1 介绍

1.1 定义

01.Flask框架起源
    a.历史背景
        Flask由奥地利开发者Armin Ronacher于2010年创建
        最初是作为愚人节玩笑项目而诞生
        基于Werkzeug WSGI工具包和Jinja2模板引擎构建
        名字来源于德语"Flasche",意为瓶子,象征轻便和简洁
    b.设计理念
        微架构(Microframework)设计哲学
        只提供Web开发的核心功能,保持精简
        高度可扩展性,通过扩展满足各种需求
        开发者拥有完全的控制权和选择权
    c.核心定位
        Python生态系统中的轻量级Web框架
        介于重量级框架(Django)和最小库(Bottle)之间
        适合快速原型开发和中小型项目
        也可扩展到企业级应用

02.微架构特点
    a.核心精简
        只包含路由、请求处理和模板渲染等核心功能
        不强制使用特定的数据库、表单验证等组件
        开发者可以自由选择和集成第三方库
        避免了不必要的依赖和性能开销
    b.显式配置
        不使用魔法式的配置,一切都显式声明
        配置项清晰可见,便于理解和维护
        支持多种配置方式:文件、对象、环境变量
        配置系统灵活且易于测试
    c.扩展友好
        官方和社区提供丰富的扩展库
        扩展遵循统一的接口规范
        支持按需加载,避免不必要的功能加载
        扩展之间相互独立,可自由组合

03.技术基础
    a.Werkzeug WSGI工具包
        提供完整的WSGI实现
        包含路由、请求/响应处理等核心功能
        强大的调试和开发服务器
        支持多种Web服务器部署
    b.Jinja2模板引擎
        高性能的模板渲染引擎
        支持模板继承和组合
        丰富的过滤器和测试器
        沙箱环境保证模板执行安全
    c.标准库集成
        基于Python标准库和成熟第三方库
        遵循Python编程规范和最佳实践
        与Python生态系统无缝集成
        充分利用Python的动态特性

1.2 核心概念:6个

01.WSGI规范与实现
    a.WSGI定义
        Web Server Gateway Interface的缩写
        Python Web应用与Web服务器之间的标准接口
        定义了服务器如何与应用程序通信的规范
        实现了Web服务器与应用程序的解耦
    b.Flask中的WSGI
        基于Werkzeug实现WSGI规范
        Flask应用本身就是WSGI可调用对象
        支持与多种WSGI服务器集成
        提供开发服务器和生产环境适配
    c.优势意义
        使得不同的Web服务器可以运行相同的Python应用
        开发者可以专注于应用逻辑,不关心底层实现
        提高了Python Web应用的可移植性和可扩展性
        是Python Web生态系统的重要基础
    d.实际应用
        开发环境使用Flask内置服务器
        生产环境使用Gunicorn、uWSGI等专业服务器
        支持容器化部署(Docker、Kubernetes)
        云平台的良好适配性

02.路由系统机制
    a.路由定义
        使用@app.route()装饰器定义URL模式与视图函数的映射
        支持静态URL和动态URL参数
        可以为同一个URL指定多个HTTP方法
        路由规则按定义顺序进行匹配
    b.动态路由
        URL中可以包含变量部分,使用<变量名>语法
        支持类型转换器:string、int、float、path
        自定义转换器实现复杂参数验证
        正则表达式支持高级路由匹配
    c.端点管理
        每个路由规则都有唯一的端点名
        默认端点名是视图函数名
        用于URL构建和反向解析
        蓝图中端点命名避免冲突
    d.路由优化
        路由规则编译为正则表达式
        匹配算法经过性能优化
        支持路由缓存和预编译
        提供路由性能监控工具

03.视图函数处理流程
    a.视图定义
        处理特定URL请求的Python函数
        接收URL参数作为函数参数
        返回响应对象或简单数据
        是业务逻辑的主要载体
    b.请求处理
        通过上下文对象访问请求数据
        支持多种请求数据格式:表单、JSON、文件
        请求数据的验证和清理
        异常处理和错误响应
    c.响应生成
        支持多种响应格式:HTML、JSON、XML
        状态码和响应头的自定义
        响应缓存和压缩支持
        流式响应处理大文件
    d.装饰器增强
        权限验证装饰器
        缓存装饰器
        日志记录装饰器
        性能监控装饰器

04.模板引擎集成
    a.Jinja2集成
        Flask内置Jinja2模板引擎
        无缝集成,开箱即用
        支持模板继承和组合
        强大的过滤器和测试器系统
    b.模板特性
        变量替换:{{ variable }}
        控制结构:{% if %}、{% for %}
        宏定义:{% macro %}
        模板继承:{% extends %}、{% block %}
    c.模板安全
        自动HTML转义防止XSS攻击
        沙箱环境限制模板执行权限
        安全标记:|safe过滤器
        模板调试和错误处理
    d.性能优化
        模板编译为Python字节码
        模板缓存机制提高渲染速度
        异步模板渲染支持
        模板调试和性能分析

05.请求/响应循环
    a.请求接收
        Web服务器接收HTTP请求
        调用Flask应用的__call__方法
        创建请求上下文和应用上下文
        将请求信息封装到request对象中
    b.路由匹配
        根据请求URL查找匹配的路由规则
        提取URL参数和查询参数
        如果没有找到匹配,返回404错误
        路由匹配支持变量转换和验证
    c.视图执行
        调用匹配的视图函数处理请求
        视图函数访问请求上下文数据
        执行业务逻辑,处理数据
        生成响应对象或简单数据
    d.响应返回
        将简单数据转换为响应对象
        响应经过中间件处理
        设置响应头和状态码
        通过Web服务器返回给客户端

06.应用上下文管理
    a.应用上下文
        存储应用级别的全局变量
        包含current_app和g对象
        在请求处理期间保持活跃
        支持多应用实例的并发运行
    b.请求上下文
        存储请求相关的临时数据
        包含request、session对象
        每个HTTP请求都有独立的上下文
        确保多线程环境下的数据隔离
    c.上下文栈
        使用LocalStack实现线程安全
        支持上下文的嵌套和切换
        在测试环境中可以手动管理
        上下文生命周期由框架自动管理
    d.上下文代理
        werkzeug.local.LocalProxy实现
        延迟加载和线程安全访问
        代理对象的创建和配置
        性能优化和内存管理

1.3 优缺点

01.优势特点
    a.轻量级和简洁
        核心代码量小,启动速度快
        学习成本低,上手快速
        配置简单,约定少,自由度高
        内存占用少,性能表现优异
    b.高度灵活性
        开发者可以自由选择数据库、表单验证等组件
        不强制使用特定的项目结构或工具
        支持多种开发模式和架构风格
        便于集成第三方库和工具
    c.良好的文档和社区
        官方文档详细完善,示例丰富
        社区活跃,问题响应及时
        丰富的教程和最佳实践
        持续更新和维护
    d.强大的扩展生态
        拥有丰富的官方和第三方扩展
        Flask-SQLAlchemy、Flask-Login、Flask-Mail等
        扩展遵循统一规范,易于使用
        支持按需加载,避免功能冗余
    e.调试友好
        内置调试服务器,开发效率高
        错误信息详细,便于问题定位
        支持交互式调试和代码执行
        集成测试工具,便于单元测试
    f.测试支持
        内置测试客户端,便于API测试
        支持模拟请求和响应
        测试覆盖率统计工具
        与pytest等测试框架良好集成

02.劣势限制
    a.项目结构需要自行设计
        缺乏标准化的项目结构指导
        开发者需要具备良好的架构设计能力
        团队协作时需要统一规范
        大型项目的组织复杂度较高
    b.功能组件需要自行选择
        缺乏内置的ORM,需要额外配置数据库层
        表单验证、用户认证等需要选择合适的扩展
        扩展质量参差不齐,需要仔细评估
        集成多个扩展时可能出现兼容性问题
    c.大型项目的最佳实践不够明确
        相比Django,企业级开发的最佳实践较少
        缺乏成熟的架构模式参考
        大规模应用的性能调优经验有限
        团队技能要求较高
    d.并发处理能力需要额外配置
        内置开发服务器不适合生产环境
        需要配置专业的WSGI服务器
        高并发场景的性能优化复杂
        分布式部署的技术门槛较高
    e.缺乏内置的管理后台
        没有类似Django Admin的管理界面
        需要自行开发或集成第三方解决方案
        数据库管理和内容编辑功能有限
        非技术用户的操作便利性不足
    f.安全配置需要手动设置
        需要开发者了解和配置各项安全措施
        CSRF、XSS等防护需要手动启用
        安全配置的复杂度较高
        容易出现安全配置遗漏

1.4 适用场景

01.快速原型开发
    a.MVP产品开发
        适合快速构建最小可行产品
        支持敏捷开发和快速迭代
        功能验证和用户反馈收集
        创业项目和产品原型
    b.概念验证项目
        技术可行性验证
        业务模式测试
        算法效果演示
        学术研究项目
    c.数据科学应用
        机器学习模型展示
        数据可视化平台
        实验结果展示系统
        数据处理工作流
    d.教育和培训
        Web开发教学项目
        编程训练营课程案例
        技术概念演示原型
        学生实践项目

02.API服务开发
    a.RESTful API后端
        微服务架构中的单个服务
        移动应用的后端API
        第三方集成接口
        B2B系统集成服务
    b.数据处理服务
        数据清洗和转换服务
        文件处理和转换API
        图像处理服务
        内容管理系统API
    c.企业内部服务
        管理后台系统的API层
        数据报表生成服务
        自动化运维工具接口
        内部协作平台服务

03.中小型Web应用
    a.个人和小团队项目
        个人博客和作品集网站
        小型企业官网
        电商网站的小型实现
        社交网络的小型应用
    b.内容管理系统
        博客系统
        新闻发布平台
        文档管理系统
        知识库和Wiki系统
    c.企业内部工具
        员工管理系统
        项目管理工具
        考勤和审批系统
        库存管理系统

04.单页应用后端
    a.前后端分离架构
        React/Vue/Angular应用的后端API
        移动混合应用的服务端
        桌面应用的后端服务
        小程序后端接口
    b.实时应用支持
        WebSocket集成支持
        实时聊天系统
        在线协作工具
        实时数据推送服务

05.云原生和微服务
    a.容器化部署
        Docker容器化支持
        Kubernetes部署友好
        微服务架构组件
        无服务器函数后端
    b.云平台集成
        AWS Lambda函数
        Google Cloud Functions
        Azure Functions
        各大云平台良好适配

06.教育和学习
    a.编程教育
        Web开发入门教学
        Python Web框架学习
        后端开发技能培训
        框架原理理解
    b.技术分享
        开源项目示例
        技术博客演示
        会议演讲素材
        代码教学案例

1.5 架构原理

01.请求处理流程
    a.请求接收阶段
        Web服务器接收HTTP请求
        服务器调用Flask应用的__call__方法
        Flask创建请求上下文和应用上下文
        将请求信息封装到request对象中
        上下文推入栈中,激活当前请求环境
    b.路由匹配阶段
        Flask根据请求URL查找匹配的路由规则
        遍历路由表,进行模式匹配
        提取URL参数和查询字符串参数
        参数类型转换和验证
        如果没有找到匹配,返回404错误
        路由匹配支持变量转换器和自定义规则
    c.预处理阶段
        执行before_request钩子函数
        支持多个钩子函数的链式执行
        钩子函数可以进行请求验证和预处理
        如果钩子函数返回响应,直接跳过视图函数
        请求上下文数据的初始化
        用户认证和权限检查
    d.视图执行阶段
        调用匹配的视图函数处理请求
        视图函数接收URL参数作为函数参数
        通过上下文对象访问请求数据
        执行业务逻辑,处理数据
        调用数据库、缓存、外部API等服务
        生成响应对象或简单数据
    e.后处理阶段
        执行after_request钩子函数
        对响应进行修改和增强
        添加响应头、压缩内容等操作
        异常处理和错误页面生成
        响应日志记录和统计
    f.响应返回阶段
        将简单数据转换为响应对象
        响应经过中间件处理
        设置响应头和状态码
        上下文弹出栈,清理临时数据
        最终通过Web服务器返回给客户端

02.中间件机制
    a.WSGI中间件
        位于Web服务器和Flask应用之间
        可以修改请求和响应数据
        支持多个中间件的链式组合
        常用中间件:代理处理、压缩、缓存等
    b.应用级中间件
        Flask钩子函数形式的中间件
        before_request、after_request钩子
        teardown_request清理钩子
        错误处理中间件
    c.自定义中间件开发
        实现WSGI应用接口
        支持配置参数传递
        中间件组合和嵌套
        性能监控和日志记录

03.蓝图系统架构
    a.蓝图定义
        蓝图是组织相关路由和视图的机制
        支持模块化应用开发
        每个蓝图可以独立开发和测试
        蓝图之间相互隔离,避免命名冲突
    b.蓝图注册机制
        蓝图在主应用中注册
        支持URL前缀和子域名
        蓝图级别的配置和钩子函数
        动态注册和注销蓝图
    c.蓝图上下文
        蓝图内部的请求前处理
        蓝图级别的错误处理
        蓝图模板和静态文件管理
        蓝图间通信机制

04.配置管理系统
    a.配置对象设计
        基于字典的配置存储
        支持多种数据类型的配置值
        配置项的层级关系和命名空间
        配置验证和类型检查机制
    b.配置加载策略
        多种配置来源:文件、对象、环境变量
        配置的继承和覆盖机制
        配置热重载和动态更新
        敏感配置的安全处理
    c.环境配置管理
        开发、测试、生产环境配置分离
        配置文件的版本控制
        配置变更的审核和追踪
        配置最佳实践指导

05.插件扩展机制
    a.扩展接口规范
        统一的扩展初始化接口
        扩展配置和状态管理
        扩展与应用的生命周期绑定
        扩展间的依赖关系管理
    b.扩展加载机制
        延迟加载和按需初始化
        扩展的自动发现和注册
        扩展冲突检测和解决
        扩展的卸载和资源清理
    c.扩展生态系统
        官方扩展库管理
        第三方扩展的认证和推荐
        扩展质量评估体系
        社区贡献和维护机制

1.6 核心特性

01.内置开发服务器
    a.功能特性
        提供轻量级的WSGI开发服务器
        支持代码热重载,修改代码后自动重启
        集成调试器,提供详细的错误信息
        支持交互式调试和代码执行
        SSL支持,便于开发HTTPS功能
    b.使用方式
        通过flask run命令启动开发服务器
        支持命令行参数配置端口和主机
        可以通过代码方式自定义启动参数
        集成到IDE中,提供一键启动和调试
        支持多线程和HTTPS模式
    c.调试功能
        详细的错误堆栈跟踪
        变量检查和修改功能
        代码执行环境和REPL
        断点设置和单步调试
        性能分析和内存监控
    d.限制说明
        仅适用于开发和测试环境
        性能和稳定性不适合生产环境
        不支持高并发请求处理
        建议生产环境使用专业WSGI服务器
        安全性考虑和生产环境差异

02.路由系统特性
    a.基础路由功能
        使用装饰器语法定义路由
        支持静态URL和动态URL参数
        HTTP方法的精确控制
        URL构建和反向解析功能
    b.高级路由特性
        正则表达式路由匹配
        自定义URL变量转换器
        子域名路由支持
        路由别名和重定向功能
    c.路由优化
        路由规则编译和缓存
        匹配算法性能优化
        路由冲突检测和处理
        大量路由的性能管理

03.模板系统特性
    a.Jinja2集成优势
        强大且快速的模板引擎
        模板继承和组合机制
        丰富的内置过滤器和测试器
        安全的沙箱执行环境
    b.模板功能特性
        变量替换和表达式求值
        条件判断和循环控制
        宏定义和包含机制
        国际化和本地化支持
    c.模板性能优化
        模板编译为Python字节码
        智能缓存机制
        异步模板渲染支持
        模板调试和性能分析工具

04.会话管理特性
    a.会话机制设计
        基于签名的Cookie会话
        支持服务端会话存储
        会话数据加密和完整性验证
        跨域会话共享支持
    b.安全性保障
        防止会话劫持和CSRF攻击
        会话ID随机生成和定期更新
        安全Cookie配置建议
        会话过期和清理机制
    c.扩展功能支持
        永久会话和临时会话
        会话数据分析和监控
        多设备会话管理
        分布式会话存储

05.错误处理特性
    a.错误捕获机制
        全局错误处理器
        HTTP错误码和异常类型匹配
        蓝图级别和应用级别处理
        错误日志自动记录
    b.调试支持功能
        交互式调试器集成
        错误堆栈详细跟踪
        变量状态检查和修改
        生产环境安全调试模式
    c.自定义错误页面
        静态和动态错误页面
        多语言错误信息支持
        错误页面模板化
        错误信息的用户友好化

06.测试支持特性
    a.测试客户端
        内置测试客户端工具
        模拟HTTP请求和响应
        支持会话和Cookie管理
        测试覆盖率统计
    b.测试工具集成
        pytest框架集成支持
        单元测试和集成测试
        测试夹具和工具函数
        性能测试和负载测试
    c.测试最佳实践
        测试驱动开发支持
        持续集成友好
        测试报告生成
        测试数据管理

07.安全特性
    a.安全头部支持
        自动添加安全相关HTTP头
        XSS和CSRF防护机制
        内容安全策略支持
        安全Cookie配置
    b.数据验证
        请求数据验证和清理
        文件上传安全检查
        SQL注入防护
        输入数据编码和转义
    c.认证和授权
        用户认证机制支持
        角色权限管理系统
        API密钥认证
        OAuth集成支持

1.7 生态对比

01.Flask vs Django
    a.设计理念对比
        Flask:微框架,核心功能最小化,高度可扩展
        Django:全能框架,开箱即用,约定优于配置
        Flask:开发者控制一切,灵活性高,学习成本低
        Django:框架决定大部分,开发效率高,学习曲线陡峭
    b.功能丰富度对比
        Flask:基础功能精简,通过扩展补充
        Django:内置ORM、管理后台、表单系统等完整功能
        Flask:功能按需加载,避免冗余
        Django:一站式解决方案,减少技术选型烦恼
    c.项目结构对比
        Flask:项目结构自由,开发者自行设计
        Django:标准化项目结构,最佳实践明确
        Flask:适合小到中型项目,灵活性强
        Django:适合中到大型企业级项目,一致性高
    d.学习曲线对比
        Flask:学习成本低,文档简洁,上手快速
        Django:学习曲线陡峭,概念较多,需要较长时间掌握
        Flask:适合初学者和快速原型开发
        Django:适合团队协作和企业级项目开发
    e.性能对比
        Flask:轻量级,内存占用少,启动速度快
        Django:功能完整,资源占用相对较高
        Flask:在简单场景下性能优异
        Django:在复杂业务场景下优化更好
    f.生态系统对比
        Flask:丰富的第三方扩展,社区活跃,扩展质量参差不齐
        Django:内置功能完整,官方插件丰富,质量有保障
        Flask:扩展选择自由,需要仔细评估质量
        Django:官方维护,生态稳定,集成度高
    g.适用场景对比
        Flask:小型项目、API服务、快速原型、个人项目
        Django:大型企业应用、内容管理系统、电商系统
        Flask:需要高度定制化的项目
        Django:需要快速开发和标准化管理的项目

02.Flask vs FastAPI
    a.性能对比
        FastAPI:基于Starlette和Pydantic,性能优异
        Flask:传统的同步框架,性能适中
        FastAPI:原生支持异步,并发处理能力强
        Flask:异步支持有限,主要依赖扩展
    b.开发体验对比
        FastAPI:自动API文档生成,类型提示支持
        Flask:传统开发方式,文档手动编写
        FastAPI:现代Python特性,IDE支持好
        Flask:成熟稳定,学习资源丰富
    c.类型安全对比
        FastAPI:强类型支持,Pydantic数据验证
        Flask:动态类型,运行时检查
        FastAPI:减少运行时错误,代码质量高
        Flask:开发灵活,适合快速迭代
    d.异步支持对比
        FastAPI:原生异步支持,性能优越
        Flask:通过扩展支持异步,功能有限
        FastAPI:适合I/O密集型应用
        Flask:适合CPU密集型和传统Web应用
    e.文档自动生成对比
        FastAPI:基于OpenAPI/Swagger自动生成文档
        Flask:需要手动编写和维护文档
        FastAPI:交互式API文档,支持在线测试
        Flask:文档维护成本高,容易过时
    f.学习成本对比
        FastAPI:需要了解异步编程和类型提示
        Flask:学习曲线平缓,入门简单
        FastAPI:现代开发理念,需要适应新概念
        Flask:传统Web开发模式,易于理解
    g.生态系统对比
        FastAPI:新兴框架,生态快速发展
        Flask:成熟框架,生态稳定完善
        FastAPI:现代化的工具和库支持
        Flask:丰富的扩展和第三方集成

03.Flask vs Spring Boot
    a.语言生态对比
        Flask:Python生态,简洁优雅,开发效率高
        Spring Boot:Java生态,企业级,性能稳定
        Flask:适合快速开发和数据科学项目
        Spring Boot:适合大型企业级和金融系统
    b.配置和部署对比
        Flask:配置简单,部署轻量,容器化友好
        Spring Boot:配置复杂,部署重量级,传统企业部署成熟
        Flask:云原生支持好,微服务架构友好
        Spring Boot:企业级部署经验丰富,监控工具完善
    c.性能对比
        Flask:Python解释型语言,性能相对较低
        Spring Boot:Java编译型语言,性能表现优秀
        Flask:开发效率高,但运行性能有限
        Spring Boot:启动较慢,但运行性能稳定
    d.企业特性对比
        Flask:需要第三方库支持企业功能
        Spring Boot:内置企业级特性丰富
        Flask:灵活性高,可按需选择组件
        Spring Boot:标准化程度高,一致性好
    e.开发效率对比
        Flask:代码简洁,开发速度快
        Spring Boot:代码量大,开发周期长
        Flask:适合MVP和快速迭代
        Spring Boot:适合大型长期维护项目
    f.团队技能要求对比
        Flask:Python技能相对易学
        Spring Boot:Java生态学习成本较高
        Flask:适合小团队和初创公司
        Spring Boot:适合大型企业和传统IT部门
    g.成本对比
        Flask:开发成本低,部署成本低
        Spring Boot:开发成本高,但运维成本相对可控
        Flask:开源方案丰富,成本低廉
        Spring Boot:企业级支持,但需要商业许可

04.框架选择建议
    a.选择Flask的场景
        项目规模小到中等,需要快速开发
        团队对Python熟悉,学习时间有限
        需要高度定制化和灵活性
        API服务开发或微服务架构
        原型开发和概念验证
        数据科学和机器学习Web应用
        个人项目和小团队开发
    b.选择Django的场景
        大型企业级项目,需要完整功能
        内容管理系统或电商平台
        需要标准化开发和团队协作
        快速开发和内置管理后台
        传统Web应用和数据库驱动项目
        需要ORM和管理界面的项目
    c.选择FastAPI的场景
        高性能API服务需求
        异步编程和I/O密集型应用
        需要自动API文档生成
        现代Python开发团队
        微服务架构和云原生应用
        需要类型安全和数据验证
    d.选择Spring Boot的场景
        Java技术栈,企业级应用
        金融系统和大流量系统
        传统IT部门和企业环境
        需要稳定性和长期维护
        大型团队和复杂业务逻辑
        严格的安全和合规要求
    e.决策因素分析
        技术栈匹配度:团队技能和现有技术栈
        项目规模和复杂度:小项目用Flask,大项目考虑Django/Spring Boot
        性能要求:高性能API考虑FastAPI
        开发时间:快速原型用Flask,企业项目用Django
        维护成本:长期维护考虑稳定成熟的框架
        社区支持:选择社区活跃、文档丰富的框架

2 基础概念

2.1 汇总

01.介绍
    a.常用信息
        a.应用对象
            Flask应用对象是Flask程序的核心。你可以通过创建一个Flask类的实例来定义一个Flask应用对象。通常我们会将它命名为app。
        b.路由
            路由是Flask的核心概念之一。它定义了URL和处理请求的视图函数之间的映射。使用装饰器@app.route可以轻松地将URL路径与视图函数关联。
        c.视图函数
            视图函数是处理特定URL请求的Python函数。它们通常会返回一个响应对象,包含HTML、JSON或其他内容。
        d.请求对象
            Flask提供了一个全局对象request,包含了客户端请求的所有信息,例如数据、头信息、文件等。它是由Werkzeug库提供的。
        e.响应对象
            视图函数的返回值最终会被转化为一个响应对象。Flask提供了简便的方法来创建和操作这些响应对象。
        f.模板
            Flask使用Jinja2作为其模板引擎。模板允许将动态数据插入到HTML中。你可以在模板中使用控制结构(如循环和条件语句)来生成动态内容。
        g.静态文件
            Flask应用可以通过一个名为static的特殊文件夹来服务静态文件(如CSS、JavaScript、图片等)。这些文件可以通过/static/ URL访问。
        h.配置
            Flask应用可以通过配置对象或配置文件进行配置。这些配置项可以控制应用的行为,例如调试模式、数据库连接等。
        i.扩展
            Flask的设计使其非常容易扩展。有许多现成的Flask扩展可以集成到你的应用中,如Flask-SQLAlchemy(ORM)、Flask-Migrate(数据库迁移)、Flask-WTF(表单处理)等。
        j.中间件
            中间件是位于请求和响应之间的组件,可以用来处理或修改请求和响应。Werkzeug提供了中间件支持,Flask可以通过Werkzeug中间件进行扩展。
        k.上下文
            Flask有两个主要的上下文:应用上下文和请求上下文。应用上下文包含应用相关的数据,如配置和扩展实例。请求上下文包含与当前请求相关的数据,如请求对象和用户会话。
        l.会话
            Flask提供了会话机制来在多个请求之间存储用户数据。默认情况下,Flask会话是使用签名cookie实现的。

02.扩展
    a.常用信息
        a.Flask-SQLAlchemy
            a.功能
                提供SQLAlchemy ORM(对象关系映射)的集成,使数据库操作更加简单和Pythonic。
            b.用途
                简化数据库查询和操作,支持多种数据库后端。
        b.Flask-Migrate
            a.功能
                基于Alembic,提供数据库迁移功能,便于管理数据库模式的变化。
            b.用途
                管理数据库版本,支持数据库模式的升级和降级。
        c.Flask-WTF
            a.功能
                集成WTForms库,提供表单处理、表单验证和CSRF保护功能。
            b.用途
                简化表单创建和验证,增强应用的安全性。
        d.Flask-Login
            a.功能
                提供用户会话管理功能,包括登录、登出和用户会话持久化。
            b.用途
                管理用户认证状态,支持用户登录和登出功能。
        e.Flask-Mail
            a.功能
                用于发送电子邮件,支持各种电子邮件服务和协议。
            b.用途
                实现邮件通知、用户注册验证等功能。
        f.Flask-RESTful
            a.功能
                简化创建REST API的过程,提供了用于定义API资源的类和方法。
            b.用途
                快速构建RESTful API,支持资源路由和请求处理。
        g.Flask-Security
            a.功能
                提供一套完整的用户认证和授权功能,包括密码重置、注册、角色管理等。
            b.用途
                增强应用的安全性,支持用户权限管理。
        h.Flask-Bootstrap
            a.功能
                集成Twitter Bootstrap框架,方便在Flask应用中使用Bootstrap的CSS和JavaScript组件。
            b.用途
                快速构建响应式Web界面,提升用户体验。
        i.Flask-Caching
            a.功能
                提供缓存支持,支持多种缓存后端(如内存、Redis、Memcached等)。
            b.用途
                提高应用性能,减少数据库查询次数。
        j.Flask-SocketIO
            a.功能
                基于Socket.IO,提供WebSocket支持,使实时通信变得简单。
            b.用途
                实现实时聊天、通知推送等功能。
        k.Flask-Babel
            a.功能
                提供国际化和本地化支持,方便处理多语言应用。
            b.用途
                支持多语言翻译和日期格式化。
        l.Flask-Admin
            a.功能
                提供一个可定制的管理后台界面,可以快速搭建管理后台。
            b.用途
                管理应用数据和用户,支持CRUD操作。
        m.Flask-Celery
            a.功能
                集成Celery任务队列,支持异步任务处理和分布式任务队列。
            b.用途
                执行异步任务,支持任务调度和并行处理。
        n.Flask-Uploads
            a.功能
                简化文件上传和管理,支持多种文件存储后端。
            b.用途
                处理用户上传的文件,支持文件验证和存储。
        o.Flask-Testing
            a.功能
                提供单元测试支持,方便对Flask应用进行测试。
            b.用途
                编写和运行测试用例,确保应用功能的正确性。
        p.Flask-Script(已过时,推荐使用Flask内置的flask命令)
            a.功能
                提供命令行解析功能,便于管理脚本任务。
            b.用途
                执行自定义管理命令,支持任务自动化。
        q.Flask-Limiter
            a.功能
                提供速率限制功能,防止滥用API。
            b.用途
                控制API请求频率,保护服务器资源。
        r.Flask-Principal
            a.功能
                提供权限管理和角色管理功能,便于实现复杂的权限控制。
            b.用途
                管理用户角色和权限,支持细粒度的访问控制。
        s.Flask-CORS
            a.功能
                提供跨域资源共享(CORS)支持,允许跨域请求。
            b.用途
                解决跨域请求问题,支持前后端分离开发。
        t.Flask-Cache(已被Flask-Caching取代)
            a.功能
                提供缓存机制,可以缓存视图函数的输出,减少服务器负载。
            b.用途
                提高应用性能,减少重复计算和数据库查询。

03.中间件
    a.Werkzeug Middleware
        a.ProxyFix
            功能:处理代理服务器设置的中间件,确保正确获取客户端IP地址和协议。
            用途:在应用部署在代理服务器后面时,确保应用能够正确识别客户端的真实IP地址和使用的协议(HTTP/HTTPS)。
        b.SharedDataMiddleware
            功能:提供静态文件服务的中间件,可以将请求路径映射到文件系统中的静态文件。
            用途:用于开发环境中快速提供静态文件服务。
        c.DispatcherMiddleware
            功能:将不同的URL路径分派给不同的WSGI应用,是创建复合应用的好工具。
            用途:在一个服务器实例中运行多个WSGI应用。
    b.Flask扩展中间件
        a.Flask-CORS
            功能:处理跨域资源共享(CORS)的中间件,允许跨域请求。
            用途:对于前后端分离的项目非常有用,解决跨域请求问题。
        b.Flask-Limiter
            功能:提供速率限制功能的中间件,用于防止API滥用。
            用途:可以根据IP地址、用户等进行限流,保护API资源。
        c.Flask-SSLify(已不再维护,推荐使用Flask-Talisman)
            功能:强制使用HTTPS协议的中间件,重定向所有HTTP请求到HTTPS。
            用途:确保应用通过HTTPS安全传输。
        d.Flask-Talisman
            功能:提供安全相关的HTTP头(如HSTS、CSP等)的中间件,增强Web应用的安全性。
            用途:提高应用的安全性,防止常见的Web攻击。
        e.Flask-Session
            功能:扩展Flask会话机制的中间件,支持服务器端会话存储(如Redis、Memcached等)。
            用途:提供更安全和持久的会话管理。
        f.Flask-Compress
            功能:为响应内容提供Gzip压缩的中间件,减少传输数据量,提高应用性能。
            用途:优化网络传输,提高加载速度。
        g.Flask-HTTPAuth
            功能:提供HTTP基础认证和摘要认证的中间件,简化API认证流程。
            用途:用于保护API,确保只有授权用户可以访问。
        h.Flask-DebugToolbar
            功能:提供调试信息的中间件,在开发环境中非常有用,可以显示详细的调试信息、SQL查询等。
            用途:帮助开发者快速定位和解决问题。
        i.Flask-Security
            功能:集成多种安全功能的中间件,包括认证、授权、角色管理等。
            用途:提供全面的安全解决方案,保护应用和用户数据。
        j.Flask-Cache(已被Flask-Caching取代)
            功能:提供缓存支持的中间件,可以缓存视图函数的输出,减少服务器负载。
            用途:提高应用性能,减少重复计算。
        k.Flask-Caching
            功能:现代的缓存中间件,支持多种缓存后端,可以缓存视图和其他数据。
            用途:优化性能,减少数据库查询和计算。

04.配置类
    a.使用配置类
        a.代码1
            ---
            import logging
            from datetime import timedelta


            from urllib.parse import quote_plus as urlquote


            class BaseConfig:
                SUPERADMIN = 'admin'

                SYSTEM_NAME = 'Pear Admin'
                # 主题面板的链接列表配置
                SYSTEM_PANEL_LINKS = [
                    {
                        "icon": "layui-icon layui-icon-auz",
                        "title": "官方网站",
                        "href": "http://www.pearadmin.com"
                    },
                    {
                        "icon": "layui-icon layui-icon-auz",
                        "title": "开发文档",
                        "href": "http://www.pearadmin.com"
                    },
                    {
                        "icon": "layui-icon layui-icon-auz",
                        "title": "开源地址",
                        "href": "https://gitee.com/Jmysy/Pear-Admin-Layui"
                    }
                ]

                UPLOADED_PHOTOS_DEST = 'static/upload'
                UPLOADED_FILES_ALLOW = ['gif', 'jpg']
                UPLOADS_AUTOSERVE = True

                # JSON配置
                JSON_AS_ASCII = False

                SECRET_KEY = "pear-system-flask"

                # mysql 配置
                MYSQL_USERNAME = "root"
                MYSQL_PASSWORD = "123456"
                MYSQL_HOST = "127.0.0.1"
                MYSQL_PORT = 3306
                MYSQL_DATABASE = "pradmin"

                # 数据库的配置信息
                # SQLALCHEMY_DATABASE_URI = 'sqlite:///../pear.db'
                SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{urlquote(MYSQL_PASSWORD)}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4"

                # 默认日志等级
                LOG_LEVEL = logging.WARN
                """
                flask-mail配置
                """
                MAIL_SERVER = 'smtp.qq.com'
                MAIL_USE_TLS = False
                MAIL_USE_SSL = True
                MAIL_PORT = 465
                MAIL_USERNAME = '123@qq.com'
                MAIL_PASSWORD = 'XXXXX'  # 生成的授权码
                MAIL_DEFAULT_SENDER = MAIL_USERNAME

                # 插件配置,填写插件的文件名名称,默认不启用插件。
                PLUGIN_ENABLE_FOLDERS = []

                # 配置多个数据库连接的连接串写法示例
                # HOSTNAME: 指数据库的IP地址、USERNAME:指数据库登录的用户名、PASSWORD:指数据库登录密码、PORT:指数据库开放的端口、DATABASE:指需要连接的数据库名称
                # MSSQL:    f"mssql+pymssql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=cp936"
                # MySQL:    f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
                # Oracle:   f"oracle+cx_oracle://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
                # SQLite    "sqlite:/// database.db"
                # Postgres f"postgresql+psycopg2://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
                # Oracle的第二种连接方式
                # dsnStr = cx_Oracle.makedsn({HOSTNAME}, 1521, service_name='orcl')
                # connect_str = "oracle://%s:%s@%s" % ('{USERNAME}', ' {PASSWORD}', dsnStr)

                #  在SQLALCHEMY_BINDS 中设置:'{数据库连接别名}': '{连接串}'
                # 最后在models的数据模型class中,在__tablename__前设置        __bind_key__ = '{数据库连接别名}'  即可,表示该数据模型不使用默认的数据库连接,改用“SQLALCHEMY_BINDS”中设置的其他数据库连接
                #  SQLALCHEMY_BINDS = {
                #    'testMySQL': 'mysql+pymysql://test:123456@192.168.1.1:3306/test?charset=utf8',
                #    'testMsSQL': 'mssql+pymssql://test:123456@192.168.1.1:1433/test?charset=cp936',
                #    'testOracle': 'oracle+cx_oracle://test:123456@192.168.1.1:1521/test',
                #    'testSQLite': 'sqlite:///database.db
                # }
                """
                session
                """

                PERMANENT_SESSION_LIFETIME = timedelta(days=7)

                SESSION_TYPE = "filesystem" # 默认使用文件系统来保存会话
                SESSION_PERMANENT = False  # 会话是否持久化
                SESSION_USE_SIGNER = True  # 是否对发送到浏览器上 session 的 cookie 值进行加密
            ---
        b.代码2
            ---
            import os
            from flask import Flask
            from applications.common.script import init_script
            from applications.config import BaseConfig
            from applications.extensions import init_plugs
            from applications.view import init_bps

            def create_app():
                app = Flask(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
                # 引入配置
                app.config.from_object(BaseConfig)

                # 注册flask组件
                init_plugs(app)

                # 注册蓝图
                init_bps(app)

                # 注册命令
                init_script(app)

                return app
            ---

05.路由、视图
    a.常见信息1
        a.路由(Routing)
            路由是将URL与特定的视图函数关联起来的机制。它定义了客户端请求的URL路径与处理请求的视图函数之间的映射关系。
            定义路由: 使用@app.route('/path')装饰器来定义路由。
            示例:
            @app.route('/hello')
            def hello():
                return 'Hello, World!'
        b.视图(View)
            视图函数是实际处理客户端请求的函数。它接收请求,处理业务逻辑,并返回响应。每个视图函数都与一个或多个路由关联。
            视图函数的返回值: 可以是字符串、HTML模板、JSON数据等。
            示例:
            @app.route('/user/<username>')
            def show_user_profile(username):
                return f'User {username}'
        c.蓝图(Blueprint)
            蓝图是组织Flask应用的组件,用于将应用的不同部分分离到独立的模块中。蓝图使得应用的路由和视图可以模块化,便于管理和复用。蓝图可以在应用工厂模式中使用,有助于创建大型应用。
            定义蓝图: 使用Blueprint类来定义蓝图。
            示例:
            from flask import Blueprint
            auth = Blueprint('auth', __name__)
            @auth.route('/login')
            def login():
                return 'Login Page'
            注册蓝图: 在主应用中注册蓝图。
            from flask import Flask
            from .auth import auth
            app = Flask(__name__)
            app.register_blueprint(auth, url_prefix='/auth')
        d.红图(Application Factories)
            红图并不是Flask的官方术语,但在社区中,有时会用“红图”来指代应用工厂模式。这种模式通过创建一个函数来构建和配置Flask应用实例,使得应用的配置和初始化更加灵活和可复用。
            应用工厂: 使用一个函数来创建和配置Flask应用实例。
            示例:
            def create_app():
                app = Flask(__name__)
                app.config.from_object('config.Config')
                # 在这里注册蓝图
                from .auth import auth
                app.register_blueprint(auth, url_prefix='/auth')
                return app
        e.总结
            路由与视图: 路由通过装饰器将URL路径与视图函数关联。每当客户端访问特定URL时,Flask会调用相应的视图函数来处理请求。
            蓝图与路由、视图: 蓝图将一组相关的路由和视图组织在一起,使得应用的模块化和复用更加容易。在主应用中注册蓝图后,蓝图中的路由和视图将成为应用的一部分。
            红图与蓝图: 应用工厂模式(红图)通过函数创建应用实例,并在其中注册蓝图,从而使得应用的配置和初始化更加灵活。这种模式特别适用于大型应用和测试环境。

2.2 应用对象

01.基本应用创建
    a.简单创建方式
        a.基本语法
            from flask import Flask
            app = Flask(__name__)
        b.完整示例
            from flask import Flask

            # 创建Flask应用实例
            app = Flask(__name__)

            # 定义路由
            @app.route('/')
            def hello_world():
                return 'Hello, World!'

            # 运行应用
            if __name__ == '__main__':
                app.run(debug=True)
        c.__name__参数说明
            __name__表示当前模块名称
            用于确定应用的根目录
            影响模板和静态文件的查找路径

02.应用配置参数
    a.构造函数参数
        a.import_name参数
            # 指定应用的导入名称
            app = Flask('myapp')
            app = Flask(__name__)  # 推荐
        b.template_folder参数
            # 自定义模板文件夹
            app = Flask(__name__, template_folder='my_templates')
        c.static_folder参数
            # 自定义静态文件夹
            app = Flask(__name__, static_folder='my_static')
            app = Flask(__name__, static_url_path='/assets')
        d.static_url_path参数
            # 静态文件URL路径
            app = Flask(__name__, static_url_path='/static')
    b.应用属性
        a.重要属性访问
            print(app.name)        # 应用名称
            print(app.root_path)    # 应用根目录
            print(app.instance_path) # 实例目录
            print(app.config)       # 配置对象
        b.扩展字典
            app.extensions = {}  # 扩展存储字典
            # 扩展会将自己存储在这里

03.应用工厂模式
    a.工厂函数实现
        a.基础工厂函数
            def create_app(config_name='development'):
                app = Flask(__name__)
                app.config.from_object(config[config_name])
                return app
        b.完整工厂实现
            def create_app(config_name='development'):
                app = Flask(__name__)

                # 加载配置
                app.config.from_object(config[config_name])

                # 初始化扩展
                db.init_app(app)
                migrate.init_app(app, db)

                # 注册蓝图
                from .main import bp as main_bp
                app.register_blueprint(main_bp)

                return app
        c.使用工厂模式
            app = create_app('production')
            app.run()
    d.工厂模式优势
        支持多应用实例
        便于测试
        配置灵活
        避免循环导入

04.应用实例方法
    a.路由相关方法
        a.route装饰器
            @app.route('/user/<username>')
            def show_user_profile(username):
                return f'User {username}'
        b.add_url_rule方法
            def hello():
                return 'Hello'
            app.add_url_rule('/hello', 'hello', hello)
        c.url_for反向解析
            with app.test_request_context():
                print(url_for('show_user_profile', username='alice'))
    b.上下文方法
        a.app_context应用上下文
            with app.app_context():
                # 在应用上下文中执行代码
                print(current_app.name)
        b.test_request_context测试上下文
            with app.test_request_context():
                # 模拟请求上下文
                print(request.method)

2.3 扩展系统

01.扩展基础概念
    a.扩展定义
        扩展是为Flask添加额外功能的Python包
        通过与应用实例绑定提供服务
        遵循统一的初始化接口
    b.扩展初始化模式
        a.扩展基础类
            from flask import Flask

            class MyExtension:
                def __init__(self, app=None):
                    self.app = app
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    app.my_extension = self
                    # 初始化逻辑
        b.使用扩展
            my_ext = MyExtension(app)
            # 或者
            my_ext = MyExtension()
            my_ext.init_app(app)

02.常用扩展集成
    a.Flask-SQLAlchemy数据库扩展
        a.安装和配置
            pip install Flask-SQLAlchemy

            from flask import Flask
            from flask_sqlalchemy import SQLAlchemy

            app = Flask(__name__)
            app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
            app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

            db = SQLAlchemy(app)
        b.模型定义
            class User(db.Model):
                id = db.Column(db.Integer, primary_key=True)
                username = db.Column(db.String(80), unique=True, nullable=False)
                email = db.Column(db.String(120), unique=True, nullable=False)

                def __repr__(self):
                    return f'<User {self.username}>'
        c.数据库操作
            # 创建表
            with app.app_context():
                db.create_all()

            # 插入数据
            user = User(username='admin', email='admin@example.com')
            db.session.add(user)
            db.session.commit()

            # 查询数据
            users = User.query.all()
            user = User.query.filter_by(username='admin').first()
    b.Flask-WTF表单扩展
        a.安装和基础配置
            pip install Flask-WTF

            from flask_wtf import FlaskForm
            from wtforms import StringField, SubmitField
            from wtforms.validators import DataRequired

            app = Flask(__name__)
            app.config['SECRET_KEY'] = 'your-secret-key'
        b.表单类定义
            class LoginForm(FlaskForm):
                username = StringField('用户名', validators=[DataRequired()])
                password = StringField('密码', validators=[DataRequired()])
                submit = SubmitField('登录')
        c.表单处理
            @app.route('/login', methods=['GET', 'POST'])
            def login():
                form = LoginForm()
                if form.validate_on_submit():
                    return f'登录成功: {form.username.data}'
                return render_template('login.html', form=form)
    c.Flask-Login认证扩展
        a.基础配置
            pip install Flask-Login

            from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required

            login_manager = LoginManager()
            login_manager.init_app(app)
            login_manager.login_view = 'login'
        b.用户模型
            class User(UserMixin, db.Model):
                id = db.Column(db.Integer, primary_key=True)
                username = db.Column(db.String(80), unique=True, nullable=False)
        c.认证逻辑
            @login_manager.user_loader
            def load_user(user_id):
                return User.query.get(int(user_id))

            @app.route('/login')
            def login():
                user = User.query.first()
                login_user(user)
                return '登录成功'

            @app.route('/protected')
            @login_required
            def protected():
                return '需要登录才能访问'

03.扩展开发实践
    a.创建自定义扩展
        a.扩展结构
            # flask_myext/__init__.py
            from flask import current_app

            class FlaskMyExt:
                def __init__(self, app=None):
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    app.config.setdefault('MYEXT_SETTING', 'default_value')
                    app.teardown_appcontext(self.teardown)
                def teardown(self, exception):
                    # 清理逻辑
                    pass
        b.扩展工厂函数
            def create_my_ext(app):
                return FlaskMyExt(app)
        c.扩展使用
            from flask_myext import FlaskMyExt
            my_ext = FlaskMyExt(app)
    b.扩展最佳实践
        a.配置项设计
            class FlaskMyExt:
                def __init__(self, app=None):
                    self.app = app
                    if app:
                        self.init_app(app)

                def init_app(self, app):
                    app.config.setdefault('MYEXT_ENABLED', True)
                    app.config.setdefault('MYEXT_TIMEOUT', 30)
        b.错误处理
            def init_app(self, app):
                app.config.setdefault('MYEXT_ENABLED', True)

                if not app.config.get('MYEXT_ENABLED'):
                    current_app.logger.warning('MyExt is disabled')
                    return
        c.日志记录
            import logging
            logger = logging.getLogger('flask_myext')

            def do_something(self):
                logger.info('Doing something with MyExt')

2.4 蓝图架构

01.蓝图基础概念
    a.蓝图定义
        蓝图是组织和路由应用组件的机制
        支持模块化应用开发
        每个蓝图可以独立开发和测试
        蓝图之间相互隔离,避免命名冲突
    b.蓝图优势
        模块化开发提高代码组织性
        支持团队协作开发
        便于代码重用和维护
        简化大型应用的管理
    c.应用场景
        大型Web应用的模块化拆分
        API服务的版本管理
        插件化系统的实现
        微服务架构的组件组织

02.蓝图创建和配置
    a.基本创建方式
        a.简单蓝图创建
            from flask import Blueprint

            # 创建用户蓝图
            user_bp = Blueprint('user', __name__)

            @user_bp.route('/profile')
            def profile():
                return 'User Profile'

            # 在主应用中注册
            from flask import Flask
            app = Flask(__name__)
            app.register_blueprint(user_bp, url_prefix='/user')
        b.蓝图参数配置
            # 带参数的蓝图创建
            admin_bp = Blueprint('admin', __name__,
                               template_folder='admin_templates',
                               static_folder='admin_static',
                               url_prefix='/admin')
        c.蓝图属性管理
            print(user_bp.name)        # 蓝图名称
            print(user_bp.import_name)  # 导入模块名
            print(user_bp.url_prefix)   # URL前缀
            print(user_bp.deferred_functions)  # 延迟函数

03.蓝图路由管理
    a.路由定义方式
        a.基础路由定义
            @user_bp.route('/login')
            def login():
                return 'Login Page'

            @user_bp.route('/logout')
            def logout():
                return 'Logout Page'

            @user_bp.route('/user/<int:user_id>')
            def get_user(user_id):
                return f'User {user_id}'
        b.HTTP方法指定
            @user_bp.route('/users', methods=['GET', 'POST'])
            def users():
                if request.method == 'POST':
                    return 'Create User'
                return 'List Users'
        c.动态路由参数
            @user_bp.route('/posts/<int:post_id>/comments/<int:comment_id>')
            def get_comment(post_id, comment_id):
                return f'Post {post_id}, Comment {comment_id}'
    b.路由命名空间
        a.端点命名规则
            # 蓝图路由的端点会自动添加蓝图名前缀
            @user_bp.route('/profile')
            def profile():
                pass
            # 端点名: user.profile

            # 可以自定义端点名
            @user_bp.route('/login', endpoint='user_login')
            def login():
                pass
            # 端点名: user.user_login
        b.路由反向解析
            from flask import url_for
            # 在视图函数中
            url_for('user.profile')  # -> /user/profile
            url_for('admin.dashboard')  # -> /admin/dashboard
    c.蓝图注册机制
        a.基础注册
            from flask import Flask
            app = Flask(__name__)

            # 注册蓝图
            app.register_blueprint(user_bp)
            app.register_blueprint(admin_bp, url_prefix='/admin')
            app.register_blueprint(api_bp, url_prefix='/api/v1')
        b.子域名注册
            # 注册到子域名
            app.register_blueprint(api_bp, subdomain='api')
            # 访问: api.example.com/users
        c.动态注册
            def register_blueprints(app):
                app.register_blueprint(user_bp, url_prefix='/user')
                app.register_blueprint(admin_bp, url_prefix='/admin')

            # 在工厂模式中使用
            def create_app():
                app = Flask(__name__)
                register_blueprints(app)
                return app

04.蓝图模板和静态文件
    a.模板文件管理
        a.蓝图专属模板
            # blueprint目录结构
            # user/
            #   __init__.py
            #   templates/
            #     profile.html
            #     settings.html
            #   static/
            #     css/
            #     js/

            from flask import Blueprint, render_template

            user_bp = Blueprint('user', __name__,
                              template_folder='templates',
                              static_folder='static')

            @user_bp.route('/profile')
            def profile():
                return render_template('profile.html')  # 使用user/templates/profile.html
        b.模板优先级
            # 模板查找顺序:
            # 1. 应用主模板目录
            # 2. 蓝图模板目录
            @user_bp.route('/dashboard')
            def dashboard():
                return render_template('dashboard.html')  # 查找顺序同上
    b.静态文件服务
        a.蓝图静态文件访问
            # 蓝图静态文件URL: /static/<filename>
            # 访问: /static/css/style.css

            @user_bp.route('/static-page')
            def static_page():
                return render_template('page.html')  # 页面中使用蓝图静态文件
        b.自定义静态URL
            user_bp = Blueprint('user', __name__,
                              static_folder='user_static',
                              static_url_path='/user_assets')
            # 静态文件URL: /user_assets/<filename>
    c.资源组织策略
        a.按功能模块组织
            project/
            ├── app/
            │   ├── __init__.py
            │   ├── main/
            │   │   ├── __init__.py
            │   │   ├── routes.py
            │   │   └── templates/
            │   ├── admin/
            │   │   ├── __init__.py
            │   │   ├── routes.py
            │   │   └── templates/
            │   └── api/
            │       ├── __init__.py
            │       └── routes.py
        b.模块化资源管理
            from .admin.routes import admin_bp
            from .api.routes import api_bp
            from .main.routes import main_bp

            def create_app():
                app = Flask(__name__)
                app.register_blueprint(main_bp)
                app.register_blueprint(admin_bp, url_prefix='/admin')
                app.register_blueprint(api_bp, url_prefix='/api')
                return app

05.蓝图高级特性
    a.蓝图错误处理
        a.蓝图级错误处理器
            @user_bp.errorhandler(404)
            def user_not_found(error):
                return 'User page not found', 404

            @user_bp.errorhandler(500)
            def user_server_error(error):
                return 'User server error', 500

            @user_bp.app_errorhandler(403)
            def app_forbidden(error):
                return 'Access forbidden', 403
        b.应用级错误处理
            @app.errorhandler(404)
            def not_found(error):
                return render_template('404.html'), 404
    b.蓝图钩子函数
        a.蓝图级钩子
            @user_bp.before_request
            def before_user_request():
                # 在用户蓝图所有请求前执行
                g.user_start_time = time.time()

            @user_bp.after_request
            def after_user_request(response):
                # 在用户蓝图所有请求后执行
                execution_time = time.time() - g.user_start_time
                response.headers['X-Execution-Time'] = str(execution_time)
                return response

            @user_bp.teardown_request
            def teardown_user_request(exception):
                # 请求清理
                pass
        c.应用级钩子
            @app.before_request
            def before_request():
                # 在所有请求前执行
                pass
    c.蓝图上下文处理
        a.蓝图上下文处理器
            @user_bp.context_processor
            def inject_user_vars():
                return {'user_name': 'John Doe', 'user_role': 'admin'}

            @user_bp.app_context_processor
            def inject_global_vars():
                return {'site_name': 'My Flask App'}
        b.上下文数据使用
            @user_bp.route('/dashboard')
            def dashboard():
                # 在模板中可以直接使用 user_name, user_role, site_name
                return render_template('dashboard.html')

06.蓝图最佳实践
    a.项目结构设计
        a.推荐目录结构
            myapp/
            ├── app/
            │   ├── __init__.py          # 工厂函数
            │   ├── models.py            # 数据模型
            │   ├── extensions.py        # 扩展实例
            │   ├── main/                # 主应用蓝图
            │   │   ├── __init__.py
            │   │   ├── forms.py
            │   │   └── views.py
            │   ├── admin/               # 管理蓝图
            │   │   ├── __init__.py
            │   │   └── views.py
            │   └── api/                 # API蓝图
            │       ├── __init__.py
            │       └── views.py
            ├── migrations/               # 数据库迁移
            ├── tests/                   # 测试文件
            └── config.py                # 配置文件
        b.模块初始化
            # app/__init__.py
            from flask import Flask
            from .extensions import db
            from .main import bp as main_bp
            from .admin import bp as admin_bp
            from .api import bp as api_bp

            def create_app(config_object='config.Development'):
                app = Flask(__name__)
                app.config.from_object(config_object)

                db.init_app(app)

                app.register_blueprint(main_bp)
                app.register_blueprint(admin_bp, url_prefix='/admin')
                app.register_blueprint(api_bp, url_prefix='/api')

                return app
    b.性能优化策略
        a.延迟加载
            def register_blueprints(app):
                # 延迟导入和注册蓝图
                from .admin.views import bp as admin_bp
                app.register_blueprint(admin_bp, url_prefix='/admin')
        b.路由优化
            # 使用路由缓存
            app.url_map._rules_by_endpoint.clear()
            app.url_map.update()
    c.开发调试支持
        a.蓝图调试配置
            if app.debug:
                app.config['TEMPLATES_AUTO_RELOAD'] = True
                app.jinja_env.auto_reload = True
        b.蓝图性能监控
            @user_bp.before_request
            def monitor_request():
                g.start_time = time.time()

            @user_bp.after_request
            def log_request(response):
                duration = time.time() - g.start_time
                app.logger.info(f'Request took {duration:.3f}s')
                return response

2.5 上下文管理

01.上下文基础概念
    a.上下文定义
        上下文是存储请求和应用相关数据的机制
        提供线程安全的数据访问
        支持数据的生命周期管理
        确保多请求环境下的数据隔离
    b.上下文类型
        应用上下文:存储应用级别数据
        请求上下文:存储请求相关数据
        上下文栈:管理多个上下文实例
        上下文代理:提供全局访问接口
    c.上下文作用
        全局对象的线程安全访问
        请求和应用数据的临时存储
        资源管理和清理
        配置和状态数据的共享

02.应用上下文详解
    a.current_app对象
        a.基本访问方式
            from flask import current_app

            @app.route('/app-info')
            def app_info():
                return {
                    'name': current_app.name,
                    'debug': current_app.debug,
                    'config': dict(current_app.config)
                }
        b.应用配置访问
            @app.route('/db-config')
            def db_config():
                return {
                    'database_uri': current_app.config.get('DATABASE_URI'),
                    'pool_size': current_app.config.get('POOL_SIZE')
                }
        c.应用方法调用
            @app.route('/create-report')
            def create_report():
                # 使用应用实例的方法
                with current_app.open_resource('templates/report.html') as f:
                    return f.read()
    b.g对象详解
        a.数据存储和传递
            @app.before_request
            def load_user_data():
                g.user_id = session.get('user_id')
                g.user_agent = request.headers.get('User-Agent')
                g.request_start = time.time()

            @app.route('/profile')
            def profile():
                if g.user_id:
                    user = User.query.get(g.user_id)
                    return f'Welcome {user.name}'
                return 'Please login'
        b.临时数据管理
            @app.route('/process-data')
            def process_data():
                g.processing_data = {'step1': 'completed', 'step2': 'in_progress'}

                # 在其他函数中使用g对象数据
                result = process_step2()

                return result

            def process_step2():
                return {'data': g.processing_data, 'timestamp': time.time()}
    c.应用上下文生命周期
        a.手动创建上下文
            def init_database():
                with app.app_context():
                    # 在应用上下文中执行
                    db.create_all()
                    print('Database initialized')
        b.上下文验证
            def safe_operation():
                try:
                    with app.app_context():
                        # 确保在应用上下文中
                        current_app.logger.info('Operation started')
                        # 执行操作
                except Exception as e:
                    current_app.logger.error(f'Operation failed: {e}')

03.请求上下文详解
    a.request对象
        a.请求数据访问
            @app.route('/request-info')
            def request_info():
                return {
                    'method': request.method,
                    'url': request.url,
                    'path': request.path,
                    'args': dict(request.args),
                    'form': dict(request.form),
                    'json': request.get_json(),
                    'headers': dict(request.headers)
                }
        b.文件上传处理
            @app.route('/upload', methods=['POST'])
            def upload_file():
                if 'file' not in request.files:
                    return 'No file part'

                file = request.files['file']
                if file.filename:
                    filename = secure_filename(file.filename)
                    file.save(f'uploads/{filename}')
                    return f'File {filename} uploaded successfully'
            return 'No selected file'
        c.请求头和参数处理
            @app.route('/api/data')
            def api_data():
                api_key = request.headers.get('X-API-Key')
                content_type = request.headers.get('Content-Type')
                user_id = request.args.get('user_id')

                return {
                    'api_key': api_key,
                    'content_type': content_type,
                    'user_id': user_id
                }
    b.session对象
        a.会话数据操作
            @app.route('/login', methods=['POST'])
            def login():
                username = request.form.get('username')
                if authenticate_user(username):
                    session['user_id'] = get_user_id(username)
                    session['username'] = username
                    session['login_time'] = time.time()
                    return 'Login successful'
                return 'Login failed'
        b.会话管理
            @app.route('/logout')
            def logout():
                session.pop('user_id', None)
                session.pop('username', None)
                session.clear()  # 清除所有会话数据
                return 'Logged out'
        c.会话安全配置
            app.config['SESSION_COOKIE_SECURE'] = True      # HTTPS only
            app.config['SESSION_COOKIE_HTTPONLY'] = True    # 防止 XSS
            app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'   # CSRF 保护
            app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=1)

04.上下文栈机制
    a.LocalStack实现
        a.基础概念
            from werkzeug.local import LocalStack

            # Flask内部使用LocalStack管理上下文
            # 每个线程都有独立的上下文栈
        b.手动上下文操作
            def test_with_context():
                with app.app_context():
                    # 当前上下文在栈顶
                    print(current_app.name)

                    with app.test_request_context():
                        # 请求上下文推入栈顶
                        print(request.method)
                        print(current_app.name)

                    # 请求上下文弹出,应用上下文仍在栈顶
                    print(current_app.name)
        c.上下文嵌套
            def nested_contexts():
                with app.app_context():
                    with app.test_request_context():
                        # 深层嵌套上下文
                        pass  # 内部操作
                # 上下文自动弹出
    b.上下文代理机制
        a.代理对象访问
            # current_app 和 request 实际上是代理对象
            from flask import current_app, request, g

            # 代理对象会自动指向当前激活的上下文
            def get_app_info():
                return current_app.config  # 自动获取当前应用
        b.延迟加载特性
            def check_context():
                # 只有实际访问时才会获取上下文
                try:
                    # 此时如果不在上下文中会抛出 RuntimeError
                    print(current_app.name)
                except RuntimeError as e:
                    print(f"Context error: {e}")
    c.多应用上下文
        a.多应用支持
            app1 = Flask('app1')
            app2 = Flask('app2')

            def handle_request(request_data, app_name):
                if app_name == 'app1':
                    app = app1
                else:
                    app = app2

                with app.app_context():
                    with app.test_request_context():
                        # 处理请求
                        return current_app.name
        b.上下文隔离
            def test_isolation():
                with app1.app_context():
                    app1_var = 'App1 data'

                with app2.app_context():
                    app2_var = 'App2 data'
                    # 在这里只能访问 app2 的上下文
                    print(current_app.name)  # 输出 'app2'

05.上下文生命周期
    a.创建阶段
        a.请求处理流程
            @app.before_request
            def setup_context():
                g.start_time = time.time()
                g.request_id = str(uuid.uuid4())
                current_app.logger.info(f"Request {g.request_id} started")
        b.上下文初始化
            def init_request_context():
                with app.test_request_context():
                    # 模拟上下文创建
                    print("Context created")

                    # 初始化数据
                    g.user_agent = "Test Agent"
                    g.ip_address = "127.0.0.1"
    b.激活阶段
        a.上下文数据访问
            @app.route('/data')
            def get_data():
                # 在激活阶段可以安全访问所有上下文数据
                return {
                    'request_id': g.request_id,
                    'start_time': g.start_time,
                    'user_agent': g.user_agent,
                    'app_name': current_app.name
                }
        b.上下文修改
            @app.route('/update-context')
            def update_context():
                g.new_data = "Updated at " + str(time.time())
                session['last_access'] = time.time()
                return "Context updated"
    c.销毁阶段
        a.清理资源
            @app.teardown_appcontext
            def cleanup_appcontext(exception):
                # 应用上下文销毁时的清理
                current_app.logger.info("App context teardown")
                # 清理资源
                pass

            @app.teardown_request
            def cleanup_request(exception):
                # 请求上下文销毁时的清理
                duration = time.time() - g.start_time
                current_app.logger.info(f"Request completed in {duration:.3f}s")
                # 记录请求结束
                pass
        b.异常处理
            @app.teardown_appcontext
            def handle_teardown_error(exception):
                if exception:
                    current_app.logger.error(f"Context teardown error: {exception}")
                # 清理工作,无论是否有异常
                pass

06.高级上下文操作
    a.手动上下文管理
        a.脚本中的上下文
            def init_database():
                with app.app_context():
                    from models import User, Post
                    db.create_all()

                    # 创建初始数据
                    admin = User(username='admin', email='admin@example.com')
                    db.session.add(admin)
                    db.session.commit()
        b.测试上下文
            def test_user_creation():
                with app.test_client() as client:
                    with app.app_context():
                        # 测试环境下的上下文
                        user = User(username='testuser', email='test@example.com')
                        db.session.add(user)
                        db.session.commit()

                        assert User.query.count() == 1
        c.命令行工具上下文
            import click
            from flask import current_app

            @click.command()
            @with_appcontext
            def init_db():
                """Initialize the database."""
                db.create_all()
                click.echo('Initialized the database.')
    b.上下文测试策略
        a.上下文隔离测试
            def test_context_isolation():
                with app.app_context():
                    app_config = current_app.config['TESTING']

                with app.test_request_context():
                    request_data = request.args.get('test', 'default')

                # 测试上下文已经销毁
                try:
                    print(request.args)  # 会抛出 RuntimeError
                except RuntimeError:
                    pass  # 预期的错误
        b.上下文数据验证
            def test_context_data():
                with app.test_request_context(query_string={'user': 'alice'}):
                    assert request.args['user'] == 'alice'
                    assert g.get('test_data') is None

                    g.test_data = 'test value'

                # 上下文外无法访问
                assert g.get('test_data') is None
    c.上下文性能优化
        a.上下文重用
            from contextlib import contextmanager

            @contextmanager
            def request_context_cache():
                """缓存请求上下文以提高性能"""
                with app.test_request_context() as ctx:
                    yield ctx

            def batch_process():
                with request_context_cache():
                    # 批量操作重用上下文
                    for item in large_dataset:
                        process_item(item)
        b.上下文监控
            def monitor_context_performance():
                @app.before_request
                def start_timing():
                    g.context_start = time.time()

                @app.teardown_request
                def end_timing(exception):
                    duration = time.time() - g.context_start
                    if duration > 1.0:  # 超过1秒的请求
                        current_app.logger.warning(f"Slow request: {duration:.3f}s")

2.6 配置系统

01.配置对象体系
    a.Config类详解
        a.基本属性和操作
            app = Flask(__name__)

            # 配置访问
            app.config['DEBUG'] = True
            app.config['SECRET_KEY'] = 'my-secret-key'
            print(app.config['DEBUG'])  # True

            # 配置迭代
            for key, value in app.config.items():
                print(f"{key}: {value}")
        b.配置项类型支持
            app.config.update({
                'DEBUG': True,                    # 布尔值
                'PORT': 5000,                     # 整数
                'DATABASE_URI': 'sqlite:///app.db',  # 字符串
                'API_TIMEOUT': 30.5,              # 浮点数
                'ALLOWED_HOSTS': ['localhost', '127.0.0.1'],  # 列表
                'RETRY_ATTEMPTS': 3               # 字典
            })
        c.配置验证
            def validate_config():
                required_keys = ['SECRET_KEY', 'DATABASE_URI']
                for key in required_keys:
                    if key not in app.config:
                        raise ValueError(f"Missing required config: {key}")

                if len(app.config['SECRET_KEY']) < 16:
                    raise ValueError("SECRET_KEY too short")
    b.配置方法接口
        a.from_object方法
            class DevelopmentConfig:
                DEBUG = True
                SECRET_KEY = 'dev-secret-key'
                DATABASE_URI = 'sqlite:///dev.db'

            class ProductionConfig:
                DEBUG = False
                SECRET_KEY = os.environ.get('SECRET_KEY')
                DATABASE_URI = os.environ.get('DATABASE_URL')

            app.config.from_object(DevelopmentConfig)
        b.from_pyfile方法
            # config.py 文件
            # DEBUG = True
            # SECRET_KEY = 'config-secret'
            # DATABASE_URI = 'sqlite:///config.db'

            app.config.from_pyfile('config.py')
        c.from_json方法
            # config.json 文件
            # {
            #   "DEBUG": true,
            #   "SECRET_KEY": "json-secret",
            #   "DATABASE_URI": "sqlite:///json.db"
            # }

            app.config.from_json('config.json')
        d.from_envvar方法
            # 设置环境变量
            # export APP_CONFIG_SETTINGS="/path/to/settings.py"
            app.config.from_envvar('APP_CONFIG_SETTINGS')
    c.配置属性操作
        a.字典式操作
            # 添加配置
            app.config['NEW_SETTING'] = 'value'

            # 检查存在性
            if 'DEBUG' in app.config:
                print('Debug mode is enabled')

            # 获取配置,带默认值
            timeout = app.config.get('TIMEOUT', 30)
        b.配置更新
            # 批量更新
            new_config = {
                'DEBUG': False,
                'LOG_LEVEL': 'INFO'
            }
            app.config.update(new_config)
        c.配置继承
            class BaseConfig:
                DEBUG = False
                SECRET_KEY = 'base-secret'

            class DevelopmentConfig(BaseConfig):
                DEBUG = True
                DATABASE_URI = 'sqlite:///dev.db'

            app.config.from_object(DevelopmentConfig)

02.环境配置管理
    a.开发环境配置
        a.config/development.py
            class DevelopmentConfig:
                DEBUG = True
                TESTING = False

                # 开发数据库
                SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'
                SQLALCHEMY_ECHO = True

                # 开发服务器
                HOST = '127.0.0.1'
                PORT = 5000

                # 开发安全设置
                SECRET_KEY = 'dev-secret-key-change-in-production'

                # 开发日志
                LOG_LEVEL = 'DEBUG'
                LOG_TO_STDOUT = True
        b.配置应用
            def create_development_app():
                app = Flask(__name__)
                app.config.from_object('config.development.DevelopmentConfig')
                return app
        c.开发环境特性
            with app.app_context():
                print(f"Debug mode: {app.config['DEBUG']}")
                print(f"Database: {app.config['SQLALCHEMY_DATABASE_URI']}")
                print(f"Log level: {app.config['LOG_LEVEL']}")
    b.测试环境配置
        a.config/testing.py
            import tempfile
            import os

            class TestingConfig:
                TESTING = True
                DEBUG = True

                # 内存数据库
                SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
                SQLALCHEMY_ECHO = False

                # 测试专用设置
                WTF_CSRF_ENABLED = False  # 禁用CSRF用于测试
                SERVER_NAME = 'localhost.localdomain'

                # 临时文件路径
                UPLOADS_DEFAULT_DEST = tempfile.mkdtemp()

                # 测试日志
                LOG_LEVEL = 'ERROR'
        b.测试应用创建
            def create_test_app():
                app = Flask(__name__)
                app.config.from_object('config.testing.TestingConfig')
                return app
        c.测试环境验证
            def test_config_validation():
                app = create_test_app()
                with app.app_context():
                    assert app.config['TESTING'] is True
                    assert app.config['SQLALCHEMY_DATABASE_URI'].startswith('sqlite://')
                    print("Test configuration validated successfully")
    c.生产环境配置
        a.config/production.py
            import os

            class ProductionConfig:
                DEBUG = False
                TESTING = False

                # 生产数据库
                SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
                SQLALCHEMY_ECHO = False
                SQLALCHEMY_POOL_SIZE = 10
                SQLALCHEMY_POOL_TIMEOUT = 30

                # 生产安全设置
                SECRET_KEY = os.environ.get('SECRET_KEY')
                SESSION_COOKIE_SECURE = True
                SESSION_COOKIE_HTTPONLY = True
                SESSION_COOKIE_SAMESITE = 'Lax'

                # 生产日志
                LOG_LEVEL = 'WARNING'
                LOG_FILE = '/var/log/flask/app.log'

                # 性能设置
                SEND_FILE_MAX_AGE_DEFAULT = 31536000  # 1年
        b.生产环境应用
            def create_production_app():
                app = Flask(__name__)
                app.config.from_object('config.production.ProductionConfig')

                # 验证必要的环境变量
                required_vars = ['SECRET_KEY', 'DATABASE_URL']
                missing_vars = [var for var in required_vars if not os.environ.get(var)]
                if missing_vars:
                    raise ValueError(f"Missing environment variables: {missing_vars}")

                return app
        d.生产环境监控
            def setup_production_logging(app):
                import logging
                from logging.handlers import RotatingFileHandler

                file_handler = RotatingFileHandler(
                    app.config['LOG_FILE'],
                    maxBytes=10240000,  # 10MB
                    backupCount=10
                )
                file_handler.setFormatter(logging.Formatter(
                    '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
                ))
                file_handler.setLevel(logging.INFO)
                app.logger.addHandler(file_handler)

03.配置加载策略
    a.配置工厂模式
        a.配置工厂
            class ConfigFactory:
                @staticmethod
                def create_config(config_name):
                    config_map = {
                        'development': DevelopmentConfig,
                        'testing': TestingConfig,
                        'production': ProductionConfig
                    }

                    if config_name not in config_map:
                        raise ValueError(f"Unknown config: {config_name}")

                    return config_map[config_name]()
        b.使用工厂
            def create_app(config_name=None):
                if config_name is None:
                    config_name = os.environ.get('FLASK_ENV', 'development')

                app = Flask(__name__)
                config = ConfigFactory.create_config(config_name)
                app.config.from_object(config)
                return app
        c.动态配置加载
            app = create_app(config_name='production')  # 从环境变量或默认
    b.配置文件结构
        a.推荐目录结构
            config/
            ├── __init__.py
            ├── base.py           # 基础配置
            ├── development.py    # 开发环境
            ├── testing.py        # 测试环境
            ├── production.py     # 生产环境
            └── defaults.py       # 默认值
        b.基础配置类
            # config/base.py
            import os
            from datetime import timedelta

            class BaseConfig:
                SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key'
                PERMANENT_SESSION_LIFETIME = timedelta(days=7)

                # 数据库配置
                SQLALCHEMY_TRACK_MODIFICATIONS = False

                # 邮件配置
                MAIL_SERVER = os.environ.get('MAIL_SERVER', 'localhost')
                MAIL_PORT = int(os.environ.get('MAIL_PORT', 587))
                MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in ['true', 'on', '1']
                MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
                MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')

                # 应用配置
                ITEMS_PER_PAGE = 20
                LANGUAGES = ['en', 'zh']
                MS_TRANSLATOR_KEY = os.environ.get('MS_TRANSLATOR_KEY')
        c.配置继承
            # config/development.py
            from .base import BaseConfig

            class DevelopmentConfig(BaseConfig):
                DEBUG = True
                SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
                    'sqlite:///' + os.path.join(os.path.dirname(__file__), '..', 'dev.db')

                # 开发专用
                TEMPLATES_AUTO_RELOAD = True
                SEND_FILE_MAX_AGE_DEFAULT = 0
    c.配置优先级
        a.加载顺序示例
            def load_app_config(app):
                # 1. 默认配置
                app.config.from_object('config.defaults.DefaultConfig')

                # 2. 配置文件
                app.config.from_pyfile('config.py', silent=True)

                # 3. 环境特定配置
                env = os.environ.get('FLASK_ENV', 'development')
                app.config.from_object(f'config.{env}.{env.capitalize()}Config', silent=True)

                # 4. 环境变量(最高优先级)
                if os.environ.get('FLASK_CONFIG_FILE'):
                    app.config.from_envvar('FLASK_CONFIG_FILE')
        b.配置冲突处理
            def handle_config_conflicts(app):
                # 检查配置冲突
                if app.config['DEBUG'] and not app.config.get('TESTING'):
                    app.logger.warning("Debug mode enabled in non-testing environment")

                # 验证数据库配置
                if not app.config.get('SQLALCHEMY_DATABASE_URI'):
                    app.logger.error("Database URI not configured")
                    raise ValueError("Database configuration missing")

04.敏感信息处理
    a.环境变量管理
        a..env文件支持
            # 安装: pip install python-dotenv
            # .env 文件
            FLASK_APP=run.py
            FLASK_ENV=development
            SECRET_KEY=your-secret-key-here
            DATABASE_URL=sqlite:///app.db
            MAIL_USERNAME=your-email@example.com
            MAIL_PASSWORD=your-app-password
        b.环境变量加载
            from dotenv import load_dotenv

            # 自动加载.env文件
            load_dotenv()

            app = Flask(__name__)
            # 现在可以使用 os.environ 访问环境变量
            app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
            app.config['DATABASE_URL'] = os.environ.get('DATABASE_URL')
        c.生产环境变量
            # 使用 docker-compose.yml 或环境变量文件
            # 不要在代码中硬编码敏感信息
            def load_production_config():
                app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
                app.config['DATABASE_URL'] = os.environ.get('DATABASE_URL')
                app.config['REDIS_URL'] = os.environ.get('REDIS_URL')

                if not all([app.config['SECRET_KEY'], app.config['DATABASE_URL']]):
                    raise ValueError("Missing required environment variables")
    b.配置文件分离
        a.公共配置
            # config/common.py - 不包含敏感信息
            COMMON_CONFIG = {
                'DEBUG': False,
                'PORT': 5000,
                'HOST': '0.0.0.0',
                'TEMPLATES_AUTO_RELOAD': False
            }
        b.私有配置
            # config/private.py - 包含敏感信息,不加入版本控制
            PRIVATE_CONFIG = {
                'SECRET_KEY': 'super-secret-key',
                'DATABASE_PASSWORD': 'db-password',
                'API_KEYS': {
                    'google_maps': 'google-api-key',
                    'stripe': 'stripe-secret-key'
                }
            }
        c.配置合并
            def load_separated_config():
                # 加载公共配置
                app.config.update(COMMON_CONFIG)

                # 加载私有配置(如果存在)
                try:
                    from config.private import PRIVATE_CONFIG
                    app.config.update(PRIVATE_CONFIG)
                except ImportError:
                    app.logger.warning("Private config not found, using defaults")
    c.安全配置项
        a.密钥管理
            import secrets

            def generate_secret_key():
                """生成安全的随机密钥"""
                return secrets.token_hex(32)

            # 在应用启动时生成密钥
            if not app.config.get('SECRET_KEY'):
                app.config['SECRET_KEY'] = generate_secret_key()
                app.logger.warning("Generated new SECRET_KEY, save it for future use")
        b.数据库安全
            # 数据库连接安全配置
            app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL')
            app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
                'pool_pre_ping': True,
                'pool_recycle': 300,
                'pool_size': 10,
                'max_overflow': 20
            }
        c.文件上传安全
            # 文件上传安全配置
            app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB
            app.config['UPLOAD_EXTENSIONS'] = ['.jpg', '.png', '.gif', '.pdf']
            app.config['UPLOAD_FOLDER'] = '/var/www/uploads'

05.动态配置更新
    a.热重载机制
        a.配置监控
            import os
            from watchdog.observers import Observer
            from watchdog.events import FileSystemEventHandler

            class ConfigReloadHandler(FileSystemEventHandler):
                def on_modified(self, event):
                    if event.src_path.endswith('.py') and 'config' in event.src_path:
                        app.logger.info(f"Configuration file changed: {event.src_path}")
                        # 重新加载配置
                        reload_config()

            def setup_config_watcher():
                observer = Observer()
                observer.schedule(ConfigReloadHandler(), path='config/', recursive=True)
                observer.start()
        b.配置重新加载
            def reload_config():
                try:
                    # 重新加载配置文件
                    app.config.from_pyfile('config.py')
                    app.logger.info("Configuration reloaded successfully")
                except Exception as e:
                    app.logger.error(f"Failed to reload config: {e}")
    b.运行时配置更新
        a.配置API端点
            @app.route('/admin/config', methods=['GET', 'POST'])
            def manage_config():
                if request.method == 'GET':
                    # 返回当前配置(过滤敏感信息)
                    safe_config = {k: v for k, v in app.config.items()
                                 if 'SECRET' not in k and 'PASSWORD' not in k}
                    return jsonify(safe_config)

                elif request.method == 'POST':
                    # 更新配置(需要管理员权限)
                    if not current_user.is_admin:
                        return jsonify({'error': 'Admin access required'}), 403

                    new_config = request.get_json()
                    for key, value in new_config.items():
                        if not is_sensitive_config(key):
                            app.config[key] = value

                    return jsonify({'message': 'Configuration updated'})
        b.配置验证
            def is_sensitive_config(key):
                """检查配置项是否为敏感信息"""
                sensitive_keys = ['SECRET', 'PASSWORD', 'KEY', 'TOKEN', 'URI']
                return any(sensitive in key.upper() for sensitive in sensitive_keys)
        c.配置通知
            import redis

            def notify_config_change(key, old_value, new_value):
                """配置变更通知"""
                try:
                    r = redis.Redis(host='localhost', port=6379, db=0)
                    r.publish('config_changes', {
                        'key': key,
                        'old_value': old_value,
                        'new_value': new_value,
                        'timestamp': time.time()
                    })
                except Exception as e:
                    app.logger.error(f"Failed to notify config change: {e}")

06.配置最佳实践
    a.配置组织策略
        a.模块化配置
            # config/
            # ├── __init__.py
            # ├── database.py     # 数据库相关配置
            # ├── email.py        # 邮件配置
            # ├── security.py     # 安全配置
            # └── logging.py      # 日志配置

            # config/database.py
            DATABASE_CONFIG = {
                'development': {
                    'SQLALCHEMY_DATABASE_URI': 'sqlite:///dev.db',
                    'SQLALCHEMY_ECHO': True
                },
                'production': {
                    'SQLALCHEMY_DATABASE_URI': os.environ.get('DATABASE_URL'),
                    'SQLALCHEMY_ECHO': False,
                    'SQLALCHEMY_POOL_SIZE': 20
                }
            }
        b.配置命名规范
            # 使用大写字母和下划线
            # 按功能分组前缀
            DATABASE_URL = 'postgresql://localhost/myapp'
            DATABASE_POOL_SIZE = 20
            DATABASE_POOL_TIMEOUT = 30

            EMAIL_SERVER = 'smtp.gmail.com'
            EMAIL_PORT = 587
            EMAIL_USE_TLS = True

            CACHE_TYPE = 'redis'
            CACHE_REDIS_URL = 'redis://localhost:6379/0'
        c.配置文档化
            # config/__init__.py
            """
            配置模块文档

            开发环境配置:
                DEBUG: True/False - 调试模式开关
                SQLALCHEMY_ECHO: True/False - SQL语句日志输出

            生产环境配置:
                SECRET_KEY: str - 应用密钥(必需)
                DATABASE_URL: str - 数据库连接字符串(必需)
                LOG_LEVEL: str - 日志级别 (DEBUG/INFO/WARNING/ERROR)
            """
    b.配置验证和测试
        a.配置验证函数
            def validate_app_config(app):
                """验证应用配置的完整性"""
                errors = []

                # 必需配置项
                required_configs = ['SECRET_KEY']
                for config in required_configs:
                    if not app.config.get(config):
                        errors.append(f"Missing required config: {config}")

                # 配置格式验证
                if app.config.get('PORT'):
                    try:
                        port = int(app.config['PORT'])
                        if not (1 <= port <= 65535):
                            errors.append("PORT must be between 1 and 65535")
                    except ValueError:
                        errors.append("PORT must be a valid integer")

                # 数据库URL格式验证
                db_uri = app.config.get('SQLALCHEMY_DATABASE_URI')
                if db_uri and not db_uri.startswith(('sqlite://', 'postgresql://', 'mysql://')):
                    errors.append("Invalid database URI format")

                if errors:
                    raise ValueError("Configuration validation failed:\n" + "\n".join(errors))

                return True
        b.配置测试
            import unittest
            from config import DevelopmentConfig, ProductionConfig

            class ConfigTestCase(unittest.TestCase):
                def test_development_config(self):
                    config = DevelopmentConfig()
                    self.assertTrue(config.DEBUG)
                    self.assertTrue(config.SQLALCHEMY_ECHO)

                def test_production_config(self):
                    config = ProductionConfig()
                    self.assertFalse(config.DEBUG)
                    self.assertFalse(config.SQLALCHEMY_ECHO)
                    self.assertFalse(config.TEMPLATES_AUTO_RELOAD)

                def test_config_validation(self):
                    from app import create_app

                    app = create_app('testing')
                    with app.app_context():
                        self.assertTrue(validate_app_config(app))
    c.配置性能优化
        a.配置缓存
            from functools import lru_cache

            @lru_cache(maxsize=1)
            def get_database_config():
                """缓存数据库配置"""
                return {
                    'engine_options': app.config.get('SQLALCHEMY_ENGINE_OPTIONS', {}),
                    'pool_size': app.config.get('SQLALCHEMY_POOL_SIZE', 5)
                }
        b.延迟加载
            def get_expensive_config():
                """延迟加载昂贵配置"""
                if not hasattr(g, 'expensive_config'):
                    g.expensive_config = load_complex_configuration()
                return g.expensive_config

            @app.route('/use-config')
            def use_config():
                config = get_expensive_config()
                return jsonify(config)

3 核心组件

3.1 路由系统

01.路由定义基础
    a.基本路由装饰器
        a.简单路由定义语法
            from flask import Flask, jsonify

            app = Flask(__name__)

            # 最简单的路由定义
            @app.route('/')
            def index():
                return 'Hello, World!'

            # 带参数的路由
            @app.route('/user/<username>')
            def show_user_profile(username):
                return f'User: {username}'

            # 多参数路由
            @app.route('/post/<int:post_id>/comment/<int:comment_id>')
            def show_comment(post_id, comment_id):
                return f'Post {post_id}, Comment {comment_id}'
        b.路由参数类型转换器
            from flask import Flask

            app = Flask(__name__)

            # 内置类型转换器
            @app.route('/int/<int:user_id>')          # 整数
            def show_int(user_id):
                return f'Integer: {user_id}, type: {type(user_id)}'

            @app.route('/float/<float:price>')        # 浮点数
            def show_float(price):
                return f'Price: {price}, type: {type(price)}'

            @app.route('/path/<path:subpath>')        # 路径(包含斜杠)
            def show_path(subpath):
                return f'Subpath: {subpath}'

            @app.route('/uuid/<uuid:post_id>')        # UUID
            def show_uuid(post_id):
                return f'UUID: {post_id}'
        c.自定义类型转换器
            from werkzeug.routing import BaseConverter
            from flask import Flask

            class ListConverter(BaseConverter):
                def to_python(self, value):
                    return value.split(',')

                def to_url(self, values):
                    return ','.join(BaseConverter.to_url(value)
                                    for value in values)

            # 注册自定义转换器
            app.url_map.converters['list'] = ListConverter

            @app.route('/users/<list:username_list>')
            def show_users(username_list):
                return f'Users: {username_list}'

02.HTTP方法支持
    a.多方法路由定义
        a.GET和POST方法
            from flask import Flask, request, jsonify

            app = Flask(__name__)

            # 默认只支持GET方法
            @app.route('/api/data')
            def get_data():
                return {'message': 'GET request'}

            # 明确指定支持的方法
            @app.route('/api/users', methods=['GET', 'POST'])
            def handle_users():
                if request.method == 'POST':
                    # 处理POST请求,创建新用户
                    data = request.get_json()
                    if not data or 'username' not in data:
                        return jsonify({'error': 'Username required'}), 400

                    # 模拟创建用户
                    user = {
                        'id': 123,
                        'username': data['username'],
                        'email': data.get('email', ''),
                        'created_at': '2024-01-01'
                    }
                    return jsonify(user), 201
                else:
                    # 处理GET请求,返回用户列表
                    users = [
                        {'id': 1, 'username': 'alice'},
                        {'id': 2, 'username': 'bob'}
                    ]
                    return jsonify(users)
        b.完整RESTful API
            from flask import Flask, request, jsonify

            app = Flask(__name__)

            # 模拟数据存储
            users = {}
            next_id = 1

            # GET /users - 获取所有用户
            # POST /users - 创建新用户
            # GET /users/<id> - 获取特定用户
            # PUT /users/<id> - 更新特定用户
            # DELETE /users/<id> - 删除特定用户
            @app.route('/users', methods=['GET', 'POST'])
            @app.route('/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
            def handle_users(user_id=None):
                global next_id

                if request.method == 'GET':
                    if user_id is None:
                        # 返回所有用户
                        return jsonify(list(users.values()))
                    else:
                        # 返回特定用户
                        user = users.get(user_id)
                        if user:
                            return jsonify(user)
                        else:
                            return jsonify({'error': 'User not found'}), 404

                elif request.method == 'POST':
                    # 创建新用户
                    data = request.get_json()
                    if not data or 'username' not in data:
                        return jsonify({'error': 'Username required'}), 400

                    user = {
                        'id': next_id,
                        'username': data['username'],
                        'email': data.get('email', ''),
                        'age': data.get('age', 0),
                        'created_at': '2024-01-01'
                    }
                    users[next_id] = user
                    next_id += 1
                    return jsonify(user), 201

                elif request.method == 'PUT':
                    # 更新用户
                    user = users.get(user_id)
                    if not user:
                        return jsonify({'error': 'User not found'}), 404

                    data = request.get_json()
                    if not data:
                        return jsonify({'error': 'No data provided'}), 400

                    # 更新字段
                    user.update({
                        'username': data.get('username', user['username']),
                        'email': data.get('email', user['email']),
                        'age': data.get('age', user['age'])
                    })
                    return jsonify(user)

                elif request.method == 'DELETE':
                    # 删除用户
                    user = users.pop(user_id, None)
                    if user:
                        return jsonify({'message': 'User deleted successfully'})
                    else:
                        return jsonify({'error': 'User not found'}), 404
        c.方法验证和安全处理
            from flask import Flask, request, jsonify, abort

            app = Flask(__name__)

            @app.route('/api/secure', methods=['POST', 'PUT', 'DELETE'])
            def secure_endpoint():
                # 验证Content-Type
                if request.method in ['POST', 'PUT']:
                    if not request.is_json:
                        abort(415, description='Content-Type must be application/json')

                # 验证Authorization头
                auth_header = request.headers.get('Authorization')
                if not auth_header or not auth_header.startswith('Bearer '):
                    abort(401, description='Authorization header required')

                token = auth_header[7:]  # 去掉 "Bearer "
                if not validate_token(token):  # 假设的token验证函数
                    abort(401, description='Invalid token')

                return jsonify({'message': 'Authorized request processed'})

03.动态路由和高级匹配
    a.正则表达式路由
        a.使用werkzeug路由器
            from flask import Flask
            from werkzeug.routing import BaseConverter
            import re

            app = Flask(__name__)

            class RegexConverter(BaseConverter):
                def __init__(self, url_map, *items):
                    super(RegexConverter, self).__init__(url_map)
                    self.regex = items[0]

            # 注册正则表达式转换器
            app.url_map.converters['regex'] = RegexConverter

            # 邮箱验证路由
            @app.route('/user/<regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"):email>')
            def show_user_by_email(email):
                return f'User email: {email}'

            # 用户名验证(只允许字母和数字)
            @app.route('/profile/<regex("[a-zA-Z0-9]+"):username>')
            def show_profile(username):
                return f'Profile: {username}'

            # 年份验证(4位数字)
            @app.route('/archive/<regex("\d{4}"):year>')
            def show_archive(year):
                return f'Archive for year: {year}'
        b.复杂路由模式
            from flask import Flask, jsonify
            import re

            app = Flask(__name__)

            # 复杂的文件路径匹配
            @app.route('/files/<path:filepath>')
            def serve_file(filepath):
                # 验证文件路径安全性
                if '..' in filepath or filepath.startswith('/'):
                    return jsonify({'error': 'Invalid file path'}), 400

                # 检查文件扩展名
                allowed_extensions = {'.txt', '.pdf', '.doc', '.docx'}
                file_ext = '.' + filepath.split('.')[-1] if '.' in filepath else ''

                if file_ext not in allowed_extensions:
                    return jsonify({'error': 'File type not allowed'}), 400

                return jsonify({'file': filepath, 'extension': file_ext})

            # API版本控制路由
            @app.route('/api/v<int:version>/users/<username>')
            def api_user_version(version, username):
                if version not in [1, 2]:
                    return jsonify({'error': 'Unsupported API version'}), 400

                response_data = {
                    'version': version,
                    'username': username,
                    'data': f'User data from API v{version}'
                }

                # 根据版本返回不同格式
                if version == 1:
                    return jsonify(response_data)
                else:
                    # v2包含更多信息
                    response_data.update({
                        'created_at': '2024-01-01',
                        'last_login': '2024-01-15'
                    })
                    return jsonify(response_data)

04.路由错误处理和最佳实践
    a.404和500错误处理
        a.自定义错误页面
            from flask import Flask, render_template, jsonify, request

            app = Flask(__name__)

            # 404错误处理
            @app.errorhandler(404)
            def not_found_error(error):
                if request.path.startswith('/api/'):
                    # API请求返回JSON
                    return jsonify({
                        'error': 'Resource not found',
                        'path': request.path,
                        'method': request.method
                    }), 404
                else:
                    # 普通请求返回HTML页面
                    return render_template('404.html'), 404

            # 500错误处理
            @app.errorhandler(500)
            def internal_error(error):
                if request.path.startswith('/api/'):
                    return jsonify({
                        'error': 'Internal server error',
                        'message': 'Something went wrong on our end'
                    }), 500
                else:
                    return render_template('500.html'), 500

            # 特定异常处理
            @app.errorhandler(ValueError)
            def handle_value_error(error):
                return jsonify({'error': str(error)}), 400
        b.路由分组和版本控制
            from flask import Flask, Blueprint, jsonify

            app = Flask(__name__)

            # v1 API蓝图
            api_v1 = Blueprint('api_v1', __name__, url_prefix='/api/v1')

            @api_v1.route('/users')
            def get_users_v1():
                return jsonify([
                    {'id': 1, 'name': 'Alice'},
                    {'id': 2, 'name': 'Bob'}
                ])

            @api_v1.route('/users/<int:user_id>')
            def get_user_v1(user_id):
                return jsonify({'id': user_id, 'name': f'User {user_id}'})

            # v2 API蓝图
            api_v2 = Blueprint('api_v2', __name__, url_prefix='/api/v2')

            @api_v2.route('/users')
            def get_users_v2():
                return jsonify({
                    'users': [
                        {
                            'id': 1,
                            'name': 'Alice',
                            'email': 'alice@example.com',
                            'created_at': '2024-01-01'
                        },
                        {
                            'id': 2,
                            'name': 'Bob',
                            'email': 'bob@example.com',
                            'created_at': '2024-01-02'
                        }
                    ],
                    'total': 2
                })

            # 注册蓝图
            app.register_blueprint(api_v1)
            app.register_blueprint(api_v2)

3.2 请求处理

01.请求对象基础
    a.请求数据获取
        a.获取请求参数
            from flask import Flask, request, jsonify

            app = Flask(__name__)

            @app.route('/api/demo')
            def demo_request():
                # 获取查询字符串参数
                page = request.args.get('page', default=1, type=int)
                per_page = request.args.get('per_page', default=10, type=int)
                search = request.args.get('search', default='', type=str)

                # 获取表单数据
                username = request.form.get('username', '')
                password = request.form.get('password', '')

                # 获取JSON数据
                json_data = request.get_json() or {}
                json_username = json_data.get('username', '')

                # 获取请求头
                user_agent = request.headers.get('User-Agent', '')
                content_type = request.headers.get('Content-Type', '')

                # 获取请求方法
                method = request.method

                # 获取请求URL
                url = request.url
                base_url = request.base_url
                path = request.path

                response = {
                    'query_params': {
                        'page': page,
                        'per_page': per_page,
                        'search': search
                    },
                    'form_data': {
                        'username': username,
                        'password': '***' if password else ''
                    },
                    'json_data': json_data,
                    'headers': {
                        'User-Agent': user_agent,
                        'Content-Type': content_type
                    },
                    'request_info': {
                        'method': method,
                        'url': url,
                        'base_url': base_url,
                        'path': path
                    }
                }

                return jsonify(response)
        b.文件上传处理
            from flask import Flask, request, jsonify, safe_join
            from werkzeug.utils import secure_filename
            import os
            from datetime import datetime

            app = Flask(__name__)
            app.config['UPLOAD_FOLDER'] = 'uploads'
            app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB

            # 确保上传目录存在
            os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

            @app.route('/upload', methods=['POST'])
            def upload_file():
                # 检查是否有文件被上传
                if 'file' not in request.files:
                    return jsonify({'error': 'No file provided'}), 400

                file = request.files['file']

                # 检查文件名是否为空
                if file.filename == '':
                    return jsonify({'error': 'No file selected'}), 400

                # 检查文件类型
                allowed_extensions = {'.txt', '.pdf', '.doc', '.docx', '.jpg', '.png'}
                file_ext = os.path.splitext(file.filename).lower()

                if file_ext not in allowed_extensions:
                    return jsonify({
                        'error': f'File type {file_ext} not allowed',
                        'allowed_types': list(allowed_extensions)
                    }), 400

                # 安全处理文件名
                filename = secure_filename(file.filename)

                # 添加时间戳避免文件名冲突
                timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
                filename = f"{timestamp}_{filename}"

                # 保存文件
                try:
                    file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
                    file.save(file_path)

                    # 获取文件信息
                    file_size = os.path.getsize(file_path)

                    return jsonify({
                        'message': 'File uploaded successfully',
                        'filename': filename,
                        'size': file_size,
                        'type': file_ext,
                        'path': file_path
                    })

                except Exception as e:
                    return jsonify({
                        'error': 'Failed to save file',
                        'details': str(e)
                    }), 500

            # 多文件上传
            @app.route('/upload/multiple', methods=['POST'])
            def upload_multiple_files():
                if 'files' not in request.files:
                    return jsonify({'error': 'No files provided'}), 400

                files = request.files.getlist('files')
                uploaded_files = []
                errors = []

                for file in files:
                    if file.filename == '':
                        continue

                    try:
                        # 安全处理文件名
                        filename = secure_filename(file.filename)
                        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
                        safe_filename = f"{timestamp}_{filename}"

                        # 保存文件
                        file_path = os.path.join(app.config['UPLOAD_FOLDER'], safe_filename)
                        file.save(file_path)

                        uploaded_files.append({
                            'original_name': file.filename,
                            'saved_name': safe_filename,
                            'size': os.path.getsize(file_path)
                        })

                    except Exception as e:
                        errors.append({
                            'file': file.filename,
                            'error': str(e)
                        })

                return jsonify({
                    'uploaded': uploaded_files,
                    'errors': errors,
                    'total_uploaded': len(uploaded_files),
                    'total_errors': len(errors)
                })

02.请求验证和安全
    a.输入验证和清理
        a.基础输入验证
            from flask import Flask, request, jsonify
            import re
            from datetime import datetime

            app = Flask(__name__)

            def validate_email(email):
                """验证邮箱格式"""
                pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
                return re.match(pattern, email) is not None

            def validate_phone(phone):
                """验证手机号格式"""
                pattern = r'^1[3-9]\d{9}$'
                return re.match(pattern, phone) is not None

            def validate_password(password):
                """验证密码强度"""
                if len(password) < 8:
                    return False, "Password must be at least 8 characters"

                if not re.search(r'[A-Z]', password):
                    return False, "Password must contain at least one uppercase letter"

                if not re.search(r'[a-z]', password):
                    return False, "Password must contain at least one lowercase letter"

                if not re.search(r'\d', password):
                    return False, "Password must contain at least one digit"

                return True, "Password is valid"

            @app.route('/api/register', methods=['POST'])
            def register_user():
                data = request.get_json()

                if not data:
                    return jsonify({'error': 'No data provided'}), 400

                # 必填字段验证
                required_fields = ['username', 'email', 'password']
                for field in required_fields:
                    if field not in data or not data[field].strip():
                        return jsonify({
                            'error': f'{field} is required'
                        }), 400

                username = data['username'].strip()
                email = data['email'].strip().lower()
                password = data['password']

                # 用户名验证
                if len(username) < 3 or len(username) > 20:
                    return jsonify({
                        'error': 'Username must be between 3 and 20 characters'
                    }), 400

                if not re.match(r'^[a-zA-Z0-9_]+$', username):
                    return jsonify({
                        'error': 'Username can only contain letters, numbers, and underscores'
                    }), 400

                # 邮箱验证
                if not validate_email(email):
                    return jsonify({'error': 'Invalid email format'}), 400

                # 密码验证
                is_valid_password, password_message = validate_password(password)
                if not is_valid_password:
                    return jsonify({'error': password_message}), 400

                # 可选字段验证
                phone = data.get('phone', '').strip()
                if phone and not validate_phone(phone):
                    return jsonify({'error': 'Invalid phone number format'}), 400

                age = data.get('age')
                if age is not None:
                    try:
                        age = int(age)
                        if age < 0 or age > 150:
                            return jsonify({'error': 'Age must be between 0 and 150'}), 400
                    except ValueError:
                        return jsonify({'error': 'Age must be a valid integer'}), 400

                # 模拟用户创建
                user_data = {
                    'username': username,
                    'email': email,
                    'phone': phone,
                    'age': age,
                    'created_at': datetime.now().isoformat(),
                    'status': 'active'
                }

                return jsonify({
                    'message': 'User registered successfully',
                    'user': user_data
                }), 201
        b.XSS防护和数据清理
            from flask import Flask, request, jsonify
            import bleach
            import html

            app = Flask(__name__)

            def sanitize_html(content):
                """清理HTML内容,防止XSS攻击"""
                # 定义允许的HTML标签
                allowed_tags = ['p', 'br', 'strong', 'em', 'u', 'h1', 'h2', 'h3', 'ul', 'ol', 'li']
                allowed_attributes = {'*': ['class']}

                # 清理HTML
                clean_content = bleach.clean(
                    content,
                    tags=allowed_tags,
                    attributes=allowed_attributes,
                    strip=True
                )

                return clean_content

            def sanitize_input(text):
                """清理用户输入文本"""
                if not text:
                    return ''

                # 转义HTML特殊字符
                escaped_text = html.escape(text)

                # 移除潜在的JavaScript代码
                dangerous_patterns = [
                    r'<script[^>]*>.*?</script>',
                    r'javascript:',
                    r'vbscript:',
                    r'on\w+\s*=',
                ]

                cleaned_text = escaped_text
                for pattern in dangerous_patterns:
                    cleaned_text = re.sub(pattern, '', cleaned_text, flags=re.IGNORECASE | re.DOTALL)

                return cleaned_text.strip()

            @app.route('/api/comment', methods=['POST'])
            def add_comment():
                data = request.get_json()

                if not data or 'content' not in data:
                    return jsonify({'error': 'Comment content is required'}), 400

                raw_content = data['content']

                # 验证内容长度
                if len(raw_content) < 1:
                    return jsonify({'error': 'Comment cannot be empty'}), 400

                if len(raw_content) > 5000:
                    return jsonify({'error': 'Comment is too long (max 5000 characters)'}), 400

                # 清理用户名(如果有提供)
                username = sanitize_input(data.get('username', 'Anonymous'))

                # 清理评论内容
                if data.get('allow_html', False):
                    # 允许部分HTML标签
                    clean_content = sanitize_html(raw_content)
                else:
                    # 完全纯文本
                    clean_content = sanitize_input(raw_content)

                # 模拟保存评论
                comment = {
                    'id': 123,
                    'username': username,
                    'content': clean_content,
                    'created_at': datetime.now().isoformat(),
                    'ip_address': request.remote_addr
                }

                return jsonify({
                    'message': 'Comment added successfully',
                    'comment': comment
                }), 201

03.请求上下文管理
    a.上下文对象使用
        a.全局上下文对象
            from flask import Flask, request, g, session, jsonify
            from functools import wraps
            import time
            import uuid

            app = Flask(__name__)
            app.secret_key = 'your-secret-key-here'

            @app.before_request
            def before_request():
                """在每个请求前执行的函数"""
                g.request_start_time = time.time()
                g.request_id = str(uuid.uuid4())
                g.user_agent = request.headers.get('User-Agent', '')

                # 记录请求信息
                app.logger.info(f"Request {g.request_id} started: {request.method} {request.path}")

                # 模拟用户认证
                auth_header = request.headers.get('Authorization')
                if auth_header and auth_header.startswith('Bearer '):
                    token = auth_header[7:]
                    # 这里应该验证token,简化示例
                    g.current_user = {
                        'id': 123,
                        'username': 'demo_user',
                        'token': token
                    }
                else:
                    g.current_user = None

            @app.after_request
            def after_request(response):
                """在每个请求后执行的函数"""
                # 计算请求处理时间
                if hasattr(g, 'request_start_time'):
                    processing_time = time.time() - g.request_start_time
                    response.headers['X-Processing-Time'] = str(processing_time)

                # 添加请求ID到响应头
                if hasattr(g, 'request_id'):
                    response.headers['X-Request-ID'] = g.request_id

                # 记录响应信息
                app.logger.info(f"Request completed with status: {response.status_code}")

                return response

            def login_required(f):
                """登录验证装饰器"""
                @wraps(f)
                def decorated_function(*args, **kwargs):
                    if not g.current_user:
                        return jsonify({
                            'error': 'Authentication required',
                            'message': 'Please provide valid authentication token'
                        }), 401
                    return f(*args, **kwargs)
                return decorated_function

            @app.route('/api/profile')
            @login_required
            def get_profile():
                """获取用户资料(需要登录)"""
                # 使用g对象中的用户信息
                user = g.current_user

                # 模拟获取详细资料
                profile_data = {
                    'id': user['id'],
                    'username': user['username'],
                    'email': 'user@example.com',
                    'created_at': '2024-01-01',
                    'last_login': '2024-01-15',
                    'request_info': {
                        'request_id': g.request_id,
                        'user_agent': g.user_agent
                    }
                }

                return jsonify(profile_data)

            @app.route('/api/public-data')
            def public_data():
                """公开数据(不需要登录)"""
                # 可以访问g对象中的请求信息
                data = {
                    'message': 'This is public data',
                    'request_id': getattr(g, 'request_id', 'no-id'),
                    'is_authenticated': g.current_user is not None,
                    'timestamp': time.time()
                }

                return jsonify(data)

            @app.route('/api/session-demo')
            def session_demo():
                """会话管理演示"""
                # 使用session对象
                if 'visit_count' not in session:
                    session['visit_count'] = 0

                session['visit_count'] += 1
                session['last_visit'] = time.time()

                # 设置会话过期时间
                session.permanent = True

                return jsonify({
                    'message': 'Session demo',
                    'visit_count': session['visit_count'],
                    'last_visit': session['last_visit'],
                    'session_id': session.get('_id', 'no-id')
                })
        b.应用上下文使用
            from flask import Flask, current_app, g, jsonify
            import sqlite3
            import os

            app = Flask(__name__)

            # 数据库配置
            app.config.update({
                'DATABASE': os.path.join(app.instance_path, 'app.db'),
                'DATABASE_TIMEOUT': 30,
                'DEBUG': True
            })

            def get_db():
                """获取数据库连接"""
                if 'db' not in g:
                    # 确保实例目录存在
                    os.makedirs(app.instance_path, exist_ok=True)

                    g.db = sqlite3.connect(
                        current_app.config['DATABASE'],
                        timeout=current_app.config['DATABASE_TIMEOUT']
                    )
                    g.db.row_factory = sqlite3.Row  # 使查询结果可以按列名访问

                return g.db

            def close_db():
                """关闭数据库连接"""
                db = g.pop('db', None)
                if db is not None:
                    db.close()

            @app.teardown_appcontext
            def teardown_db(exception):
                """在应用上下文结束时关闭数据库连接"""
                close_db()

            @app.cli.command('init-db')
            def init_db_command():
                """初始化数据库的CLI命令"""
                db = get_db()

                with current_app.open_resource('schema.sql') as f:
                    db.executescript(f.read().decode('utf8'))

                current_app.logger.info('Database initialized successfully')

            @app.route('/api/users')
            def get_users():
                """获取用户列表"""
                db = get_db()

                try:
                    # 使用应用配置
                    limit = current_app.config.get('DEFAULT_LIMIT', 10)
                    limit = min(limit, 100)  # 最大限制100条

                    cursor = db.execute(
                        'SELECT id, username, email, created_at FROM users LIMIT ?',
                        (limit,)
                    )
                    users = [dict(row) for row in cursor.fetchall()]

                    return jsonify({
                        'users': users,
                        'count': len(users),
                        'limit': limit,
                        'database_path': current_app.config['DATABASE']
                    })

                except sqlite3.Error as e:
                    current_app.logger.error(f"Database error: {e}")
                    return jsonify({'error': 'Database error occurred'}), 500

            @app.route('/api/config')
            def get_config():
                """获取应用配置信息"""
                safe_config = {
                    'debug': current_app.debug,
                    'testing': current_app.testing,
                    'instance_path': current_app.instance_path,
                    'root_path': current_app.root_path,
                    'default_limit': current_app.config.get('DEFAULT_LIMIT', 10),
                    'database_timeout': current_app.config.get('DATABASE_TIMEOUT', 30)
                }

                return jsonify({
                    'app_name': current_app.name,
                    'config': safe_config
                })

3.3 响应处理

01.响应对象基础
    a.基本响应创建
        a.文本响应
            from flask import Flask, Response, jsonify, make_response
            import json

            app = Flask(__name__)

            @app.route('/text/simple')
            def simple_text():
                """简单文本响应"""
                return 'Hello, Flask!'

            @app.route('/text/html')
            def html_response():
                """HTML响应"""
                html_content = '''
                <!DOCTYPE html>
                <html>
                <head>
                    <title>Flask Demo</title>
                    <style>
                        body { font-family: Arial, sans-serif; margin: 40px; }
                        .container { max-width: 800px; margin: 0 auto; }
                        .highlight { background-color: #f0f8ff; padding: 20px; border-radius: 5px; }
                    </style>
                </head>
                <body>
                    <div class="container">
                        <h1>Welcome to Flask Demo</h1>
                        <div class="highlight">
                            <p>This is a dynamically generated HTML response from Flask.</p>
                            <p>Current time: <span id="current-time"></span></p>
                        </div>
                        <script>
                            document.getElementById('current-time').textContent = new Date().toLocaleString();
                        </script>
                    </div>
                </body>
                </html>
                '''
                return html_content

            @app.route('/text/custom-headers')
            def custom_headers_response():
                """自定义响应头"""
                response = make_response('Response with custom headers')
                response.headers['X-Custom-Header'] = 'Custom Value'
                response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
                response.headers['Pragma'] = 'no-cache'
                response.headers['Expires'] = '0'
                return response
        b.JSON响应
            @app.route('/api/data')
            def json_data():
                """简单JSON响应"""
                data = {
                    'name': 'Flask Demo',
                    'version': '1.0.0',
                    'features': ['routing', 'templating', 'request handling'],
                    'status': 'active'
                }
                return jsonify(data)

            @app.route('/api/users')
            def users_json():
                """用户列表JSON响应"""
                users = [
                    {
                        'id': 1,
                        'name': 'Alice Johnson',
                        'email': 'alice@example.com',
                        'profile': {
                            'age': 28,
                            'city': 'New York',
                            'interests': ['coding', 'music', 'travel']
                        },
                        'created_at': '2024-01-01T10:00:00Z',
                        'last_login': '2024-01-15T14:30:00Z'
                    },
                    {
                        'id': 2,
                        'name': 'Bob Smith',
                        'email': 'bob@example.com',
                        'profile': {
                            'age': 32,
                            'city': 'San Francisco',
                            'interests': ['photography', 'hiking', 'cooking']
                        },
                        'created_at': '2024-01-02T09:15:00Z',
                        'last_login': '2024-01-16T16:45:00Z'
                    }
                ]

                response_data = {
                    'users': users,
                    'pagination': {
                        'page': 1,
                        'per_page': 10,
                        'total': 2,
                        'pages': 1
                    },
                    'filters': {
                        'active_only': True,
                        'sort_by': 'created_at',
                        'order': 'desc'
                    }
                }

                return jsonify(response_data)

            @app.route('/api/error')
            def error_response():
                """错误响应"""
                error_data = {
                    'error': {
                        'code': 'VALIDATION_ERROR',
                        'message': 'Invalid input parameters',
                        'details': {
                            'field': 'email',
                            'issue': 'Invalid email format',
                            'suggestion': 'Please provide a valid email address'
                        },
                        'timestamp': '2024-01-15T10:30:00Z',
                        'request_id': 'req_123456789'
                    }
                }
                response = jsonify(error_data)
                response.status_code = 400
                return response

02.响应状态码和HTTP特性
    a.状态码管理
        a.不同状态码响应
            from flask import Flask, Response, jsonify, abort
            import json

            app = Flask(__name__)

            @app.route('/status/success')
            def success_status():
                """成功响应(200)"""
                data = {
                    'status': 'success',
                    'message': 'Operation completed successfully',
                    'data': {'result': 'completed'}
                }
                return jsonify(data), 200

            @app.route('/status/created')
            def created_status():
                """资源创建成功(201)"""
                new_resource = {
                    'id': 123,
                    'name': 'New Resource',
                    'created_at': '2024-01-15T10:00:00Z',
                    'uri': '/api/resources/123'
                }
                response = jsonify(new_resource)
                response.status_code = 201
                response.headers['Location'] = new_resource['uri']
                return response

            @app.route('/status/no-content')
            def no_content_status():
                """无内容响应(204)"""
                response = Response('', status=204)
                return response

            @app.route('/status/bad-request')
            def bad_request_status():
                """客户端错误(400)"""
                error_info = {
                    'error': 'Bad Request',
                    'message': 'The request could not be understood or was missing required parameters',
                    'validation_errors': [
                        {'field': 'username', 'message': 'Username is required'},
                        {'field': 'password', 'message': 'Password must be at least 8 characters'}
                    ]
                }
                return jsonify(error_info), 400

            @app.route('/status/unauthorized')
            def unauthorized_status():
                """未授权访问(401)"""
                response = jsonify({
                    'error': 'Unauthorized',
                    'message': 'Authentication required to access this resource',
                    'auth_required': True,
                    'login_url': '/auth/login'
                })
                response.status_code = 401
                response.headers['WWW-Authenticate'] = 'Bearer realm="Restricted area"'
                return response

            @app.route('/status/forbidden')
            def forbidden_status():
                """禁止访问(403)"""
                return jsonify({
                    'error': 'Forbidden',
                    'message': 'You do not have permission to access this resource',
                    'required_permissions': ['admin', 'read'],
                    'current_permissions': ['user']
                }), 403

            @app.route('/status/not-found')
            def not_found_status():
                """资源未找到(404)"""
                return jsonify({
                    'error': 'Not Found',
                    'message': 'The requested resource was not found',
                    'requested_path': '/status/not-found',
                    'suggestion': 'Please check the URL and try again'
                }), 404

            @app.route('/status/server-error')
            def server_error_status():
                """服务器错误(500)"""
                return jsonify({
                    'error': 'Internal Server Error',
                    'message': 'An unexpected error occurred on the server',
                    'timestamp': '2024-01-15T10:30:00Z',
                    'request_id': 'req_987654321'
                }), 500
        b.重定向响应
            @app.route('/redirect/permanent')
            def permanent_redirect():
                """永久重定向(301)"""
                from flask import redirect
                return redirect('/api/v2/users', code=301)

            @app.route('/redirect/temporary')
            def temporary_redirect():
                """临时重定向(302)"""
                from flask import redirect
                return redirect('/login', code=302)

            @app.route('/redirect/see-other')
            def see_other_redirect():
                """重定向到其他方法(303)"""
                from flask import redirect, url_for
                # 在POST处理后重定向到GET请求
                return redirect(url_for('get_resource'), code=303)

            @app.route('/redirect/not-modified')
            def not_modified_response():
                """内容未修改(304)"""
                # 通常用于缓存机制
                response = Response('', status=304)
                response.headers['ETag'] = '123456789'
                response.headers['Cache-Control'] = 'max-age=3600'
                return response

03.高级响应处理
    a.流式响应
        a.大文件下载
            from flask import Flask, Response, stream_with_context
            import os
            import mimetypes
            from pathlib import Path

            app = Flask(__name__)

            def generate_file_stream(file_path, chunk_size=8192):
                """生成文件流"""
                with open(file_path, 'rb') as file:
                    while True:
                        chunk = file.read(chunk_size)
                        if not chunk:
                            break
                        yield chunk

            @app.route('/download/file/<filename>')
            def download_file(filename):
                """文件下载响应"""
                # 安全处理文件名
                safe_filename = os.path.basename(filename)
                file_path = os.path.join('uploads', safe_filename)

                if not os.path.exists(file_path):
                    return jsonify({'error': 'File not found'}), 404

                # 获取文件信息
                file_size = os.path.getsize(file_path)
                mime_type = mimetypes.guess_type(file_path)[0] or 'application/octet-stream'

                # 创建响应
                response = Response(
                    stream_with_context(generate_file_stream(file_path)),
                    mimetype=mime_type
                )

                # 设置响应头
                response.headers['Content-Length'] = str(file_size)
                response.headers['Content-Disposition'] = f'attachment; filename="{safe_filename}"'
                response.headers['Cache-Control'] = 'no-cache'

                return response

            @app.route('/stream/data')
            def stream_data():
                """数据流响应"""
                def generate_data():
                    import time
                    import json

                    for i in range(10):
                        data = {
                            'message': f'Processing step {i + 1}',
                            'progress': (i + 1) * 10,
                            'timestamp': time.time()
                        }
                        yield f"data: {json.dumps(data)}\n\n"
                        time.sleep(1)

                    # 完成消息
                    complete_data = {
                        'message': 'Processing completed',
                        'progress': 100,
                        'timestamp': time.time()
                    }
                    yield f"data: {json.dumps(complete_data)}\n\n"

                response = Response(
                    stream_with_context(generate_data()),
                    mimetype='text/event-stream'
                )
                response.headers['Cache-Control'] = 'no-cache'
                response.headers['Connection'] = 'keep-alive'
                return response
        b.实时数据推送
            @app.route('/stream/chat')
            def chat_stream():
                """聊天流式响应"""
                def generate_chat_response():
                    import time
                    import json

                    messages = [
                        "Hello! How can I help you today?",
                        "I'm processing your request...",
                        "Let me find the information you need...",
                        "Here's what I found for you!",
                        "Is there anything else I can help with?"
                    ]

                    for i, message in enumerate(messages):
                        chunk = {
                            'id': i + 1,
                            'message': message,
                            'timestamp': time.time(),
                            'is_complete': i == len(messages) - 1
                        }
                        yield f"data: {json.dumps(chunk)}\n\n"
                        time.sleep(2)  # 模拟处理时间

                response = Response(
                    stream_with_context(generate_chat_response()),
                    mimetype='text/event-stream'
                )
                response.headers['Cache-Control'] = 'no-cache'
                response.headers['Connection'] = 'keep-alive'
                response.headers['Access-Control-Allow-Origin'] = '*'
                return response

04.响应压缩和优化
    a.Gzip压缩
        a.响应压缩配置
            from flask import Flask, Response, jsonify
            import gzip
            import io

            app = Flask(__name__)

            def compress_response(data):
                """压缩响应数据"""
                if isinstance(data, str):
                    data_bytes = data.encode('utf-8')
                else:
                    data_bytes = data

                # 创建压缩缓冲区
                buffer = io.BytesIO()
                with gzip.GzipFile(fileobj=buffer, mode='wb') as gz_file:
                    gz_file.write(data_bytes)

                return buffer.getvalue()

            @app.route('/api/compressed-data')
            def compressed_data():
                """压缩的JSON响应"""
                # 生成大量数据
                large_data = []
                for i in range(1000):
                    large_data.append({
                        'id': i,
                        'name': f'Item {i}',
                        'description': f'This is a detailed description for item {i}',
                        'metadata': {
                            'created_at': '2024-01-15T10:00:00Z',
                            'category': 'demo',
                            'tags': [f'tag_{j}' for j in range(5)]
                        }
                    })

                # 转换为JSON
                json_data = json.dumps(large_data, ensure_ascii=False, indent=2)

                # 检查客户端是否支持压缩
                accept_encoding = request.headers.get('Accept-Encoding', '')
                if 'gzip' in accept_encoding:
                    # 压缩数据
                    compressed_data = compress_response(json_data)

                    response = Response(compressed_data)
                    response.headers['Content-Encoding'] = 'gzip'
                    response.headers['Content-Type'] = 'application/json; charset=utf-8'
                    response.headers['Vary'] = 'Accept-Encoding'
                else:
                    # 不压缩
                    response = Response(json_data)
                    response.headers['Content-Type'] = 'application/json; charset=utf-8'

                return response
        b.缓存控制和优化
            @app.route('/api/cached-data')
            def cached_data():
                """带缓存控制的响应"""
                data = {
                    'message': 'This data is cacheable',
                    'cache_info': {
                        'cache_control': 'public, max-age=3600',
                        'expires': '1 hour from now',
                        'etag': 'unique-data-identifier'
                    }
                }

                response = jsonify(data)

                # 设置缓存控制头
                response.headers['Cache-Control'] = 'public, max-age=3600'
                response.headers['Expires'] = 'Wed, 15 Jan 2025 11:30:00 GMT'
                response.headers['ETag'] = 'unique-data-identifier-12345'

                return response

            @app.route('/api/no-cache-data')
            def no_cache_data():
                """不缓存的数据响应"""
                data = {
                    'message': 'This data should not be cached',
                    'timestamp': datetime.now().isoformat(),
                    'random': random.randint(1, 1000)
                }

                response = jsonify(data)

                # 禁用缓存
                response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
                response.headers['Pragma'] = 'no-cache'
                response.headers['Expires'] = '0'

                return response

3.4 模板引擎

01.Jinja2模板基础
    a.模板语法和结构
        a.基本模板语法
            <!DOCTYPE html>
            <html>
            <head>
                <title>{{ title }} - Flask Demo</title>
                <meta charset="utf-8">
                <meta name="viewport" content="width=device-width, initial-scale=1">
                <style>
                    body { font-family: Arial, sans-serif; margin: 20px; }
                    .container { max-width: 1200px; margin: 0 auto; }
                    .card { border: 1px solid #ddd; border-radius: 5px; padding: 15px; margin: 10px 0; }
                    .highlight { background-color: #f8f9fa; padding: 15px; border-left: 4px solid #007bff; }
                </style>
            </head>
            <body>
                <div class="container">
                    <header>
                        <h1>{{ title }}</h1>
                        <nav>
                            <a href="/">Home</a> |
                            <a href="/about">About</a> |
                            <a href="/contact">Contact</a>
                        </nav>
                    </header>

                    <main>
                        {% block content %}{% endblock %}
                    </main>

                    <footer>
                        <p>&copy; 2024 Flask Demo. All rights reserved.</p>
                    </footer>
                </div>
            </body>
            </html>
        b.变量和过滤器
            <!-- 变量显示示例 -->
            <div class="card">
                <h2>用户信息</h2>
                <p><strong>姓名:</strong> {{ user.name | default('匿名用户') }}</p>
                <p><strong>邮箱:</strong> {{ user.email | lower }}</p>
                <p><strong>注册时间:</strong> {{ user.created_at | dateformat('%Y-%m-%d %H:%M') }}</p>
                <p><strong>状态:</strong>
                    <span class="status-{{ user.status | lower }}">
                        {{ user.status | title }}
                    </span>
                </p>
            </div>

            <!-- 过滤器链示例 -->
            <div class="highlight">
                <h3>处理长文本</h3>
                <p>{{ long_text | striptags | truncate(100, True, '...') }}</p>
            </div>

            <!-- 列表处理 -->
            <div class="card">
                <h3>用户列表 ({{ users | length }} 个用户)</h3>
                <ul>
                    {% for user in users | sort(attribute='name') %}
                    <li>{{ user.name }} - {{ user.email | lower }}</li>
                    {% endfor %}
                </ul>
            </div>

            <!-- 条件渲染 -->
            <div class="card">
                <h3>权限显示</h3>
                {% if user.role == 'admin' %}
                <p class="admin-badge">管理员权限</p>
                {% elif user.role == 'editor' %}
                <p class="editor-badge">编辑权限</p>
                {% else %}
                <p class="user-badge">普通用户</p>
                {% endif %}
            </div>
        c.控制结构
            <!-- 循环结构 -->
            <div class="products">
                <h2>产品列表</h2>

                <!-- 简单循环 -->
                <ul>
                    {% for product in products %}
                    <li>{{ product.name }} - ${{ product.price | round(2) }}</li>
                    {% endfor %}
                </ul>

                <!-- 带索引的循环 -->
                <table class="product-table">
                    <thead>
                        <tr>
                            <th>序号</th>
                            <th>产品名</th>
                            <th>价格</th>
                            <th>库存</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for product in products %}
                        <tr class="{% if loop.index is even %}even{% else %}odd{% endif %}">
                            <td>{{ loop.index }}</td>
                            <td>{{ product.name }}</td>
                            <td>${{ product.price | round(2) }}</td>
                            <td>
                                {% if product.stock > 0 %}
                                <span class="in-stock">{{ product.stock }}</span>
                                {% else %}
                                <span class="out-of-stock">缺货</span>
                                {% endif %}
                            </td>
                        </tr>
                        {% endfor %}
                    </tbody>
                </table>

                <!-- 循环控制 -->
                {% if products %}
                <p>显示第 1-{{ products | length }} 个产品</p>
                {% else %}
                <p>暂无产品</p>
                {% endif %}
            </div>

            <!-- 条件结构 -->
            <div class="user-profile">
                {% if user %}
                <h2>{{ user.name }}的个人资料</h2>

                <!-- 复杂条件判断 -->
                {% if user.age < 18 %}
                <p class="minor">未成年用户</p>
                {% elif user.age >= 18 and user.age < 65 %}
                <p class="adult">成年用户</p>
                {% else %}
                <p class="senior">老年用户</p>
                {% endif %}

                <!-- 检查用户特性 -->
                {% if user.is_verified %}
                <span class="verified-badge">✓ 已认证</span>
                {% endif %}

                {% if user.premium %}
                <span class="premium-badge">⭐ 高级会员</span>
                {% endif %}

                {% else %}
                <p>用户未登录</p>
                <a href="/login" class="login-btn">请登录</a>
                {% endif %}
            </div>
        d.模板继承
            <!-- base.html -->
            <!DOCTYPE html>
            <html lang="zh-CN">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>{% block title %}Flask Demo{% endblock %}</title>

                <!-- CSS -->
                {% block styles %}
                <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
                <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
                {% endblock %}
            </head>
            <body>
                <!-- 导航栏 -->
                <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
                    <div class="container">
                        <a class="navbar-brand" href="/">Flask Demo</a>

                        <div class="navbar-nav">
                            <a class="nav-link" href="/">首页</a>
                            <a class="nav-link" href="/about">关于</a>
                            <a class="nav-link" href="/contact">联系我们</a>
                        </div>

                        <!-- 用户菜单 -->
                        {% if current_user %}
                        <div class="user-menu">
                            <span class="navbar-text">
                                欢迎,{{ current_user.name }}
                            </span>
                            <a href="/logout" class="btn btn-outline-light btn-sm">退出</a>
                        </div>
                        {% else %}
                        <div class="auth-menu">
                            <a href="/login" class="btn btn-outline-light btn-sm">登录</a>
                            <a href="/register" class="btn btn-light btn-sm">注册</a>
                        </div>
                        {% endif %}
                    </div>
                </nav>

                <!-- 消息提示 -->
                {% with messages = get_flashed_messages(with_categories=true) %}
                    {% if messages %}
                        <div class="container mt-3">
                            {% for category, message in messages %}
                            <div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show" role="alert">
                                {{ message }}
                                <button type="button" class="close" data-dismiss="alert">
                                    <span>&times;</span>
                                </button>
                            </div>
                            {% endfor %}
                        </div>
                    {% endif %}
                {% endwith %}

                <!-- 主要内容 -->
                <main class="container mt-4">
                    {% block content %}{% endblock %}
                </main>

                <!-- 页脚 -->
                <footer class="bg-light text-center py-3 mt-5">
                    <div class="container">
                        <p>&copy; 2024 Flask Demo. {% block footer %}{% endblock %}</p>
                    </div>
                </footer>

                <!-- JavaScript -->
                {% block scripts %}
                <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
                <script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script>
                {% endblock %}

                <!-- 页面特定的脚本 -->
                {% block page_scripts %}{% endblock %}
            </body>
            </html>

            <!-- home.html -->
            {% extends "base.html" %}

            {% block title %}首页 - Flask Demo{% endblock %}

            {% block content %}
            <div class="hero-section text-center py-5 bg-light">
                <h1 class="display-4">欢迎来到 Flask Demo</h1>
                <p class="lead">这是一个展示 Flask 框架功能的演示网站</p>
                <a href="/about" class="btn btn-primary btn-lg">了解更多</a>
            </div>

            <div class="features-section py-5">
                <div class="row">
                    {% for feature in features %}
                    <div class="col-md-4 mb-4">
                        <div class="card h-100">
                            <div class="card-body text-center">
                                <h3 class="card-title">{{ feature.title }}</h3>
                                <p class="card-text">{{ feature.description }}</p>
                                <a href="{{ feature.link }}" class="btn btn-outline-primary">查看详情</a>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>

            <div class="recent-posts-section py-5">
                <h2 class="text-center mb-4">最新文章</h2>
                <div class="row">
                    {% for post in posts %}
                    <div class="col-md-6 mb-4">
                        <div class="card">
                            <div class="card-body">
                                <h5 class="card-title">{{ post.title }}</h5>
                                <p class="card-text">{{ post.summary | truncate(100) }}</p>
                                <small class="text-muted">
                                    发布于 {{ post.created_at | dateformat('%Y-%m-%d') }}
                                    by {{ post.author.name }}
                                </small>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
            {% endblock %}

            {% block page_scripts %}
            <script>
                // 首页特定的JavaScript
                $(document).ready(function() {
                    console.log('Home page loaded');
                    // 可以添加更多交互功能
                });
            </script>
            {% endblock %}

02.高级模板功能
    a.宏和包含
        a.自定义宏定义
            <!-- macros.html -->
            {% macro render_field(field, label_class='', field_class='') %}
            <div class="form-group mb-3">
                <label for="{{ field.id }}" class="form-label {{ label_class }}">
                    {{ field.label.text }}
                    {% if field.flags.required %}
                    <span class="text-danger">*</span>
                    {% endif %}
                </label>

                {{ field(class=field_class + ' form-control' + (' is-invalid' if field.errors else '')) }}

                {% if field.description %}
                <small class="form-text text-muted">{{ field.description }}</small>
                {% endif %}

                {% if field.errors %}
                {% for error in field.errors %}
                <div class="invalid-feedback">{{ error }}</div>
                {% endfor %}
                {% endif %}
            </div>
            {% endmacro %}

            {% macro render_pagination(pagination, endpoint) %}
            <nav aria-label="Page navigation">
                <ul class="pagination justify-content-center">
                    {% if pagination.has_prev %}
                    <li class="page-item">
                        <a class="page-link" href="{{ url_for(endpoint, page=pagination.prev_num) }}">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                    {% else %}
                    <li class="page-item disabled">
                        <span class="page-link"><span aria-hidden="true">&laquo;</span></span>
                    </li>
                    {% endif %}

                    {% for page_num in pagination.iter_pages() %}
                        {% if page_num %}
                            {% if page_num != pagination.page %}
                            <li class="page-item">
                                <a class="page-link" href="{{ url_for(endpoint, page=page_num) }}">{{ page_num }}</a>
                            </li>
                            {% else %}
                            <li class="page-item active">
                                <span class="page-link">{{ page_num }}</span>
                            </li>
                            {% endif %}
                        {% else %}
                        <li class="page-item disabled">
                            <span class="page-link">…</span>
                        </li>
                        {% endif %}
                    {% endfor %}

                    {% if pagination.has_next %}
                    <li class="page-item">
                        <a class="page-link" href="{{ url_for(endpoint, page=pagination.next_num) }}">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                    {% else %}
                    <li class="page-item disabled">
                        <span class="page-link"><span aria-hidden="true">&raquo;</span></span>
                    </li>
                    {% endif %}
                </ul>
            </nav>
            {% endmacro %}

            {% macro user_card(user, show_details=False) %}
            <div class="card user-card mb-3">
                <div class="card-body">
                    <div class="row align-items-center">
                        <div class="col-auto">
                            <img src="{{ user.avatar or url_for('static', filename='img/default-avatar.png') }}"
                                 class="rounded-circle avatar"
                                 alt="{{ user.name }}"
                                 width="50" height="50">
                        </div>
                        <div class="col">
                            <h5 class="card-title mb-0">{{ user.name }}</h5>
                            <p class="card-text text-muted mb-0">{{ user.email }}</p>
                            {% if show_details %}
                            <small class="text-muted">
                                加入于 {{ user.created_at | dateformat('%Y-%m-%d') }}
                            </small>
                            {% endif %}
                        </div>
                        <div class="col-auto">
                            {% if user.is_online %}
                            <span class="badge bg-success">在线</span>
                            {% else %}
                            <span class="bg-secondary badge">离线</span>
                            {% endif %}
                        </div>
                    </div>
                </div>
            </div>
            {% endmacro %}

            <!-- 使用宏的模板 -->
            {% from "macros.html" import render_field, render_pagination, user_card %}

            <form method="POST" action="">
                {{ form.hidden_tag() }}

                {{ render_field(form.username, field_class="form-control-lg") }}
                {{ render_field(form.email, field_class="") }}
                {{ render_field(form.password, field_class="") }}
                {{ render_field(form.confirm_password, field_class="") }}

                <div class="form-group">
                    <button type="submit" class="btn btn-primary">注册</button>
                </div>
            </form>

            <!-- 用户列表 -->
            <div class="user-list">
                {% for user in users %}
                {{ user_card(user, show_details=True) }}
                {% endfor %}
            </div>

            <!-- 分页 -->
            {{ render_pagination(pagination, 'users.list') }}
        b.模板包含
            <!-- navbar.html -->
            <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
                <div class="container">
                    <a class="navbar-brand" href="/">
                        <img src="{{ url_for('static', filename='img/logo.png') }}"
                             height="30" class="d-inline-block align-top" alt="Logo">
                        Flask Demo
                    </a>

                    <button class="navbar-toggler" type="button" data-toggle="collapse"
                            data-target="#navbarNav" aria-controls="navbarNav"
                            aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>

                    <div class="collapse navbar-collapse" id="navbarNav">
                        <ul class="navbar-nav mr-auto">
                            {% for item in nav_items %}
                            <li class="nav-item {% if item.active %}active{% endif %}">
                                <a class="nav-link" href="{{ item.url }}">
                                    {{ item.label }}
                                    {% if item.active %}<span class="sr-only">(current)</span>{% endif %}
                                </a>
                            </li>
                            {% endfor %}
                        </ul>

                        <ul class="navbar-nav">
                            {% if current_user %}
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" href="#" id="userDropdown"
                                   role="button" data-toggle="dropdown" aria-haspopup="true"
                                   aria-expanded="false">
                                    {{ current_user.name }}
                                </a>
                                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="userDropdown">
                                    <a class="dropdown-item" href="/profile">个人资料</a>
                                    <a class="dropdown-item" href="/settings">设置</a>
                                    <div class="dropdown-divider"></div>
                                    <a class="dropdown-item" href="/logout">退出登录</a>
                                </div>
                            </li>
                            {% else %}
                            <li class="nav-item">
                                <a class="nav-link" href="/login">登录</a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link" href="/register">注册</a>
                            </li>
                            {% endif %}
                        </ul>
                    </div>
                </div>
            </nav>

            <!-- 使用包含的模板 -->
            {% include "navbar.html" %}

            <div class="container">
                <div class="row">
                    <div class="col-md-8">
                        <main>
                            {% block content %}{% endblock %}
                        </main>
                    </div>
                    <div class="col-md-4">
                        <!-- 侧边栏 -->
                        {% include "sidebar.html" %}
                    </div>
                </div>
            </div>

            {% include "footer.html" %}

3.5 静态文件管理

01.静态文件基础配置
    a.静态文件目录结构
        a.标准目录结构
            project/
            ├── app.py
            ├── static/
            │   ├── css/
            │   │   ├── main.css
            │   │   ├── bootstrap.min.css
            │   │   └── components/
            │   │       ├── navbar.css
            │   │       └── sidebar.css
            │   ├── js/
            │   │   ├── main.js
            │   │   ├── jquery.min.js
            │   │   ├── bootstrap.bundle.min.js
            │   │   └── modules/
            │   │       ├── api.js
            │   │       ├── utils.js
            │   │       └── charts.js
            │   ├── img/
            │   │   ├── logo.png
            │   │   ├── hero-banner.jpg
            │   │   ├── icons/
            │   │   │   ├── user.svg
            │   │   │   ├── settings.svg
            │   │   │   └── logout.svg
            │   │   └── uploads/
            │   │       ├── avatars/
            │   │       └── products/
            │   ├── fonts/
            │   │   ├── fontawesome-webfont.woff2
            │   │   └── custom-font.woff2
            │   └── docs/
            │       ├── user-guide.pdf
            │       └── api-spec.json
            └── templates/
        b.应用配置设置
            from flask import Flask, send_from_directory
            import os

            app = Flask(__name__)

            # 自定义静态文件配置
            app.config.update({
                # 静态文件目录
                'STATIC_FOLDER': 'static',
                'STATIC_URL_PATH': '/static',

                # 静态文件缓存控制
                'SEND_FILE_MAX_AGE_DEFAULT': 31536000,  # 1年

                # 开发环境下禁用缓存
                'DEBUG': True,
                'TEMPLATES_AUTO_RELOAD': True,

                # 文件上传配置
                'UPLOAD_FOLDER': 'static/uploads',
                'MAX_CONTENT_LENGTH': 16 * 1024 * 1024,  # 16MB
            })

            # 创建必要的目录
            os.makedirs(os.path.join(app.config['STATIC_FOLDER'], 'uploads'), exist_ok=True)
            os.makedirs(os.path.join(app.config['STATIC_FOLDER'], 'css'), exist_ok=True)
            os.makedirs(os.path.join(app.config['STATIC_FOLDER'], 'js'), exist_ok=True)
            os.makedirs(os.path.join(app.config['STATIC_FOLDER'], 'img'), exist_ok=True)
        c.静态文件访问示例
            from flask import Flask, render_template, url_for, send_from_directory
            import os

            app = Flask(__name__)

            @app.route('/')
            def home():
                """首页示例"""
                return render_template('home.html',
                    css_url=url_for('static', filename='css/main.css'),
                    js_url=url_for('static', filename='js/main.js'),
                    logo_url=url_for('static', filename='img/logo.png')
                )

            @app.route('/api/files')
            def list_static_files():
                """列出静态文件"""
                static_dir = app.static_folder
                files = []

                for root, dirs, filenames in os.walk(static_dir):
                    for filename in filenames:
                        rel_path = os.path.relpath(os.path.join(root, filename), static_dir)
                        file_url = url_for('static', filename=rel_path.replace('\\', '/'))

                        files.append({
                            'name': filename,
                            'path': rel_path,
                            'url': file_url,
                            'size': os.path.getsize(os.path.join(root, filename))
                        })

                return jsonify({'files': files, 'total_count': len(files)})

            @app.route('/static/uploads/<path:filename>')
            def custom_upload_serve(filename):
                """自定义上传文件服务"""
                upload_dir = os.path.join(app.static_folder, 'uploads')

                # 安全检查
                if '..' in filename or filename.startswith('/'):
                    return jsonify({'error': 'Invalid file path'}), 400

                # 检查文件是否存在
                file_path = os.path.join(upload_dir, filename)
                if not os.path.exists(file_path):
                    return jsonify({'error': 'File not found'}), 404

                # 检查文件类型
                allowed_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.pdf', '.txt'}
                file_ext = os.path.splitext(filename).lower()
                if file_ext not in allowed_extensions:
                    return jsonify({'error': 'File type not allowed'}), 403

                return send_from_directory(upload_dir, filename)

02.静态文件优化和压缩
    a.CSS和JS压缩
        a.开发环境vs生产环境
            from flask import Flask, render_template
            import os
            import gzip
            from pathlib import Path

            app = Flask(__name__)

            def is_development():
                """判断是否为开发环境"""
                return app.debug

            def get_css_url(filename):
                """获取CSS文件URL,考虑环境"""
                if is_development():
                    return url_for('static', filename=f'css/{filename}')
                else:
                    # 生产环境可以使用压缩版本
                    compressed_name = filename.replace('.css', '.min.css')
                    return url_for('static', filename=f'css/{compressed_name}')

            def get_js_url(filename):
                """获取JS文件URL,考虑环境"""
                if is_development():
                    return url_for('static', filename=f'js/{filename}')
                else:
                    # 生产环境可以使用压缩版本
                    compressed_name = filename.replace('.js', '.min.js')
                    return url_for('static', filename=f'js/{compressed_name}')

            # 模板中使用
            @app.route('/optimized')
            def optimized_page():
                return render_template('optimized.html',
                    main_css=get_css_url('main.css'),
                    app_js=get_js_url('app.js'),
                    is_dev=is_development()
                )

            <!-- optimized.html -->
            <!DOCTYPE html>
            <html>
            <head>
                <title>优化示例</title>
                <!-- 根据环境选择CSS文件 -->
                <link rel="stylesheet" href="{{ main_css }}">

                <!-- 开发环境使用单独文件,生产环境合并 -->
                {% if is_dev %}
                <link rel="stylesheet" href="{{ url_for('static', filename='css/components/navbar.css') }}">
                <link rel="stylesheet" href="{{ url_for('static', filename='css/components/sidebar.css') }}">
                {% endif %}
            </head>
            <body>
                <!-- 页面内容 -->

                <!-- 开发环境使用单独文件,生产环境合并 -->
                {% if is_dev %}
                <script src="{{ url_for('static', filename='js/modules/utils.js') }}"></script>
                <script src="{{ url_for('static', filename='js/modules/api.js') }}"></script>
                {% endif %}
                <script src="{{ app_js }}"></script>
            </body>
            </html>
        b.静态文件压缩中间件
            from flask import Flask, Response, request
            import gzip
            from io import BytesIO
            import os

            app = Flask(__name__)

            class StaticFileCompressor:
                def __init__(self, app=None):
                    self.app = app
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    app.after_request(self.compress_response)

                def compress_response(self, response):
                    """压缩响应内容"""
                    # 只压缩文本文件
                    content_type = response.headers.get('Content-Type', '')
                    if not any(ct in content_type for ct in ['text/', 'application/json', 'application/javascript']):
                        return response

                    # 检查客户端是否支持gzip
                    accept_encoding = request.headers.get('Accept-Encoding', '')
                    if 'gzip' not in accept_encoding:
                        return response

                    # 压缩内容
                    if response.data:
                        compressed_data = self.compress_data(response.data)
                        if len(compressed_data) < len(response.data):
                            # 只有在压缩后体积更小的时候才使用压缩
                            response.data = compressed_data
                            response.headers['Content-Encoding'] = 'gzip'
                            response.headers['Vary'] = 'Accept-Encoding'
                            # 更新Content-Length
                            response.headers['Content-Length'] = str(len(compressed_data))

                    return response

                def compress_data(self, data):
                    """压缩数据"""
                    buffer = BytesIO()
                    with gzip.GzipFile(fileobj=buffer, mode='wb') as gz_file:
                        gz_file.write(data)
                    return buffer.getvalue()

            # 初始化压缩中间件
            compressor = StaticFileCompressor(app)

            @app.route('/static/compress-demo.css')
            def compress_demo_css():
                """压缩演示CSS"""
                css_content = """
                body {
                    font-family: Arial, sans-serif;
                    margin: 0;
                    padding: 20px;
                    background-color: #f5f5f5;
                }

                .container {
                    max-width: 1200px;
                    margin: 0 auto;
                    background-color: white;
                    padding: 20px;
                    border-radius: 8px;
                    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
                }

                .header {
                    background-color: #333;
                    color: white;
                    padding: 20px;
                    margin: -20px -20px 20px -20px;
                    border-radius: 8px 8px 0 0;
                }

                .btn {
                    display: inline-block;
                    padding: 10px 20px;
                    background-color: #007bff;
                    color: white;
                    text-decoration: none;
                    border-radius: 4px;
                    border: none;
                    cursor: pointer;
                }

                .btn:hover {
                    background-color: #0056b3;
                }
                """

                response = Response(css_content)
                response.headers['Content-Type'] = 'text/css'
                return response

03.CDN和静态文件服务优化
    a.多CDN支持配置
        a.CDN配置管理
            from flask import Flask, current_app
            import random
            import os

            app = Flask(__name__)

            # CDN配置
            app.config['CDN_DOMAINS'] = [
                'https://cdn1.example.com',
                'https://cdn2.example.com',
                'https://cdn3.example.com'
            ]

            app.config['LOCAL_STATIC_URL'] = '/static'
            app.config['USE_CDN'] = os.environ.get('USE_CDN', 'false').lower() == 'true'

            def get_static_url(filename):
                """获取静态文件URL,支持CDN负载均衡"""
                if current_app.config['USE_CDN']:
                    # 随机选择一个CDN域名
                    cdn_domain = random.choice(current_app.config['CDN_DOMAINS'])
                    return f"{cdn_domain}/{filename}"
                else:
                    return url_for('static', filename=filename)

            # 注册为模板函数
            @app.context_processor
            def utility_processor():
                return {
                    'static_url': get_static_url,
                    'cdn_enabled': lambda: current_app.config['USE_CDN']
                }

            @app.route('/cdn-demo')
            def cdn_demo():
                """CDN演示页面"""
                return render_template('cdn_demo.html')

            <!-- cdn_demo.html -->
            <!DOCTYPE html>
            <html>
            <head>
                <title>CDN演示</title>
                <!-- CDN状态显示 -->
                {% if cdn_enabled() %}
                <meta name="cdn-status" content="enabled">
                {% else %}
                <meta name="cdn-status" content="disabled">
                {% endif %}

                <!-- 使用CDN的CSS文件 -->
                <link rel="stylesheet" href="{{ static_url('css/bootstrap.min.css') }}">
                <link rel="stylesheet" href="{{ static_url('css/main.css') }}">

                <!-- 使用CDN的字体文件 -->
                <link rel="preload" href="{{ static_url('fonts/fontawesome-webfont.woff2') }}"
                      as="font" type="font/woff2" crossorigin>
            </head>
            <body>
                <div class="container">
                    <h1>CDN静态文件演示</h1>

                    {% if cdn_enabled() %}
                    <div class="alert alert-success">
                        当前使用CDN加载静态文件
                    </div>
                    {% else %}
                    <div class="alert alert-info">
                        当前使用本地静态文件
                    </div>
                    {% endif %}

                    <!-- 使用CDN的图片 -->
                    <img src="{{ static_url('img/demo-banner.jpg') }}"
                         alt="Demo Banner" class="img-fluid">

                    <!-- CDN性能信息 -->
                    <div id="cdn-info">
                        <h3>静态文件加载信息</h3>
                        <div id="file-list">
                            <!-- JavaScript填充 -->
                        </div>
                    </div>
                </div>

                <!-- 使用CDN的JavaScript文件 -->
                <script src="{{ static_url('js/jquery.min.js') }}"></script>
                <script src="{{ static_url('js/bootstrap.bundle.min.js') }}"></script>
                <script src="{{ static_url('js/cdn-monitor.js') }}"></script>
            </body>
            </html>
        b.静态文件缓存策略
            from flask import Flask, send_from_directory, request, make_response
            import os
            import hashlib
            import time

            app = Flask(__name__)

            def get_file_hash(filepath):
                """获取文件内容的哈希值"""
                if not os.path.exists(filepath):
                    return None

                with open(filepath, 'rb') as f:
                    content = f.read()
                return hashlib.md5(content).hexdigest()[:8]

            def get_versioned_static_url(filename):
                """获取带版本号的静态文件URL"""
                filepath = os.path.join(app.static_folder, filename)
                file_hash = get_file_hash(filepath)

                if file_hash:
                    base_name, ext = os.path.splitext(filename)
                    versioned_filename = f"{base_name}.{file_hash}{ext}"
                    return url_for('static', filename=versioned_filename)
                else:
                    return url_for('static', filename=filename)

            @app.route('/static/<path:filename>')
            def serve_static_with_cache(filename):
                """带缓存控制的静态文件服务"""
                filepath = os.path.join(app.static_folder, filename)

                if not os.path.exists(filepath):
                    return jsonify({'error': 'File not found'}), 404

                # 获取文件信息
                file_stat = os.stat(filepath)
                etag = f'"{int(file_stat.st_mtime)}-{int(file_stat.st_size)}"'

                # 检查ETag
                if_none_match = request.headers.get('If-None-Match')
                if if_none_match == etag:
                    response = make_response('', 304)
                    return response

                # 检查Last-Modified
                if_modified_since = request.headers.get('If-Modified-Since')
                last_modified = file_stat.st_mtime
                if if_modified_since and last_modified <= if_modified_since:
                    response = make_response('', 304)
                    return response

                # 发送文件
                response = send_from_directory(app.static_folder, filename)

                # 设置缓存头
                file_ext = os.path.splitext(filename).lower()

                if file_ext in ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.woff', '.woff2']:
                    # 静态资源长期缓存
                    response.headers['Cache-Control'] = 'public, max-age=31536000, immutable'
                elif file_ext in ['.html', '.htm']:
                    # HTML文件短期缓存
                    response.headers['Cache-Control'] = 'public, max-age=3600'
                else:
                    # 其他文件中等缓存
                    response.headers['Cache-Control'] = 'public, max-age=86400'

                response.headers['ETag'] = etag
                response.headers['Last-Modified'] = time.strftime(
                    '%a, %d %b %Y %H:%M:%S GMT',
                    time.gmtime(last_modified)
                )

                return response

            @app.route('/versioned-static-demo')
            def versioned_static_demo():
                """版本化静态文件演示"""
                return render_template('versioned_static.html',
                    main_css=get_versioned_static_url('css/main.css'),
                    app_js=get_versioned_static_url('js/app.js'),
                    logo_url=get_versioned_static_url('img/logo.png')
                )

04.静态文件安全和管理
    a.安全访问控制
        a.访问权限控制
            from flask import Flask, send_from_directory, request, jsonify, abort
            from functools import wraps
            import os
            import secrets

            app = Flask(__name__)

            # 安全配置
            app.config['SECRET_KEY'] = 'your-very-secret-key'
            app.config['STATIC_TOKEN_EXPIRY'] = 3600  # 1小时

            # 生成安全的访问令牌
            def generate_access_token(filepath):
                """生成文件访问令牌"""
                timestamp = int(time.time())
                token_data = f"{filepath}:{timestamp}:{app.config['SECRET_KEY']}"
                token = hashlib.sha256(token_data.encode()).hexdigest()
                return f"{token}:{timestamp}"

            def verify_access_token(token, filepath):
                """验证文件访问令牌"""
                try:
                    token_hash, timestamp = token.rsplit(':', 1)
                    timestamp = int(timestamp)

                    # 检查过期时间
                    if time.time() - timestamp > app.config['STATIC_TOKEN_EXPIRY']:
                        return False

                    # 验证令牌
                    expected_data = f"{filepath}:{timestamp}:{app.config['SECRET_KEY']}"
                    expected_hash = hashlib.sha256(expected_data.encode()).hexdigest()

                    return secrets.compare_digest(token_hash, expected_hash)
                except (ValueError, AttributeError):
                    return False

            def protected_file_required(f):
                """保护文件访问的装饰器"""
                @wraps(f)
                def decorated_function(*args, **kwargs):
                    filepath = kwargs.get('filename', '')

                    # 检查是否为保护目录
                    if filepath.startswith('protected/'):
                        token = request.args.get('token')
                        if not token or not verify_access_token(token, filepath):
                            abort(403, description="Access denied: invalid or missing token")

                    return f(*args, **kwargs)
                return decorated_function

            @app.route('/static/protected/<path:filename>')
            @protected_file_required
            def serve_protected_file(filename):
                """服务受保护的静态文件"""
                protected_dir = os.path.join(app.static_folder, 'protected')

                # 安全路径检查
                safe_path = os.path.normpath(filename)
                if safe_path.startswith('..') or safe_path.startswith('/'):
                    abort(400, description="Invalid file path")

                filepath = os.path.join(protected_dir, safe_path)

                if not os.path.exists(filepath):
                    abort(404, description="File not found")

                return send_from_directory(protected_dir, safe_path)

            @app.route('/generate-access-token/<path:filename>')
            def generate_file_access_token(filename):
                """为受保护文件生成访问令牌"""
                if not filename.startswith('protected/'):
                    return jsonify({'error': 'File is not in protected directory'}), 400

                token = generate_access_token(filename)
                file_url = url_for('serve_protected_file', filename=filename, token=token)

                return jsonify({
                    'filename': filename,
                    'token': token,
                    'access_url': file_url,
                    'expires_in': app.config['STATIC_TOKEN_EXPIRY']
                })

            @app.route('/protected-demo')
            def protected_demo():
                """受保护文件访问演示"""
                protected_files = [
                    'protected/reports/annual-report-2024.pdf',
                    'protected/manuals/admin-guide.pdf',
                    'protected/data/sensitive-data.json'
                ]

                files_with_tokens = []
                for file_path in protected_files:
                    if os.path.exists(os.path.join(app.static_folder, file_path)):
                        token = generate_access_token(file_path)
                        access_url = url_for('serve_protected_file', filename=file_path, token=token)
                        files_with_tokens.append({
                            'path': file_path,
                            'access_url': access_url,
                            'expires_in': app.config['STATIC_TOKEN_EXPIRY']
                        })

                return render_template('protected_demo.html', files=files_with_tokens)
        b.文件类型限制和病毒扫描
            from flask import Flask, send_from_directory, request, jsonify
            import os
            import magic
            import subprocess
            from werkzeug.utils import secure_filename

            app = Flask(__name__)

            # 文件类型白名单
            ALLOWED_MIME_TYPES = {
                'image/jpeg', 'image/png', 'image/gif', 'image/webp',
                'text/plain', 'text/csv', 'text/html', 'text/css',
                'application/pdf', 'application/json', 'application/javascript',
                'font/woff', 'font/woff2', 'font/ttf', 'font/otf'
            }

            MAX_FILE_SIZE = 10 * 1024 * 1024  # 10MB

            def scan_file_for_viruses(filepath):
                """使用ClamAV扫描文件病毒"""
                try:
                    # 检查是否安装了ClamAV
                    subprocess.run(['clamscan', '--version'],
                                 check=True, capture_output=True)

                    # 扫描文件
                    result = subprocess.run(['clamscan', '--no-summary', filepath],
                                         capture_output=True, text=True)

                    return result.returncode == 0, result.stdout
                except (subprocess.CalledProcessError, FileNotFoundError):
                    # 如果没有安装ClamAV,返回未扫描状态
                    return True, "Virus scanner not available"

            def validate_file_type(filepath):
                """验证文件类型"""
                try:
                    # 使用python-magic库检测文件类型
                    file_type = magic.from_file(filepath, mime=True)
                    return file_type in ALLOWED_MIME_TYPES, file_type
                except Exception:
                    # 如果无法检测,返回未知
                    return False, 'unknown'

            @app.route('/static/secure/<path:filename>')
            def serve_secure_file(filename):
                """安全地服务静态文件"""
                static_dir = app.static_folder

                # 安全路径处理
                safe_filename = secure_filename(filename)
                safe_path = os.path.normpath(safe_filename)

                if safe_path.startswith('..') or safe_path.startswith('/'):
                    return jsonify({'error': 'Invalid file path'}), 400

                filepath = os.path.join(static_dir, safe_path)

                if not os.path.exists(filepath):
                    return jsonify({'error': 'File not found'}), 404

                # 文件大小检查
                file_size = os.path.getsize(filepath)
                if file_size > MAX_FILE_SIZE:
                    return jsonify({'error': 'File too large'}), 413

                # 文件类型验证
                is_allowed, detected_type = validate_file_type(filepath)
                if not is_allowed:
                    return jsonify({
                        'error': 'File type not allowed',
                        'detected_type': detected_type
                    }), 403

                # 病毒扫描(异步,不阻塞响应)
                scan_result = scan_file_for_viruses(filepath)

                response = send_from_directory(static_dir, safe_path)

                # 添加安全头
                response.headers['X-Content-Type-Options'] = 'nosniff'
                response.headers['X-Frame-Options'] = 'DENY'
                response.headers['X-File-Type'] = detected_type
                response.headers['X-Virus-Scanned'] = 'safe' if scan_result[0] else 'infected'

                return response

            @app.route('/upload-secure', methods=['POST'])
            def upload_secure_file():
                """安全文件上传"""
                if 'file' not in request.files:
                    return jsonify({'error': 'No file provided'}), 400

                file = request.files['file']
                if file.filename == '':
                    return jsonify({'error': 'No file selected'}), 400

                # 保存临时文件进行验证
                temp_dir = 'temp_uploads'
                os.makedirs(temp_dir, exist_ok=True)

                secure_name = secure_filename(file.filename)
                temp_path = os.path.join(temp_dir, secure_name)
                file.save(temp_path)

                try:
                    # 文件大小检查
                    if os.path.getsize(temp_path) > MAX_FILE_SIZE:
                        return jsonify({'error': 'File too large'}), 413

                    # 文件类型验证
                    is_allowed, detected_type = validate_file_type(temp_path)
                    if not is_allowed:
                        return jsonify({
                            'error': f'File type {detected_type} not allowed'
                        }), 403

                    # 病毒扫描
                    is_safe, scan_result = scan_file_for_viruses(temp_path)
                    if not is_safe:
                        return jsonify({
                            'error': 'File contains viruses',
                            'scan_result': scan_result
                        }), 403

                    # 移动到最终位置
                    final_path = os.path.join(app.static_folder, 'uploads', secure_name)
                    os.makedirs(os.path.dirname(final_path), exist_ok=True)
                    os.rename(temp_path, final_path)

                    return jsonify({
                        'message': 'File uploaded successfully',
                        'filename': secure_name,
                        'url': url_for('static', filename=f'uploads/{secure_name}'),
                        'file_type': detected_type,
                        'file_size': os.path.getsize(final_path)
                    })

                except Exception as e:
                    # 清理临时文件
                    if os.path.exists(temp_path):
                        os.remove(temp_path)
                    return jsonify({'error': f'Upload failed: {str(e)}'}), 500

4 Blueprint 架构

4.1 基础概念

01.什么是 Blueprint
    a.Blueprint 的定义和用途
        a.基础 Blueprint 概念
            from flask import Flask, Blueprint, jsonify, render_template
            import os

            app = Flask(__name__)

            # 创建一个基础 Blueprint
            user_bp = Blueprint('users', __name__)

            # 定义 Blueprint 路由
            @user_bp.route('/')
            def user_index():
                return jsonify({
                    'message': 'Welcome to Users Module',
                    'blueprint': 'users',
                    'endpoints': [
                        '/users/',
                        '/users/<int:user_id>',
                        '/users/create',
                        '/users/search'
                    ]
                })

            @user_bp.route('/<int:user_id>')
            def get_user(user_id):
                """获取用户信息"""
                # 模拟用户数据
                users = {
                    1: {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
                    2: {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'},
                    3: {'id': 3, 'name': 'Charlie', 'email': 'charlie@example.com'}
                }

                user = users.get(user_id)
                if user:
                    return jsonify({
                        'user': user,
                        'blueprint': 'users',
                        'endpoint': 'get_user'
                    })
                else:
                    return jsonify({'error': 'User not found'}), 404

            # 注册 Blueprint 到应用
            app.register_blueprint(user_bp, url_prefix='/users')

            if __name__ == '__main__':
                app.run(debug=True)
        b.模块化应用结构
            # app.py - 主应用文件
            from flask import Flask
            from blueprints.users import user_bp
            from blueprints.products import product_bp
            from blueprints.admin import admin_bp

            def create_app():
                """应用工厂函数"""
                app = Flask(__name__)

                # 应用配置
                app.config.update({
                    'SECRET_KEY': 'your-secret-key-here',
                    'DEBUG': True
                })

                # 注册 Blueprint
                app.register_blueprint(user_bp, url_prefix='/users')
                app.register_blueprint(product_bp, url_prefix='/products')
                app.register_blueprint(admin_bp, url_prefix='/admin')

                # 主页路由
                @app.route('/')
                def index():
                    return jsonify({
                        'message': 'Welcome to Modular Flask App',
                        'modules': {
                            'users': '/users',
                            'products': '/products',
                            'admin': '/admin'
                        }
                    })

                return app

            if __name__ == '__main__':
                app = create_app()
                app.run(debug=True)

            # blueprints/users.py - 用户模块
            from flask import Blueprint, jsonify, request

            user_bp = Blueprint('users', __name__)

            # 模拟用户数据库
            users_db = {}
            next_user_id = 1

            @user_bp.route('/', methods=['GET', 'POST'])
            def handle_users():
                global next_user_id

                if request.method == 'GET':
                    # 获取用户列表
                    return jsonify({
                        'users': list(users_db.values()),
                        'total': len(users_db)
                    })

                elif request.method == 'POST':
                    # 创建新用户
                    data = request.get_json()
                    if not data or 'name' not in data:
                        return jsonify({'error': 'Name is required'}), 400

                    user = {
                        'id': next_user_id,
                        'name': data['name'],
                        'email': data.get('email', ''),
                        'created_at': '2024-01-15T10:00:00Z'
                    }

                    users_db[next_user_id] = user
                    next_user_id += 1

                    return jsonify(user), 201

            @user_bp.route('/<int:user_id>')
            def get_user(user_id):
                user = users_db.get(user_id)
                if user:
                    return jsonify(user)
                else:
                    return jsonify({'error': 'User not found'}), 404

            @user_bp.route('/search')
            def search_users():
                """搜索用户"""
                name_query = request.args.get('name', '').lower()
                results = [user for user in users_db.values()
                          if name_query in user['name'].lower()]

                return jsonify({
                    'query': name_query,
                    'results': results,
                    'count': len(results)
                })

02.创建和注册 Blueprint
    a.基础 Blueprint 创建
        a.简单 Blueprint 创建模式
            from flask import Blueprint, render_template, request, jsonify, redirect, url_for

            # 1. 基础 Blueprint
            auth_bp = Blueprint('auth', __name__,
                              template_folder='templates/auth',
                              static_folder='static/auth')

            @auth_bp.route('/login', methods=['GET', 'POST'])
            def login():
                if request.method == 'GET':
                    return render_template('login.html')
                else:
                    data = request.get_json()
                    username = data.get('username')
                    password = data.get('password')

                    # 简单验证逻辑
                    if username == 'admin' and password == 'password':
                        return jsonify({
                            'message': 'Login successful',
                            'user': {'username': username, 'role': 'admin'},
                            'token': 'fake-jwt-token-12345'
                        })
                    else:
                        return jsonify({'error': 'Invalid credentials'}), 401

            @auth_bp.route('/register', methods=['GET', 'POST'])
            def register():
                if request.method == 'GET':
                    return render_template('register.html')
                else:
                    data = request.get_json()
                    username = data.get('username')
                    email = data.get('email')
                    password = data.get('password')

                    # 验证输入
                    if not all([username, email, password]):
                        return jsonify({'error': 'All fields are required'}), 400

                    # 模拟用户注册
                    user = {
                        'id': len(users_db) + 1,
                        'username': username,
                        'email': email,
                        'password': password,  # 实际应用中需要加密
                        'created_at': '2024-01-15T10:00:00Z'
                    }

                    users_db[user['id']] = user

                    return jsonify({
                        'message': 'Registration successful',
                        'user': {'id': user['id'], 'username': username, 'email': email}
                    }), 201

            @auth_bp.route('/logout')
            def logout():
                return jsonify({'message': 'Logged out successfully'})

            # 2. 带前缀和子域名的 Blueprint
            api_bp = Blueprint('api', __name__, url_prefix='/api/v1')

            @api_bp.route('/status')
            def api_status():
                return jsonify({
                    'status': 'running',
                    'version': '1.0.0',
                    'timestamp': '2024-01-15T10:00:00Z'
                })

            # 3. 带模板和静态文件的 Blueprint
            dashboard_bp = Blueprint('dashboard', __name__,
                                    template_folder='templates/dashboard',
                                    static_folder='static/dashboard')

            @dashboard_bp.route('/')
            def dashboard():
                return render_template('dashboard.html',
                                     user_count=len(users_db),
                                     recent_users=list(users_db.values())[-5:])

            # 在主应用中注册
            app.register_blueprint(auth_bp, url_prefix='/auth')
            app.register_blueprint(api_bp)
            app.register_blueprint(dashboard_bp, url_prefix='/dashboard')
        b.高级 Blueprint 注册选项
            from flask import Flask, Blueprint, render_template_string

            app = Flask(__name__)

            # 创建带有自定义配置的 Blueprint
            blog_bp = Blueprint('blog', __name__)

            # 注册时指定多种参数
            app.register_blueprint(
                blog_bp,
                url_prefix='/blog',                    # URL 前缀
                subdomain='blog',                      # 子域名 (需要配置)
                name='blog_module',                    # 自定义名称
                static_folder='static',                # 静态文件文件夹
                template_folder='templates',           # 模板文件夹
                static_url_path='/blog/static',       # 静态文件URL路径
                url_defaults={'page': 1}              # URL默认参数
            )

            # 使用默认参数的路由
            @blog_bp.route('/posts')
            @blog_bp.route('/posts/<int:page>')
            def list_posts(page=1):
                posts = [
                    {'id': 1, 'title': 'First Post', 'content': 'This is the first post'},
                    {'id': 2, 'title': 'Second Post', 'content': 'This is the second post'},
                    {'id': 3, 'title': 'Third Post', 'content': 'This is the third post'}
                ]

                # 模拟分页
                per_page = 2
                start = (page - 1) * per_page
                end = start + per_page
                paginated_posts = posts[start:end]

                return render_template_string('''
                    <h1>Blog Posts (Page {{ page }})</h1>
                    <ul>
                        {% for post in posts %}
                        <li>{{ post.title }} - {{ post.content }}</li>
                        {% endfor %}
                    </ul>
                    {% if posts|length >= per_page %}
                    <a href="{{ url_for('blog.list_posts', page=page+1) }}">Next Page</a>
                    {% endif %}
                ''', posts=paginated_posts, page=page)

            # 动态注册 Blueprint
            def register_dynamic_blueprints():
                """动态注册多个 Blueprint"""
                modules = ['users', 'products', 'orders']

                for module in modules:
                    bp = Blueprint(module, __name__, url_prefix=f'/{module}')

                    # 为每个模块添加通用路由
                    @bp.route('/')
                    def module_index():
                        current_module = request.blueprint
                        return jsonify({
                            'module': current_module,
                            'endpoints': [
                                f'/{current_module}',
                                f'/{current_module}/<int:id>',
                                f'/{current_module}/search'
                            ]
                        })

                    @bp.route('/<int:id>')
                    def module_detail(id):
                        return jsonify({
                            'module': request.blueprint,
                            'id': id,
                            'detail': f'Details for {request.blueprint} {id}'
                        })

                    app.register_blueprint(bp)

            register_dynamic_blueprints()

03.Blueprint 配置和属性
    a.Blueprint 属性设置
        a.基本属性配置
            from flask import Blueprint, render_template, url_for

            # 带完整属性的 Blueprint
            admin_bp = Blueprint(
                'admin',                              # Blueprint 名称
                __name__,
                url_prefix='/admin',                  # URL 前缀
                subdomain='admin',                    # 子域名
                static_folder='static/admin',         # 静态文件目录
                static_url_path='/admin/static',      # 静态文件URL路径
                template_folder='templates/admin',    # 模板目录
                url_defaults={'role': 'admin'}        # URL 默认值
            )

            @admin_bp.before_request
            def admin_before_request():
                """Blueprint 级别的请求前处理"""
                # 模拟管理员权限检查
                auth_header = request.headers.get('Authorization')
                if not auth_header or not auth_header.startswith('Bearer '):
                    return jsonify({'error': 'Admin access required'}), 401

            @admin_bp.route('/dashboard/<role>')
            def dashboard(role):
                return render_template('admin_dashboard.html',
                                     role=role,
                                     blueprint_name=admin_bp.name,
                                     url_prefix=admin_bp.url_prefix)

            @admin_bp.context_processor
            def admin_context_processor():
                """Blueprint 级别的模板上下文处理器"""
                return {
                    'admin_menu_items': [
                        {'name': 'Dashboard', 'url': url_for('admin.dashboard', role='admin')},
                        {'name': 'Users', 'url': url_for('admin.users_list')},
                        {'name': 'Settings', 'url': url_for('admin.settings')}
                    ],
                    'current_year': 2024
                }

            # 带错误处理的 Blueprint
            api_bp = Blueprint('api', __name__, url_prefix='/api')

            @api_bp.errorhandler(404)
            def api_404(error):
                return jsonify({
                    'error': 'API resource not found',
                    'path': request.path,
                    'blueprint': 'api'
                }), 404

            @api_bp.errorhandler(500)
            def api_500(error):
                return jsonify({
                    'error': 'Internal server error',
                    'message': 'Something went wrong on the server',
                    'blueprint': 'api'
                }), 500
        b.Blueprint 信息获取
            from flask import Blueprint, jsonify, current_app
            import inspect

            info_bp = Blueprint('info', __name__, url_prefix='/info')

            @info_bp.route('/blueprint-details')
            def blueprint_details():
                """获取当前 Blueprint 的详细信息"""
                current_bp = current_app.blueprints.get(request.blueprint)

                if current_bp:
                    return jsonify({
                        'blueprint_name': current_bp.name,
                        'url_prefix': current_bp.url_prefix,
                        'subdomain': getattr(current_bp, 'subdomain', None),
                        'static_folder': current_bp.static_folder,
                        'static_url_path': current_bp.static_url_path,
                        'template_folder': current_bp.template_folder,
                        'url_defaults': getattr(current_bp, 'url_defaults', {}),
                        'deferred_functions': len(current_bp.deferred_functions),
                        'has_request_handlers': hasattr(current_bp, 'deferred_functions')
                    })
                else:
                    return jsonify({'error': 'Blueprint not found'}), 404

            @info_bp.route('/all-blueprints')
            def all_blueprints_info():
                """获取应用中所有 Blueprint 的信息"""
                blueprints_info = {}

                for name, bp in current_app.blueprints.items():
                    blueprints_info[name] = {
                        'name': bp.name,
                        'url_prefix': bp.url_prefix,
                        'subdomain': getattr(bp, 'subdomain', None),
                        'static_folder': bp.static_folder,
                        'template_folder': bp.template_folder
                    }

                return jsonify({
                    'total_blueprints': len(blueprints_info),
                    'blueprints': blueprints_info
                })

            @info_bp.route('/routes')
            def list_routes():
                """列出当前 Blueprint 的所有路由"""
                routes = []

                for rule in current_app.url_map.iter_rules():
                    if request.blueprint and rule.endpoint.startswith(f"{request.blueprint}."):
                        routes.append({
                            'endpoint': rule.endpoint,
                            'methods': list(rule.methods - {'HEAD', 'OPTIONS'}),
                            'rule': str(rule),
                            'arguments': list(rule.arguments)
                        })

                return jsonify({
                    'blueprint': request.blueprint,
                    'total_routes': len(routes),
                    'routes': routes
                })

04.多 Blueprint 协作
    a.Blueprint 间通信
        a.共享数据和方法
            from flask import Blueprint, g, current_app
            functools

            app = Flask(__name__)

            # 共享服务类
            class UserService:
                def __init__(self):
                    self.users = {}

                def get_user(self, user_id):
                    return self.users.get(user_id)

                def create_user(self, user_data):
                    user_id = len(self.users) + 1
                    user = {'id': user_id, **user_data}
                    self.users[user_id] = user
                    return user

                def update_user(self, user_id, updates):
                    if user_id in self.users:
                        self.users[user_id].update(updates)
                        return self.users[user_id]
                    return None

            # 初始化共享服务
            user_service = UserService()

            # 用户管理 Blueprint
            users_bp = Blueprint('users', __name__, url_prefix='/users')

            @users_bp.before_request
            def inject_user_service():
                """在请求前注入服务到 g 对象"""
                g.user_service = user_service

            @users_bp.route('/', methods=['GET', 'POST'])
            def handle_users():
                if request.method == 'GET':
                    return jsonify({
                        'users': list(g.user_service.users.values()),
                        'total': len(g.user_service.users)
                    })

                elif request.method == 'POST':
                    data = request.get_json()
                    user = g.user_service.create_user(data)
                    return jsonify(user), 201

            @users_bp.route('/<int:user_id>')
            def get_user(user_id):
                user = g.user_service.get_user(user_id)
                if user:
                    return jsonify(user)
                else:
                    return jsonify({'error': 'User not found'}), 404

            # 订单管理 Blueprint
            orders_bp = Blueprint('orders', __name__, url_prefix='/orders')

            # 模拟订单数据库
            orders_db = {}

            @orders_bp.before_request
            def inject_services():
                """订单服务也需要用户服务"""
                g.user_service = user_service
                g.orders_db = orders_db

            @orders_bp.route('/', methods=['GET', 'POST'])
            def handle_orders():
                if request.method == 'GET':
                    return jsonify({
                        'orders': list(g.orders_db.values()),
                        'total': len(g.orders_db)
                    })

                elif request.method == 'POST':
                    data = request.get_json()
                    user_id = data.get('user_id')

                    # 使用用户服务验证用户
                    user = g.user_service.get_user(user_id)
                    if not user:
                        return jsonify({'error': 'User not found'}), 404

                    # 创建订单
                    order_id = len(g.orders_db) + 1
                    order = {
                        'id': order_id,
                        'user_id': user_id,
                        'user_name': user['name'],
                        'items': data.get('items', []),
                        'total': data.get('total', 0),
                        'status': 'pending',
                        'created_at': '2024-01-15T10:00:00Z'
                    }

                    g.orders_db[order_id] = order
                    return jsonify(order), 201

            @orders_bp.route('/user/<int:user_id>')
            def get_user_orders(user_id):
                """获取特定用户的订单"""
                # 验证用户存在
                user = g.user_service.get_user(user_id)
                if not user:
                    return jsonify({'error': 'User not found'}), 404

                # 获取用户订单
                user_orders = [
                    order for order in g.orders_db.values()
                    if order['user_id'] == user_id
                ]

                return jsonify({
                    'user': user,
                    'orders': user_orders,
                    'order_count': len(user_orders)
                })

            # 注册 Blueprint
            app.register_blueprint(users_bp)
            app.register_blueprint(orders_bp)
        b.Blueprint 事件钩子
            from flask import Blueprint, request, g, current_app
            import time

            app = Flask(__name__)

            # 日志记录 Blueprint
            logging_bp = Blueprint('logging', __name__)

            @logging_bp.before_app_request
            def log_before_request():
                """应用级别的请求前日志"""
                g.start_time = time.time()
                g.request_id = request.headers.get('X-Request-ID', 'unknown')

                current_app.logger.info(
                    f"Request {g.request_id} started: {request.method} {request.path}"
                )

            @logging_bp.after_app_request
            def log_after_request(response):
                """应用级别的请求后日志"""
                if hasattr(g, 'start_time'):
                    duration = time.time() - g.start_time
                    current_app.logger.info(
                        f"Request {getattr(g, 'request_id', 'unknown')} completed "
                        f"in {duration:.3f}s with status {response.status_code}"
                    )
                return response

            # 性能监控 Blueprint
            monitoring_bp = Blueprint('monitoring', __name__)

            @monitoring_bp.before_request
            def start_monitoring():
                """开始性能监控"""
                g.monitor_start = time.time()

            @monitoring_bp.after_request
            def end_monitoring(response):
                """结束性能监控"""
                if hasattr(g, 'monitor_start'):
                    duration = time.time() - g.monitor_start
                    response.headers['X-Monitoring-Time'] = str(duration)

                    # 记录慢请求
                    if duration > 1.0:
                        current_app.logger.warning(
                            f"Slow request detected: {request.path} took {duration:.3f}s"
                        )

                return response

            @monitoring_bp.route('/performance-stats')
            def performance_stats():
                """性能统计信息"""
                return jsonify({
                    'blueprint': monitoring_bp.name,
                    'endpoints': [str(rule) for rule in current_app.url_map.iter_rules()
                                 if rule.endpoint.startswith(f'{monitoring_bp.name}.')],
                    'timestamp': time.time()
                })

            # 安全检查 Blueprint
            security_bp = Blueprint('security', __name__)

            @security_bp.before_request
            def security_check():
                """安全检查"""
                # 检查必需的安全头
                required_headers = ['X-Requested-With']
                missing_headers = [h for h in required_headers if h not in request.headers]

                if missing_headers and request.method in ['POST', 'PUT', 'DELETE']:
                    return jsonify({
                        'error': 'Security check failed',
                        'missing_headers': missing_headers
                    }), 400

            @security_bp.route('/secure-data')
            def secure_data():
                """需要安全检查的端点"""
                return jsonify({
                    'message': 'Secure data accessed successfully',
                    'security_status': 'passed',
                    'timestamp': time.time()
                })

            # 注册所有 Blueprint
            app.register_blueprint(logging_bp)
            app.register_blueprint(monitoring_bp, url_prefix='/monitoring')
            app.register_blueprint(security_bp, url_prefix='/secure')

            @app.route('/')
            def index():
                return jsonify({
                    'message': 'Multi-Blueprint Application',
                    'modules': {
                        'monitoring': '/monitoring/performance-stats',
                        'secure': '/secure/secure-data'
                    }
                })

4.2 路由管理

01.路由定义和 URL 规则
    a.动态路由注册
        a.程序化路由注册
            from flask import Blueprint, Flask, jsonify
            import inspect

            # 创建 Blueprint
            products_bp = Blueprint('products', __name__, url_prefix='/products')

            # 方法 1: 装饰器方式注册路由
            @products_bp.route('/')
            def product_list():
                return jsonify({
                    'products': [
                        {'id': 1, 'name': 'Laptop', 'price': 999.99},
                        {'id': 2, 'name': 'Phone', 'price': 699.99},
                        {'id': 3, 'name': 'Tablet', 'price': 399.99}
                    ]
                })

            # 方法 2: 直接注册视图函数
            def get_product_details(product_id):
                products = {
                    1: {'id': 1, 'name': 'Laptop', 'price': 999.99, 'stock': 50},
                    2: {'id': 2, 'name': 'Phone', 'price': 699.99, 'stock': 100},
                    3: {'id': 3, 'name': 'Tablet', 'price': 399.99, 'stock': 75}
                }

                product = products.get(product_id)
                if product:
                    return jsonify(product)
                else:
                    return jsonify({'error': 'Product not found'}), 404

            # 手动注册路由
            products_bp.add_url_rule(
                '/<int:product_id>',
                'product_details',
                get_product_details,
                methods=['GET']
            )

            # 方法 3: 基于类的视图路由
            class ProductAPI:
                def __init__(self):
                    self.products = {}

                def get(self, product_id=None):
                    if product_id:
                        return self.products.get(product_id) or {'error': 'Not found'}
                    else:
                        return list(self.products.values())

                def post(self, product_data):
                    product_id = len(self.products) + 1
                    product = {'id': product_id, **product_data}
                    self.products[product_id] = product
                    return product

                def put(self, product_id, product_data):
                    if product_id in self.products:
                        self.products[product_id].update(product_data)
                        return self.products[product_id]
                    else:
                        return {'error': 'Product not found'}

                def delete(self, product_id):
                    return self.products.pop(product_id, None)

            # 创建实例并注册多个路由
            product_api = ProductAPI()

            # 注册不同的路由到同一个类方法
            products_bp.add_url_rule(
                '/api',
                'product_api_list',
                product_api.get,
                methods=['GET']
            )

            products_bp.add_url_rule(
                '/api',
                'product_api_create',
                lambda: product_api.post(request.get_json()),
                methods=['POST']
            )

            products_bp.add_url_rule(
                '/api/<int:product_id>',
                'product_api_detail',
                lambda product_id: product_api.get(product_id),
                methods=['GET']
            )

            # 动态路由生成器
            def generate_crud_routes(bp, resource_name, resource_class):
                """为资源类生成 CRUD 路由"""
                resource_instance = resource_class()

                # 资源列表 (GET) 和创建 (POST)
                def resource_list():
                    if request.method == 'GET':
                        return jsonify(resource_instance.get_all())
                    else:
                        return jsonify(resource_instance.create(request.get_json()))

                # 资源详情 (GET), 更新 (PUT), 删除 (DELETE)
                def resource_detail(resource_id):
                    if request.method == 'GET':
                        return jsonify(resource_instance.get(resource_id))
                    elif request.method == 'PUT':
                        return jsonify(resource_instance.update(resource_id, request.get_json()))
                    elif request.method == 'DELETE':
                        return jsonify(resource_instance.delete(resource_id))

                # 注册路由
                bp.add_url_rule(
                    f'/{resource_name}',
                    f'{resource_name}_list',
                    resource_list,
                    methods=['GET', 'POST']
                )

                bp.add_url_rule(
                    f'/{resource_name}/<int:resource_id>',
                    f'{resource_name}_detail',
                    resource_detail,
                    methods=['GET', 'PUT', 'DELETE']
                )

            # 示例资源类
            class CategoryManager:
                def __init__(self):
                    self.categories = {
                        1: {'id': 1, 'name': 'Electronics', 'description': 'Electronic devices'},
                        2: {'id': 2, 'name': 'Books', 'description': 'Printed books and e-books'}
                    }

                def get_all(self):
                    return list(self.categories.values())

                def create(self, data):
                    cat_id = len(self.categories) + 1
                    category = {'id': cat_id, **data}
                    self.categories[cat_id] = category
                    return category

                def get(self, cat_id):
                    return self.categories.get(cat_id)

                def update(self, cat_id, data):
                    if cat_id in self.categories:
                        self.categories[cat_id].update(data)
                        return self.categories[cat_id]
                    return None

                def delete(self, cat_id):
                    return self.categories.pop(cat_id, None)

            # 生成分类资源的 CRUD 路由
            generate_crud_routes(products_bp, 'categories', CategoryManager)
        b.条件路由注册
            from flask import Blueprint, request, current_app, abort

            conditional_bp = Blueprint('conditional', __name__)

            # 条件路由注册器
            class ConditionalRouter:
                def __init__(self, blueprint):
                    self.blueprint = blueprint
                    self.routes = []

                def add_conditional_route(self, rule, condition, endpoint=None, **options):
                    """添加条件路由"""
                    def conditional_view(*args, **kwargs):
                        if condition():
                            # 满足条件时执行
                            return self.routes[-1]['view'](*args, **kwargs)
                        else:
                            # 不满足条件时返回404或自定义响应
                            abort(404, description="Route not available")

                    # 包装原视图函数
                    original_view = self.routes[-1]['view'] if self.routes else (lambda: "OK")

                    # 保存原视图函数
                    self.routes.append({
                        'view': original_view,
                        'condition': condition
                    })

                    self.blueprint.add_url_rule(rule, endpoint, conditional_view, **options)

            # 使用条件路由
            router = ConditionalRouter(conditional_bp)

            # 只在开发环境可用的路由
            @conditional_bp.route('/debug')
            def debug_info():
                return jsonify({
                    'debug_mode': current_app.debug,
                    'routes': [str(rule) for rule in current_app.url_map.iter_rules()],
                    'config': {k: str(v) for k, v in current_app.config.items()}
                })

            # 只有管理员可访问的路由
            @conditional_bp.route('/admin-only')
            def admin_only_route():
                return jsonify({
                    'message': 'Admin only content',
                    'user_role': 'admin'
                })

            # 修改路由注册以添加条件
            def is_admin():
                """检查是否为管理员"""
                auth_header = request.headers.get('Authorization', '')
                return 'admin' in auth_header

            # 手动添加条件检查
            conditional_bp.add_url_rule(
                '/admin-only',
                'admin_only_route',
                lambda: admin_only_route() if is_admin() else abort(403),
                methods=['GET']
            )

            # 基于时间的条件路由
            @conditional_bp.route('/limited-time')
            def limited_time_offer():
                return jsonify({
                    'message': 'Limited time offer available!',
                    'valid_until': '2024-12-31T23:59:59Z'
                })

            def is_offer_valid():
                """检查优惠是否有效"""
                from datetime import datetime
                return datetime.now().year < 2025

            conditional_bp.add_url_rule(
                '/limited-time',
                'limited_time_offer',
                lambda: limited_time_offer() if is_offer_valid() else abort(404),
                methods=['GET']
            )

02.路由优先级和冲突处理
    a.路由冲突解决
        a.路由优先级系统
            from flask import Blueprint, Flask, jsonify, request, abort
            import re

            app = Flask(__name__)

            # 路由优先级管理器
            class RoutePriorityManager:
                def __init__(self, app):
                    self.app = app
                    self.priority_routes = {}

                def add_priority_route(self, blueprint, rule, view_func, priority=0, **options):
                    """添加优先级路由"""
                    endpoint = f"priority_{len(self.priority_routes)}"

                    # 保存路由信息
                    self.priority_routes[endpoint] = {
                        'blueprint': blueprint,
                        'rule': rule,
                        'view_func': view_func,
                        'priority': priority,
                        'options': options
                    }

                    # 注册路由
                    blueprint.add_url_rule(rule, endpoint, view_func, **options)

                def reorder_routes(self):
                    """重新排序路由"""
                    # 按优先级排序
                    sorted_routes = sorted(
                        self.priority_routes.items(),
                        key=lambda x: x['priority'],
                        reverse=True
                    )

                    # 重新注册路由
                    for endpoint, route_info in sorted_routes:
                        route_info['blueprint'].add_url_rule(
                            route_info['rule'],
                            endpoint,
                            route_info['view_func'],
                            **route_info['options']
                        )

            # 创建带优先级的 Blueprint
            api_bp = Blueprint('api', __name__, url_prefix='/api')

            priority_manager = RoutePriorityManager(app)

            # 高优先级路由 - 具体用户ID
            @api_bp.route('/users/<int:user_id>')
            def get_specific_user(user_id):
                users = {
                    1: {'id': 1, 'name': 'Alice', 'type': 'premium'},
                    2: {'id': 2, 'name': 'Bob', 'type': 'regular'}
                }
                user = users.get(user_id)
                if user:
                    return jsonify({'user': user, 'endpoint': 'specific'})
                else:
                    return jsonify({'error': 'User not found'}), 404

            # 中等优先级路由 - 用户名
            @api_bp.route('/users/<username>')
            def get_user_by_name(username):
                users = {
                    'alice': {'name': 'Alice', 'type': 'premium'},
                    'bob': {'name': 'Bob', 'type': 'regular'}
                }
                user = users.get(username.lower())
                if user:
                    return jsonify({'user': user, 'endpoint': 'by_name'})
                else:
                    return jsonify({'error': 'User not found'}), 404

            # 低优先级路由 - 用户搜索
            @api_bp.route('/users')
            def search_users():
                query = request.args.get('q', '').lower()
                all_users = [
                    {'id': 1, 'name': 'Alice', 'type': 'premium'},
                    {'id': 2, 'name': 'Bob', 'type': 'regular'}
                ]

                if query:
                    filtered = [u for u in all_users if query in u['name'].lower()]
                else:
                    filtered = all_users

                return jsonify({'users': filtered, 'endpoint': 'search'})

            # 注册优先级路由
            priority_manager.add_priority_route(api_bp, '/users/<int:user_id>', get_specific_user, priority=3)
            priority_manager.add_priority_route(api_bp, '/users/<username>', get_user_by_name, priority=2)
            priority_manager.add_priority_route(api_bp, '/users', search_users, priority=1)

            # 智能路由匹配系统
            class SmartRouter:
                def __init__(self):
                    self.routes = []

                def add_smart_route(self, pattern, view_func, priority=0):
                    """添加智能路由"""
                    self.routes.append({
                        'pattern': pattern,
                        'view_func': view_func,
                        'priority': priority,
                        'compiled_pattern': re.compile(pattern)
                    })

                def match_and_execute(self, path):
                    """匹配并执行路由"""
                    # 按优先级排序
                    sorted_routes = sorted(self.routes, key=lambda x: x['priority'], reverse=True)

                    for route in sorted_routes:
                        match = route['compiled_pattern'].match(path)
                        if match:
                            return route['view_func'](*match.groups())

                    return None  # 没有匹配的路由

            # 创建智能路由器
            smart_bp = Blueprint('smart', __name__, url_prefix='/smart')
            smart_router = SmartRouter()

            # 定义智能路由模式
            def product_handler(product_id=None, action=None):
                if product_id and action:
                    return jsonify({
                        'product_id': int(product_id),
                        'action': action,
                        'message': f'Action {action} on product {product_id}'
                    })
                elif product_id:
                    return jsonify({
                        'product_id': int(product_id),
                        'message': f'Details for product {product_id}'
                    })
                else:
                    return jsonify({'message': 'Product list'})

            def search_handler(term=None):
                if term:
                    return jsonify({
                        'search_term': term,
                        'results': [f'Product {term}', f'Item {term}']
                    })
                else:
                    return jsonify({'message': 'Search page'})

            # 添加智能路由
            smart_router.add_smart_route(
                r'/products/(\d+)/(edit|delete|view)/?$',
                lambda pid, act: product_handler(pid, act),
                priority=3
            )

            smart_router.add_smart_route(
                r'/products/(\d+)/?$',
                lambda pid: product_handler(pid),
                priority=2
            )

            smart_router.add_smart_route(
                r'/products/search/([^/]+)/?$',
                lambda term: search_handler(term),
                priority=1
            )

            @smart_bp.route('/products/<path:subpath>')
            def smart_product_handler(subpath):
                """智能产品路由处理器"""
                full_path = f'/products/{subpath}'
                result = smart_router.match_and_execute(full_path)

                if result:
                    return result
                else:
                    return jsonify({'error': 'Product not found'}), 404

            app.register_blueprint(api_bp)
            app.register_blueprint(smart_bp)

4.3 模板和静态文件

01.模板管理
    a.Blueprint 专属模板目录
        a.模板目录结构设置
            from flask import Flask, Blueprint, render_template, current_app
            import os

            app = Flask(__name__)

            # Blueprint 1: 用户模块 - 使用独立模板目录
            user_bp = Blueprint('user', __name__,
                              template_folder='templates/users',     # 独立模板目录
                              static_folder='static/users')         # 独立静态文件目录

            @user_bp.route('/profile')
            def user_profile():
                # Blueprint 会先在 templates/users 目录查找模板
                return render_template('profile.html',
                                     user={'name': 'Alice', 'email': 'alice@example.com'})

            @user_bp.route('/dashboard')
            def user_dashboard():
                return render_template('dashboard.html',
                                     stats={'posts': 15, 'comments': 42, 'likes': 128})

            # Blueprint 2: 管理模块 - 使用独立模板目录
            admin_bp = Blueprint('admin', __name__,
                                template_folder='templates/admin',
                                static_folder='static/admin')

            @admin_bp.route('/dashboard')
            def admin_dashboard():
                return render_template('dashboard.html',
                                     user_count=150,
                                     active_sessions=25,
                                     system_status='healthy')

            @admin_bp.route('/users')
            def admin_users():
                users = [
                    {'id': 1, 'name': 'Alice', 'role': 'user', 'status': 'active'},
                    {'id': 2, 'name': 'Bob', 'role': 'editor', 'status': 'active'},
                    {'id': 3, 'name': 'Charlie', 'role': 'admin', 'status': 'inactive'}
                ]
                return render_template('users.html', users=users)

            # Blueprint 3: 公共模块 - 共享主应用模板
            public_bp = Blueprint('public', __name__)  # 不指定模板目录,使用主应用模板

            @public_bp.route('/about')
            def about():
                return render_template('public/about.html')

            @public_bp.route('/contact')
            def contact():
                return render_template('public/contact.html')

            # 注册 Blueprint
            app.register_blueprint(user_bp, url_prefix='/user')
            app.register_blueprint(admin_bp, url_prefix='/admin')
            app.register_blueprint(public_bp)

            # 模板搜索路径测试路由
            @app.route('/template-info')
            def template_info():
                """显示模板搜索路径信息"""
                template_folders = []

                # 主应用模板目录
                if hasattr(app, 'template_folder') and app.template_folder:
                    main_template_folder = os.path.join(app.root_path, app.template_folder)
                    template_folders.append({
                        'name': 'Main App Templates',
                        'path': main_template_folder,
                        'exists': os.path.exists(main_template_folder)
                    })

                # Blueprint 模板目录
                for name, blueprint in app.blueprints.items():
                    if hasattr(blueprint, 'template_folder') and blueprint.template_folder:
                        bp_template_folder = os.path.join(
                            blueprint.root_path, blueprint.template_folder
                        )
                        template_folders.append({
                            'name': f'{name} Blueprint Templates',
                            'path': bp_template_folder,
                            'exists': os.path.exists(bp_template_folder)
                        })

                return render_template('template_info.html', folders=template_folders)
        b.模板继承和覆盖
            from flask import Blueprint, render_template
            import os

            # 创建复杂的模板继承结构

            # 基础 Blueprint 模板
            <!-- templates/base/base_layout.html -->
            <!DOCTYPE html>
            <html lang="zh-CN">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>{% block title %}Flask App{% endblock %}</title>

                <!-- 基础CSS -->
                {% block base_styles %}
                <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
                <link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}">
                {% endblock %}

                <!-- Blueprint 特定CSS -->
                {% block styles %}{% endblock %}
            </head>
            <body>
                <!-- 导航栏 -->
                <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
                    <div class="container">
                        <a class="navbar-brand" href="/">Flask Demo</a>

                        <div class="navbar-nav">
                            <a class="nav-link" href="/">首页</a>
                            <a class="nav-link" href="{{ url_for('user.user_profile') }}">用户</a>
                            <a class="nav-link" href="{{ url_for('admin.admin_dashboard') }}">管理</a>
                        </div>

                        <!-- 用户菜单 -->
                        {% block user_menu %}
                        <div class="navbar-nav ms-auto">
                            <a class="nav-link" href="/login">登录</a>
                        </div>
                        {% endblock %}
                    </div>
                </nav>

                <!-- 消息提示 -->
                {% with messages = get_flashed_messages(with_categories=true) %}
                    {% if messages %}
                    <div class="container mt-3">
                        {% for category, message in messages %}
                        <div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show">
                            {{ message }}
                            <button type="button" class="close" data-dismiss="alert">
                                <span>&times;</span>
                            </button>
                        </div>
                        {% endfor %}
                    </div>
                    {% endif %}
                {% endwith %}

                <!-- 主要内容区域 -->
                <main class="container mt-4">
                    {% block content %}{% endblock %}
                </main>

                <!-- 页脚 -->
                <footer class="bg-light text-center py-3 mt-5">
                    <div class="container">
                        {% block footer %}
                        <p>&copy; 2024 Flask Demo. All rights reserved.</p>
                        {% endblock %}
                    </div>
                </footer>

                <!-- 基础JavaScript -->
                {% block base_scripts %}
                <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
                <script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script>
                {% endblock %}

                <!-- 页面特定JavaScript -->
                {% block scripts %}{% endblock %}
            </body>
            </html>

            <!-- templates/base/admin_base.html -->
            {% extends "base/base_layout.html" %}

            {% block styles %}
            <link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}">
            {% endblock %}

            {% block title %}管理面板 - {% endblock %}

            {% block user_menu %}
            <div class="navbar-nav ms-auto">
                <div class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="adminDropdown" role="button" data-toggle="dropdown">
                        <i class="fas fa-user-shield"></i> 管理员
                    </a>
                    <div class="dropdown-menu dropdown-menu-right">
                        <a class="dropdown-item" href="/admin/profile">个人资料</a>
                        <a class="dropdown-item" href="/admin/settings">系统设置</a>
                        <div class="dropdown-divider"></div>
                        <a class="dropdown-item" href="/logout">退出登录</a>
                    </div>
                </div>
            </div>
            {% endblock %}

            {% block content %}
            <div class="row">
                <div class="col-md-3">
                    <!-- 管理员侧边栏 -->
                    {% include 'admin/sidebar.html' %}
                </div>
                <div class="col-md-9">
                    <!-- 主要内容 -->
                    {% block admin_content %}{% endblock %}
                </div>
            </div>
            {% endblock %}

            <!-- templates/admin/dashboard.html -->
            {% extends "base/admin_base.html" %}

            {% block title %}管理仪表板 - {% endblock %}

            {% block admin_content %}
            <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
                <h1 class="h2">管理仪表板</h1>
                <div class="btn-toolbar mb-2 mb-md-0">
                    <div class="btn-group me-2">
                        <button type="button" class="btn btn-sm btn-outline-secondary">导出数据</button>
                        <button type="button" class="btn btn-sm btn-outline-secondary">刷新</button>
                    </div>
                </div>
            </div>

            <!-- 统计卡片 -->
            <div class="row">
                <div class="col-xl-3 col-md-6 mb-4">
                    <div class="card border-left-primary shadow h-100 py-2">
                        <div class="card-body">
                            <div class="row no-gutters align-items-center">
                                <div class="col mr-2">
                                    <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
                                        用户总数
                                    </div>
                                    <div class="h5 mb-0 font-weight-bold text-gray-800">{{ user_count }}</div>
                                </div>
                                <div class="col-auto">
                                    <i class="fas fa-users fa-2x text-gray-300"></i>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="col-xl-3 col-md-6 mb-4">
                    <div class="card border-left-success shadow h-100 py-2">
                        <div class="card-body">
                            <div class="row no-gutters align-items-center">
                                <div class="col mr-2">
                                    <div class="text-xs font-weight-bold text-success text-uppercase mb-1">
                                        活跃会话
                                    </div>
                                    <div class="h5 mb-0 font-weight-bold text-gray-800">{{ active_sessions }}</div>
                                </div>
                                <div class="col-auto">
                                    <i class="fas fa-signal fa-2x text-gray-300"></i>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="col-xl-3 col-md-6 mb-4">
                    <div class="card border-left-info shadow h-100 py-2">
                        <div class="card-body">
                            <div class="row no-gutters align-items-center">
                                <div class="col mr-2">
                                    <div class="text-xs font-weight-bold text-info text-uppercase mb-1">
                                        系统状态
                                    </div>
                                    <div class="h5 mb-0 font-weight-bold text-gray-800">
                                        <span class="badge bg-success">{{ system_status }}</span>
                                    </div>
                                </div>
                                <div class="col-auto">
                                    <i class="fas fa-server fa-2x text-gray-300"></i>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="col-xl-3 col-md-6 mb-4">
                    <div class="card border-left-warning shadow h-100 py-2">
                        <div class="card-body">
                            <div class="row no-gutters align-items-center">
                                <div class="col mr-2">
                                    <div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
                                        待处理任务
                                    </div>
                                    <div class="h5 mb-0 font-weight-bold text-gray-800">{{ pending_tasks }}</div>
                                </div>
                                <div class="col-auto">
                                    <i class="fas fa-tasks fa-2x text-gray-300"></i>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- 最近活动 -->
            <div class="card shadow mb-4">
                <div class="card-header py-3">
                    <h6 class="m-0 font-weight-bold text-primary">最近活动</h6>
                </div>
                <div class="card-body">
                    <div class="table-responsive">
                        <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
                            <thead>
                                <tr>
                                    <th>时间</th>
                                    <th>用户</th>
                                    <th>操作</th>
                                    <th>状态</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr>
                                    <td>2024-01-15 10:30</td>
                                    <td>Alice</td>
                                    <td>登录系统</td>
                                    <td><span class="badge bg-success">成功</span></td>
                                </tr>
                                <tr>
                                    <td>2024-01-15 10:25</td>
                                    <td>Bob</td>
                                    <td>更新资料</td>
                                    <td><span class="badge bg-success">成功</span></td>
                                </tr>
                                <tr>
                                    <td>2024-01-15 10:20</td>
                                    <td>Charlie</td>
                                    <td>上传文件</td>
                                    <td><span class="badge bg-warning">待处理</span></td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
            {% endblock %}

            <!-- templates/users/base.html -->
            {% extends "base/base_layout.html" %}

            {% block styles %}
            <link rel="stylesheet" href="{{ url_for('static', filename='css/users.css') }}">
            {% endblock %}

            {% block title %}用户中心 - {% endblock %}

            {% block user_menu %}
            <div class="navbar-nav ms-auto">
                <div class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown">
                        <i class="fas fa-user"></i> {{ current_user.name }}
                    </a>
                    <div class="dropdown-menu dropdown-menu-right">
                        <a class="dropdown-item" href="{{ url_for('user.user_profile') }}">个人资料</a>
                        <a class="dropdown-item" href="{{ url_for('user.user_dashboard') }}">我的仪表板</a>
                        <a class="dropdown-item" href="{{ url_for('user.settings') }}">设置</a>
                        <div class="dropdown-divider"></div>
                        <a class="dropdown-item" href="/logout">退出登录</a>
                    </div>
                </div>
            </div>
            {% endblock %}

            {% block content %}
            <div class="container-fluid">
                <div class="row">
                    <!-- 用户侧边栏 -->
                    <div class="col-md-3">
                        {% include 'users/sidebar.html' %}
                    </div>
                    <!-- 主要内容区域 -->
                    <div class="col-md-9">
                        {% block user_content %}{% endblock %}
                    </div>
                </div>
            </div>
            {% endblock %}

02.静态文件管理
    a.Blueprint 静态文件服务
        a.独立静态文件配置
            from flask import Flask, Blueprint, send_from_directory, url_for, current_app
            import os

            app = Flask(__name__)

            # 1. 带独立静态文件的 Blueprint
            user_bp = Blueprint('user', __name__,
                              static_folder='static/users',
                              static_url_path='/static/users')

            # 2. 带自定义静态文件路径的 Blueprint
            admin_bp = Blueprint('admin', __name__,
                                static_folder='static/admin',
                                static_url_path='/static/admin')

            # 3. 静态文件路由管理器
            class StaticFileManager:
                def __init__(self, app=None):
                    self.app = app
                    self.custom_routes = {}

                def init_app(self, app):
                    self.app = app

                def add_custom_static_route(self, blueprint, endpoint, directory):
                    """添加自定义静态文件路由"""
                    if hasattr(blueprint, 'deferred_functions'):
                        # Blueprint 注册后添加路由
                        blueprint.record_once(lambda state: self._add_route(state, endpoint, directory))

                def _add_route(self, state, endpoint, directory):
                    """内部方法:添加静态文件路由"""
                    app = state.app
                    url_prefix = state.url_prefix or ''

                    def serve_file(filename):
                        safe_path = os.path.normpath(filename)
                        if safe_path.startswith('..'):
                            return "Access denied", 403

                        file_path = os.path.join(directory, safe_path)
                        if not os.path.exists(file_path):
                            return "File not found", 404

                        return send_from_directory(directory, safe_path)

                    app.add_url_rule(
                        f'{url_prefix}/{endpoint}/<path:filename>',
                        f'{state.blueprint.name}_static_{endpoint}',
                        serve_file
                    )

            # 创建静态文件管理器
            static_manager = StaticFileManager(app)

            # 用户 Blueprint 路由
            @user_bp.route('/')
            def user_home():
                return f'''
                <html>
                <head>
                    <title>User Module</title>
                    <link rel="stylesheet" href="{url_for('user.static', filename='css/user.css')}">
                </head>
                <body>
                    <h1>User Module</h1>
                    <p>This page uses user-specific static files.</p>
                    <img src="{url_for('user.static', filename='img/avatar-default.png')}" alt="Default Avatar">
                    <script src="{url_for('user.static', filename='js/user.js')}"></script>
                </body>
                </html>
                '''

            @user_bp.route('/static-info')
            def user_static_info():
                """显示用户模块静态文件信息"""
                static_info = {
                    'blueprint': 'user',
                    'static_folder': user_bp.static_folder,
                    'static_url_path': user_bp.static_url_path,
                    'static_files': []
                }

                # 列出静态文件
                if os.path.exists(user_bp.static_folder):
                    for root, dirs, files in os.walk(user_bp.static_folder):
                        for file in files:
                            rel_path = os.path.relpath(os.path.join(root, file), user_bp.static_folder)
                            static_info['static_files'].append({
                                'name': file,
                                'path': rel_path,
                                'url': url_for('user.static', filename=rel_path.replace('\\', '/'))
                            })

                return jsonify(static_info)

            # 管理 Blueprint 路由
            @admin_bp.route('/')
            def admin_home():
                return f'''
                <html>
                <head>
                    <title>Admin Module</title>
                    <link rel="stylesheet" href="{url_for('admin.static', filename='css/admin.css')}">
                </head>
                <body class="admin-theme">
                    <h1>Admin Module</h1>
                    <p>This page uses admin-specific static files.</p>
                    <img src="{url_for('admin.static', filename='img/admin-logo.png')}" alt="Admin Logo">
                    <script src="{url_for('admin.static', filename='js/admin.js')}"></script>
                </body>
                </html>
                '''

            @admin_bp.route('/static-browser')
            def static_browser():
                """静态文件浏览器"""
                return render_template('admin/static_browser.html',
                                     admin_static_url=url_for('admin.static', filename=''),
                                     user_static_url=url_for('user.static', filename=''))

            # 创建资源优化 Blueprint
            assets_bp = Blueprint('assets', __name__, url_prefix='/assets')

            @assets_bp.route('/css/<filename>')
            def optimized_css(filename):
                """优化的 CSS 服务"""
                # CSS 压缩逻辑
                css_file = os.path.join('static/css', filename)
                if os.path.exists(css_file):
                    with open(css_file, 'r', encoding='utf-8') as f:
                        css_content = f.read()

                    # 简单的 CSS 压缩
                    compressed = re.sub(r'/\*.*?\*/', '', css_content)  # 移除注释
                    compressed = re.sub(r'\s+', ' ', compressed)       # 压缩空白
                    compressed = compressed.strip()

                    response = Response(compressed, mimetype='text/css')
                    response.headers['Cache-Control'] = 'public, max-age=31536000'
                    return response
                else:
                    return "CSS file not found", 404

            @assets_bp.route('/js/<filename>')
            def optimized_js(filename):
                """优化的 JavaScript 服务"""
                js_file = os.path.join('static/js', filename)
                if os.path.exists(js_file):
                    with open(js_file, 'r', encoding='utf-8') as f:
                        js_content = f.read()

                    # 简单的 JS 压缩
                    compressed = re.sub(r'//.*', '', js_content)      # 移除单行注释
                    compressed = re.sub(r'/\*.*?\*/', '', compressed) # 移除多行注释
                    compressed = re.sub(r'\s+', ' ', compressed)     # 压缩空白
                    compressed = compressed.strip()

                    response = Response(compressed, mimetype='application/javascript')
                    response.headers['Cache-Control'] = 'public, max-age=31536000'
                    return response
                else:
                    return "JavaScript file not found", 404

            @assets_bp.route('/img/<filename>')
            def optimized_image(filename):
                """优化的图片服务"""
                img_file = os.path.join('static/img', filename)
                if os.path.exists(img_file):
                    # 获取文件信息
                    file_size = os.path.getsize(img_file)
                    file_mtime = os.path.getmtime(img_file)

                    # 生成 ETag
                    etag = f'"{int(file_mtime)}-{file_size}"'

                    # 检查 If-None-Match
                    if request.headers.get('If-None-Match') == etag:
                        response = Response('', status=304)
                        return response

                    # 读取文件
                    with open(img_file, 'rb') as f:
                        img_data = f.read()

                    # 检测文件类型
                    from PIL import Image
                    import io

                    try:
                        with Image.open(io.BytesIO(img_data)) as img:
                            # 根据浏览器支持优化图片
                            accept_header = request.headers.get('Accept', '')

                            if 'image/webp' in accept_header and not filename.endswith('.webp'):
                                # 转换为 WebP
                                output = io.BytesIO()
                                img.save(output, format='WebP', quality=85)
                                img_data = output.getvalue()
                                mimetype = 'image/webp'
                            else:
                                # 使用原始格式
                                ext = filename.lower().split('.')[-1]
                                mimetype = {
                                    'jpg': 'image/jpeg',
                                    'jpeg': 'image/jpeg',
                                    'png': 'image/png',
                                    'gif': 'image/gif'
                                }.get(ext, 'application/octet-stream')

                            response = Response(img_data, mimetype=mimetype)
                            response.headers['ETag'] = etag
                            response.headers['Cache-Control'] = 'public, max-age=31536000'
                            return response

                    except Exception:
                        # 如果图片处理失败,返回原始文件
                        pass

                    # 返回原始文件
                    ext = filename.lower().split('.')[-1]
                    mimetype = {
                        'jpg': 'image/jpeg',
                        'jpeg': 'image/jpeg',
                        'png': 'image/png',
                        'gif': 'image/gif'
                    }.get(ext, 'application/octet-stream')

                    response = Response(img_data, mimetype=mimetype)
                    response.headers['ETag'] = etag
                    response.headers['Cache-Control'] = 'public, max-age=31536000'
                    return response
                else:
                    return "Image file not found", 404

            # 注册 Blueprint
            app.register_blueprint(user_bp, url_prefix='/user')
            app.register_blueprint(admin_bp, url_prefix='/admin')
            app.register_blueprint(assets_bp)
        b.静态文件版本控制和缓存
            from flask import Blueprint, url_for, current_app
            import hashlib
            import os
            import time

            app = Flask(__name__)

            class VersionedStaticFiles:
                """版本化静态文件管理器"""
                def __init__(self, app=None):
                    self.app = app
                    self.version_cache = {}

                def init_app(self, app):
                    app.jinja_env.globals['static_versioned'] = self.versioned_url
                    app.context_processor(self.context_processor)

                def versioned_url(self, endpoint, filename):
                    """生成带版本号的静态文件 URL"""
                    blueprint_name, static_endpoint = endpoint.split('.')

                    # 获取 Blueprint 对象
                    blueprint = current_app.blueprints.get(blueprint_name)
                    if not blueprint:
                        return url_for(endpoint, filename=filename)

                    # 构建文件路径
                    file_path = os.path.join(blueprint.static_folder, filename)

                    # 获取或计算文件版本
                    if file_path not in self.version_cache:
                        self.version_cache[file_path] = self._get_file_version(file_path)

                    version = self.version_cache[file_path]

                    # 分离文件名和扩展名
                    name, ext = os.path.splitext(filename)
                    versioned_filename = f"{name}.{version}{ext}"

                    return url_for(endpoint, filename=versioned_filename)

                def _get_file_version(self, filepath):
                    """获取文件版本(基于内容哈希或修改时间)"""
                    if not os.path.exists(filepath):
                        return 'unknown'

                    try:
                        # 基于文件内容生成哈希
                        with open(filepath, 'rb') as f:
                            content = f.read()
                        return hashlib.md5(content).hexdigest()[:8]
                    except Exception:
                        # 如果无法读取内容,使用修改时间
                        return str(int(os.path.getmtime(filepath)))

                def context_processor(self):
                    """模板上下文处理器"""
                    return {
                        'versioned_static': self.versioned_url,
                        'asset_url': lambda filename: self.versioned_url('main.static', filename)
                    }

            # 初始化版本化静态文件管理器
            versioned_static = VersionedStaticFiles(app)

            # 主应用 Blueprint
            main_bp = Blueprint('main', __name__,
                              static_folder='static',
                              static_url_path='/static')

            @main_bp.app_template_global()
            def asset_url(filename):
                """全局模板函数:生成资源 URL"""
                return versioned_static.versioned_url('main.static', filename)

            @main_bp.route('/versioned-demo')
            def versioned_demo():
                """版本化静态文件演示"""
                return render_template('versioned_demo.html',
                                     css_url=asset_url('css/main.css'),
                                     js_url=asset_url('js/app.js'),
                                     logo_url=asset_url('img/logo.png'))

            # 缓存控制 Blueprint
            cache_bp = Blueprint('cache', __name__, url_prefix='/cache')

            @cache_bp.route('/static-with-cache/<path:filename>')
            def static_with_cache(filename):
                """带缓存控制的静态文件服务"""
                static_path = os.path.join(app.static_folder, filename)

                if not os.path.exists(static_path):
                    return jsonify({'error': 'File not found'}), 404

                # 获取文件信息
                file_stat = os.stat(static_path)
                last_modified = file_stat.st_mtime
                file_size = file_stat.st_size

                # 生成 ETag
                etag = f'"{int(last_modified)}-{file_size}"'

                # 检查请求头
                if_none_match = request.headers.get('If-None-Match')
                if_modified_since = request.headers.get('If-Modified-Since')

                # ETag 匹配检查
                if if_none_match == etag:
                    response = Response('', status=304)
                    return response

                # 修改时间检查
                if if_modified_since:
                    import time
                    if_modified_since_time = time.strptime(if_modified_since, '%a, %d %b %Y %H:%M:%S GMT')
                    if_modified_since_timestamp = time.mktime(if_modified_since_time)
                    if last_modified <= if_modified_since_timestamp:
                        response = Response('', status=304)
                        return response

                # 读取文件
                with open(static_path, 'rb') as f:
                    file_content = f.read()

                # 确定内容类型
                ext = os.path.splitext(filename).lower()
                content_types = {
                    '.css': 'text/css',
                    '.js': 'application/javascript',
                    '.png': 'image/png',
                    '.jpg': 'image/jpeg',
                    '.jpeg': 'image/jpeg',
                    '.gif': 'image/gif',
                    '.svg': 'image/svg+xml'
                }
                content_type = content_types.get(ext, 'application/octet-stream')

                # 创建响应
                response = Response(file_content, content_type=content_type)

                # 设置缓存头
                if ext in ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif']:
                    # 静态资源长期缓存
                    response.headers['Cache-Control'] = 'public, max-age=31536000, immutable'
                else:
                    # 其他文件中等缓存
                    response.headers['Cache-Control'] = 'public, max-age=86400'

                response.headers['ETag'] = etag
                response.headers['Last-Modified'] = time.strftime(
                    '%a, %d %b %Y %H:%M:%S GMT',
                    time.gmtime(last_modified)
                )
                response.headers['Vary'] = 'Accept-Encoding'

                return response

            @cache_bp.route('/cache-info')
            def cache_info():
                """缓存信息测试页面"""
                return render_template('cache_info.html',
                    test_images=[
                        cache_static_url('img/test1.jpg'),
                        cache_static_url('img/test2.png'),
                        cache_static_url('img/test3.svg')
                    ],
                    test_styles=[
                        cache_static_url('css/style1.css'),
                        cache_static_url('css/style2.css')
                    ],
                    test_scripts=[
                        cache_static_url('js/script1.js'),
                        cache_static_url('js/script2.js')
                    ]
                )

            def cache_static_url(filename):
                """生成缓存静态文件 URL"""
                return url_for('cache.static_with_cache', filename=filename)

            app.register_blueprint(main_bp)
            app.register_blueprint(cache_bp)

            if __name__ == '__main__':
                # 确保静态文件目录存在
                os.makedirs('static/css', exist_ok=True)
                os.makedirs('static/js', exist_ok=True)
                os.makedirs('static/img', exist_ok=True)
                os.makedirs('static/users/css', exist_ok=True)
                os.makedirs('static/users/js', exist_ok=True)
                os.makedirs('static/admin/css', exist_ok=True)
                os.makedirs('static/admin/js', exist_ok=True)

                app.run(debug=True)

4.4 中间件和钩子

01.请求前处理
    a.Before Request 钩子
        a.单 Blueprint 的请求前处理
            from flask import Blueprint, request, g, jsonify, redirect, url_for
            import time
            import uuid
            import jwt

            # 1. 认证 Blueprint - 请求前验证
            auth_bp = Blueprint('auth', __name__, url_prefix='/auth')

            @auth_bp.before_request
            def require_authentication():
                """认证前的验证"""
                # 排除登录和注册页面
                if request.endpoint in ['auth.login', 'auth.register']:
                    return

                # 检查 Authorization 头
                auth_header = request.headers.get('Authorization')
                if not auth_header or not auth_header.startswith('Bearer '):
                    return jsonify({
                        'error': 'Authentication required',
                        'message': 'Please provide a valid Bearer token'
                    }), 401

                # 提取和验证 token
                token = auth_header[7:]  # 去掉 'Bearer '
                try:
                    # 验证 JWT token (简化示例)
                    payload = jwt.decode(token, 'your-secret-key', algorithms=['HS256'])
                    g.current_user = payload
                    g.user_id = payload['user_id']
                except jwt.ExpiredSignatureError:
                    return jsonify({'error': 'Token has expired'}), 401
                except jwt.InvalidTokenError:
                    return jsonify({'error': 'Invalid token'}), 401

            @auth_bp.before_request
            def log_api_request():
                """记录 API 请求日志"""
                if hasattr(g, 'user_id'):
                    g.request_id = str(uuid.uuid4())
                    g.start_time = time.time()

                    print(f"[{g.request_id}] User {g.user_id} accessing {request.method} {request.path}")

            @auth_bp.route('/protected-data')
            def protected_data():
                """受保护的数据"""
                if not hasattr(g, 'current_user'):
                    return jsonify({'error': 'Not authenticated'}), 401

                return jsonify({
                    'user': g.current_user,
                    'data': 'This is protected data',
                    'request_id': getattr(g, 'request_id', 'unknown')
                })

            @auth_bp.route('/profile')
            def user_profile():
                """用户资料"""
                return jsonify({
                    'user': g.current_user,
                    'profile': {
                        'email': f"user{g.user_id}@example.com",
                        'join_date': '2024-01-01',
                        'status': 'active'
                    }
                })

            # 2. API Blueprint - 速率限制和版本控制
            api_bp = Blueprint('api', __name__, url_prefix='/api/v1')

            @api_bp.before_request
            def api_rate_limiting():
                """API 速率限制"""
                # 模拟简单的速率限制
                client_ip = request.remote_addr
                current_time = time.time()

                if not hasattr(api_bp, 'rate_limiter'):
                    api_bp.rate_limiter = {}

                if client_ip not in api_bp.rate_limiter:
                    api_bp.rate_limiter[client_ip] = []

                # 清理过期的请求记录
                api_bp.rate_limiter[client_ip] = [
                    req_time for req_time in api_bp.rate_limiter[client_ip]
                    if current_time - req_time < 60  # 1分钟内
                ]

                # 检查是否超过限制
                if len(api_bp.rate_limiter[client_ip]) >= 100:  # 每分钟100次请求
                    return jsonify({
                        'error': 'Rate limit exceeded',
                        'message': 'Too many requests. Please try again later.',
                        'limit': 100,
                        'window': 60
                    }), 429

                # 记录当前请求
                api_bp.rate_limiter[client_ip].append(current_time)

            @api_bp.before_request
            def validate_api_version():
                """验证 API 版本"""
                version_header = request.headers.get('API-Version')
                if version_header and version_header != '1.0':
                    return jsonify({
                        'error': 'Unsupported API version',
                        'supported_versions': ['1.0'],
                        'current_version': version_header
                    }), 400

            @api_bp.before_request
            def set_api_context():
                """设置 API 上下文"""
                g.api_request = True
                g.api_version = request.headers.get('API-Version', '1.0')
                g.request_start_time = time.time()

            @api_bp.route('/users')
            def api_users():
                """API 用户列表"""
                users = [
                    {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
                    {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
                ]

                return jsonify({
                    'users': users,
                    'pagination': {
                        'page': 1,
                        'per_page': 10,
                        'total': len(users)
                    },
                    'meta': {
                        'api_version': g.api_version,
                        'request_id': getattr(g, 'request_id', 'none')
                    }
                })

            # 3. 管理员 Blueprint - 权限检查
            admin_bp = Blueprint('admin', __name__, url_prefix='/admin')

            @admin_bp.before_request
            def require_admin_permissions():
                """管理员权限检查"""
                # 检查是否有管理员权限
                auth_header = request.headers.get('Authorization')
                if not auth_header:
                    return jsonify({'error': 'Admin access required'}), 401

                # 模拟权限验证
                if 'admin' not in auth_header:
                    return jsonify({'error': 'Insufficient permissions'}), 403

                # 设置管理员上下文
                g.is_admin = True
                g.admin_id = 1  # 模拟管理员ID

            @admin_bp.before_request
            def admin_audit_log():
                """管理员操作审计日志"""
                if hasattr(g, 'admin_id'):
                    audit_data = {
                        'admin_id': g.admin_id,
                        'action': f"{request.method} {request.path}",
                        'ip': request.remote_addr,
                        'timestamp': time.time(),
                        'user_agent': request.headers.get('User-Agent', '')
                    }

                    # 在实际应用中,这里会写入日志文件或数据库
                    print(f"[AUDIT] {audit_data}")

            @admin_bp.route('/dashboard')
            def admin_dashboard():
                """管理员仪表板"""
                return jsonify({
                    'admin_id': g.admin_id,
                    'stats': {
                        'total_users': 150,
                        'active_sessions': 25,
                        'system_status': 'healthy'
                    }
                })

            @admin_bp.route('/users/<int:user_id>/suspend')
            def suspend_user(user_id):
                """暂停用户"""
                # 模拟用户暂停操作
                return jsonify({
                    'message': f'User {user_id} suspended successfully',
                    'admin_id': g.admin_id,
                    'timestamp': time.time()
                })
        b.多 Blueprint 协调处理
            from flask import Blueprint, g, request, current_app
            import functools

            # 全局请求前处理器
            @app.before_request
            def global_before_request():
                """全局请求前处理"""
                g.global_start_time = time.time()
                g.request_id = request.headers.get('X-Request-ID', str(uuid.uuid4()))

            # 特定 Blueprint 的请求前处理器
            def blueprint_before_request(blueprint_name):
                """Blueprint 请求前处理装饰器"""
                def decorator(f):
                    @functools.wraps(f)
                    def decorated_function(*args, **kwargs):
                        if request.blueprint == blueprint_name:
                            # Blueprint 特定的请求前处理
                            g.blueprint_context = blueprint_name
                            print(f"Before request for {blueprint_name}")
                        return f(*args, **kwargs)
                    return decorated_function
                return decorator

            # 动态 Blueprint 钩子管理器
            class BlueprintHookManager:
                def __init__(self, app=None):
                    self.app = app
                    self.before_request_hooks = {}
                    self.after_request_hooks = {}

                def init_app(self, app):
                    self.app = app

                    # 注册全局钩子
                    app.before_request(self.global_before_request_handler)
                    app.after_request(self.global_after_request_handler)

                def add_before_request_hook(self, blueprint_name, hook_func):
                    """添加 Blueprint 的 before_request 钩子"""
                    if blueprint_name not in self.before_request_hooks:
                        self.before_request_hooks[blueprint_name] = []
                    self.before_request_hooks[blueprint_name].append(hook_func)

                def add_after_request_hook(self, blueprint_name, hook_func):
                    """添加 Blueprint 的 after_request 钩子"""
                    if blueprint_name not in self.after_request_hooks:
                        self.after_request_hooks[blueprint_name] = []
                    self.after_request_hooks[blueprint_name].append(hook_func)

                def global_before_request_handler(self):
                    """全局 before_request 处理器"""
                    if request.blueprint:
                        # 执行特定 Blueprint 的 before_request 钩子
                        hooks = self.before_request_hooks.get(request.blueprint, [])
                        for hook in hooks:
                            result = hook()
                            if result:  # 如果钩子返回响应,立即返回
                                return result

                def global_after_request_handler(self, response):
                    """全局 after_request 处理器"""
                    if request.blueprint:
                        # 执行特定 Blueprint 的 after_request 钩子
                        hooks = self.after_request_hooks.get(request.blueprint, [])
                        for hook in hooks:
                            response = hook(response)
                    return response

            # 创建钩子管理器
            hook_manager = BlueprintHookManager(app)

            # 定义 Blueprint
            products_bp = Blueprint('products', __name__, url_prefix='/products')

            # 添加自定义钩子
            def products_auth_check():
                """产品模块的认证检查"""
                if not request.headers.get('X-API-Key'):
                    return jsonify({'error': 'API key required'}), 401

            def products_logging():
                """产品模块的日志记录"""
                print(f"[Products] {request.method} {request.path} from {request.remote_addr}")

            def products_response_headers(response):
                """产品模块的响应头处理"""
                response.headers['X-API-Version'] = '1.0'
                response.headers['X-Module'] = 'products'
                return response

            # 注册钩子
            hook_manager.add_before_request_hook('products', products_auth_check)
            hook_manager.add_before_request_hook('products', products_logging)
            hook_manager.add_after_request_hook('products', products_response_headers)

            # 产品路由
            @products_bp.route('/')
            def product_list():
                return jsonify({
                    'products': [
                        {'id': 1, 'name': 'Laptop', 'price': 999.99},
                        {'id': 2, 'name': 'Mouse', 'price': 29.99}
                    ]
                })

            @products_bp.route('/<int:product_id>')
            def product_detail(product_id):
                return jsonify({
                    'id': product_id,
                    'name': f'Product {product_id}',
                    'price': 99.99
                })

            # 订单 Blueprint
            orders_bp = Blueprint('orders', __name__, url_prefix='/orders')

            def orders_rate_limit():
                """订单模块的速率限制"""
                # 模拟速率限制检查
                print(f"[Orders] Rate limit check for {request.remote_addr}")

            def orders_cors_headers(response):
                """订单模块的 CORS 头"""
                response.headers['Access-Control-Allow-Origin'] = '*'
                response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE'
                response.headers['Access-Control-Allow-Headers'] = 'Content-Type, X-API-Key'
                return response

            hook_manager.add_before_request_hook('orders', orders_rate_limit)
            hook_manager.add_after_request_hook('orders', orders_cors_headers)

            @orders_bp.route('/')
            def order_list():
                return jsonify({
                    'orders': [
                        {'id': 1, 'product_id': 1, 'quantity': 1},
                        {'id': 2, 'product_id': 2, 'quantity': 2}
                    ]
                })

            # 注册 Blueprint
            app.register_blueprint(products_bp)
            app.register_blueprint(orders_bp)

02.响应后处理
    a.After Request 钩子
        a.响应修改和增强
            from flask import Blueprint, request, g, jsonify, Response
            import time
            import json
            from datetime import datetime

            app = Flask(__name__)

            # 1. API Blueprint - 响应格式化
            api_v1_bp = Blueprint('api_v1', __name__, url_prefix='/api/v1')

            @api_v1_bp.after_request
            def format_api_response(response):
                """格式化 API 响应"""
                # 只处理 JSON 响应
                if response.content_type.startswith('application/json'):
                    try:
                        data = json.loads(response.get_data(as_text=True))

                        # 包装响应数据
                        wrapped_data = {
                            'success': response.status_code < 400,
                            'status_code': response.status_code,
                            'timestamp': datetime.utcnow().isoformat(),
                            'request_id': getattr(g, 'request_id', 'unknown'),
                            'data': data if isinstance(data, (dict, list)) else {}
                        }

                        # 添加错误信息(如果有)
                        if response.status_code >= 400:
                            wrapped_data['error'] = {
                                'code': response.status_code,
                                'message': data.get('error', 'Unknown error')
                            }

                        response.set_data(json.dumps(wrapped_data, ensure_ascii=False))
                        response.headers['Content-Type'] = 'application/json; charset=utf-8'

                    except (json.JSONDecodeError, UnicodeDecodeError):
                        # 如果解析失败,保持原响应
                        pass

                # 添加性能头
                if hasattr(g, 'start_time'):
                    processing_time = time.time() - g.start_time
                    response.headers['X-Processing-Time'] = f"{processing_time:.3f}s"

                return response

            @api_v1_bp.before_request
            def set_request_context():
                """设置请求上下文"""
                g.start_time = time.time()
                g.request_id = request.headers.get('X-Request-ID', f"req_{int(time.time())}")

            @api_v1_bp.route('/users')
            def get_users():
                """获取用户列表"""
                return jsonify([
                    {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
                    {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
                ])

            @api_v1_bp.route('/error-demo')
            def error_demo():
                """错误演示"""
                return jsonify({'error': 'This is a demo error'}), 500

            # 2. 日志记录 Blueprint - 响应日志
            logging_bp = Blueprint('logging', __name__)

            @logging_bp.after_request
            def log_response(response):
                """记录响应日志"""
                if hasattr(g, 'start_time'):
                    duration = time.time() - g.start_time
                    log_data = {
                        'timestamp': datetime.utcnow().isoformat(),
                        'method': request.method,
                        'path': request.path,
                        'status_code': response.status_code,
                        'duration_ms': round(duration * 1000, 2),
                        'user_agent': request.headers.get('User-Agent', ''),
                        'ip': request.remote_addr
                    }

                    # 在实际应用中,这里会写入日志系统
                    print(f"[RESPONSE_LOG] {json.dumps(log_data)}")

                return response

            @logging_bp.before_request
            def log_request():
                """记录请求日志"""
                g.start_time = time.time()
                log_data = {
                    'timestamp': datetime.utcnow().isoformat(),
                    'method': request.method,
                    'path': request.path,
                    'headers': dict(request.headers),
                    'args': dict(request.args)
                }

                print(f"[REQUEST_LOG] {json.dumps(log_data)}")

            @logging_bp.route('/test-endpoint')
            def test_endpoint():
                return jsonify({'message': 'Logging test endpoint'})

            # 3. 缓存 Blueprint - 响应缓存
            cache_bp = Blueprint('cache', __name__, url_prefix='/cache')

            @cache_bp.after_request
            def add_cache_headers(response):
                """添加缓存头"""
                # 根据内容类型和状态码设置缓存策略
                if response.status_code == 200:
                    if request.path.startswith('/cache/static/'):
                        # 静态资源长期缓存
                        response.headers['Cache-Control'] = 'public, max-age=31536000, immutable'
                        response.headers['ETag'] = f'"{hash(response.get_data())}"'

                    elif request.path.startswith('/cache/data/'):
                        # 数据短期缓存
                        response.headers['Cache-Control'] = 'public, max-age=300, must-revalidate'
                        response.headers['Vary'] = 'Accept-Encoding'

                    else:
                        # 默认缓存
                        response.headers['Cache-Control'] = 'public, max-age=60'

                else:
                    # 错误响应不缓存
                    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
                    response.headers['Pragma'] = 'no-cache'
                    response.headers['Expires'] = '0'

                return response

            @cache_bp.route('/static-data')
            def static_data():
                """静态数据 - 适合长期缓存"""
                return jsonify({
                    'version': '1.0.0',
                    'features': ['user-management', 'product-catalog', 'order-processing'],
                    'last_updated': '2024-01-15T10:00:00Z'
                })

            @cache_bp.route('/dynamic-data')
            def dynamic_data():
                """动态数据 - 短期缓存"""
                return jsonify({
                    'timestamp': datetime.utcnow().isoformat(),
                    'active_users': 25,
                    'current_load': 0.65,
                    'server_time': time.time()
                })

            @cache_bp.route('/error-example')
            def error_example():
                """错误响应 - 不缓存"""
                return jsonify({'error': 'Example error'}), 500

            # 4. 安全 Blueprint - 安全头处理
            security_bp = Blueprint('security', __name__, url_prefix='/secure')

            @security_bp.after_request
            def add_security_headers(response):
                """添加安全头"""
                # 内容安全策略
                response.headers['Content-Security-Policy'] = (
                    "default-src 'self'; "
                    "script-src 'self' 'unsafe-inline' https://cdn.example.com; "
                    "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; "
                    "font-src 'self' https://fonts.gstatic.com; "
                    "img-src 'self' data: https:; "
                    "connect-src 'self'; "
                    "frame-ancestors 'none'; "
                    "base-uri 'self'; "
                    "form-action 'self'"
                )

                # X-Frame-Options
                response.headers['X-Frame-Options'] = 'DENY'

                # X-Content-Type-Options
                response.headers['X-Content-Type-Options'] = 'nosniff'

                # X-XSS-Protection
                response.headers['X-XSS-Protection'] = '1; mode=block'

                # Referrer-Policy
                response.headers['Referrer-Policy'] = 'strict-origin-when-cross-origin'

                # Permissions-Policy
                response.headers['Permissions-Policy'] = (
                    'geolocation=(), '
                    'microphone=(), '
                    'camera=(), '
                    'payment=(), '
                    'usb=()'
                )

                # Strict-Transport-Security (仅 HTTPS)
                if request.is_secure:
                    response.headers['Strict-Transport-Security'] = (
                        'max-age=31536000; includeSubDomains; preload'
                    )

                return response

            @security_bp.route('/protected-content')
            def protected_content():
                """受保护的内容"""
                return jsonify({
                    'message': 'This content is served with security headers',
                    'security_features': [
                        'Content Security Policy',
                        'X-Frame-Options',
                        'X-Content-Type-Options',
                        'X-XSS-Protection',
                        'Referrer Policy',
                        'Permissions Policy'
                    ]
                })

            @security_bp.route('/form-data', methods=['GET', 'POST'])
            def form_data():
                """表单数据处理"""
                if request.method == 'POST':
                    return jsonify({
                        'message': 'Form submitted securely',
                        'received_data': request.get_json()
                    })
                else:
                    return jsonify({
                        'form_url': '/secure/form-data',
                        'method': 'POST',
                        'content_type': 'application/json',
                        'csrf_protection': 'enabled'
                    })

            # 5. 监控 Blueprint - 性能监控
            monitoring_bp = Blueprint('monitoring', __name__, url_prefix='/monitor')

            @monitoring_bp.after_request
            def monitor_performance(response):
                """性能监控"""
                if hasattr(g, 'start_time'):
                    duration = time.time() - g.start_time

                    # 记录慢请求
                    if duration > 1.0:
                        print(f"[SLOW_REQUEST] {request.method} {request.path} took {duration:.3f}s")

                    # 性能分类
                    if duration < 0.1:
                        perf_category = 'fast'
                    elif duration < 0.5:
                        perf_category = 'normal'
                    elif duration < 1.0:
                        perf_category = 'slow'
                    else:
                        perf_category = 'very_slow'

                    response.headers['X-Performance-Category'] = perf_category

                return response

            @monitoring_bp.before_request
            def start_monitoring():
                """开始监控"""
                g.start_time = time.time()

            @monitoring_bp.route('/health-check')
            def health_check():
                """健康检查端点"""
                # 模拟各种健康指标
                health_data = {
                    'status': 'healthy',
                    'timestamp': datetime.utcnow().isoformat(),
                    'services': {
                        'database': 'connected',
                        'cache': 'connected',
                        'external_api': 'connected'
                    },
                    'metrics': {
                        'uptime': 86400,  # 秒
                        'memory_usage': 0.65,  # 65%
                        'cpu_usage': 0.23,  # 23%
                        'disk_usage': 0.45   # 45%
                    }
                }

                return jsonify(health_data)

            @monitoring_bp.route('/metrics')
            def get_metrics():
                """获取性能指标"""
                # 模拟性能指标数据
                return jsonify({
                    'request_stats': {
                        'total_requests': 1000,
                        'requests_per_second': 5.2,
                        'average_response_time': 0.125,
                        'error_rate': 0.02
                    },
                    'system_stats': {
                        'memory_usage': 0.65,
                        'cpu_usage': 0.23,
                        'active_connections': 25,
                        'disk_io': {
                            'reads_per_sec': 120,
                            'writes_per_sec': 45
                        }
                    },
                    'application_stats': {
                        'active_users': 150,
                        'database_connections': 8,
                        'cache_hit_rate': 0.85
                    }
                })

            # 注册所有 Blueprint
            app.register_blueprint(api_v1_bp)
            app.register_blueprint(logging_bp)
            app.register_blueprint(cache_bp)
            app.register_blueprint(security_bp)
            app.register_blueprint(monitoring_bp)

            # 主页路由 - 展示各个 Blueprint 的功能
            @app.route('/')
            def index():
                return jsonify({
                    'message': 'Flask Blueprint Middleware Demo',
                    'endpoints': {
                        'api_v1': '/api/v1/users',
                        'logging': '/logging/test-endpoint',
                        'cache': '/cache/static-data',
                        'security': '/secure/protected-content',
                        'monitoring': '/monitor/health-check'
                    }
                })

            if __name__ == '__main__':
                app.run(debug=True)

5 数据库集成

5.1 SQLAlchemy 集成

01.SQLAlchemy 基础配置
    a.Flask-SQLAlchemy 初始化
        a.基础 SQLAlchemy 配置
            from flask import Flask, jsonify, request
            from flask_sqlalchemy import SQLAlchemy
            from sqlalchemy import create_engine, text
            from sqlalchemy.orm import sessionmaker, scoped_session
            from sqlalchemy.ext.declarative import declarative_base
            import os

            # 创建 Flask 应用
            app = Flask(__name__)

            # 数据库配置 - 支持多种数据库类型
            def configure_database(app, db_type='sqlite'):
                """配置数据库连接"""
                db_configs = {
                    'sqlite': {
                        'SQLALCHEMY_DATABASE_URI': 'sqlite:///flask_demo.db',
                        'SQLALCHEMY_BINDS': {
                            'logs': 'sqlite:///logs.db',
                            'cache': 'sqlite:///cache.db'
                        }
                    },
                    'postgresql': {
                        'SQLALCHEMY_DATABASE_URI': 'postgresql://user:password@localhost/flask_demo',
                        'SQLALCHEMY_BINDS': {
                            'logs': 'postgresql://user:password@localhost/logs',
                            'cache': 'postgresql://user:password@localhost/cache'
                        }
                    },
                    'mysql': {
                        'SQLALCHEMY_DATABASE_URI': 'mysql+pymysql://user:password@localhost/flask_demo',
                        'SQLALCHEMY_BINDS': {
                            'logs': 'mysql+pymysql://user:password@localhost/logs',
                            'cache': 'mysql+pymysql://user:password@localhost/cache'
                        }
                    }
                }

                config = db_configs.get(db_type, db_configs['sqlite'])
                app.config.update(config)

                # SQLAlchemy 特定配置
                app.config.update({
                    'SQLALCHEMY_TRACK_MODIFICATIONS': False,  # 禁用事件系统以提高性能
                    'SQLALCHEMY_ECHO': False,                  # 生产环境设为 False
                    'SQLALCHEMY_ENGINE_OPTIONS': {
                        'pool_size': 10,                      # 连接池大小
                        'pool_recycle': 120,                   # 连接回收时间(秒)
                        'pool_pre_ping': True,                 # 连接预检
                        'max_overflow': 20                     # 最大溢出连接数
                    }
                })

            # 初始化数据库配置
            configure_database(app, 'sqlite')

            # 创建 SQLAlchemy 实例
            db = SQLAlchemy(app)

            # 创建数据库名称管理器
            class DatabaseManager:
                def __init__(self, db_instance):
                    self.db = db_instance
                    self.engines = {}
                    self.sessions = {}

                def get_engine(self, bind_key=None):
                    """获取数据库引擎"""
                    key = bind_key or 'default'
                    if key not in self.engines:
                        if bind_key:
                            self.engines[key] = create_engine(
                                self.db.get_app().config['SQLALCHEMY_BINDS'][bind_key]
                            )
                        else:
                            self.engines[key] = self.db.engine
                    return self.engines[key]

                def get_session(self, bind_key=None):
                    """获取数据库会话"""
                    key = bind_key or 'default'
                    if key not in self.sessions:
                        engine = self.get_engine(bind_key)
                        Session = scoped_session(sessionmaker(bind=engine))
                        self.sessions[key] = Session
                    return self.sessions[key]

                def close_sessions(self):
                    """关闭所有会话"""
                    for session in self.sessions.values():
                        session.remove()
                    self.sessions.clear()

            # 创建数据库管理器实例
            db_manager = DatabaseManager(db)

            # 数据库连接测试
            @app.route('/db/test-connection')
            def test_database_connection():
                """测试数据库连接"""
                try:
                    # 测试主数据库连接
                    with db.engine.connect() as conn:
                        result = conn.execute(text('SELECT 1'))
                        main_db_status = 'connected'
                    except Exception as e:
                        main_db_status = f'error: {str(e)}'

                    # 测试绑定数据库连接
                    bind_status = {}
                    for bind_key in app.config.get('SQLALCHEMY_BINDS', {}):
                        try:
                            bind_engine = db_manager.get_engine(bind_key)
                            with bind_engine.connect() as conn:
                                conn.execute(text('SELECT 1'))
                            bind_status[bind_key] = 'connected'
                        except Exception as e:
                            bind_status[bind_key] = f'error: {str(e)}'

                    return jsonify({
                        'main_database': main_db_status,
                        'bind_databases': bind_status,
                        'connection_pool_size': db.engine.pool.size(),
                        'connection_pool_checked_in': db.engine.pool.checkedin(),
                        'connection_pool_checked_out': db.engine.pool.checkedout()
                    })

            @app.route('/db/info')
            def get_database_info():
                """获取数据库信息"""
                info = {
                    'database_uri': app.config['SQLALCHEMY_DATABASE_URI'],
                    'bind_databases': app.config.get('SQLALCHEMY_BINDS', {}),
                    'engine_info': {
                        'driver': str(db.engine.driver),
                        'name': str(db.engine.name),
                        'dialect': str(db.engine.dialect)
                    },
                    'pool_status': {
                        'size': db.engine.pool.size(),
                        'checked_in': db.engine.pool.checkedin(),
                        'checked_out': db.engine.pool.checkedout(),
                        'invalid': db.engine.pool.invalid()
                    }
                }
                return jsonify(info)

            # 数据库健康检查
            @app.route('/db/health')
            def database_health_check():
                """数据库健康检查"""
                health_status = {
                    'database': 'unknown',
                    'timestamp': '2024-01-15T10:00:00Z',
                    'checks': {}
                }

                # 主数据库健康检查
                try:
                    with db.engine.connect() as conn:
                        result = conn.execute(text('SELECT 1 as health_check'))
                        health_check_result = result.fetchone()
                        if health_check_result and health_check_result[0] == 1:
                            health_status['database'] = 'healthy'
                            health_status['checks']['main_db'] = 'pass'
                        else:
                            health_status['database'] = 'unhealthy'
                            health_status['checks']['main_db'] = 'fail'
                except Exception as e:
                    health_status['database'] = 'error'
                    health_status['checks']['main_db'] = f'error: {str(e)}'

                # 绑定数据库健康检查
                for bind_key in app.config.get('SQLALCHEMY_BINDS', {}):
                    try:
                        bind_engine = db_manager.get_engine(bind_key)
                        with bind_engine.connect() as conn:
                            conn.execute(text('SELECT 1'))
                        health_status['checks'][f'{bind_key}_db'] = 'pass'
                    except Exception as e:
                        health_status['checks'][f'{bind_key}_db'] = f'error: {str(e)}'

                return jsonify(health_status)
        b.多数据库配置和绑定
            from flask import Flask
            from flask_sqlalchemy import SQLAlchemy
            from sqlalchemy import create_engine, MetaData, Table
            import os

            app = Flask(__name__)

            # 高级多数据库配置
            def setup_multi_database(app):
                """设置多数据库配置"""
                # 主数据库配置
                app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost:5432/flask_main'

                # 绑定数据库配置
                app.config['SQLALCHEMY_BINDS'] = {
                    # 用户数据库
                    'users': 'postgresql://user:password@localhost:5432/flask_users',

                    # 日志数据库(可能使用不同的数据库类型)
                    'logs': 'mysql+pymysql://user:password@localhost:3306/flask_logs',

                    # 缓存数据库
                    'cache': 'sqlite:///cache.db',

                    # 分析数据库
                    'analytics': 'postgresql://user:password@localhost:5432/flask_analytics',

                    # 文件存储数据库
                    'files': 'postgresql://user:password@localhost:5432/flask_files'
                }

                # 优化配置
                app.config.update({
                    'SQLALCHEMY_TRACK_MODIFICATIONS': False,
                    'SQLALCHEMY_POOL_SIZE': 20,
                    'SQLALCHEMY_POOL_TIMEOUT': 30,
                    'SQLALCHEMY_POOL_RECYCLE': 3600,
                    'SQLALCHEMY_MAX_OVERFLOW': 30,
                    'SQLALCHEMY_POOL_PRE_PING': True
                })

            setup_multi_database(app)

            # 创建 SQLAlchemy 实例
            db = SQLAlchemy(app)

            # 混合模型基类
            class BaseModel(db.Model):
                """基础模型类"""
                __abstract__ = True

                id = db.Column(db.Integer, primary_key=True)
                created_at = db.Column(db.DateTime, server_default=db.func.now())
                updated_at = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())

                def save(self):
                    """保存模型"""
                    try:
                        db.session.add(self)
                        db.session.commit()
                    except Exception as e:
                        db.session.rollback()
                        raise e

                def delete(self):
                    """删除模型"""
                    try:
                        db.session.delete(self)
                        db.session.commit()
                    except Exception as e:
                        db.session.rollback()
                        raise e

                def to_dict(self):
                    """转换为字典"""
                    result = {}
                    for column in self.__table__.columns:
                        value = getattr(self, column.name)
                        if isinstance(value, datetime.datetime):
                            value = value.isoformat()
                        result[column.name] = value
                    return result

            # 主数据库模型
            class User(BaseModel):
                __tablename__ = 'users'
                __bind_key__ = 'users'

                username = db.Column(db.String(80), unique=True, nullable=False, index=True)
                email = db.Column(db.String(120), unique=True, nullable=False, index=True)
                password_hash = db.Column(db.String(255), nullable=False)
                is_active = db.Column(db.Boolean, default=True, nullable=False)
                last_login = db.Column(db.DateTime)

                # 关系定义
                posts = db.relationship('Post', backref='author', lazy='dynamic', cascade='all, delete-orphan')
                comments = db.relationship('Comment', backref='author', lazy='dynamic')

                def __repr__(self):
                    return f'<User {self.username}>'

            class Post(BaseModel):
                __tablename__ = 'posts'

                title = db.Column(db.String(200), nullable=False)
                content = db.Column(db.Text, nullable=False)
                author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
                is_published = db.Column(db.Boolean, default=False)
                view_count = db.Column(db.Integer, default=0)

                # 关系定义
                comments = db.relationship('Comment', backref='post', lazy='dynamic', cascade='all, delete-orphan')
                tags = db.relationship('Tag', secondary='post_tags', backref='posts')

                def __repr__(self):
                    return f'<Post {self.title}>'

            class Comment(BaseModel):
                __tablename__ = 'comments'

                content = db.Column(db.Text, nullable=False)
                author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
                post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False)
                is_approved = db.Column(db.Boolean, default=False)

                def __repr__(self):
                    return f'<Comment {self.id}>'

            # 日志数据库模型
            class SystemLog(db.Model):
                __tablename__ = 'system_logs'
                __bind_key__ = 'logs'

                id = db.Column(db.Integer, primary_key=True)
                level = db.Column(db.String(20), nullable=False, index=True)
                message = db.Column(db.Text, nullable=False)
                module = db.Column(db.String(50), nullable=False, index=True)
                user_id = db.Column(db.Integer, nullable=True)
                ip_address = db.Column(db.String(45), nullable=True)
                timestamp = db.Column(db.DateTime, server_default=db.func.now(), index=True)
                extra_data = db.Column(db.JSON)

                def __repr__(self):
                    return f'<SystemLog {self.level}: {self.message[:50]}>'

            class UserActivityLog(db.Model):
                __tablename__ = 'user_activity_logs'
                __bind_key__ = 'logs'

                id = db.Column(db.Integer, primary_key=True)
                user_id = db.Column(db.Integer, nullable=False, index=True)
                action = db.Column(db.String(100), nullable=False, index=True)
                resource_type = db.Column(db.String(50), nullable=False)
                resource_id = db.Column(db.Integer, nullable=True)
                ip_address = db.Column(db.String(45), nullable=False)
                user_agent = db.Column(db.Text, nullable=True)
                timestamp = db.Column(db.DateTime, server_default=db.func.now(), index=True)

                def __repr__(self):
                    return f'<UserActivityLog {self.action} by User {self.user_id}>'

            # 分析数据库模型
            class PageView(db.Model):
                __tablename__ = 'page_views'
                __bind_key__ = 'analytics'

                id = db.Column(db.Integer, primary_key=True)
                path = db.Column(db.String(500), nullable=False, index=True)
                user_id = db.Column(db.Integer, nullable=True, index=True)
                ip_address = db.Column(db.String(45), nullable=False, index=True)
                referrer = db.Column(db.String(500), nullable=True)
                user_agent = db.Column(db.Text, nullable=True)
                timestamp = db.Column(db.DateTime, server_default=db.func.now(), index=True)
                session_id = db.Column(db.String(255), nullable=True, index=True)
                duration_seconds = db.Column(db.Integer, nullable=True)

                def __repr__(self):
                    return f'<PageView {self.path}>'

            # 文件存储数据库模型
            class UploadedFile(db.Model):
                __tablename__ = 'uploaded_files'
                __bind_key__ = 'files'

                id = db.Column(db.Integer, primary_key=True)
                original_filename = db.Column(db.String(255), nullable=False)
                stored_filename = db.Column(db.String(255), nullable=False, unique=True)
                file_path = db.Column(db.String(500), nullable=False)
                file_size = db.Column(db.Integer, nullable=False)
                mime_type = db.Column(db.String(100), nullable=False)
                checksum = db.Column(db.String(64), nullable=False, index=True)
                uploader_id = db.Column(db.Integer, nullable=False, index=True)
                is_public = db.Column(db.Boolean, default=False)
                download_count = db.Column(db.Integer, default=0)

                def __repr__(self):
                    return f'<UploadedFile {self.original_filename}>'

            # 数据库操作工具类
            class DatabaseOperations:
                """数据库操作工具类"""

                @staticmethod
                def create_tables(app):
                    """创建所有数据库表"""
                    with app.app_context():
                        try:
                            # 创建主数据库表
                            db.create_all()
                            print("Main database tables created successfully")

                            # 创建绑定数据库表
                            for bind_key in app.config.get('SQLALCHEMY_BINDS', {}):
                                db.create_all(bind=bind_key)
                                print(f"Bind database '{bind_key}' tables created successfully")

                            return True
                        except Exception as e:
                            print(f"Error creating tables: {e}")
                            return False

                @staticmethod
                def drop_tables(app):
                    """删除所有数据库表"""
                    with app.app_context():
                        try:
                            # 删除绑定数据库表
                            for bind_key in app.config.get('SQLALCHEMY_BINDS', {}):
                                db.drop_all(bind=bind_key)
                                print(f"Bind database '{bind_key}' tables dropped successfully")

                            # 删除主数据库表
                            db.drop_all()
                            print("Main database tables dropped successfully")

                            return True
                        except Exception as e:
                            print(f"Error dropping tables: {e}")
                            return False

                @staticmethod
                def backup_database(bind_key=None):
                    """备份数据库(简化示例)"""
                    # 在实际应用中,这里会使用适当的备份工具
                    backup_info = {
                        'bind_key': bind_key or 'main',
                        'timestamp': '2024-01-15T10:00:00Z',
                        'status': 'completed',
                        'backup_file': f'backup_{bind_key or "main"}_20240115.db'
                    }
                    return backup_info

                @staticmethod
                def get_database_stats(bind_key=None):
                    """获取数据库统计信息"""
                    try:
                        if bind_key:
                            engine = db.get_engine(bind=bind_key)
                        else:
                            engine = db.engine

                        with engine.connect() as conn:
                            # 获取表统计
                            if bind_key == 'main' or bind_key is None:
                                result = conn.execute(text("""
                                    SELECT
                                        table_name,
                                        (SELECT COUNT(*) FROM information_schema.columns
                                         WHERE table_name = t.table_name) as column_count
                                    FROM information_schema.tables t
                                    WHERE table_schema = 'public'
                                """))
                                tables_info = [dict(row) for row in result]
                            else:
                                tables_info = [{'table_name': 'data', 'column_count': 5}]

                        return {
                            'bind_key': bind_key or 'main',
                            'tables': tables_info,
                            'connection_pool': {
                                'size': engine.pool.size(),
                                'checked_in': engine.pool.checkedin(),
                                'checked_out': engine.pool.checkedout()
                            }
                        }
                    except Exception as e:
                        return {'error': str(e)}

            # 创建数据库操作实例
            db_ops = DatabaseOperations()

            @app.route('/db/setup')
            def setup_database():
                """设置数据库"""
                success = db_ops.create_tables(app)
                return jsonify({
                    'message': 'Database setup completed' if success else 'Database setup failed',
                    'bind_databases': list(app.config.get('SQLALCHEMY_BINDS', {}).keys())
                })

            @app.route('/db/stats')
            def get_database_stats():
                """获取所有数据库统计信息"""
                stats = {
                    'main': db_ops.get_database_stats()
                }

                for bind_key in app.config.get('SQLALCHEMY_BINDS', {}):
                    stats[bind_key] = db_ops.get_database_stats(bind_key)

                return jsonify(stats)

            if __name__ == '__main__':
                with app.app_context():
                    db.create_all()
                app.run(debug=True)

02.模型定义和关系
    a.基础模型类设计
        a.用户和内容模型
            from flask import Flask
            from flask_sqlalchemy import SQLAlchemy
            from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey, Table
            from sqlalchemy.orm import relationship, backref
            from sqlalchemy.sql import func
            from datetime import datetime
            import hashlib
            secrets

            app = Flask(__name__)
            app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog_demo.db'
            app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
            db = SQLAlchemy(app)

            # 用户角色关联表(多对多)
            user_roles = Table(
                'user_roles',
                db.Model.metadata,
                Column('user_id', Integer, ForeignKey('users.id'), primary_key=True),
                Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True)
            )

            # 文章标签关联表(多对多)
            post_tags = Table(
                'post_tags',
                db.Model.metadata,
                Column('post_id', Integer, ForeignKey('posts.id'), primary_key=True),
                Column('tag_id', Integer, ForeignKey('tags.id'), primary_key=True)
            )

            # 用户收藏文章关联表(多对多)
            user_favorites = Table(
                'user_favorites',
                db.Model.metadata,
                Column('user_id', Integer, ForeignKey('users.id'), primary_key=True),
                Column('post_id', Integer, ForeignKey('posts.id'), primary_key=True),
                Column('created_at', DateTime, default=datetime.utcnow)
            )

            # 基础模型类
            class BaseModel(db.Model):
                """基础模型类,包含通用字段和方法"""
                __abstract__ = True

                id = Column(Integer, primary_key=True)
                created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
                updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
                is_active = Column(Boolean, default=True, nullable=False)

                def save(self):
                    """保存模型到数据库"""
                    try:
                        db.session.add(self)
                        db.session.commit()
                        return self
                    except Exception as e:
                        db.session.rollback()
                        raise e

                def delete(self):
                    """从数据库删除模型"""
                    try:
                        db.session.delete(self)
                        db.session.commit()
                    except Exception as e:
                        db.session.rollback()
                        raise e

                def to_dict(self, include_relationships=False):
                    """将模型转换为字典"""
                    result = {}
                    for column in self.__table__.columns:
                        value = getattr(self, column.name)
                        if isinstance(value, datetime):
                            value = value.isoformat()
                        result[column.name] = value

                    if include_relationships:
                        for relationship in self.__mapper__.relationships:
                            if relationship.uselist:  # 一对多或多对多关系
                                result[relationship.key] = [item.to_dict() for item in getattr(self, relationship.key)]
                            else:  # 多对一或一对一关系
                                related_obj = getattr(self, relationship.key)
                                result[relationship.key] = related_obj.to_dict() if related_obj else None

                    return result

                @classmethod
                def create(cls, **kwargs):
                    """创建新实例"""
                    instance = cls(**kwargs)
                    return instance.save()

                @classmethod
                def get_by_id(cls, id):
                    """根据ID获取实例"""
                    return cls.query.filter_by(id=id, is_active=True).first()

                @classmethod
                def get_all(cls, limit=None, offset=None):
                    """获取所有活跃实例"""
                    query = cls.query.filter_by(is_active=True)
                    if offset:
                        query = query.offset(offset)
                    if limit:
                        query = query.limit(limit)
                    return query.all()

                def soft_delete(self):
                    """软删除(标记为不活跃)"""
                    self.is_active = False
                    self.save()

            # 角色模型
            class Role(BaseModel):
                __tablename__ = 'roles'

                name = Column(String(50), unique=True, nullable=False, index=True)
                description = Column(String(200))
                permissions = Column(Text)  # JSON格式的权限列表

                # 关系
                users = relationship('User', secondary=user_roles, back_populates='roles')

                def __repr__(self):
                    return f'<Role {self.name}>'

                def has_permission(self, permission):
                    """检查是否具有特定权限"""
                    if not self.permissions:
                        return False
                    try:
                        import json
                        permissions = json.loads(self.permissions)
                        return permission in permissions
                    except:
                        return False

            # 用户模型
            class User(BaseModel):
                __tablename__ = 'users'

                # 基本信息
                username = Column(String(80), unique=True, nullable=False, index=True)
                email = Column(String(120), unique=True, nullable=False, index=True)
                password_hash = Column(String(255), nullable=False)

                # 个人信息
                first_name = Column(String(50))
                last_name = Column(String(50))
                bio = Column(Text)
                avatar_url = Column(String(500))

                # 状态信息
                is_verified = Column(Boolean, default=False)
                last_login = Column(DateTime)
                login_count = Column(Integer, default=0)

                # 关系定义
                roles = relationship('Role', secondary=user_roles, back_populates='users')
                posts = relationship('Post', back_populates='author', lazy='dynamic', cascade='all, delete-orphan')
                comments = relationship('Comment', back_populates='author', lazy='dynamic', cascade='all, delete-orphan')
                favorites = relationship('Post', secondary=user_favorites, backref='favorited_by')

                def __repr__(self):
                    return f'<User {self.username}>'

                @property
                def full_name(self):
                    """获取全名"""
                    if self.first_name and self.last_name:
                        return f"{self.first_name} {self.last_name}"
                    return self.username

                @property
                def is_admin(self):
                    """检查是否为管理员"""
                    admin_role = Role.query.filter_by(name='admin').first()
                    if admin_role:
                        return admin_role in self.roles
                    return False

                def has_role(self, role_name):
                    """检查是否具有特定角色"""
                    return any(role.name == role_name for role in self.roles)

                def has_permission(self, permission):
                    """检查是否具有特定权限"""
                    return any(role.has_permission(permission) for role in self.roles)

                def set_password(self, password):
                    """设置密码哈希"""
                    from werkzeug.security import generate_password_hash
                    self.password_hash = generate_password_hash(password)

                def check_password(self, password):
                    """验证密码"""
                    from werkzeug.security import check_password_hash
                    return check_password_hash(self.password_hash, password)

                def update_last_login(self):
                    """更新最后登录时间"""
                    self.last_login = datetime.utcnow()
                    self.login_count += 1
                    self.save()

                def get_posts_count(self):
                    """获取文章数量"""
                    return self.posts.filter_by(is_active=True).count()

                def get_favorites_count(self):
                    """获取收藏数量"""
                    return len(self.favorites)

            # 分类模型
            class Category(BaseModel):
                __tablename__ = 'categories'

                name = Column(String(100), unique=True, nullable=False, index=True)
                slug = Column(String(100), unique=True, nullable=False, index=True)
                description = Column(Text)
                parent_id = Column(Integer, ForeignKey('categories.id'))
                sort_order = Column(Integer, default=0)

                # 自引用关系(父子分类)
                children = relationship('Category',
                                     backref=backref('parent', remote_side=[id]),
                                     lazy='dynamic')

                # 一对多关系
                posts = relationship('Post', back_populates='category', lazy='dynamic')

                def __repr__(self):
                    return f'<Category {self.name}>'

                @property
                def posts_count(self):
                    """获取分类下的文章数量"""
                    return self.posts.filter_by(is_active=True).count()

                def get_hierarchy_path(self):
                    """获取分类层级路径"""
                    if self.parent:
                        return f"{self.parent.get_hierarchy_path()}/{self.slug}"
                    return self.slug

                def get_all_children(self):
                    """获取所有子分类(递归)"""
                    children = list(self.children)
                    for child in self.children:
                        children.extend(child.get_all_children())
                    return children

            # 标签模型
            class Tag(BaseModel):
                __tablename__ = 'tags'

                name = Column(String(50), unique=True, nullable=False, index=True)
                slug = Column(String(50), unique=True, nullable=False, index=True)
                description = Column(Text)
                color = Column(String(7))  # 十六进制颜色代码

                def __repr__(self):
                    return f'<Tag {self.name}>'

                @property
                def posts_count(self):
                    """获取使用该标签的文章数量"""
                    return len(self.posts)

                def get_related_tags(self, limit=10):
                    """获取相关标签(基于共同文章)"""
                    # 找到有共同文章的标签
                    related_tags = db.session.query(Tag).join(post_tags).join(Post).filter(
                        post_tags.c.tag_id == self.id,
                        Post.is_active == True
                    ).join(post_tags, Post.id == post_tags.c.post_id).filter(
                        post_tags.c.tag_id != self.id
                    ).group_by(Tag.id).order_by(
                        db.func.count(Tag.id).desc()
                    ).limit(limit).all()

                    return related_tags

            # 文章模型
            class Post(BaseModel):
                __tablename__ = 'posts'

                # 基本信息
                title = Column(String(200), nullable=False, index=True)
                slug = Column(String(200), unique=True, nullable=False, index=True)
                content = Column(Text, nullable=False)
                excerpt = Column(Text)

                # 作者和分类
                author_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True)
                category_id = Column(Integer, ForeignKey('categories.id'), nullable=False, index=True)

                # 状态信息
                is_published = Column(Boolean, default=False, index=True)
                is_featured = Column(Boolean, default=False)
                view_count = Column(Integer, default=0)
                like_count = Column(Integer, default=0)
                comment_count = Column(Integer, default=0)

                # 时间信息
                published_at = Column(DateTime)
                expires_at = Column(DateTime)

                # SEO信息
                meta_title = Column(String(200))
                meta_description = Column(String(500))
                meta_keywords = Column(String(500))

                # 关系定义
                author = relationship('User', back_populates='posts')
                category = relationship('Category', back_populates='posts')
                tags = relationship('Tag', secondary=post_tags, back_populates='posts')
                comments = relationship('Comment', back_populates='post', lazy='dynamic', cascade='all, delete-orphan')

                def __repr__(self):
                    return f'<Post {self.title}>'

                @property
                def url(self):
                    """获取文章URL"""
                    return f"/posts/{self.slug}"

                @property
                def word_count(self):
                    """获取文章字数"""
                    return len(self.content.split()) if self.content else 0

                @property
                def reading_time(self):
                    """估算阅读时间(分钟)"""
                    words_per_minute = 200
                    return max(1, round(self.word_count / words_per_minute))

                def increment_view_count(self):
                    """增加浏览次数"""
                    self.view_count += 1
                    db.session.commit()

                def increment_like_count(self):
                    """增加点赞次数"""
                    self.like_count += 1
                    db.session.commit()

                def update_comment_count(self):
                    """更新评论数量"""
                    self.comment_count = self.comments.filter_by(is_active=True, is_approved=True).count()
                    db.session.commit()

                def is_accessible_by_user(self, user):
                    """检查用户是否可以访问此文章"""
                    if self.is_published:
                        return True
                    if user and (user == self.author or user.has_permission('manage_posts')):
                        return True
                    return False

                def get_related_posts(self, limit=5):
                    """获取相关文章"""
                    # 基于标签和分类获取相关文章
                    related_posts = Post.query.filter(
                        Post.id != self.id,
                        Post.is_published == True,
                        Post.is_active == True,
                        db.or_(
                            Post.category_id == self.category_id,
                            Post.tags.any(Tag.id.in_([tag.id for tag in self.tags]))
                        )
                    ).order_by(
                        Post.published_at.desc()
                    ).limit(limit).all()

                    return related_posts

                def add_tag(self, tag):
                    """添加标签"""
                    if tag not in self.tags:
                        self.tags.append(tag)
                        self.save()

                def remove_tag(self, tag):
                    """移除标签"""
                    if tag in self.tags:
                        self.tags.remove(tag)
                        self.save()

                def publish(self):
                    """发布文章"""
                    self.is_published = True
                    self.published_at = datetime.utcnow()
                    self.save()

                def unpublish(self):
                    """取消发布文章"""
                    self.is_published = False
                    self.save()

            # 评论模型
            class Comment(BaseModel):
                __tablename__ = 'comments'

                # 评论内容
                content = Column(Text, nullable=False)
                author_name = Column(String(100))  # 游客评论时使用
                author_email = Column(String(120))  # 游客评论时使用
                author_ip = Column(String(45))

                # 关联信息
                author_id = Column(Integer, ForeignKey('users.id'), nullable=True, index=True)
                post_id = Column(Integer, ForeignKey('posts.id'), nullable=False, index=True)
                parent_id = Column(Integer, ForeignKey('comments.id'), nullable=True)

                # 状态信息
                is_approved = Column(Boolean, default=False, index=True)
                is_spam = Column(Boolean, default=False)

                # 关系定义
                author = relationship('User', back_populates='comments')
                post = relationship('Post', back_populates='comments')
                replies = relationship('Comment', backref=backref('parent', remote_side=[id]), lazy='dynamic')

                def __repr__(self):
                    return f'<Comment {self.id}>'

                @property
                def author_display_name(self):
                    """获取显示的作者名称"""
                    if self.author:
                        return self.author.full_name
                    return self.author_name or 'Anonymous'

                @property
                def replies_count(self):
                    """获取回复数量"""
                    return self.replies.filter_by(is_active=True).count()

                def approve(self):
                    """批准评论"""
                    self.is_approved = True
                    self.is_spam = False
                    self.save()
                    # 更新文章评论数
                    self.post.update_comment_count()

                def reject(self):
                    """拒绝评论(标记为垃圾)"""
                    self.is_approved = False
                    self.is_spam = True
                    self.save()

                def add_reply(self, content, author=None):
                    """添加回复"""
                    reply = Comment(
                        content=content,
                        author_id=author.id if author else None,
                        post_id=self.post_id,
                        parent_id=self.id,
                        is_approved=True  # 回复默认自动批准
                    )
                    return reply.save()

            # 数据库初始化函数
            def init_database():
                """初始化数据库,创建表和默认数据"""
                with app.app_context():
                    # 创建所有表
                    db.create_all()

                    # 创建默认角色
                    admin_role = Role.query.filter_by(name='admin').first()
                    if not admin_role:
                        admin_role = Role(
                            name='admin',
                            description='系统管理员',
                            permissions='["manage_users", "manage_posts", "manage_comments", "manage_settings"]'
                        )
                        admin_role.save()

                    editor_role = Role.query.filter_by(name='editor').first()
                    if not editor_role:
                        editor_role = Role(
                            name='editor',
                            description='编辑',
                            permissions='["manage_posts", "manage_comments"]'
                        )
                        editor_role.save()

                    user_role = Role.query.filter_by(name='user').first()
                    if not user_role:
                        user_role = Role(
                            name='user',
                            description='普通用户',
                            permissions='["read_posts", "create_comments"]'
                        )
                        user_role.save()

                    # 创建默认管理员用户
                    admin_user = User.query.filter_by(username='admin').first()
                    if not admin_user:
                        admin_user = User(
                            username='admin',
                            email='admin@example.com',
                            first_name='Admin',
                            last_name='User',
                            is_verified=True
                        )
                        admin_user.set_password('admin123')
                        admin_user.save()
                        admin_user.roles.append(admin_role)
                        admin_user.save()

                    # 创建默认分类
                    default_category = Category.query.filter_by(slug='uncategorized').first()
                    if not default_category:
                        default_category = Category(
                            name='未分类',
                            slug='uncategorized',
                            description='默认分类'
                        )
                        default_category.save()

                    # 创建一些默认标签
                    default_tags = ['技术', '生活', '教程', '新闻']
                    for tag_name in default_tags:
                        tag = Tag.query.filter_by(name=tag_name).first()
                        if not tag:
                            tag = Tag(
                                name=tag_name,
                                slug=tag_name.lower(),
                                color='#007bff'
                            )
                            tag.save()

                print("Database initialized successfully!")

            if __name__ == '__main__':
                init_database()
                app.run(debug=True)

5.2 数据库操作和查询

01.CRUD 操作实现
    a.基础增删改查
        a.用户管理 CRUD 操作
            from flask import Flask, jsonify, request, g
            from flask_sqlalchemy import SQLAlchemy
            from sqlalchemy import and_, or_, not_, func, desc, asc, text
            from sqlalchemy.exc import SQLAlchemyError
            from datetime import datetime, timedelta
            import re

            app = Flask(__name__)
            app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog_crud.db'
            app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
            db = SQLAlchemy(app)

            # 使用前面定义的模型类
            from models import User, Post, Comment, Category, Tag, BaseModel

            class UserService:
                """用户服务类,包含完整的CRUD操作"""

                @staticmethod
                def create_user(user_data):
                    """创建新用户"""
                    try:
                        # 验证必填字段
                        required_fields = ['username', 'email', 'password']
                        for field in required_fields:
                            if not user_data.get(field):
                                return {'success': False, 'error': f'{field} is required'}

                        # 检查用户名和邮箱是否已存在
                        if User.query.filter_by(username=user_data['username']).first():
                            return {'success': False, 'error': 'Username already exists'}

                        if User.query.filter_by(email=user_data['email']).first():
                            return {'success': False, 'error': 'Email already exists'}

                        # 创建新用户
                        user = User(
                            username=user_data['username'],
                            email=user_data['email'],
                            first_name=user_data.get('first_name', ''),
                            last_name=user_data.get('last_name', ''),
                            bio=user_data.get('bio', '')
                        )
                        user.set_password(user_data['password'])

                        # 分配默认角色
                        default_role = Role.query.filter_by(name='user').first()
                        if default_role:
                            user.roles.append(default_role)

                        user.save()

                        return {
                            'success': True,
                            'user': user.to_dict(include_relationships=False)
                        }

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def get_user(user_id, include_sensitive=False):
                    """获取单个用户信息"""
                    try:
                        user = User.query.filter_by(id=user_id, is_active=True).first()
                        if not user:
                            return {'success': False, 'error': 'User not found'}

                        user_data = user.to_dict(include_relationships=True)

                        # 移除敏感信息
                        if not include_sensitive:
                            user_data.pop('password_hash', None)

                        return {'success': True, 'user': user_data}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def get_users(filters=None, pagination=None, sorting=None):
                    """获取用户列表,支持过滤、分页和排序"""
                    try:
                        query = User.query.filter_by(is_active=True)

                        # 应用过滤器
                        if filters:
                            if filters.get('search'):
                                search_term = f"%{filters['search']}%"
                                query = query.filter(
                                    or_(
                                        User.username.ilike(search_term),
                                        User.email.ilike(search_term),
                                        User.first_name.ilike(search_term),
                                        User.last_name.ilike(search_term)
                                    )
                                )

                            if filters.get('role'):
                                query = query.filter(User.roles.any(Role.name == filters['role']))

                            if filters.get('is_verified') is not None:
                                query = query.filter(User.is_verified == filters['is_verified'])

                            if filters.get('last_login_from'):
                                query = query.filter(User.last_login >= filters['last_login_from'])

                            if filters.get('last_login_to'):
                                query = query.filter(User.last_login <= filters['last_login_to'])

                        # 应用排序
                        if sorting:
                            field = sorting.get('field', 'created_at')
                            direction = desc if sorting.get('direction') == 'desc' else asc

                            if hasattr(User, field):
                                query = query.order_by(direction(getattr(User, field)))
                        else:
                            query = query.order_by(desc(User.created_at))

                        # 应用分页
                        total = query.count()
                        if pagination:
                            page = pagination.get('page', 1)
                            per_page = min(pagination.get('per_page', 20), 100)  # 限制每页最大数量

                            offset = (page - 1) * per_page
                            query = query.offset(offset).limit(per_page)

                        users = query.all()
                        users_data = [user.to_dict(include_relationships=False) for user in users]

                        return {
                            'success': True,
                            'users': users_data,
                            'total': total,
                            'page': pagination.get('page', 1) if pagination else 1,
                            'per_page': pagination.get('per_page', 20) if pagination else total
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def update_user(user_id, update_data):
                    """更新用户信息"""
                    try:
                        user = User.query.filter_by(id=user_id, is_active=True).first()
                        if not user:
                            return {'success': False, 'error': 'User not found'}

                        # 更新基本信息
                        updatable_fields = ['username', 'email', 'first_name', 'last_name', 'bio', 'avatar_url']
                        for field in updatable_fields:
                            if field in update_data:
                                # 检查唯一性约束
                                if field in ['username', 'email']:
                                    existing_user = User.query.filter(
                                        getattr(User, field) == update_data[field],
                                        User.id != user_id
                                    ).first()
                                    if existing_user:
                                        return {'success': False, 'error': f'{field} already exists'}

                                setattr(user, field, update_data[field])

                        # 更新密码
                        if 'password' in update_data:
                            user.set_password(update_data['password'])

                        # 更新角色
                        if 'roles' in update_data:
                            # 清除现有角色
                            user.roles.clear()

                            # 添加新角色
                            for role_name in update_data['roles']:
                                role = Role.query.filter_by(name=role_name).first()
                                if role:
                                    user.roles.append(role)

                        # 更新其他字段
                        if 'is_verified' in update_data:
                            user.is_verified = update_data['is_verified']

                        if 'is_active' in update_data:
                            user.is_active = update_data['is_active']

                        user.save()

                        return {
                            'success': True,
                            'user': user.to_dict(include_relationships=True)
                        }

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def delete_user(user_id, soft_delete=True):
                    """删除用户"""
                    try:
                        user = User.query.filter_by(id=user_id).first()
                        if not user:
                            return {'success': False, 'error': 'User not found'}

                        if soft_delete:
                            # 软删除
                            user.soft_delete()
                            return {'success': True, 'message': 'User soft deleted successfully'}
                        else:
                            # 硬删除
                            # 检查是否有关联数据
                            posts_count = user.posts.count()
                            comments_count = user.comments.count()

                            if posts_count > 0 or comments_count > 0:
                                return {
                                    'success': False,
                                    'error': 'Cannot delete user with associated posts or comments',
                                    'posts_count': posts_count,
                                    'comments_count': comments_count
                                }

                            user.delete()
                            return {'success': True, 'message': 'User deleted successfully'}

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

            # 文章服务类
            class PostService:
                """文章服务类"""

                @staticmethod
                def create_post(post_data, author_id):
                    """创建新文章"""
                    try:
                        # 验证必填字段
                        required_fields = ['title', 'content', 'category_id']
                        for field in required_fields:
                            if not post_data.get(field):
                                return {'success': False, 'error': f'{field} is required'}

                        # 验证作者是否存在
                        author = User.query.filter_by(id=author_id, is_active=True).first()
                        if not author:
                            return {'success': False, 'error': 'Author not found'}

                        # 验证分类是否存在
                        category = Category.query.filter_by(id=post_data['category_id'], is_active=True).first()
                        if not category:
                            return {'success': False, 'error': 'Category not found'}

                        # 生成唯一的slug
                        slug = post_data['title'].lower().replace(' ', '-').replace(',', '').replace('.', '')
                        slug = re.sub(r'[^a-z0-9-]', '', slug)

                        # 确保slug唯一
                        original_slug = slug
                        counter = 1
                        while Post.query.filter_by(slug=slug).first():
                            slug = f"{original_slug}-{counter}"
                            counter += 1

                        # 创建文章
                        post = Post(
                            title=post_data['title'],
                            slug=slug,
                            content=post_data['content'],
                            excerpt=post_data.get('excerpt', ''),
                            author_id=author_id,
                            category_id=post_data['category_id'],
                            is_published=post_data.get('is_published', False),
                            is_featured=post_data.get('is_featured', False),
                            meta_title=post_data.get('meta_title', ''),
                            meta_description=post_data.get('meta_description', ''),
                            meta_keywords=post_data.get('meta_keywords', '')
                        )

                        post.save()

                        # 添加标签
                        if 'tag_ids' in post_data:
                            for tag_id in post_data['tag_ids']:
                                tag = Tag.query.filter_by(id=tag_id, is_active=True).first()
                                if tag:
                                    post.tags.append(tag)

                        post.save()

                        return {
                            'success': True,
                            'post': post.to_dict(include_relationships=True)
                        }

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def get_post(post_id, user=None):
                    """获取单个文章"""
                    try:
                        post = Post.query.filter_by(id=post_id, is_active=True).first()
                        if not post:
                            return {'success': False, 'error': 'Post not found'}

                        # 检查访问权限
                        if not post.is_accessible_by_user(user):
                            return {'success': False, 'error': 'Access denied'}

                        # 增加浏览次数
                        post.increment_view_count()

                        return {
                            'success': True,
                            'post': post.to_dict(include_relationships=True)
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def get_posts(filters=None, pagination=None, sorting=None):
                    """获取文章列表"""
                    try:
                        query = Post.query.filter_by(is_active=True)

                        # 应用过滤器
                        if filters:
                            # 根据用户权限过滤
                            if filters.get('user_id'):
                                query = query.filter(Post.author_id == filters['user_id'])

                            if filters.get('category_id'):
                                query = query.filter(Post.category_id == filters['category_id'])

                            if filters.get('tag_id'):
                                query = query.filter(Post.tags.any(Tag.id == filters['tag_id']))

                            if filters.get('is_published') is not None:
                                query = query.filter(Post.is_published == filters['is_published'])

                            if filters.get('is_featured') is not None:
                                query = query.filter(Post.is_featured == filters['is_featured'])

                            if filters.get('search'):
                                search_term = f"%{filters['search']}%"
                                query = query.filter(
                                    or_(
                                        Post.title.ilike(search_term),
                                        Post.content.ilike(search_term),
                                        Post.excerpt.ilike(search_term)
                                    )
                                )

                            if filters.get('date_from'):
                                query = query.filter(Post.created_at >= filters['date_from'])

                            if filters.get('date_to'):
                                query = query.filter(Post.created_at <= filters['date_to'])

                        # 应用排序
                        if sorting:
                            field = sorting.get('field', 'created_at')
                            direction = desc if sorting.get('direction') == 'desc' else asc

                            if hasattr(Post, field):
                                query = query.order_by(direction(getattr(Post, field)))
                        else:
                            query = query.order_by(desc(Post.published_at))

                        # 应用分页
                        total = query.count()
                        if pagination:
                            page = pagination.get('page', 1)
                            per_page = min(pagination.get('per_page', 10), 50)

                            offset = (page - 1) * per_page
                            query = query.offset(offset).limit(per_page)

                        posts = query.all()
                        posts_data = [post.to_dict(include_relationships=False) for post in posts]

                        return {
                            'success': True,
                            'posts': posts_data,
                            'total': total,
                            'page': pagination.get('page', 1) if pagination else 1,
                            'per_page': pagination.get('per_page', 10) if pagination else total
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def update_post(post_id, update_data, user=None):
                    """更新文章"""
                    try:
                        post = Post.query.filter_by(id=post_id, is_active=True).first()
                        if not post:
                            return {'success': False, 'error': 'Post not found'}

                        # 检查权限
                        if not post.is_accessible_by_user(user):
                            return {'success': False, 'error': 'Access denied'}

                        # 更新基本信息
                        updatable_fields = ['title', 'content', 'excerpt', 'category_id',
                                          'is_published', 'is_featured', 'meta_title',
                                          'meta_description', 'meta_keywords']

                        for field in updatable_fields:
                            if field in update_data:
                                # 特殊处理:如果更改标题,重新生成slug
                                if field == 'title' and update_data[field] != post.title:
                                    new_slug = update_data[field].lower().replace(' ', '-').replace(',', '').replace('.', '')
                                    new_slug = re.sub(r'[^a-z0-9-]', '', new_slug)

                                    # 确保新slug唯一
                                    original_slug = new_slug
                                    counter = 1
                                    while Post.query.filter(Post.slug == new_slug, Post.id != post_id).first():
                                        new_slug = f"{original_slug}-{counter}"
                                        counter += 1

                                    post.slug = new_slug

                                setattr(post, field, update_data[field])

                        # 验证分类
                        if 'category_id' in update_data:
                            category = Category.query.filter_by(
                                id=update_data['category_id'],
                                is_active=True
                            ).first()
                            if not category:
                                return {'success': False, 'error': 'Category not found'}

                        # 更新标签
                        if 'tag_ids' in update_data:
                            post.tags.clear()
                            for tag_id in update_data['tag_ids']:
                                tag = Tag.query.filter_by(id=tag_id, is_active=True).first()
                                if tag:
                                    post.tags.append(tag)

                        # 发布/取消发布处理
                        if 'is_published' in update_data:
                            if update_data['is_published'] and not post.is_published:
                                post.publish()
                            elif not update_data['is_published'] and post.is_published:
                                post.unpublish()

                        post.save()

                        return {
                            'success': True,
                            'post': post.to_dict(include_relationships=True)
                        }

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def delete_post(post_id, user=None):
                    """删除文章"""
                    try:
                        post = Post.query.filter_by(id=post_id, is_active=True).first()
                        if not post:
                            return {'success': False, 'error': 'Post not found'}

                        # 检查权限
                        if not post.is_accessible_by_user(user):
                            return {'success': False, 'error': 'Access denied'}

                        # 软删除
                        post.soft_delete()

                        return {'success': True, 'message': 'Post deleted successfully'}

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def like_post(post_id):
                    """点赞文章"""
                    try:
                        post = Post.query.filter_by(id=post_id, is_active=True).first()
                        if not post:
                            return {'success': False, 'error': 'Post not found'}

                        post.increment_like_count()

                        return {
                            'success': True,
                            'like_count': post.like_count
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

            # 评论服务类
            class CommentService:
                """评论服务类"""

                @staticmethod
                def create_comment(comment_data, post_id, author_id=None):
                    """创建新评论"""
                    try:
                        # 验证文章是否存在
                        post = Post.query.filter_by(id=post_id, is_active=True).first()
                        if not post:
                            return {'success': False, 'error': 'Post not found'}

                        # 验证必填字段
                        if not comment_data.get('content'):
                            return {'success': False, 'error': 'Content is required'}

                        # 验证作者
                        author = None
                        if author_id:
                            author = User.query.filter_by(id=author_id, is_active=True).first()
                            if not author:
                                return {'success': False, 'error': 'Author not found'}
                        else:
                            # 游客评论,需要姓名和邮箱
                            if not comment_data.get('author_name') or not comment_data.get('author_email'):
                                return {'success': False, 'error': 'Author name and email required for guest comments'}

                        # 验证父评论(如果是回复)
                        parent_comment = None
                        if comment_data.get('parent_id'):
                            parent_comment = Comment.query.filter_by(
                                id=comment_data['parent_id'],
                                post_id=post_id,
                                is_active=True
                            ).first()
                            if not parent_comment:
                                return {'success': False, 'error': 'Parent comment not found'}

                        # 创建评论
                        comment = Comment(
                            content=comment_data['content'],
                            author_id=author_id,
                            post_id=post_id,
                            parent_id=comment_data.get('parent_id'),
                            author_name=comment_data.get('author_name') if not author else None,
                            author_email=comment_data.get('author_email') if not author else None,
                            author_ip=comment_data.get('author_ip'),
                            is_approved=author is not None  # 注册用户评论自动批准
                        )

                        comment.save()

                        # 更新文章评论数
                        post.update_comment_count()

                        return {
                            'success': True,
                            'comment': comment.to_dict(include_relationships=True)
                        }

                    except SQLAlchemyError as e:
                        db.session.rollback()
                        return {'success': False, 'error': f'Database error: {str(e)}'}
                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                @staticmethod
                def get_comments(post_id, filters=None, pagination=None):
                    """获取评论列表"""
                    try:
                        query = Comment.query.filter_by(post_id=post_id, is_active=True)

                        # 应用过滤器
                        if filters:
                            if filters.get('is_approved') is not None:
                                query = query.filter(Comment.is_approved == filters['is_approved'])

                            if filters.get('author_id'):
                                query = query.filter(Comment.author_id == filters['author_id'])

                            if filters.get('parent_id') is not None:
                                query = query.filter(Comment.parent_id == filters['parent_id'])

                        # 默认排序:顶级评论在前,按时间排序
                        query = query.order_by(asc(Comment.parent_id.nullslast()), desc(Comment.created_at))

                        # 应用分页
                        total = query.count()
                        if pagination:
                            page = pagination.get('page', 1)
                            per_page = min(pagination.get('per_page', 20), 100)

                            offset = (page - 1) * per_page
                            query = query.offset(offset).limit(per_page)

                        comments = query.all()
                        comments_data = [comment.to_dict(include_relationships=True) for comment in comments]

                        return {
                            'success': True,
                            'comments': comments_data,
                            'total': total,
                            'page': pagination.get('page', 1) if pagination else 1,
                            'per_page': pagination.get('per_page', 20) if pagination else total
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

            # Flask 路由定义
            @app.route('/api/users', methods=['POST'])
            def create_user():
                """创建用户API"""
                user_data = request.get_json()
                result = UserService.create_user(user_data)

                if result['success']:
                    return jsonify(result), 201
                else:
                    return jsonify(result), 400

            @app.route('/api/users/<int:user_id>')
            def get_user(user_id):
                """获取用户信息API"""
                result = UserService.get_user(user_id)

                if result['success']:
                    return jsonify(result)
                else:
                    return jsonify(result), 404

            @app.route('/api/users')
            def get_users():
                """获取用户列表API"""
                filters = {}
                pagination = {}
                sorting = {}

                # 解析查询参数
                if request.args.get('search'):
                    filters['search'] = request.args.get('search')

                if request.args.get('role'):
                    filters['role'] = request.args.get('role')

                if request.args.get('is_verified'):
                    filters['is_verified'] = request.args.get('is_verified').lower() == 'true'

                if request.args.get('page'):
                    pagination['page'] = int(request.args.get('page'))

                if request.args.get('per_page'):
                    pagination['per_page'] = int(request.args.get('per_page'))

                if request.args.get('sort'):
                    sorting['field'] = request.args.get('sort')

                if request.args.get('order'):
                    sorting['direction'] = request.args.get('order')

                result = UserService.get_users(filters, pagination, sorting)
                return jsonify(result)

            @app.route('/api/users/<int:user_id>', methods=['PUT'])
            def update_user(user_id):
                """更新用户信息API"""
                update_data = request.get_json()
                result = UserService.update_user(user_id, update_data)

                if result['success']:
                    return jsonify(result)
                else:
                    return jsonify(result), 400

            @app.route('/api/users/<int:user_id>', methods=['DELETE'])
            def delete_user(user_id):
                """删除用户API"""
                soft_delete = request.args.get('soft', 'true').lower() == 'true'
                result = UserService.delete_user(user_id, soft_delete)

                if result['success']:
                    return jsonify(result)
                else:
                    return jsonify(result), 400

            @app.route('/api/posts', methods=['POST'])
            def create_post():
                """创建文章API"""
                post_data = request.get_json()
                author_id = post_data.get('author_id')  # 在实际应用中应该从认证中获取

                result = PostService.create_post(post_data, author_id)

                if result['success']:
                    return jsonify(result), 201
                else:
                    return jsonify(result), 400

            @app.route('/api/posts/<int:post_id>')
            def get_post(post_id):
                """获取文章API"""
                # 在实际应用中应该从认证中获取用户信息
                user = None  # User.query.get(request.user.id) if request.user else None

                result = PostService.get_post(post_id, user)

                if result['success']:
                    return jsonify(result)
                else:
                    return jsonify(result), 404

            @app.route('/api/posts')
            def get_posts():
                """获取文章列表API"""
                filters = {}
                pagination = {}
                sorting = {}

                # 解析查询参数
                if request.args.get('search'):
                    filters['search'] = request.args.get('search')

                if request.args.get('category_id'):
                    filters['category_id'] = int(request.args.get('category_id'))

                if request.args.get('tag_id'):
                    filters['tag_id'] = int(request.args.get('tag_id'))

                if request.args.get('is_published'):
                    filters['is_published'] = request.args.get('is_published').lower() == 'true'

                if request.args.get('page'):
                    pagination['page'] = int(request.args.get('page'))

                if request.args.get('per_page'):
                    pagination['per_page'] = int(request.args.get('per_page'))

                if request.args.get('sort'):
                    sorting['field'] = request.args.get('sort')

                if request.args.get('order'):
                    sorting['direction'] = request.args.get('order')

                result = PostService.get_posts(filters, pagination, sorting)
                return jsonify(result)

            @app.route('/api/posts/<int:post_id>/like', methods=['POST'])
            def like_post(post_id):
                """点赞文章API"""
                result = PostService.like_post(post_id)

                if result['success']:
                    return jsonify(result)
                else:
                    return jsonify(result), 404

            @app.route('/api/posts/<int:post_id>/comments', methods=['POST'])
            def create_comment(post_id):
                """创建评论API"""
                comment_data = request.get_json()
                author_id = comment_data.get('author_id')  # 可选,从认证中获取

                result = CommentService.create_comment(comment_data, post_id, author_id)

                if result['success']:
                    return jsonify(result), 201
                else:
                    return jsonify(result), 400

            @app.route('/api/posts/<int:post_id>/comments')
            def get_comments(post_id):
                """获取评论列表API"""
                filters = {}
                pagination = {}

                if request.args.get('is_approved'):
                    filters['is_approved'] = request.args.get('is_approved').lower() == 'true'

                if request.args.get('page'):
                    pagination['page'] = int(request.args.get('page'))

                if request.args.get('per_page'):
                    pagination['per_page'] = int(request.args.get('per_page'))

                result = CommentService.get_comments(post_id, filters, pagination)
                return jsonify(result)

            # 数据库统计API
            @app.route('/api/stats/dashboard')
            def get_dashboard_stats():
                """获取仪表板统计数据"""
                try:
                    stats = {
                        'users': {
                            'total': User.query.filter_by(is_active=True).count(),
                            'verified': User.query.filter_by(is_active=True, is_verified=True).count(),
                            'new_this_month': User.query.filter(
                                User.is_active == True,
                                User.created_at >= datetime.utcnow() - timedelta(days=30)
                            ).count()
                        },
                        'posts': {
                            'total': Post.query.filter_by(is_active=True).count(),
                            'published': Post.query.filter_by(is_active=True, is_published=True).count(),
                            'featured': Post.query.filter_by(is_active=True, is_featured=True).count(),
                            'new_this_month': Post.query.filter(
                                Post.is_active == True,
                                Post.created_at >= datetime.utcnow() - timedelta(days=30)
                            ).count()
                        },
                        'comments': {
                            'total': Comment.query.filter_by(is_active=True).count(),
                            'approved': Comment.query.filter_by(is_active=True, is_approved=True).count(),
                            'pending': Comment.query.filter_by(is_active=True, is_approved=False).count(),
                            'new_this_month': Comment.query.filter(
                                Comment.is_active == True,
                                Comment.created_at >= datetime.utcnow() - timedelta(days=30)
                            ).count()
                        },
                        'categories': {
                            'total': Category.query.filter_by(is_active=True).count()
                        },
                        'tags': {
                            'total': Tag.query.filter_by(is_active=True).count()
                        }
                    }

                    # 最受欢迎的文章
                    popular_posts = Post.query.filter_by(is_active=True, is_published=True).order_by(
                        desc(Post.view_count)
                    ).limit(5).all()

                    stats['popular_posts'] = [post.to_dict(include_relationships=False) for post in popular_posts]

                    return jsonify({'success': True, 'stats': stats})

                except Exception as e:
                    return jsonify({'success': False, 'error': str(e)}), 500

            if __name__ == '__main__':
                # 初始化数据库
                init_database()
                app.run(debug=True)

5.3 数据库迁移和优化

01.Flask-Migrate 数据库迁移
    a.基础迁移配置
        a.设置 Flask-Migrate
            from flask import Flask
            from flask_sqlalchemy import SQLAlchemy
            from flask_migrate import Migrate, MigrateCommand
            from flask_script import Manager
            import os

            app = Flask(__name__)

            # 数据库配置
            def get_database_url():
                """获取数据库URL,支持不同环境"""
                env = os.environ.get('FLASK_ENV', 'development')

                if env == 'testing':
                    return 'sqlite:///test_blog.db'
                elif env == 'production':
                    # 生产环境使用PostgreSQL
                    db_host = os.environ.get('DB_HOST', 'localhost')
                    db_port = os.environ.get('DB_PORT', '5432')
                    db_name = os.environ.get('DB_NAME', 'blog_prod')
                    db_user = os.environ.get('DB_USER', 'postgres')
                    db_password = os.environ.get('DB_PASSWORD', '')

                    return f'postgresql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}'
                else:
                    # 开发环境使用SQLite
                    return 'sqlite:///blog_dev.db'

            app.config['SQLALCHEMY_DATABASE_URI'] = get_database_url()
            app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

            # 创建数据库实例
            db = SQLAlchemy(app)

            # 创建迁移实例
            migrate = Migrate(app, db)

            # 创建命令管理器
            manager = Manager(app)
            manager.add_command('db', MigrateCommand)

            # 导入模型(确保所有模型都被导入)
            from models import User, Post, Comment, Category, Tag, Role

            class DatabaseMigrationManager:
                """数据库迁移管理器"""

                def __init__(self, app=None, db=None):
                    self.app = app
                    self.db = db
                    self.migration_history = []

                def init_app(self, app, db):
                    """初始化迁移管理器"""
                    self.app = app
                    self.db = db

                def create_migration(self, message=None):
                    """创建新的迁移文件"""
                    import subprocess
                    import sys

                    try:
                        cmd = [sys.executable, '-m', 'flask', 'db', 'revision', '--autogenerate']
                        if message:
                            cmd.extend(['-m', message])

                        result = subprocess.run(cmd, capture_output=True, text=True, cwd=os.getcwd())

                        if result.returncode == 0:
                            return {'success': True, 'message': 'Migration created successfully', 'output': result.stdout}
                        else:
                            return {'success': False, 'error': result.stderr}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def apply_migrations(self, target='head'):
                    """应用迁移"""
                    import subprocess
                    import sys

                    try:
                        cmd = [sys.executable, '-m', 'flask', 'db', 'upgrade', target]
                        result = subprocess.run(cmd, capture_output=True, text=True, cwd=os.getcwd())

                        if result.returncode == 0:
                            return {'success': True, 'message': 'Migrations applied successfully', 'output': result.stdout}
                        else:
                            return {'success': False, 'error': result.stderr}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def rollback_migration(self, revision):
                    """回滚到指定版本"""
                    import subprocess
                    import sys

                    try:
                        cmd = [sys.executable, '-m', 'flask', 'db', 'downgrade', revision]
                        result = subprocess.run(cmd, capture_output=True, text=True, cwd=os.getcwd())

                        if result.returncode == 0:
                            return {'success': True, 'message': 'Rollback successful', 'output': result.stdout}
                        else:
                            return {'success': False, 'error': result.stderr}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def get_migration_status(self):
                    """获取迁移状态"""
                    import subprocess
                    import sys

                    try:
                        # 获取当前版本
                        cmd_current = [sys.executable, '-m', 'flask', 'db', 'current']
                        result_current = subprocess.run(cmd_current, capture_output=True, text=True, cwd=os.getcwd())

                        # 获取历史记录
                        cmd_history = [sys.executable, '-m', 'flask', 'db', 'history']
                        result_history = subprocess.run(cmd_history, capture_output=True, text=True, cwd=os.getcwd())

                        return {
                            'success': True,
                            'current': result_current.stdout.strip() if result_current.returncode == 0 else 'Unknown',
                            'history': result_history.stdout.strip() if result_history.returncode == 0 else 'Unknown'
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

            # 创建迁移管理器实例
            migration_manager = DatabaseMigrationManager(app, db)

            # 数据库备份和恢复
            class DatabaseBackupManager:
                """数据库备份管理器"""

                def __init__(self, app=None):
                    self.app = app
                    self.backup_dir = 'backups'
                    os.makedirs(self.backup_dir, exist_ok=True)

                def create_backup(self, backup_name=None):
                    """创建数据库备份"""
                    from datetime import datetime
                    import json
                    import shutil

                    try:
                        if not backup_name:
                            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
                            backup_name = f'backup_{timestamp}'

                        backup_path = os.path.join(self.backup_dir, backup_name)
                        os.makedirs(backup_path, exist_ok=True)

                        # 获取数据库配置
                        db_url = app.config['SQLALCHEMY_DATABASE_URI']

                        if db_url.startswith('sqlite'):
                            # SQLite备份
                            db_path = db_url.replace('sqlite:///', '')
                            if os.path.exists(db_path):
                                shutil.copy2(db_path, os.path.join(backup_path, 'database.db'))

                                # 备份元数据
                                metadata = {
                                    'backup_name': backup_name,
                                    'created_at': datetime.now().isoformat(),
                                    'database_type': 'sqlite',
                                    'file_path': db_path,
                                    'file_size': os.path.getsize(db_path)
                                }

                        elif db_url.startswith('postgresql'):
                            # PostgreSQL备份
                            import subprocess

                            # 解析连接信息
                            import re
                            pattern = r'postgresql://([^:]+):([^@]+)@([^:]+):(\d+)/(.+)'
                            match = re.match(pattern, db_url)

                            if match:
                                username, password, host, port, dbname = match.groups()

                                # 创建转储文件
                                dump_file = os.path.join(backup_path, 'database.sql')
                                cmd = [
                                    'pg_dump',
                                    f'--host={host}',
                                    f'--port={port}',
                                    f'--username={username}',
                                    f'--dbname={dbname}',
                                    f'--file={dump_file}',
                                    '--no-password',
                                    '--verbose',
                                    '--clean',
                                    '--if-exists',
                                    '--create'
                                ]

                                # 设置环境变量
                                env = os.environ.copy()
                                env['PGPASSWORD'] = password

                                result = subprocess.run(cmd, env=env, capture_output=True, text=True)

                                if result.returncode != 0:
                                    return {'success': False, 'error': result.stderr}

                                metadata = {
                                    'backup_name': backup_name,
                                    'created_at': datetime.now().isoformat(),
                                    'database_type': 'postgresql',
                                    'host': host,
                                    'port': port,
                                    'dbname': dbname,
                                    'dump_file': dump_file
                                }
                            else:
                                return {'success': False, 'error': 'Invalid PostgreSQL connection string'}

                        else:
                            return {'success': False, 'error': 'Unsupported database type'}

                        # 保存元数据
                        with open(os.path.join(backup_path, 'metadata.json'), 'w') as f:
                            json.dump(metadata, f, indent=2)

                        return {
                            'success': True,
                            'backup_name': backup_name,
                            'backup_path': backup_path,
                            'metadata': metadata
                        }

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def restore_backup(self, backup_name):
                    """恢复数据库备份"""
                    import json
                    import subprocess

                    try:
                        backup_path = os.path.join(self.backup_dir, backup_name)

                        if not os.path.exists(backup_path):
                            return {'success': False, 'error': 'Backup not found'}

                        # 读取元数据
                        metadata_file = os.path.join(backup_path, 'metadata.json')
                        if not os.path.exists(metadata_file):
                            return {'success': False, 'error': 'Backup metadata not found'}

                        with open(metadata_file, 'r') as f:
                            metadata = json.load(f)

                        db_url = app.config['SQLALCHEMY_DATABASE_URI']

                        if metadata['database_type'] == 'sqlite':
                            # SQLite恢复
                            db_path = db_url.replace('sqlite:///', '')
                            backup_file = os.path.join(backup_path, 'database.db')

                            if os.path.exists(backup_file):
                                import shutil
                                shutil.copy2(backup_file, db_path)

                                return {
                                    'success': True,
                                    'message': 'SQLite database restored successfully'
                                }
                            else:
                                return {'success': False, 'error': 'SQLite backup file not found'}

                        elif metadata['database_type'] == 'postgresql':
                            # PostgreSQL恢复
                            dump_file = os.path.join(backup_path, 'database.sql')

                            if not os.path.exists(dump_file):
                                return {'success': False, 'error': 'PostgreSQL dump file not found'}

                            # 解析当前数据库连接信息
                            import re
                            pattern = r'postgresql://([^:]+):([^@]+)@([^:]+):(\d+)/(.+)'
                            match = re.match(pattern, db_url)

                            if match:
                                username, password, host, port, dbname = match.groups()

                                cmd = [
                                    'psql',
                                    f'--host={host}',
                                    f'--port={port}',
                                    f'--username={username}',
                                    f'--dbname={dbname}',
                                    '--file=' + dump_file,
                                    '--no-password',
                                    '--verbose'
                                ]

                                env = os.environ.copy()
                                env['PGPASSWORD'] = password

                                result = subprocess.run(cmd, env=env, capture_output=True, text=True)

                                if result.returncode == 0:
                                    return {
                                        'success': True,
                                        'message': 'PostgreSQL database restored successfully'
                                    }
                                else:
                                    return {'success': False, 'error': result.stderr}
                            else:
                                return {'success': False, 'error': 'Invalid PostgreSQL connection string'}

                        else:
                            return {'success': False, 'error': 'Unsupported database type'}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def list_backups(self):
                    """列出所有备份"""
                    import json

                    try:
                        backups = []

                        if not os.path.exists(self.backup_dir):
                            return {'success': True, 'backups': []}

                        for item in os.listdir(self.backup_dir):
                            backup_path = os.path.join(self.backup_dir, item)

                            if os.path.isdir(backup_path):
                                metadata_file = os.path.join(backup_path, 'metadata.json')

                                if os.path.exists(metadata_file):
                                    try:
                                        with open(metadata_file, 'r') as f:
                                            metadata = json.load(f)

                                        # 添加额外信息
                                        metadata['backup_path'] = backup_path
                                        metadata['size_bytes'] = self._get_directory_size(backup_path)

                                        backups.append(metadata)
                                    except:
                                        continue

                        # 按创建时间排序
                        backups.sort(key=lambda x: x['created_at'], reverse=True)

                        return {'success': True, 'backups': backups}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def delete_backup(self, backup_name):
                    """删除备份"""
                    import shutil

                    try:
                        backup_path = os.path.join(self.backup_dir, backup_name)

                        if not os.path.exists(backup_path):
                            return {'success': False, 'error': 'Backup not found'}

                        shutil.rmtree(backup_path)

                        return {'success': True, 'message': 'Backup deleted successfully'}

                    except Exception as e:
                        return {'success': False, 'error': str(e)}

                def _get_directory_size(self, path):
                    """获取目录大小"""
                    total_size = 0
                    try:
                        for dirpath, dirnames, filenames in os.walk(path):
                            for filename in filenames:
                                filepath = os.path.join(dirpath, filename)
                                if os.path.exists(filepath):
                                    total_size += os.path.getsize(filepath)
                    except:
                        pass
                    return total_size

            # 创建备份管理器实例
            backup_manager = DatabaseBackupManager(app)

            # API 路由
            @app.route('/api/db/migrate/create', methods=['POST'])
            def create_migration():
                """创建迁移API"""
                data = request.get_json() or {}
                message = data.get('message')

                result = migration_manager.create_migration(message)

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 400

            @app.route('/api/db/migrate/apply', methods=['POST'])
            def apply_migrations():
                """应用迁移API"""
                data = request.get_json() or {}
                target = data.get('target', 'head')

                result = migration_manager.apply_migrations(target)

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 400

            @app.route('/api/db/migrate/rollback', methods=['POST'])
            def rollback_migration():
                """回滚迁移API"""
                data = request.get_json() or {}
                revision = data.get('revision')

                if not revision:
                    return jsonify({'success': False, 'error': 'Revision is required'}), 400

                result = migration_manager.rollback_migration(revision)

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 400

            @app.route('/api/db/migrate/status')
            def get_migration_status():
                """获取迁移状态API"""
                result = migration_manager.get_migration_status()

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 500

            @app.route('/api/db/backup', methods=['POST'])
            def create_backup():
                """创建备份API"""
                data = request.get_json() or {}
                backup_name = data.get('backup_name')

                result = backup_manager.create_backup(backup_name)

                if result['success']:
                    return jsonify(result), 201
                else:
                    return jsonify(result), 400

            @app.route('/api/db/backup/<backup_name>/restore', methods=['POST'])
            def restore_backup(backup_name):
                """恢复备份API"""
                result = backup_manager.restore_backup(backup_name)

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 400

            @app.route('/api/db/backups')
            def list_backups():
                """列出备份API"""
                result = backup_manager.list_backups()

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 500

            @app.route('/api/db/backup/<backup_name>', methods=['DELETE'])
            def delete_backup(backup_name):
                """删除备份API"""
                result = backup_manager.delete_backup(backup_name)

                if result['success']:
                    return jsonify(result), 200
                else:
                    return jsonify(result), 404

            # 命令行集成
            @manager.command
            def init_db():
                """初始化数据库"""
                from models import init_database
                init_database()
                print("Database initialized successfully!")

            @manager.command
            def create_db():
                """创建数据库表"""
                from models import BaseModel, User, Post, Comment, Category, Tag, Role

                with app.app_context():
                    BaseModel.metadata.create_all(db.engine)
                    print("Database tables created successfully!")

            @manager.command
            def drop_db():
                """删除数据库表"""
                from models import BaseModel

                with app.app_context():
                    BaseModel.metadata.drop_all(db.engine)
                    print("Database tables dropped successfully!")

            @manager.command
            def reset_db():
                """重置数据库"""
                drop_db()
                init_db()
                print("Database reset successfully!")

            @manager.command
            def seed_db():
                """填充测试数据"""
                from models import User, Post, Comment, Category, Tag, Role
                from datetime import datetime

                with app.app_context():
                    # 创建测试用户
                    test_user = User(
                        username='testuser',
                        email='test@example.com',
                        first_name='Test',
                        last_name='User',
                        is_verified=True
                    )
                    test_user.set_password('test123')
                    test_user.save()

                    # 创建测试分类
                    test_category = Category(
                        name='Test Category',
                        slug='test-category',
                        description='A test category'
                    )
                    test_category.save()

                    # 创建测试标签
                    test_tag = Tag(
                        name='Test Tag',
                        slug='test-tag',
                        description='A test tag'
                    )
                    test_tag.save()

                    # 创建测试文章
                    test_post = Post(
                        title='Test Article',
                        slug='test-article',
                        content='This is a test article content.',
                        excerpt='Test article excerpt.',
                        author_id=test_user.id,
                        category_id=test_category.id,
                        is_published=True
                    )
                    test_post.save()
                    test_post.tags.append(test_tag)
                    test_post.save()

                    # 创建测试评论
                    test_comment = Comment(
                        content='This is a test comment.',
                        author_id=test_user.id,
                        post_id=test_post.id,
                        is_approved=True
                    )
                    test_comment.save()

                    print("Test data seeded successfully!")

            if __name__ == '__main__':
                # 初始化数据库(如果没有迁移文件)
                if not os.path.exists('migrations'):
                    with app.app_context():
                        from flask_migrate import init
                        init()
                        print("Initialized migration repository!")

                manager.run()

02.数据库性能优化
    a.查询优化和索引
        a.数据库性能分析工具
            from flask import Flask, jsonify, request
            from flask_sqlalchemy import SQLAlchemy
        from sqlalchemy import text, Index, event
        from sqlalchemy.engine import Engine
        from sqlalchemy.exc import SQLAlchemyError
        import time
        import logging
        from collections import defaultdict

        app = Flask(__name__)
        app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/optimized_blog'
        app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
        db = SQLAlchemy(app)

        # 启用SQL查询日志
        logging.basicConfig()
        logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

        class PerformanceMonitor:
            """性能监控器"""

            def __init__(self):
                self.query_times = []
                self.slow_queries = []
                self.query_frequency = defaultdict(int)

            def record_query(self, query, duration):
                """记录查询信息"""
                self.query_times.append(duration)
                self.query_frequency[query] += 1

                # 记录慢查询(超过1秒)
                if duration > 1.0:
                    self.slow_queries.append({
                        'query': query,
                        'duration': duration,
                        'timestamp': time.time()
                    })

            def get_stats(self):
                """获取性能统计"""
                if not self.query_times:
                    return {}

                return {
                    'total_queries': len(self.query_times),
                    'avg_query_time': sum(self.query_times) / len(self.query_times),
                    'max_query_time': max(self.query_times),
                    'min_query_time': min(self.query_times),
                    'slow_queries_count': len(self.slow_queries),
                    'most_frequent_queries': dict(
                        sorted(self.query_frequency.items(), key=lambda x: x, reverse=True)[:10]
                    )
                }

        # 创建性能监控器实例
        perf_monitor = PerformanceMonitor()

        # SQLAlchemy事件监听器,用于监控查询性能
        @event.listens_for(Engine, "before_cursor_execute")
        def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
            """查询开始时间"""
            context._query_start_time = time.time()

        @event.listens_for(Engine, "after_cursor_execute")
        def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
            """查询结束时间"""
            total = time.time() - context._query_start_time
            perf_monitor.record_query(statement[:100], total)  # 只记录前100个字符

        class DatabaseOptimizer:
            """数据库优化器"""

            @staticmethod
            def create_optimized_indexes():
                """创建优化的索引"""

                # 用户表索引
                Index('idx_users_username_email', User.username, User.email, unique=True)
                Index('idx_users_is_active_verified', User.is_active, User.is_verified)
                Index('idx_users_created_at', User.created_at.desc())
                Index('idx_users_last_login', User.last_login.desc())

                # 文章表索引
                Index('idx_posts_author_category', Post.author_id, Post.category_id)
                Index('idx_posts_published_featured', Post.is_published, Post.is_featured)
                Index('idx_posts_created_at', Post.created_at.desc())
                Index('idx_posts_published_at', Post.published_at.desc())
                Index('idx_posts_title_content', Post.title, Post.content)  # 全文搜索索引

                # 评论表索引
                Index('idx_comments_post_approved', Comment.post_id, Comment.is_approved)
                Index('idx_comments_author_post', Comment.author_id, Comment.post_id)
                Index('idx_comments_created_at', Comment.created_at.desc())

                # 分类表索引
                Index('idx_categories_parent_active', Category.parent_id, Category.is_active)
                Index('idx_categories_slug', Category.slug, unique=True)

                # 标签表索引
                Index('idx_tags_name', Tag.name, unique=True)

                # 关联表索引
                Index('idx_user_roles_user_role', user_roles.c.user_id, user_roles.c.role_id)
                Index('idx_post_tags_post_tag', post_tags.c.post_id, post_tags.c.tag_id)

                print("Optimized indexes created successfully!")

            @staticmethod
            def analyze_query_performance():
                """分析查询性能"""
                slow_queries = perf_monitor.slow_queries

                analysis = {
                    'total_slow_queries': len(slow_queries),
                    'average_slow_query_time': sum(q['duration'] for q in slow_queries) / len(slow_queries) if slow_queries else 0,
                    'recommendations': []
                }

                # 分析慢查询模式
                query_patterns = defaultdict(list)
                for query in slow_queries:
                    # 提取查询类型(SELECT, INSERT, UPDATE, DELETE)
                    query_type = query['query'].strip().split()[0].upper()
                    query_patterns[query_type].append(query['duration'])

                # 生成优化建议
                for query_type, durations in query_patterns.items():
                    avg_duration = sum(durations) / len(durations)
                    if query_type == 'SELECT' and avg_duration > 2.0:
                        analysis['recommendations'].append(
                            f"Consider adding indexes for frequently queried columns in SELECT statements (avg: {avg_duration:.2f}s)"
                        )
                    elif query_type == 'INSERT' and avg_duration > 1.0:
                        analysis['recommendations'].append(
                            f"Consider batch INSERT operations for better performance (avg: {avg_duration:.2f}s)"
                        )
                    elif query_type == 'UPDATE' and avg_duration > 1.5:
                        analysis['recommendations'].append(
                            f"Check UPDATE WHERE conditions for proper indexing (avg: {avg_duration:.2f}s)"
                        )

                return analysis

            @staticmethod
            def get_table_statistics():
                """获取表统计信息"""
                stats = {}

                try:
                    with db.engine.connect() as conn:
                        # 获取所有表
                        result = conn.execute(text("""
                            SELECT table_name,
                                   (SELECT COUNT(*) FROM information_schema.columns WHERE table_name = t.table_name) as column_count
                            FROM information_schema.tables t
                            WHERE table_schema = 'public' AND table_type = 'BASE TABLE'
                        """))

                        tables_info = {row[0]: row for row in result}

                        # 获取每个表的行数和大小
                        for table_name, column_count in tables_info.items():
                            result = conn.execute(text(f"""
                                SELECT
                                    COUNT(*) as row_count,
                                    pg_size_pretty(pg_total_relation_size('{table_name}')) as table_size
                                FROM {table_name}
                            """))

                            row = result.fetchone()
                            stats[table_name] = {
                                'row_count': row[0],
                                'table_size': row,
                                'column_count': column_count
                            }

                except Exception as e:
                    stats['error'] = str(e)

                return stats

            @staticmethod
            def optimize_database():
                """执行数据库优化操作"""
                try:
                    with db.engine.connect() as conn:
                        # 更新表统计信息
                        conn.execute(text("ANALYZE;"))

                        # 清理无用数据
                        conn.execute(text("VACUUM ANALYZE;"))

                        # 重建索引(如果需要)
                        conn.execute(text("REINDEX DATABASE;"))

                        return {'success': True, 'message': 'Database optimization completed'}

                except Exception as e:
                    return {'success': False, 'error': str(e)}

        class QueryOptimizer:
            """查询优化器"""

            @staticmethod
            def optimized_user_search(search_term, filters=None, limit=20, offset=0):
                """优化的用户搜索查询"""
                query = db.session.query(User).filter(User.is_active == True)

                # 使用全文搜索索引
                if search_term:
                    query = query.filter(
                        db.or_(
                            User.username.ilike(f'%{search_term}%'),
                            User.email.ilike(f'%{search_term}%'),
                            User.first_name.ilike(f'%{search_term}%'),
                            User.last_name.ilike(f'%{search_term}%')
                        )
                    )

                # 应用过滤器
                if filters:
                    if filters.get('role'):
                        query = query.join(User.roles).filter(Role.name == filters['role'])

                    if filters.get('is_verified') is not None:
                        query = query.filter(User.is_verified == filters['is_verified'])

                # 使用索引优化的排序
                query = query.order_by(User.created_at.desc())

                # 分页
                total = query.count()
                users = query.offset(offset).limit(limit).all()

                return {
                    'users': users,
                    'total': total,
                    'page': offset // limit + 1
                }

            @staticmethod
            def optimized_post_search(search_term, filters=None, limit=10, offset=0):
                """优化的文章搜索查询"""
                # 使用子查询优化
                base_query = db.session.query(Post).filter(
                    Post.is_active == True,
                    Post.is_published == True
                )

                # 全文搜索(使用PostgreSQL的全文搜索功能)
                if search_term:
                    base_query = base_query.filter(
                        db.or_(
                            Post.title.ilike(f'%{search_term}%'),
                            Post.content.ilike(f'%{search_term}%'),
                            Post.excerpt.ilike(f'%{search_term}%')
                        )
                    )

                # 应用过滤器
                if filters:
                    if filters.get('category_id'):
                        base_query = base_query.filter(Post.category_id == filters['category_id'])

                    if filters.get('author_id'):
                        base_query = base_query.filter(Post.author_id == filters['author_id'])

                    if filters.get('tag_ids'):
                        base_query = base_query.join(Post.tags).filter(Tag.id.in_(filters['tag_ids']))

                # 使用复合索引的排序
                base_query = base_query.order_by(
                    Post.is_featured.desc(),
                    Post.published_at.desc()
                )

                # 分页
                total = base_query.count()
                posts = base_query.offset(offset).limit(limit).all()

                return {
                    'posts': posts,
                    'total': total,
                    'page': offset // limit + 1
                }

            @staticmethod
            def get_popular_posts(days=30, limit=10):
                """获取热门文章(优化版本)"""
                from datetime import datetime, timedelta

                start_date = datetime.utcnow() - timedelta(days=days)

                # 使用窗口函数优化性能
                query = db.session.query(
                    Post,
                    db.func.count(Comment.id).label('comment_count'),
                    db.func.sum(Post.view_count).label('total_views')
                ).outerjoin(Comment).filter(
                    Post.is_active == True,
                    Post.is_published == True,
                    Post.published_at >= start_date
                ).group_by(Post.id).order_by(
                    db.func.count(Comment.id).desc(),
                    db.func.sum(Post.view_count).desc()
                ).limit(limit)

                return query.all()

        class CacheManager:
            """缓存管理器"""

            def __init__(self):
                self.cache = {}
                self.cache_stats = {
                    'hits': 0,
                    'misses': 0,
                    'total_requests': 0
                }

            def get(self, key):
                """获取缓存值"""
                self.cache_stats['total_requests'] += 1

                if key in self.cache:
                    item = self.cache[key]
                    # 检查是否过期
                    if time.time() < item['expires_at']:
                        self.cache_stats['hits'] += 1
                        return item['value']
                    else:
                        del self.cache[key]

                self.cache_stats['misses'] += 1
                return None

            def set(self, key, value, ttl=300):  # 默认5分钟TTL
                """设置缓存值"""
                self.cache[key] = {
                    'value': value,
                    'expires_at': time.time() + ttl
                }

            def invalidate(self, pattern=None):
                """清除缓存"""
                if pattern:
                    keys_to_remove = [key for key in self.cache.keys() if pattern in key]
                    for key in keys_to_remove:
                        del self.cache[key]
                else:
                    self.cache.clear()

            def get_stats(self):
                """获取缓存统计"""
                total = self.cache_stats['total_requests']
                hit_rate = (self.cache_stats['hits'] / total * 100) if total > 0 else 0

                return {
                    'cache_size': len(self.cache),
                    'hits': self.cache_stats['hits'],
                    'misses': self.cache_stats['misses'],
                    'hit_rate': f"{hit_rate:.2f}%"
                }

        # 创建缓存管理器实例
        cache_manager = CacheManager()

        # 优化的API路由
        @app.route('/api/users/search')
        def search_users():
            """优化的用户搜索API"""
            search_term = request.args.get('q', '')
            page = int(request.args.get('page', 1))
            per_page = min(int(request.args.get('per_page', 20)), 50)

            # 检查缓存
            cache_key = f"users_search_{search_term}_{page}_{per_page}"
            cached_result = cache_manager.get(cache_key)

            if cached_result:
                return jsonify({
                    'success': True,
                    'cached': True,
                    **cached_result
                })

            # 构建过滤器
            filters = {}
            if request.args.get('role'):
                filters['role'] = request.args.get('role')

            if request.args.get('is_verified'):
                filters['is_verified'] = request.args.get('is_verified').lower() == 'true'

            # 执行优化查询
            offset = (page - 1) * per_page
            result = QueryOptimizer.optimized_user_search(
                search_term, filters, per_page, offset
            )

            # 格式化结果
            response_data = {
                'users': [user.to_dict() for user in result['users']],
                'total': result['total'],
                'page': result['page'],
                'per_page': per_page
            }

            # 缓存结果
            cache_manager.set(cache_key, response_data, ttl=600)  # 10分钟缓存

            return jsonify({
                'success': True,
                'cached': False,
                **response_data
            })

        @app.route('/api/posts/search')
        def search_posts():
            """优化的文章搜索API"""
            search_term = request.args.get('q', '')
            page = int(request.args.get('page', 1))
            per_page = min(int(request.args.get('per_page', 10)), 50)

            # 检查缓存
            cache_key = f"posts_search_{search_term}_{page}_{per_page}"
            cached_result = cache_manager.get(cache_key)

            if cached_result:
                return jsonify({
                    'success': True,
                    'cached': True,
                    **cached_result
                })

            # 构建过滤器
            filters = {}
            if request.args.get('category_id'):
                filters['category_id'] = int(request.args.get('category_id'))

            if request.args.get('author_id'):
                filters['author_id'] = int(request.args.get('author_id'))

            if request.args.get('tag_ids'):
                tag_ids = request.args.get('tag_ids').split(',')
                filters['tag_ids'] = [int(tag_id) for tag_id in tag_ids if tag_id.isdigit()]

            # 执行优化查询
            offset = (page - 1) * per_page
            result = QueryOptimizer.optimized_post_search(
                search_term, filters, per_page, offset
            )

            # 格式化结果
            response_data = {
                'posts': [post.to_dict() for post in result['posts']],
                'total': result['total'],
                'page': result['page'],
                'per_page': per_page
            }

            # 缓存结果
            cache_manager.set(cache_key, response_data, ttl=300)  # 5分钟缓存

            return jsonify({
                'success': True,
                'cached': False,
                **response_data
            })

        @app.route('/api/posts/popular')
        def get_popular_posts():
            """获取热门文章API"""
            days = int(request.args.get('days', 30))
            limit = min(int(request.args.get('limit', 10)), 20)

            # 检查缓存
            cache_key = f"popular_posts_{days}_{limit}"
            cached_result = cache_manager.get(cache_key)

            if cached_result:
                return jsonify({
                    'success': True,
                    'cached': True,
                    'posts': cached_result
                })

            # 执行优化查询
            popular_posts_data = QueryOptimizer.get_popular_posts(days, limit)

            # 格式化结果
            posts_data = []
            for post, comment_count, total_views in popular_posts_data:
                post_data = post.to_dict()
                post_data['comment_count'] = comment_count or 0
                post_data['total_views'] = total_views or 0
                posts_data.append(post_data)

            # 缓存结果
            cache_manager.set(cache_key, posts_data, ttl=1800)  # 30分钟缓存

            return jsonify({
                'success': True,
                'cached': False,
                'posts': posts_data
            })

        # 性能监控API
        @app.route('/api/db/performance/stats')
        def get_performance_stats():
            """获取数据库性能统计"""
            return jsonify({
                'query_performance': perf_monitor.get_stats(),
                'cache_performance': cache_manager.get_stats(),
                'optimization_analysis': DatabaseOptimizer.analyze_query_performance()
            })

        @app.route('/api/db/performance/tables')
        def get_table_statistics():
            """获取表统计信息"""
            return jsonify({
                'tables': DatabaseOptimizer.get_table_statistics()
            })

        @app.route('/api/db/optimize', methods=['POST'])
        def optimize_database():
            """执行数据库优化"""
            result = DatabaseOptimizer.optimize_database()

            if result['success']:
                # 清除所有缓存
                cache_manager.invalidate()

            return jsonify(result)

        @app.route('/api/cache/clear', methods=['POST'])
        def clear_cache():
            """清除缓存"""
            data = request.get_json() or {}
            pattern = data.get('pattern')

            cache_manager.invalidate(pattern)

            return jsonify({
                'success': True,
                'message': 'Cache cleared successfully',
                'stats': cache_manager.get_stats()
            })

        # 创建优化的索引
        with app.app_context():
            DatabaseOptimizer.create_optimized_indexes()

        if __name__ == '__main__':
            app.run(debug=True)

6 表单处理和验证

6.1 Flask-WTF 基础

01.WTF 表单基础配置
    a.Flask-WTF 初始化设置
        a.基础 Flask-WTF 配置
            from flask import Flask, render_template, redirect, url_for, flash, jsonify, request
            from flask_wtf import FlaskForm
            from wtforms import StringField, TextAreaField, SelectField, BooleanField, IntegerField
            from wtforms.validators import DataRequired, Length, Email, NumberRange, Optional
            from wtforms.widgets import TextArea, TextInput
            from wtforms.fields import SelectMultipleField, PasswordField, DateField, DateTimeField
            from wtforms.validators import ValidationError
            import secrets
            import os

            app = Flask(__name__)

            # Flask-WTF 安全配置
            def configure_wtf_security(app):
                """配置 Flask-WTF 安全设置"""
                # 生成安全的 CSRF 密钥
                app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', secrets.token_urlsafe(32))

                # CSRF 配置
                app.config['WTF_CSRF_ENABLED'] = True
                app.config['WTF_CSRF_TIME_LIMIT'] = 3600  # CSRF token 有效期 1小时
                app.config['WTF_CSRF_SSL_STRICT'] = True  # 仅在 HTTPS 下启用严格模式

                # 表单配置
                app.config['WTF_CSRF_FIELD_NAME'] = 'csrf_token'
                app.config['WTF_CSRF_HEADER_NAME'] = 'X-CSRFToken'

                # 安全头配置
                app.config['SECURE_HEADERS'] = {
                    'X-Frame-Options': 'DENY',
                    'X-Content-Type-Options': 'nosniff',
                    'X-XSS-Protection': '1; mode=block',
                    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
                }

                # 文件上传配置
                app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB
                app.config['UPLOAD_FOLDER'] = 'uploads'
                app.config['ALLOWED_EXTENSIONS'] = {
                    'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx'
                }

            configure_wtf_security(app)

            # 确保上传目录存在
            os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

            # 自定义 CSRF 验证
            class CustomCSRFProtect:
                """自定义 CSRF 保护"""

                def __init__(self, app=None):
                    self.app = app
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    app.before_request(self._before_request)
                    app.after_request(self._after_request)

                def _before_request(self):
                    """请求前 CSRF 验证"""
                    # 跳过不需要 CSRF 验证的请求
                    if request.method in ['GET', 'HEAD', 'OPTIONS', 'TRACE']:
                        return

                    # API 请求可以使用 Header 中的 CSRF token
                    if request.path.startswith('/api/'):
                        csrf_token = request.headers.get('X-CSRFToken')
                        if not csrf_token:
                            csrf_token = request.form.get('csrf_token')
                    else:
                        csrf_token = request.form.get('csrf_token')

                    if not csrf_token:
                        return jsonify({'error': 'CSRF token missing'}), 400

                    # 验证 CSRF token
                    if not self._validate_csrf_token(csrf_token):
                        return jsonify({'error': 'CSRF token invalid'}), 400

                def _after_request(self, response):
                    """响应后添加 CSRF token"""
                    if request.path.startswith('/api/'):
                        # 为 API 响应添加 CSRF token
                        if hasattr(response, 'headers'):
                            response.headers['X-CSRFToken'] = self._generate_csrf_token()
                    return response

                def _validate_csrf_token(self, token):
                    """验证 CSRF token"""
                    # 简化的 token 验证逻辑
                    # 在实际应用中应该使用 session 和时间戳验证
                    return len(token) > 10  # 基本长度检查

                def _generate_csrf_token(self):
                    """生成 CSRF token"""
                    return secrets.token_urlsafe(32)

            # 初始化自定义 CSRF 保护
            csrf_protect = CustomCSRFProtect(app)

            # 基础表单类
            class BaseForm(FlaskForm):
                """基础表单类,包含通用功能和验证"""

                def __init__(self, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self.add_error_messages()

                def add_error_messages(self):
                    """添加默认错误消息"""
                    for field_name, field in self._fields.items():
                        if not field.render_kw:
                            field.render_kw = {}

                        # 添加 Bootstrap CSS 类
                        if field_name != 'csrf_token':
                            current_class = field.render_kw.get('class', '')
                            field.render_kw['class'] = f"form-control {current_class}".strip()

                        # 添加占位符
                        if 'placeholder' not in field.render_kw and hasattr(field, 'label'):
                            field.render_kw['placeholder'] = field.label.text

                def get_errors_dict(self):
                    """获取错误字典"""
                    errors = {}
                    for field_name, field_errors in self.errors.items():
                        errors[field_name] = field_errors
                    return errors

                def get_field_error(self, field_name):
                    """获取特定字段的错误"""
                    return self.errors.get(field_name, [])

                def is_valid(self):
                    """检查表单是否有效"""
                    return self.validate_on_submit()

                def get_form_data(self):
                    """获取表单数据"""
                    data = {}
                    for field_name, field in self._fields.items():
                        if field_name != 'csrf_token':
                            data[field_name] = field.data
                    return data

            # 用户注册表单
            class RegistrationForm(BaseForm):
                """用户注册表单"""
                username = StringField(
                    '用户名',
                    validators=[
                        DataRequired(message='用户名不能为空'),
                        Length(min=3, max=20, message='用户名长度必须在3-20个字符之间'),
                        Regexp('^[a-zA-Z0-9_]+$', message='用户名只能包含字母、数字和下划线')
                    ],
                    render_kw={
                        'class': 'form-control',
                        'autocomplete': 'username'
                    }
                )

                email = StringField(
                    '邮箱地址',
                    validators=[
                        DataRequired(message='邮箱地址不能为空'),
                        Email(message='请输入有效的邮箱地址'),
                        Length(max=120, message='邮箱地址不能超过120个字符')
                    ],
                    render_kw={
                        'type': 'email',
                        'autocomplete': 'email'
                    }
                )

                password = PasswordField(
                    '密码',
                    validators=[
                        DataRequired(message='密码不能为空'),
                        Length(min=8, max=128, message='密码长度必须在8-128个字符之间'),
                        Regexp(
                            r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]',
                            message='密码必须包含大小写字母、数字和特殊字符'
                        )
                    ],
                    render_kw={
                        'autocomplete': 'new-password',
                        'minlength': '8'
                    }
                )

                confirm_password = PasswordField(
                    '确认密码',
                    validators=[
                        DataRequired(message='请确认密码'),
                    ]
                )

                first_name = StringField(
                    '名字',
                    validators=[
                        DataRequired(message='名字不能为空'),
                        Length(min=1, max=50, message='名字长度必须在1-50个字符之间')
                    ],
                    render_kw={
                        'autocomplete': 'given-name'
                    }
                )

                last_name = StringField(
                    '姓氏',
                    validators=[
                        DataRequired(message='姓氏不能为空'),
                        Length(min=1, max=50, message='姓氏长度必须在1-50个字符之间')
                    ],
                    render_kw={
                        'autocomplete': 'family-name'
                    }
                )

                bio = TextAreaField(
                    '个人简介',
                    validators=[
                        Optional(),
                        Length(max=500, message='个人简介不能超过500个字符')
                    ],
                    render_kw={
                        'rows': 4,
                        'placeholder': '请简单介绍一下自己...'
                    }
                )

                agree_terms = BooleanField(
                    '我同意服务条款和隐私政策',
                    validators=[
                        DataRequired(message='必须同意服务条款才能注册')
                    ]
                )

                newsletter = BooleanField(
                    '订阅新闻通讯',
                    default=False
                )

                def validate_confirm_password(self, field):
                    """验证确认密码"""
                    if field.data != self.password.data:
                        raise ValidationError('两次输入的密码不一致')

                def validate_username(self, field):
                    """验证用户名唯一性"""
                    from models import User
                    if User.query.filter_by(username=field.data).first():
                        raise ValidationError('用户名已存在')

                def validate_email(self, field):
                    """验证邮箱唯一性"""
                    from models import User
                    if User.query.filter_by(email=field.data).first():
                        raise ValidationError('邮箱地址已被注册')

            # 用户登录表单
            class LoginForm(BaseForm):
                """用户登录表单"""
                username = StringField(
                    '用户名或邮箱',
                    validators=[
                        DataRequired(message='请输入用户名或邮箱'),
                        Length(min=3, max=120, message='用户名或邮箱长度不正确')
                    ],
                    render_kw={
                        'autocomplete': 'username',
                        'autofocus': True
                    }
                )

                password = PasswordField(
                    '密码',
                    validators=[
                        DataRequired(message='请输入密码')
                    ],
                    render_kw={
                        'autocomplete': 'current-password'
                    }
                )

                remember_me = BooleanField(
                    '记住我',
                    default=False
                )

                # 添加自定义验证
                def validate(self, extra_validators=None):
                    """验证用户凭据"""
                    if not super().validate(extra_validators):
                        return False

                    from models import User
                    user = User.query.filter(
                        (User.username == self.username.data) | (User.email == self.username.data)
                    ).first()

                    if not user or not user.check_password(self.password.data):
                        self.username.errors.append('用户名或密码错误')
                        self.password.errors.append('用户名或密码错误')
                        return False

                    if not user.is_active:
                        self.username.errors.append('账户已被禁用')
                        return False

                    if not user.is_verified:
                        self.username.errors.append('账户未验证,请检查邮箱')
                        return False

                    self.user = user  # 保存用户对象供后续使用
                    return True

            # 文章创建表单
            class PostForm(BaseForm):
                """文章创建表单"""
                title = StringField(
                    '文章标题',
                    validators=[
                        DataRequired(message='文章标题不能为空'),
                        Length(min=5, max=200, message='文章标题长度必须在5-200个字符之间')
                    ],
                    render_kw={
                        'placeholder': '请输入文章标题...',
                        'autofocus': True
                    }
                )

                content = TextAreaField(
                    '文章内容',
                    validators=[
                        DataRequired(message='文章内容不能为空'),
                        Length(min=50, message='文章内容至少需要50个字符')
                    ],
                    render_kw={
                        'rows': 15,
                        'placeholder': '请输入文章内容...',
                        'class': 'form-control content-editor'
                    }
                )

                excerpt = TextAreaField(
                    '文章摘要',
                    validators=[
                        Optional(),
                        Length(max=500, message='文章摘要不能超过500个字符')
                    ],
                    render_kw={
                        'rows': 3,
                        'placeholder': '请输入文章摘要(可选)...'
                    }
                )

                category_id = SelectField(
                    '文章分类',
                    coerce=int,
                    validators=[
                        DataRequired(message='请选择文章分类')
                    ]
                )

                tags = SelectMultipleField(
                    '文章标签',
                    coerce=int,
                    validators=[
                        Optional()
                    ]
                )

                is_published = BooleanField(
                    '立即发布',
                    default=False
                )

                is_featured = BooleanField(
                    '设为精选文章',
                    default=False
                )

                meta_title = StringField(
                    'SEO标题',
                    validators=[
                        Optional(),
                        Length(max=60, message='SEO标题不能超过60个字符')
                    ],
                    render_kw={
                        'placeholder': 'SEO优化标题(可选)...'
                    }
                )

                meta_description = StringField(
                    'SEO描述',
                    validators=[
                        Optional(),
                        Length(max=160, message='SEO描述不能超过160个字符')
                    ],
                    render_kw={
                        'placeholder': 'SEO优化描述(可选)...'
                    }
                )

                meta_keywords = StringField(
                    'SEO关键词',
                    validators=[
                        Optional(),
                        Length(max=255, message='SEO关键词不能超过255个字符')
                    ],
                    render_kw={
                        'placeholder': '关键词,用逗号分隔(可选)...'
                    }
                )

                def __init__(self, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self._setup_category_choices()
                    self._setup_tag_choices()

                def _setup_category_choices(self):
                    """设置分类选择"""
                    from models import Category
                    categories = Category.query.filter_by(is_active=True).order_by(Category.name).all()
                    self.category_id.choices = [(0, '请选择分类')] + [
                        (cat.id, cat.name) for cat in categories
                    ]

                def _setup_tag_choices(self):
                    """设置标签选择"""
                    from models import Tag
                    tags = Tag.query.filter_by(is_active=True).order_by(Tag.name).all()
                    self.tags.choices = [(tag.id, tag.name) for tag in tags]

                def validate_content(self, field):
                    """验证内容"""
                    if field.data:
                        # 检查内容是否包含恶意脚本
                        import re
                        script_pattern = r'<script[^>]*>.*?</script>'
                        if re.search(script_pattern, field.data, re.IGNORECASE | re.DOTALL):
                            raise ValidationError('内容不能包含脚本代码')

                def validate_title(self, field):
                    """验证标题"""
                    if field.data:
                        # 检查标题是否包含敏感词
                        sensitive_words = ['违法', '暴力', '色情', '赌博']
                        for word in sensitive_words:
                            if word in field.data:
                                raise ValidationError(f'标题不能包含敏感词汇: {word}')

            # 评论表单
            class CommentForm(BaseForm):
                """评论表单"""
                content = TextAreaField(
                    '评论内容',
                    validators=[
                        DataRequired(message='评论内容不能为空'),
                        Length(min=5, max=1000, message='评论内容长度必须在5-1000个字符之间')
                    ],
                    render_kw={
                        'rows': 4,
                        'placeholder': '请输入您的评论...',
                        'class': 'form-control'
                    }
                )

                author_name = StringField(
                    '姓名',
                    validators=[
                        DataRequired(message='姓名不能为空'),
                        Length(min=2, max=50, message='姓名长度必须在2-50个字符之间')
                    ],
                    render_kw={
                        'placeholder': '请输入您的姓名...'
                    }
                )

                author_email = StringField(
                    '邮箱',
                    validators=[
                        DataRequired(message='邮箱不能为空'),
                        Email(message='请输入有效的邮箱地址')
                    ],
                    render_kw={
                        'type': 'email',
                        'placeholder': '请输入您的邮箱地址...'
                    }
                )

                website = StringField(
                    '网站',
                    validators=[
                        Optional(),
                        Length(max=200, message='网站地址不能超过200个字符')
                    ],
                    render_kw={
                        'type': 'url',
                        'placeholder': '您的网站地址(可选)...'
                    }
                )

                parent_id = IntegerField(
                    '父评论ID',
                    validators=[Optional()]
                )

                def validate_website(self, field):
                    """验证网站地址"""
                    if field.data:
                        import re
                        url_pattern = r'^https?://(?:[-\w.])+(?:[:\d]+)?(?:/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:#(?:\w*))?)?$'
                        if not re.match(url_pattern, field.data):
                            raise ValidationError('请输入有效的网站地址')

                def validate_content(self, field):
                    """验证评论内容"""
                    if field.data:
                        # 检查是否包含垃圾信息关键词
                        spam_keywords = ['广告', '推广', '赚钱', '免费', '优惠', '折扣']
                        content_lower = field.data.lower()
                        spam_count = sum(1 for keyword in spam_keywords if keyword in content_lower)

                        if spam_count > 2:
                            raise ValidationError('评论内容看起来像垃圾信息')

                        # 检查是否全是英文(可能是垃圾评论)
                        if all(ord(char) < 128 for char in field.data.replace(' ', '')):
                            # 简单的英文垃圾评论检测
                            if len(field.data.split()) < 5:
                                raise ValidationError('评论内容过于简单,请提供更有意义的内容')

            # 搜索表单
            class SearchForm(BaseForm):
                """搜索表单"""
                query = StringField(
                    '搜索关键词',
                    validators=[
                        DataRequired(message='请输入搜索关键词'),
                        Length(min=2, max=100, message='搜索关键词长度必须在2-100个字符之间')
                    ],
                    render_kw={
                        'placeholder': '搜索文章、用户、评论...',
                        'autocomplete': 'off',
                        'class': 'form-control form-control-lg'
                    }
                )

                search_type = SelectField(
                    '搜索类型',
                    choices=[
                        ('all', '全部'),
                        ('posts', '文章'),
                        ('users', '用户'),
                        ('comments', '评论')
                    ],
                    default='all',
                    coerce=str
                )

                category_id = SelectField(
                    '分类筛选',
                    coerce=int,
                    validators=[Optional()]
                )

                date_from = DateField(
                    '开始日期',
                    validators=[Optional()]
                )

                date_to = DateField(
                    '结束日期',
                    validators=[Optional()]
                )

                sort_by = SelectField(
                    '排序方式',
                    choices=[
                        ('relevance', '相关性'),
                        ('date', '发布时间'),
                        'popularity', '热度'
                    ],
                    default='relevance',
                    coerce=str
                )

                def __init__(self, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self._setup_category_choices()

                def _setup_category_choices(self):
                    """设置分类选择"""
                    from models import Category
                    categories = Category.query.filter_by(is_active=True).order_by(Category.name).all()
                    self.category_id.choices = [(0, '全部分类')] + [
                        (cat.id, cat.name) for cat in categories
                    ]

                def validate_date_to(self, field):
                    """验证结束日期"""
                    if field.data and self.date_from.data:
                        if field.data < self.date_from.data:
                            raise ValidationError('结束日期不能早于开始日期')

            # 文件上传表单
            class FileUploadForm(BaseForm):
                """文件上传表单"""
                file = TextAreaField(
                    '选择文件',
                    validators=[
                        DataRequired(message='请选择要上传的文件')
                    ]
                )

                description = TextAreaField(
                    '文件描述',
                    validators=[
                        Optional(),
                        Length(max=500, message='文件描述不能超过500个字符')
                    ],
                    render_kw={
                        'rows': 3,
                        'placeholder': '请输入文件描述(可选)...'
                    }
                )

                is_public = BooleanField(
                    '公开文件',
                    default=False
                )

                def validate_file(self, field):
                    """验证上传文件"""
                    if 'file' not in request.files:
                        raise ValidationError('请选择要上传的文件')

                    file = request.files['file']

                    if file.filename == '':
                        raise ValidationError('请选择有效的文件')

                    # 检查文件扩展名
                    allowed_extensions = app.config['ALLOWED_EXTENSIONS']
                    file_ext = '.' + file.filename.rsplit('.', 1).lower() if '.' in file.filename else ''

                    if file_ext not in allowed_extensions:
                        raise ValidationError(f'不支持的文件类型。支持的类型: {", ".join(allowed_extensions)}')

                    # 检查文件大小
                    if hasattr(file, 'content_length'):
                        max_size = app.config['MAX_CONTENT_LENGTH']
                        if file.content_length > max_size:
                            raise ValidationError(f'文件大小不能超过 {max_size // (1024*1024)}MB')

            # 联系表单
            class ContactForm(BaseForm):
                """联系表单"""
                name = StringField(
                    '姓名',
                    validators=[
                        DataRequired(message='姓名不能为空'),
                        Length(min=2, max=50, message='姓名长度必须在2-50个字符之间')
                    ],
                    render_kw={
                        'placeholder': '请输入您的姓名'
                    }
                )

                email = StringField(
                    '邮箱地址',
                    validators=[
                        DataRequired(message='邮箱地址不能为空'),
                        Email(message='请输入有效的邮箱地址')
                    ],
                    render_kw={
                        'type': 'email',
                        'placeholder': '请输入您的邮箱地址'
                    }
                )

                subject = StringField(
                    '主题',
                    validators=[
                        DataRequired(message='主题不能为空'),
                        Length(min=5, max=200, message='主题长度必须在5-200个字符之间')
                    ],
                    render_kw={
                        'placeholder': '请输入消息主题'
                    }
                )

                message = TextAreaField(
                    '消息内容',
                    validators=[
                        DataRequired(message='消息内容不能为空'),
                        Length(min=20, max=2000, message='消息内容长度必须在20-2000个字符之间')
                    ],
                    render_kw={
                        'rows': 6,
                        'placeholder': '请输入您的消息内容...'
                    }
                )

                contact_method = SelectField(
                    '联系方式',
                    choices=[
                        ('email', '邮箱回复'),
                        ('phone', '电话回复'),
                        ('wechat', '微信回复')
                    ],
                    default='email',
                    coerce=str
                )

                phone = StringField(
                    '联系电话',
                    validators=[
                        Optional(),
                        Length(min=10, max=20, message='联系电话格式不正确')
                    ],
                    render_kw={
                        'placeholder': '请输入您的联系电话(可选)'
                    }
                )

                urgent = BooleanField(
                    '紧急消息',
                    default=False
                )

                def validate_phone(self, field):
                    """验证电话号码"""
                    if field.data:
                        import re
                        phone_pattern = r'^[\d\s\-\+\(\)]+$'
                        if not re.match(phone_pattern, field.data):
                            raise ValidationError('请输入有效的电话号码')

                def validate_message(self, field):
                    """验证消息内容"""
                    if field.data:
                        # 检查是否包含敏感信息
                        sensitive_patterns = [
                            r'\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b',  # 信用卡号
                            r'\b\d{3}[-\s]?\d{2}[-\s]?\d{4}\b',          # 社会保险号
                            r'password\s*[:=]\s*\S+',                      # 密码
                        ]

                        for pattern in sensitive_patterns:
                            if re.search(pattern, field.data, re.IGNORECASE):
                                raise ValidationError('消息内容包含敏感信息,请修改后重试')

            # 密码重置表单
            class PasswordResetForm(BaseForm):
                """密码重置表单"""
                email = StringField(
                    '邮箱地址',
                    validators=[
                        DataRequired(message='邮箱地址不能为空'),
                        Email(message='请输入有效的邮箱地址')
                    ],
                    render_kw={
                        'type': 'email',
                        'placeholder': '请输入注册时使用的邮箱地址'
                    }
                )

                def validate_email(self, field):
                    """验证邮箱是否存在"""
                    from models import User
                    user = User.query.filter_by(email=field.data).first()
                    if not user:
                        raise ValidationError('该邮箱地址未注册')

                    self.user = user  # 保存用户对象

            # 新密码设置表单
            class SetPasswordForm(BaseForm):
                """设置新密码表单"""
                password = PasswordField(
                    '新密码',
                    validators=[
                        DataRequired(message='新密码不能为空'),
                        Length(min=8, max=128, message='密码长度必须在8-128个字符之间'),
                        Regexp(
                            r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]',
                            message='密码必须包含大小写字母、数字和特殊字符'
                        )
                    ],
                    render_kw={
                        'placeholder': '请输入新密码'
                    }
                )

                confirm_password = PasswordField(
                    '确认新密码',
                    validators=[
                        DataRequired(message='请确认新密码'),
                    ],
                    render_kw={
                        'placeholder': '请再次输入新密码'
                    }
                )

                def validate_confirm_password(self, field):
                    """验证确认密码"""
                    if field.data != self.password.data:
                        raise ValidationError('两次输入的密码不一致')

            # 用户资料编辑表单
            class ProfileForm(BaseForm):
                """用户资料编辑表单"""
                first_name = StringField(
                    '名字',
                    validators=[
                        DataRequired(message='名字不能为空'),
                        Length(min=1, max=50, message='名字长度必须在1-50个字符之间')
                    ]
                )

                last_name = StringField(
                    '姓氏',
                    validators=[
                        DataRequired(message='姓氏不能为空'),
                        Length(min=1, max=50, message='姓氏长度必须在1-50个字符之间')
                    ]
                )

                bio = TextAreaField(
                    '个人简介',
                    validators=[
                        Optional(),
                        Length(max=500, message='个人简介不能超过500个字符')
                    ],
                    render_kw={
                        'rows': 4,
                        'placeholder': '请介绍一下您自己...'
                    }
                )

                website = StringField(
                    '个人网站',
                    validators=[
                        Optional(),
                        Length(max=200, message='网站地址不能超过200个字符')
                    ],
                    render_kw={
                        'type': 'url',
                        'placeholder': 'https://yourwebsite.com'
                    }
                )

                location = StringField(
                    '所在地',
                    validators=[
                        Optional(),
                        Length(max=100, message='所在地不能超过100个字符')
                    ],
                    render_kw={
                        'placeholder': '城市,国家'
                    }
                )

                avatar = TextAreaField(
                    '头像上传'
                )

                def validate_website(self, field):
                    """验证网站地址"""
                    if field.data:
                        import re
                        url_pattern = r'^https?://(?:[-\w.])+(?:[:\d]+)?(?:/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:#(?:\w*))?)?$'
                        if not re.match(url_pattern, field.data):
                            raise ValidationError('请输入有效的网站地址')

            @app.route('/forms/demo')
            def forms_demo():
                """表单演示页面"""
                return render_template('forms/demo.html')

            @app.route('/forms/register', methods=['GET', 'POST'])
            def register():
                """用户注册"""
                form = RegistrationForm()

                if form.validate_on_submit():
                    # 处理注册逻辑
                    flash('注册成功!', 'success')
                    return redirect(url_for('login'))

                return render_template('forms/register.html', form=form)

            @app.route('/forms/login', methods=['GET', 'POST'])
            def login():
                """用户登录"""
                form = LoginForm()

                if form.validate_on_submit():
                    # 处理登录逻辑
                    flash(f'欢迎回来,{form.user.username}!', 'success')
                    return redirect(url_for('dashboard'))

                return render_template('forms/login.html', form=form)

            @app.route('/forms/contact', methods=['GET', 'POST'])
            def contact():
                """联系表单"""
                form = ContactForm()

                if form.validate_on_submit():
                    # 处理联系逻辑
                    flash('消息发送成功!我们会尽快回复您。', 'success')
                    return redirect(url_for('contact'))

                return render_template('forms/contact.html', form=form)

            if __name__ == '__main__':
                app.run(debug=True)

6.2 表单验证和自定义验证器

01.内置验证器使用
    a.常用验证器组合
        a.基础验证器示例
            from flask import Flask, render_template, request, flash, redirect, url_for, jsonify
            from flask_wtf import FlaskForm
            from wtforms import StringField, TextAreaField, SelectField, BooleanField, IntegerField, FloatField, DateField
            from wtforms.validators import (
                DataRequired, Length, Email, NumberRange, Optional, URL, UUID,
                IPAddress, MacAddress, Regexp, EqualTo, InputRequired, AnyOf, NoneOf
            )
            from wtforms.widgets import TextArea, TextInput
            import re
            from datetime import datetime, date

            app = Flask(__name__)
            app.config['SECRET_KEY'] = 'your-secret-key-here'

            # 完整的用户资料表单
            class UserProfileForm(FlaskForm):
                """用户资料表单,展示各种验证器"""

                # 基础输入验证
                username = StringField(
                    '用户名',
                    validators=[
                        InputRequired(message='用户名是必填项'),
                        Length(min=3, max=20, message='用户名长度必须在3-20个字符之间'),
                        Regexp(
                            r'^[a-zA-Z0-9_]+$',
                            message='用户名只能包含字母、数字和下划线'
                        )
                    ]
                )

                # 邮箱验证
                email = StringField(
                    '邮箱地址',
                    validators=[
                        DataRequired(message='邮箱地址不能为空'),
                        Email(message='请输入有效的邮箱地址'),
                        Length(max=120, message='邮箱地址不能超过120个字符')
                    ]
                )

                # 电话号码验证
                phone = StringField(
                    '电话号码',
                    validators=[
                        Optional(),
                        Regexp(
                            r'^\+?1?-?\.?\s?\(?(\d{3})\)?[\s.-]?(\d{3})[\s.-]?(\d{4})$',
                            message='请输入有效的电话号码格式'
                        )
                    ]
                )

                # 年龄验证
                age = IntegerField(
                    '年龄',
                    validators=[
                        NumberRange(min=13, max=120, message='年龄必须在13-120之间')
                    ]
                )

                # 身高验证(浮点数)
                height = FloatField(
                    '身高(cm)',
                    validators=[
                        Optional(),
                        NumberRange(min=50.0, max=250.0, message='身高必须在50-250cm之间')
                    ]
                )

                # 体重验证
                weight = FloatField(
                    '体重(kg)',
                    validators=[
                        Optional(),
                        NumberRange(min=20.0, max=300.0, message='体重必须在20-300kg之间')
                    ]
                )

                # 个人网站验证
                website = StringField(
                    '个人网站',
                    validators=[
                        Optional(),
                        URL(message='请输入有效的URL地址'),
                        Length(max=200, message='网站地址不能超过200个字符')
                    ]
                )

                # IP地址验证
                ip_address = StringField(
                    'IP地址',
                    validators=[
                        Optional(),
                        IPAddress(message='请输入有效的IP地址')
                    ]
                )

                # MAC地址验证
                mac_address = StringField(
                    'MAC地址',
                    validators=[
                        Optional(),
                        MacAddress(message='请输入有效的MAC地址')
                    ]
                )

                # UUID验证
                user_uuid = StringField(
                    '用户UUID',
                    validators=[
                        Optional(),
                        UUID(message='请输入有效的UUID格式')
                    ]
                )

                # 性别选择验证
                gender = SelectField(
                    '性别',
                    choices=[
                        ('', '请选择性别'),
                        ('male', '男'),
                        ('female', '女'),
                        ('other', '其他')
                    ],
                    validators=[
                        AnyOf(['male', 'female', 'other'], message='请选择有效的性别')
                    ],
                    coerce=lambda x: x if x else None
                )

                # 国家验证
                country = SelectField(
                    '国家',
                    choices=[
                        ('', '请选择国家'),
                        ('CN', '中国'),
                        ('US', '美国'),
                        ('UK', '英国'),
                        ('JP', '日本'),
                        ('KR', '韩国')
                    ],
                    validators=[
                        AnyOf(['CN', 'US', 'UK', 'JP', 'KR'], message='请选择有效的国家')
                    ],
                    coerce=lambda x: x if x else None
                )

                # 个人简介验证
                bio = TextAreaField(
                    '个人简介',
                    validators=[
                        Optional(),
                        Length(min=10, max=500, message='个人简介长度必须在10-500个字符之间')
                    ]
                )

                # 技能验证(多选)
                skills = SelectMultipleField(
                    '技能',
                    choices=[
                        ('python', 'Python'),
                        ('javascript', 'JavaScript'),
                        ('java', 'Java'),
                        ('cpp', 'C++'),
                        ('go', 'Go'),
                        ('rust', 'Rust')
                    ],
                    validators=[
                        Optional(),
                        AnyOf(['python', 'javascript', 'java', 'cpp', 'go', 'rust'],
                             message='请选择有效的技能')
                    ],
                    coerce=str
                )

                # 同意条款验证
                agree_terms = BooleanField(
                    '我同意用户协议和隐私政策',
                    validators=[
                        DataRequired(message='必须同意用户协议才能继续')
                    ]
                )

                # 验证年龄与出生日期的一致性
                def validate_age(self, field):
                    """验证年龄的合理性"""
                    if field.data and field.data < 13:
                        raise ValidationError('年龄必须大于13岁')

                # 验证身高体重的比例
                def validate_weight(self, field):
                    """验证身高体重的合理性"""
                    if self.height.data and field.data:
                        bmi = field.data / ((self.height.data / 100) ** 2)
                        if bmi > 50:  # BMI > 50 可能数据有误
                            raise ValidationError('请检查身高体重数据的合理性')

            # 产品订单表单
            class ProductOrderForm(FlaskForm):
                """产品订单表单"""

                # 订单信息验证
                order_id = StringField(
                    '订单编号',
                    validators=[
                        DataRequired(message='订单编号不能为空'),
                        Regexp(
                            r'^[A-Z]{2}\d{8}$',
                            message='订单编号格式:2个大写字母+8个数字'
                        )
                    ]
                )

                product_name = StringField(
                    '产品名称',
                    validators=[
                        DataRequired(message='产品名称不能为空'),
                        Length(min=2, max=100, message='产品名称长度必须在2-100个字符之间'),
                        Regexp(
                            r'^[a-zA-Z0-9\s\u4e00-\u9fa5\-_]+$',
                            message='产品名称只能包含中英文、数字、空格、横线和下划线'
                        )
                    ]
                )

                quantity = IntegerField(
                    '数量',
                    validators=[
                        DataRequired(message='数量不能为空'),
                        NumberRange(min=1, max=1000, message='数量必须在1-1000之间')
                    ]
                )

                unit_price = FloatField(
                    '单价',
                    validators=[
                        DataRequired(message='单价不能为空'),
                        NumberRange(min=0.01, max=100000.00, message='单价必须在0.01-100000之间')
                    ]
                )

                # 订单验证
                def validate_quantity(self, field):
                    """验证订单数量的合理性"""
                    if self.product_name.data and field.data:
                        # 特殊产品数量限制
                        limited_products = ['限量版', '收藏版', '纪念版']
                        for product in limited_products:
                            if product in self.product_name.data and field.data > 1:
                                raise ValidationError(f'{product}产品限购1件')

            # 企业注册表单
            class CompanyRegistrationForm(FlaskForm):
                """企业注册表单"""

                # 企业信息验证
                company_name = StringField(
                    '企业名称',
                    validators=[
                        DataRequired(message='企业名称不能为空'),
                        Length(min=5, max=100, message='企业名称长度必须在5-100个字符之间'),
                        Regexp(
                            r'^[\u4e00-\u9fa5a-zA-Z0-9\s\(\)\)\-_]+$',
                            message='企业名称包含无效字符'
                        )
                    ]
                )

                # 统一社会信用代码验证
                credit_code = StringField(
                    '统一社会信用代码',
                    validators=[
                        DataRequired(message='统一社会信用代码不能为空'),
                        Regexp(
                            r'^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$',
                            message='请输入有效的18位统一社会信用代码'
                        )
                    ]
                )

                # 法定代表人验证
                legal_representative = StringField(
                    '法定代表人',
                    validators=[
                        DataRequired(message='法定代表人不能为空'),
                        Length(min=2, max=20, message='法定代表人姓名长度必须在2-20个字符之间'),
                        Regexp(
                            r'^[\u4e00-\u9fa5a-zA-Z\s]+$',
                            message='法定代表人姓名只能包含中英文字符和空格'
                        )
                    ]
                )

                # 注册资本验证
                registered_capital = FloatField(
                    '注册资本(万元)',
                    validators=[
                        DataRequired(message='注册资本不能为空'),
                        NumberRange(min=1.0, max=1000000.0, message='注册资本必须在1-1000000万元之间')
                    ]
                )

                # 员工人数验证
                employee_count = IntegerField(
                    '员工人数',
                    validators=[
                        DataRequired(message='员工人数不能为空'),
                        NumberRange(min=1, max=100000, message='员工人数必须在1-100000之间')
                    ]
                )

                # 成立日期验证
                establishment_date = DateField(
                    '成立日期',
                    validators=[
                        DataRequired(message='成立日期不能为空')
                    ]
                )

                # 企业类型验证
                company_type = SelectField(
                    '企业类型',
                    choices=[
                        ('', '请选择企业类型'),
                        ('limited', '有限责任公司'),
                        ('stock', '股份有限公司'),
                        ('partnership', '合伙企业'),
                        ('individual', '个人独资企业')
                    ],
                    validators=[
                        AnyOf(['limited', 'stock', 'partnership', 'individual'],
                             message='请选择有效的企业类型')
                    ],
                    coerce=lambda x: x if x else None
                )

                # 行业验证
                industry = SelectField(
                    '所属行业',
                    choices=[
                        ('', '请选择行业'),
                        ('tech', '信息技术'),
                        ('manufacturing', '制造业'),
                        ('finance', '金融业'),
                        ('retail', '零售业'),
                        ('healthcare', '医疗健康'),
                        ('education', '教育培训'),
                        ('real_estate', '房地产')
                    ],
                    validators=[
                        AnyOf(['tech', 'manufacturing', 'finance', 'retail',
                               'healthcare', 'education', 'real_estate'],
                             message='请选择有效的行业')
                    ],
                    coerce=lambda x: x if x else None
                )

                # 营业执照验证
                business_license = StringField(
                    '营业执照注册号',
                    validators=[
                        DataRequired(message='营业执照注册号不能为空'),
                        Regexp(
                            r'^\d{15}$',
                            message='营业执照注册号必须是15位数字'
                        )
                    ]
                )

                def validate_establishment_date(self, field):
                    """验证成立日期的合理性"""
                    if field.data:
                        today = date.today()
                        min_date = date(1950, 1, 1)

                        if field.data > today:
                            raise ValidationError('成立日期不能是未来日期')

                        if field.data < min_date:
                            raise ValidationError('成立日期不能早于1950年')

                def validate_registered_capital(self, field):
                    """验证注册资本与企业类型的关系"""
                    if field.data and self.company_type.data:
                        if self.company_type.data == 'stock' and field.data < 500:
                            raise ValidationError('股份有限公司注册资本不能少于500万元')

            # 考试报名表单
            class ExamRegistrationForm(FlaskForm):
                """考试报名表单"""

                # 考生信息验证
                exam_name = StringField(
                    '考试名称',
                    validators=[
                        DataRequired(message='考试名称不能为空'),
                        Length(min=2, max=50, message='考试名称长度必须在2-50个字符之间')
                    ]
                )

                candidate_name = StringField(
                    '考生姓名',
                    validators=[
                        DataRequired(message='考生姓名不能为空'),
                        Length(min=2, max=20, message='姓名长度必须在2-20个字符之间'),
                        Regexp(
                            r'^[\u4e00-\u9fa5a-zA-Z\s]+$',
                            message='姓名只能包含中英文字符和空格'
                        )
                    ]
                )

                # 身份证号验证
                id_card = StringField(
                    '身份证号码',
                    validators=[
                        DataRequired(message='身份证号码不能为空'),
                        Regexp(
                            r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$',
                            message='请输入有效的18位身份证号码'
                        )
                    ]
                )

                # 准考证号验证
                exam_number = StringField(
                    '准考证号',
                    validators=[
                        DataRequired(message='准考证号不能为空'),
                        Regexp(
                            r'^\d{4}\d{2}\d{2}\d{3}\d{2}$',
                            message='准考证号格式不正确'
                        )
                    ]
                )

                # 考试日期验证
                exam_date = DateField(
                    '考试日期',
                    validators=[
                        DataRequired(message='考试日期不能为空')
                    ]
                )

                # 考场验证
                exam_room = StringField(
                    '考场',
                    validators=[
                        DataRequired(message='考场不能为空'),
                        Regexp(
                            r'^[A-Z]\d{3}$',
                            message='考场格式:1个大写字母+3个数字'
                        )
                    ]
                )

                # 座位号验证
                seat_number = IntegerField(
                    '座位号',
                    validators=[
                        DataRequired(message='座位号不能为空'),
                        NumberRange(min=1, max=100, message='座位号必须在1-100之间')
                    ]
                )

                def validate_exam_date(self, field):
                    """验证考试日期"""
                    if field.data:
                        today = date.today()

                        if field.data < today:
                            raise ValidationError('考试日期不能是过去的日期')

                        # 考试日期不能超过一年后
                        max_date = date(today.year + 1, today.month, today.day)
                        if field.data > max_date:
                            raise ValidationError('考试日期不能超过一年后')

            # API 密钥生成表单
            class APIKeyForm(FlaskForm):
                """API密钥管理表单"""

                key_name = StringField(
                    '密钥名称',
                    validators=[
                        DataRequired(message='密钥名称不能为空'),
                        Length(min=3, max=50, message='密钥名称长度必须在3-50个字符之间'),
                        Regexp(
                            r'^[a-zA-Z0-9_-]+$',
                            message='密钥名称只能包含字母、数字、下划线和横线'
                        )
                    ]
                )

                permissions = SelectMultipleField(
                    '权限范围',
                    choices=[
                        ('read', '读取权限'),
                        ('write', '写入权限'),
                        ('delete', '删除权限'),
                        ('admin', '管理权限')
                    ],
                    validators=[
                        AnyOf(['read', 'write', 'delete', 'admin'],
                             message='请选择有效的权限')
                    ],
                    coerce=str
                )

                rate_limit = IntegerField(
                    '请求限制(次/分钟)',
                    validators=[
                        NumberRange(min=1, max=10000, message='请求限制必须在1-10000之间')
                    ]
                )

                expiry_days = IntegerField(
                    '有效期(天)',
                    validators=[
                        Optional(),
                        NumberRange(min=1, max=365, message='有效期必须在1-365天之间')
                    ]
                )

                def validate_permissions(self, field):
                    """验证权限组合的合理性"""
                    if 'admin' in field.data and len(field.data) > 1:
                        raise ValidationError('管理员权限不能与其他权限同时选择')

02.自定义验证器
    a.业务逻辑验证器
        a.复杂业务验证器实现
            from flask import Flask, render_template, request, flash, redirect, url_for, jsonify
            from flask_wtf import FlaskForm
            from wtforms import StringField, TextAreaField, SelectField, IntegerField, FloatField, BooleanField, DateField
            from wtforms.validators import DataRequired, Length, Email, NumberRange, Optional, ValidationError
            from wtforms.widgets import TextArea
            import re
            import hashlib
            from datetime import datetime, date, timedelta

            app = Flask(__name__)
            app.config['SECRET_KEY'] = 'your-secret-key-here'

            # 自定义验证器函数
            class CustomValidators:
                """自定义验证器集合"""

                @staticmethod
                def validate_password_strength(form, field):
                    """密码强度验证器"""
                    password = field.data
                    if not password:
                        return

                    # 检查长度
                    if len(password) < 8:
                        raise ValidationError('密码长度至少8位')

                    # 检查字符类型
                    has_upper = bool(re.search(r'[A-Z]', password))
                    has_lower = bool(re.search(r'[a-z]', password))
                    has_digit = bool(re.search(r'\d', password))
                    has_special = bool(re.search(r'[!@#$%^&*(),.?":{}|<>]', password))

                    if not (has_upper and has_lower and has_digit and has_special):
                        raise ValidationError('密码必须包含大小写字母、数字和特殊字符')

                    # 检查常见弱密码
                    weak_passwords = [
                        'password', '12345678', 'qwerty123', 'admin123',
                        'password123', '123456789', 'abc123456'
                    ]

                    if password.lower() in weak_passwords:
                        raise ValidationError('密码过于简单,请使用更强的密码')

                    # 检查连续字符
                    if any(ord(char) + 1 == ord(next_char)
                           for char, next_char in zip(password, password[1:])
                           for _ in range(3)):
                        raise ValidationError('密码不能包含连续的字符序列')

                @staticmethod
                def validate_business_license(form, field):
                    """营业执照号码验证器"""
                    license_number = field.data
                    if not license_number:
                        return

                    # 18位营业执照号码验证
                    if len(license_number) != 18:
                        raise ValidationError('营业执照号码必须是18位')

                    # 检查字符类型
                    if not re.match(r'^[0-9A-HJ-NPQRTUWXY]+$', license_number):
                        raise ValidationError('营业执照号码格式不正确')

                    # 检查校验码
                    weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
                    check_codes = '0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y'

                    total = 0
                    for i, char in enumerate(license_number[:17]):
                        if char.isdigit():
                            total += int(char) * weights[i]
                        else:
                            total += (check_codes.index(char) + 1) * weights[i]

                    mod = total % 31
                    expected_check = check_codes[31 - mod] if mod != 0 else '0'

                    if license_number[17] != expected_check:
                        raise ValidationError('营业执照号码校验码错误')

                @staticmethod
                def validate_id_card(form, field):
                    """身份证号码验证器"""
                    id_card = field.data
                    if not id_card:
                        return

                    # 18位身份证验证
                    if len(id_card) != 18:
                        raise ValidationError('身份证号码必须是18位')

                    # 检查字符类型
                    if not re.match(r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$', id_card):
                        raise ValidationError('身份证号码格式不正确')

                    # 验证地区代码
                    area_code = id_card[:6]
                    valid_areas = [
                        '110000', '110101', '110102', '110105', '110106', '110107',
                        '110108', '110109', '110111', '112000', '120000', '120101',
                        '120102', '120103', '120104', '120105', '120106', '120110',
                        '120111', '120112', '120113', '120114', '120115', '120116',
                        '120117', '120118', '120119', '130000', '130100', '130102'
                    ]

                    if area_code not in valid_areas:
                        raise ValidationError('身份证号码地区代码无效')

                    # 验证出生日期
                    try:
                        birth_date = datetime.strptime(id_card[6:14], '%Y%m%d').date()
                        today = date.today()

                        if birth_date > today:
                            raise ValidationError('身份证号码出生日期无效')

                        if birth_date < date(1900, 1, 1):
                            raise ValidationError('身份证号码出生日期过于久远')

                        if today.year - birth_date.year > 120:
                            raise ValidationError('身份证号码年龄超出合理范围')

                    except ValueError:
                        raise ValidationError('身份证号码出生日期格式错误')

                    # 验证校验码
                    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
                    check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

                    total = sum(int(id_card[i]) * weights[i] for i in range(17))
                    mod = total % 11
                    expected_check = check_codes[mod]

                    if id_card[17].upper() != expected_check:
                        raise ValidationError('身份证号码校验码错误')

                @staticmethod
                def validate_bank_account(form, field):
                    """银行账号验证器"""
                    account_number = field.data
                    if not account_number:
                        return

                    # 移除空格和横线
                    account_number = re.sub(r'[\s-]', '', account_number)

                    # 检查长度(16-19位)
                    if len(account_number) < 16 or len(account_number) > 19:
                        raise ValidationError('银行账号长度必须在16-19位之间')

                    # 检查是否全为数字
                    if not account_number.isdigit():
                        raise ValidationError('银行账号只能包含数字')

                    # Luhn算法验证
                    def luhn_check(card_number):
                        def digits_of(n):
                            return [int(d) for d in str(n)]

                        digits = digits_of(card_number)
                        odd_digits = digits[-1::-2]
                        even_digits = digits[-2::-2]
                        checksum = 0
                        checksum += sum(odd_digits)

                        for d in even_digits:
                            checksum += sum(digits_of(d*2))

                        return checksum % 10 == 0

                    if not luhn_check(account_number):
                        raise ValidationError('银行账号校验失败,请检查账号是否正确')

                @staticmethod
                def validate_credit_card(form, field):
                    """信用卡号验证器"""
                    card_number = field.data
                    if not card_number:
                        return

                    # 移除空格和横线
                    card_number = re.sub(r'[\s-]', '', card_number)

                    # 检查长度(13-19位)
                    if len(card_number) < 13 or len(card_number) > 19:
                        raise ValidationError('信用卡号长度必须在13-19位之间')

                    # 检查是否全为数字
                    if not card_number.isdigit():
                        raise ValidationError('信用卡号只能包含数字')

                    # Luhn算法验证
                    def luhn_check(card_number):
                        def digits_of(n):
                            return [int(d) for d in str(n)]

                        digits = digits_of(card_number)
                        odd_digits = digits[-1::-2]
                        even_digits = digits[-2::-2]
                        checksum = 0
                        checksum += sum(odd_digits)

                        for d in even_digits:
                            checksum += sum(digits_of(d*2))

                        return checksum % 10 == 0

                    if not luhn_check(card_number):
                        raise ValidationError('信用卡号校验失败,请检查卡号是否正确')

                    # 识别卡类型
                    if card_number.startswith('4'):
                        card_type = 'Visa'
                    elif card_number.startswith('5'):
                        card_type = 'MasterCard'
                    elif card_number.startswith('3'):
                        card_type = 'American Express'
                    elif card_number.startswith('6'):
                        card_type = 'Discover'
                    else:
                        card_type = 'Unknown'

                    # 可以将卡类型存储到表单中
                    form.card_type = card_type

                @staticmethod
                def validate_social_media_url(form, field):
                    """社交媒体URL验证器"""
                    url = field.data
                    if not url:
                        return

                    # 支持的社交媒体平台
                    platforms = {
                        'weibo': r'^https?://(weibo\.com/|www\.weibo\.com/)',
                        'wechat': r'^https?://(mp\.weixin\.qq\.com/)',
                        'linkedin': r'^https?://(www\.linkedin\.com/in/|linkedin\.com/in/)',
                        'twitter': r'^https?://(twitter\.com/|www\.twitter\.com/)',
                        'facebook': r'^https?://(facebook\.com/|www\.facebook\.com/)',
                        'instagram': r'^https?://(instagram\.com/|www\.instagram\.com/)'
                    }

                    valid_platform = False
                    for platform, pattern in platforms.items():
                        if re.match(pattern, url):
                            valid_platform = True
                            form.social_platform = platform
                            break

                    if not valid_platform:
                        raise ValidationError('请输入有效的社交媒体URL')

                @staticmethod
                def validate_coordinate(form, field):
                    """地理坐标验证器"""
                    coordinate = field.data
                    if not coordinate:
                        return

                    # 解析坐标格式:经度,纬度
                    try:
                        lon, lat = map(float, coordinate.split(','))
                    except ValueError:
                        raise ValidationError('坐标格式不正确,应为:经度,纬度')

                    # 验证经度范围
                    if not (-180 <= lon <= 180):
                        raise ValidationError('经度必须在-180到180之间')

                    # 验证纬度范围
                    if not (-90 <= lat <= 90):
                        raise ValidationError('纬度必须在-90到90之间')

                    # 检查坐标是否在中国境内(可选)
                    # 中国大致范围:经度73°E-135°E,纬度18°N-54°N
                    if not (73 <= lon <= 135 and 18 <= lat <= 54):
                        raise ValidationError('坐标不在中国境内')

                @staticmethod
                def validate_product_code(form, field):
                    """商品条码验证器"""
                    code = field.data
                    if not code:
                        return

                    # 移除空格和横线
                    code = re.sub(r'[\s-]', '', code)

                    # EAN-13码验证
                    if len(code) == 13:
                        if not code.isdigit():
                            raise ValidationError('EAN-13条码必须为13位数字')

                        # 检查前缀
                        prefixes = ['690', '691', '692', '693', '694', '695']
                        if not any(code.startswith(prefix) for prefix in prefixes):
                            raise ValidationError('EAN-13条码前缀无效')

                        # 验证校验码
                        def calculate_ean13_check_digit(code_12):
                            total = 0
                            for i, digit in enumerate(code_12):
                                weight = 3 if i % 2 == 1 else 1
                                total += int(digit) * weight
                            check_digit = (10 - (total % 10)) % 10
                            return check_digit

                        expected_check = calculate_ean13_check_digit(code[:12])
                        if int(code[12]) != expected_check:
                            raise ValidationError('EAN-13条码校验码错误')

                    # UPC-A码验证
                    elif len(code) == 12:
                        if not code.isdigit():
                            raise ValidationError('UPC-A条码必须为12位数字')

                        # 验证校验码
                        def calculate_upca_check_digit(code_11):
                            total = 0
                            for i, digit in enumerate(code_11):
                                weight = 3 if i % 2 == 0 else 1
                                total += int(digit) * weight
                            check_digit = (10 - (total % 10)) % 10
                            return check_digit

                        expected_check = calculate_upca_check_digit(code[:11])
                        if int(code[11]) != expected_check:
                            raise ValidationError('UPC-A条码校验码错误')

                    else:
                        raise ValidationError('商品条码长度必须为12位(UPC-A)或13位(EAN-13)')

                @staticmethod
                def validate_vehicle_plate(form, field):
                    """车牌号码验证器"""
                    plate = field.data
                    if not plate:
                        return

                    plate = plate.upper()

                    # 新能源车牌验证
                    new_energy_pattern = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{6}$'

                    # 传统车牌验证
                    traditional_pattern = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5}$'

                    if not (re.match(new_energy_pattern, plate) or re.match(traditional_pattern, plate)):
                        raise ValidationError('车牌号码格式不正确')

                @staticmethod
                def validate_color_hex(form, field):
                    """十六进制颜色验证器"""
                    color = field.data
                    if not color:
                        return

                    # 支持 #RGB, #RRGGBB 格式
                    pattern = r'^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6})$'

                    if not re.match(pattern, color):
                        raise ValidationError('颜色格式不正确,应为 #RGB 或 #RRGGBB 格式')

                    # 转换为RGB值(可选)
                    def hex_to_rgb(hex_color):
                        hex_color = hex_color.lstrip('#')
                        if len(hex_color) == 3:
                            hex_color = ''.join([c*2 for c in hex_color])
                        return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))

                    try:
                        rgb_values = hex_to_rgb(color)
                        form.rgb_values = rgb_values
                    except ValueError:
                        raise ValidationError('颜色值转换失败')

                @staticmethod
                def validate_time_range(form, field):
                    """时间范围验证器"""
                    time_range = field.data
                    if not time_range:
                        return

                    # 支持 HH:MM-HH:MM 格式
                    pattern = r'^([01]?[0-9]|2[0-3]):[0-5][0-9]-([01]?[0-9]|2[0-3]):[0-5][0-9]$'

                    if not re.match(pattern, time_range):
                        raise ValidationError('时间范围格式不正确,应为 HH:MM-HH:MM')

                    try:
                        start_time, end_time = time_range.split('-')
                        start_hour, start_minute = map(int, start_time.split(':'))
                        end_hour, end_minute = map(int, end_time.split(':'))

                        start_minutes = start_hour * 60 + start_minute
                        end_minutes = end_hour * 60 + end_minute

                        if start_minutes >= end_minutes:
                            raise ValidationError('开始时间必须早于结束时间')

                        # 存储解析后的时间
                        form.start_time_minutes = start_minutes
                        form.end_time_minutes = end_minutes

                    except ValueError:
                        raise ValidationError('时间范围解析失败')

            # 高级用户注册表单
            class AdvancedRegistrationForm(FlaskForm):
                """高级用户注册表单"""

                username = StringField(
                    '用户名',
                    validators=[
                        DataRequired(message='用户名不能为空'),
                        Length(min=3, max=20, message='用户名长度必须在3-20个字符之间'),
                        Regexp(r'^[a-zA-Z0-9_]+$', message='用户名只能包含字母、数字和下划线')
                    ]
                )

                email = StringField(
                    '邮箱地址',
                    validators=[
                        DataRequired(message='邮箱地址不能为空'),
                        Email(message='请输入有效的邮箱地址')
                    ]
                )

                password = StringField(
                    '密码',
                    validators=[
                        DataRequired(message='密码不能为空'),
                        CustomValidators.validate_password_strength
                    ]
                )

                confirm_password = StringField(
                    '确认密码',
                    validators=[
                        DataRequired(message='请确认密码')
                    ]
                )

                real_name = StringField(
                    '真实姓名',
                    validators=[
                        DataRequired(message='真实姓名不能为空'),
                        Length(min=2, max=20, message='姓名长度必须在2-20个字符之间')
                    ]
                )

                id_card = StringField(
                    '身份证号码',
                    validators=[
                        DataRequired(message='身份证号码不能为空'),
                        CustomValidators.validate_id_card
                    ]
                )

                phone = StringField(
                    '手机号码',
                    validators=[
                        DataRequired(message='手机号码不能为空'),
                        Regexp(r'^1[3-9]\d{9}$', message='请输入有效的手机号码')
                    ]
                )

                # 自定义验证方法
                def validate_confirm_password(self, field):
                    """验证确认密码"""
                    if field.data != self.password.data:
                        raise ValidationError('两次输入的密码不一致')

                def validate_username(self, field):
                    """验证用户名唯一性"""
                    # 模拟数据库检查
                    existing_users = ['admin', 'test', 'user123']
                    if field.data in existing_users:
                        raise ValidationError('用户名已存在')

                def validate_email(self, field):
                    """验证邮箱唯一性"""
                    # 模拟数据库检查
                    existing_emails = ['admin@example.com', 'test@example.com']
                    if field.data in existing_emails:
                        raise ValidationError('邮箱地址已被注册')

            # 企业信息表单
            class CompanyInfoForm(FlaskForm):
                """企业信息表单"""

                company_name = StringField(
                    '企业名称',
                    validators=[
                        DataRequired(message='企业名称不能为空'),
                        Length(min=5, max=100, message='企业名称长度必须在5-100个字符之间')
                    ]
                )

                business_license = StringField(
                    '营业执照号码',
                    validators=[
                        DataRequired(message='营业执照号码不能为空'),
                        CustomValidators.validate_business_license
                    ]
                )

                tax_id = StringField(
                    '税务登记号',
                    validators=[
                        DataRequired(message='税务登记号不能为空'),
                        Regexp(r'^\d{15}$', message='税务登记号必须为15位数字')
                    ]
                )

                legal_representative = StringField(
                    '法定代表人',
                    validators=[
                        DataRequired(message='法定代表人不能为空'),
                        Length(min=2, max=20, message='法定代表人姓名长度必须在2-20个字符之间')
                    ]
                )

                legal_rep_id_card = StringField(
                    '法人身份证号',
                    validators=[
                        DataRequired(message='法人身份证号不能为空'),
                        CustomValidators.validate_id_card
                    ]
                )

                bank_account = StringField(
                    '银行账号',
                    validators=[
                        DataRequired(message='银行账号不能为空'),
                        CustomValidators.validate_bank_account
                    ]
                )

                credit_card = StringField(
                    '企业信用卡号',
                    validators=[
                        Optional(),
                        CustomValidators.validate_credit_card
                    ]
                )

                company_website = StringField(
                    '企业官网',
                    validators=[
                        Optional(),
                        URL(message='请输入有效的URL地址')
                    ]
                )

                weibo_url = StringField(
                    '微博地址',
                    validators=[
                        Optional(),
                        CustomValidators.validate_social_media_url
                    ]
                )

                coordinate = StringField(
                    '企业坐标',
                    validators=[
                        Optional(),
                        CustomValidators.validate_coordinate
                    ]
                )

                brand_color = StringField(
                    '品牌颜色',
                    validators=[
                        Optional(),
                        CustomValidators.validate_color_hex
                    ]
                )

                business_hours = StringField(
                    '营业时间',
                    validators=[
                        Optional(),
                        CustomValidators.validate_time_range
                    ]
                )

                vehicle_plates = StringField(
                    '车辆牌照',
                    validators=[
                        Optional(),
                        Regexp(r'^[A-Za-z0-9\s,,]+$', message='车牌号格式不正确')
                    ]
                )

                # 验证车牌号
                def validate_vehicle_plates(self, field):
                    """验证车牌号列表"""
                    if field.data:
                        plates = [plate.strip() for plate in re.split(r'[,,]', field.data) if plate.strip()]
                        for plate in plates:
                            if not CustomValidators.validate_vehicle_plate(self, plate):
                                # 这里需要创建一个临时的field对象来调用验证器
                                temp_field = type('TempField', (), {'data': plate})()
                                CustomValidators.validate_vehicle_plate(self, temp_field)

            # 订单表单
            class OrderForm(FlaskForm):
                """订单表单"""

                product_code = StringField(
                    '商品条码',
                    validators=[
                        DataRequired(message='商品条码不能为空'),
                        CustomValidators.validate_product_code
                    ]
                )

                quantity = IntegerField(
                    '数量',
                    validators=[
                        DataRequired(message='数量不能为空'),
                        NumberRange(min=1, max=1000, message='数量必须在1-1000之间')
                    ]
                )

                unit_price = FloatField(
                    '单价',
                    validators=[
                        DataRequired(message='单价不能为空'),
                        NumberRange(min=0.01, max=1000000, message='单价必须在0.01-1000000之间')
                    ]
                )

                discount_code = StringField(
                    '优惠码',
                    validators=[
                        Optional(),
                        Regexp(r'^[A-Z0-9]{6,12}$', message='优惠码格式不正确')
                    ]
                )

                # 自定义验证方法
                def validate_product_code(self, field):
                    """验证商品条码"""
                    # 模拟检查商品是否存在
                    valid_codes = ['6901234567890', '6931234567890']
                    if field.data not in valid_codes:
                        raise ValidationError('商品条码不存在')

                def validate_discount_code(self, field):
                    """验证优惠码"""
                    if field.data:
                        # 模拟检查优惠码有效性
                        valid_codes = ['SAVE20', 'WELCOME10', 'SPECIAL50']
                        if field.data not in valid_codes:
                            raise ValidationError('优惠码无效或已过期')

            # 路由定义
            @app.route('/forms/advanced-register', methods=['GET', 'POST'])
            def advanced_register():
                """高级注册页面"""
                form = AdvancedRegistrationForm()

                if form.validate_on_submit():
                    flash('注册成功!', 'success')
                    return redirect(url_for('success'))

                return render_template('forms/advanced_register.html', form=form)

            @app.route('/forms/company-info', methods=['GET', 'POST'])
            def company_info():
                """企业信息页面"""
                form = CompanyInfoForm()

                if form.validate_on_submit():
                    flash('企业信息提交成功!', 'success')
                    return redirect(url_for('success'))

                return render_template('forms/company_info.html', form=form)

            @app.route('/forms/order', methods=['GET', 'POST'])
            def order():
                """订单页面"""
                form = OrderForm()

                if form.validate_on_submit():
                    flash('订单提交成功!', 'success')
                    return redirect(url_for('success'))

                return render_template('forms/order.html', form=form)

            if __name__ == '__main__':
                app.run(debug=True)

6.3 文件上传处理

01.文件上传基础
    a.基础文件上传配置
        a.安全文件上传实现
            from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, send_from_directory
            from flask_wtf import FlaskForm
            from flask_wtf.file import FileField, FileRequired, FileAllowed
            from wtforms import StringField, TextAreaField, SelectField, BooleanField, IntegerField
            from wtforms.validators import DataRequired, Length, Optional, NumberRange
            from werkzeug.utils import secure_filename
            from werkzeug.datastructures import FileStorage
            import os
            import uuid
            import hashlib
            from datetime import datetime
            import mimetypes
            import magic

            app = Flask(__name__)

            # 文件上传配置
            def configure_file_upload(app):
                """配置文件上传设置"""
                # 基础配置
                app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB
                app.config['UPLOAD_FOLDER'] = 'uploads'
                app.config['UPLOAD_EXTENSIONS'] = {
                    # 图片文件
                    'images': ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg'],
                    # 文档文件
                    'documents': ['.pdf', '.doc', '.docx', '.txt', '.rtf', '.odt'],
                    # 电子表格
                    'spreadsheets': ['.xls', '.xlsx', '.csv', '.ods'],
                    # 演示文稿
                    'presentations': ['.ppt', '.pptx', '.odp'],
                    # 音频文件
                    'audio': ['.mp3', '.wav', '.ogg', '.m4a', '.flac'],
                    # 视频文件
                    'video': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.webm'],
                    # 压缩文件
                    'archives': ['.zip', '.rar', '.7z', '.tar', '.gz']
                }

                # MIME类型映射
                app.config['UPLOAD_MIME_TYPES'] = {
                    'image/jpeg': '.jpg',
                    'image/png': '.png',
                    'image/gif': '.gif',
                    'image/webp': '.webp',
                    'image/svg+xml': '.svg',
                    'application/pdf': '.pdf',
                    'text/plain': '.txt',
                    'application/msword': '.doc',
                    'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',
                    'application/vnd.ms-excel': '.xls',
                    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
                    'application/vnd.ms-powerpoint': '.ppt',
                    'application/vnd.openxmlformats-officedocument.presentationml.presentation': '.pptx'
                }

                # 安全设置
                app.config['UPLOAD_SECURITY'] = {
                    'scan_uploads': True,           # 扫描上传文件
                    'quarantine_infected': True,     # 隔离感染文件
                    'generate_thumbnails': True,     # 生成缩略图
                    'extract_metadata': True,        # 提取文件元数据
                    'allow_duplicates': False       # 允许重复文件
                }

                # 目录结构
                upload_dirs = [
                    'uploads',
                    'uploads/images',
                    'uploads/documents',
                    'uploads/temp',
                    'uploads/quarantine',
                    'uploads/thumbnails'
                ]

                for directory in upload_dirs:
                    os.makedirs(os.path.join(app.root_path, directory), exist_ok=True)

            configure_file_upload(app)

            class FileUploadManager:
                """文件上传管理器"""

                def __init__(self, app=None):
                    self.app = app
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    """初始化文件上传管理器"""
                    self.app = app

                def allowed_file(self, filename):
                    """检查文件扩展名是否允许"""
                    if not filename:
                        return False

                    # 获取文件扩展名
                    ext = os.path.splitext(filename).lower()

                    # 检查是否在允许的扩展名列表中
                    allowed_extensions = set()
                    for ext_list in self.app.config['UPLOAD_EXTENSIONS'].values():
                        allowed_extensions.update(ext_list)

                    return ext in allowed_extensions

                def get_file_category(self, filename):
                    """获取文件类别"""
                    if not filename:
                        return 'unknown'

                    ext = os.path.splitext(filename).lower()

                    for category, extensions in self.app.config['UPLOAD_EXTENSIONS'].items():
                        if ext in extensions:
                            return category

                    return 'unknown'

                def generate_unique_filename(self, filename):
                    """生成唯一的文件名"""
                    # 获取文件扩展名
                    name, ext = os.path.splitext(filename)
                    ext = ext.lower()

                    # 生成UUID作为文件名
                    unique_id = str(uuid.uuid4())
                    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')

                    # 组合文件名
                    unique_filename = f"{timestamp}_{unique_id[:8]}{ext}"

                    return unique_filename

                def get_file_path(self, filename, category=None):
                    """获取文件存储路径"""
                    if category:
                        upload_dir = os.path.join(self.app.config['UPLOAD_FOLDER'], category)
                    else:
                        upload_dir = self.app.config['UPLOAD_FOLDER']

                    return os.path.join(upload_dir, filename)

                def scan_file_for_malware(self, filepath):
                    """扫描文件恶意软件"""
                    if not self.app.config['UPLOAD_SECURITY']['scan_uploads']:
                        return True, "扫描未启用"

                    try:
                        # 使用python-magic库检测文件类型
                        file_mime = magic.from_file(filepath, mime=True)

                        # 检查可疑的MIME类型
                        suspicious_mimes = [
                            'application/x-executable',
                            'application/x-msdos-program',
                            'application/x-msdownload',
                            'application/x-msi',
                            'application/x-shockwave-flash'
                        ]

                        if file_mime in suspicious_mimes:
                            return False, f"可疑的文件类型: {file_mime}"

                        # 检查文件内容特征
                        with open(filepath, 'rb') as f:
                            header = f.read(1024)

                        # 检查PE文件头(Windows可执行文件)
                        if header.startswith(b'MZ'):
                            return False, "检测到Windows可执行文件"

                        # 检查ELF文件头(Linux可执行文件)
                        if header.startswith(b'\x7fELF'):
                            return False, "检测到Linux可执行文件"

                        # 检查脚本特征
                        script_signatures = [
                            b'<script',
                            b'javascript:',
                            b'vbscript:',
                            b'data:text/html',
                            b'<?php',
                            b'<%',
                            b'#!/bin/sh',
                            b'#!/bin/bash'
                        ]

                        for signature in script_signatures:
                            if signature in header.lower():
                                return False, f"检测到可疑脚本: {signature.decode('utf-8', errors='ignore')}"

                        return True, "文件安全"

                    except Exception as e:
                        # 如果扫描失败,根据配置决定是否接受文件
                        if self.app.config['UPLOAD_SECURITY']['quarantine_infected']:
                            return False, f"扫描失败: {str(e)}"
                        else:
                            return True, f"扫描跳过: {str(e)}"

                def calculate_file_hash(self, filepath):
                    """计算文件哈希值"""
                    hash_md5 = hashlib.md5()
                    hash_sha256 = hashlib.sha256()

                    with open(filepath, 'rb') as f:
                        for chunk in iter(lambda: f.read(4096), b""):
                            hash_md5.update(chunk)
                            hash_sha256.update(chunk)

                    return {
                        'md5': hash_md5.hexdigest(),
                        'sha256': hash_sha256.hexdigest()
                    }

                def extract_file_metadata(self, filepath, filename):
                    """提取文件元数据"""
                    metadata = {
                        'original_name': filename,
                        'file_size': 0,
                        'mime_type': 'application/octet-stream',
                        'upload_time': datetime.utcnow().isoformat(),
                        'file_hash': {}
                    }

                    try:
                        # 获取文件大小
                        metadata['file_size'] = os.path.getsize(filepath)

                        # 获取MIME类型
                        metadata['mime_type'] = magic.from_file(filepath, mime=True)

                        # 计算文件哈希
                        metadata['file_hash'] = self.calculate_file_hash(filepath)

                        # 根据文件类型提取特定元数据
                        if metadata['mime_type'].startswith('image/'):
                            metadata.update(self._extract_image_metadata(filepath))
                        elif metadata['mime_type'] == 'application/pdf':
                            metadata.update(self._extract_pdf_metadata(filepath))
                        elif metadata['mime_type'].startswith('video/'):
                            metadata.update(self._extract_video_metadata(filepath))

                    except Exception as e:
                        metadata['extraction_error'] = str(e)

                    return metadata

                def _extract_image_metadata(self, filepath):
                    """提取图片元数据"""
                    metadata = {}

                    try:
                        from PIL import Image, ExifTags
                        from PIL.ExifTags import TAGS

                        with Image.open(filepath) as img:
                            metadata.update({
                                'image_format': img.format,
                                'image_mode': img.mode,
                                'image_size': img.size,
                                'has_transparency': img.mode in ('RGBA', 'LA') or 'transparency' in img.info
                            })

                            # 提取EXIF数据
                            if hasattr(img, '_getexif') and img._getexif() is not None:
                                exif_data = {}
                                for tag_id, value in img._getexif().items():
                                    tag = TAGS.get(tag_id, tag_id)
                                    exif_data[tag] = value

                                metadata['exif_data'] = exif_data

                    except ImportError:
                        metadata['pil_error'] = 'PIL库未安装'
                    except Exception as e:
                        metadata['extraction_error'] = str(e)

                    return metadata

                def _extract_pdf_metadata(self, filepath):
                    """提取PDF元数据"""
                    metadata = {}

                    try:
                        import PyPDF2

                        with open(filepath, 'rb') as file:
                            pdf_reader = PyPDF2.PdfReader(file)

                            if pdf_reader.metadata:
                                metadata['pdf_info'] = {
                                    'title': pdf_reader.metadata.get('/Title', ''),
                                    'author': pdf_reader.metadata.get('/Author', ''),
                                    'subject': pdf_reader.metadata.get('/Subject', ''),
                                    'creator': pdf_reader.metadata.get('/Creator', ''),
                                    'producer': pdf_reader.metadata.get('/Producer', ''),
                                    'creation_date': pdf_reader.metadata.get('/CreationDate', ''),
                                    'modification_date': pdf_reader.metadata.get('/ModDate', '')
                                }

                            metadata['page_count'] = len(pdf_reader.pages)

                    except ImportError:
                        metadata['pypdf2_error'] = 'PyPDF2库未安装'
                    except Exception as e:
                        metadata['extraction_error'] = str(e)

                    return metadata

                def _extract_video_metadata(self, filepath):
                    """提取视频元数据"""
                    metadata = {}

                    try:
                        import cv2

                        cap = cv2.VideoCapture(filepath)

                        if cap.isOpened():
                            metadata.update({
                                'video_width': int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
                                'video_height': int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),
                                'video_fps': cap.get(cv2.CAP_PROP_FPS),
                                'video_frame_count': int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
                            })

                            # 计算视频时长
                            frame_count = metadata['video_frame_count']
                            fps = metadata['video_fps']
                            if fps > 0:
                                metadata['video_duration'] = frame_count / fps

                        cap.release()

                    except ImportError:
                        metadata['opencv_error'] = 'OpenCV库未安装'
                    except Exception as e:
                        metadata['extraction_error'] = str(e)

                    return metadata

                def generate_thumbnail(self, filepath, output_path, size=(150, 150)):
                    """生成缩略图"""
                    try:
                        from PIL import Image

                        # 只为图片生成缩略图
                        mime_type = magic.from_file(filepath, mime=True)
                        if not mime_type.startswith('image/'):
                            return False, "非图片文件"

                        with Image.open(filepath) as img:
                            # 转换为RGB模式(处理RGBA等模式)
                            if img.mode in ('RGBA', 'LA', 'P'):
                                background = Image.new('RGB', img.size, (255, 255, 255))
                                if img.mode == 'P':
                                    img = img.convert('RGBA')
                                background.paste(img, mask=img.split()[-1] if img.mode == 'RGBA' else None)
                                img = background

                            # 生成缩略图
                            img.thumbnail(size, Image.Resampling.LANCZOS)
                            img.save(output_path, 'JPEG', quality=85)

                        return True, "缩略图生成成功"

                    except ImportError:
                        return False, "PIL库未安装"
                    except Exception as e:
                        return False, f"缩略图生成失败: {str(e)}"

            # 创建文件上传管理器实例
            upload_manager = FileUploadManager(app)

            class FileUploadForm(FlaskForm):
                """文件上传表单"""
                file = FileField(
                    '选择文件',
                    validators=[
                        FileRequired(message='请选择要上传的文件'),
                        FileAllowed(
                            ['jpg', 'jpeg', 'png', 'gif', 'webp', 'pdf', 'doc', 'docx', 'txt'],
                            '不支持的文件类型'
                        )
                    ]
                )

                description = TextAreaField(
                    '文件描述',
                    validators=[
                        Optional(),
                        Length(max=500, message='描述不能超过500个字符')
                    ],
                    render_kw={'rows': 3, 'placeholder': '请输入文件描述...'}
                )

                category = SelectField(
                    '文件类别',
                    choices=[
                        ('', '自动检测'),
                        ('images', '图片'),
                        ('documents', '文档'),
                        ('spreadsheets', '电子表格'),
                        ('presentations', '演示文稿')
                    ],
                    coerce=lambda x: x if x else None
                )

                is_public = BooleanField(
                    '公开文件',
                    default=False
                )

                allow_overwrite = BooleanField(
                    '允许覆盖同名文件',
                    default=False
                )

                def validate_file(self, field):
                    """验证上传文件"""
                    if field.data and isinstance(field.data, FileStorage):
                        # 检查文件名
                        filename = field.data.filename
                        if not filename:
                            raise ValidationError('文件名为空')

                        # 检查文件大小
                        if hasattr(field.data, 'content_length'):
                            max_size = app.config['MAX_CONTENT_LENGTH']
                            if field.data.content_length > max_size:
                                raise ValidationError(f'文件大小不能超过 {max_size // (1024*1024)}MB')

                        # 检查文件类型(基于MIME类型)
                        if field.data.content_type:
                            suspicious_types = [
                                'application/x-executable',
                                'application/x-msdos-program',
                                'application/x-msdownload'
                            ]
                            if field.data.content_type in suspicious_types:
                                raise ValidationError('不允许上传可执行文件')

            # 多文件上传表单
            class MultipleFileUploadForm(FlaskForm):
                """多文件上传表单"""
                files = FileField(
                    '选择文件(可多选)',
                    validators=[
                        FileRequired(message='请选择要上传的文件'),
                    ]
                )

                description = TextAreaField(
                    '批量描述',
                    validators=[
                        Optional(),
                        Length(max=1000, message='描述不能超过1000个字符')
                    ],
                    render_kw={'rows': 3, 'placeholder': '请输入文件描述(将应用于所有文件)...'}
                )

                category = SelectField(
                    '文件类别',
                    choices=[
                        ('', '自动检测'),
                        ('images', '图片'),
                        ('documents', '文档'),
                        ('spreadsheets', '电子表格'),
                        ('presentations', '演示文稿'),
                        ('audio', '音频'),
                        ('video', '视频')
                    ],
                    coerce=lambda x: x if x else None
                )

                is_public = BooleanField(
                    '公开文件',
                    default=False
                )

                def validate_files(self, field):
                    """验证多文件上传"""
                    if field.data and isinstance(field.data, FileStorage):
                        # 单文件情况
                        return super().validate_files(field)
                    elif request.files.getlist(field.name):
                        # 多文件情况
                        files = request.files.getlist(field.name)
                        max_files = 10  # 最多同时上传10个文件

                        if len(files) > max_files:
                            raise ValidationError(f'最多只能同时上传 {max_files} 个文件')

                        total_size = sum(
                            file.content_length for file in files
                            if hasattr(file, 'content_length')
                        )

                        max_total_size = app.config['MAX_CONTENT_LENGTH'] * 2  # 总大小限制
                        if total_size > max_total_size:
                            raise ValidationError(f'总文件大小不能超过 {max_total_size // (1024*1024)}MB')

            # 图片上传表单
            class ImageUploadForm(FlaskForm):
                """图片上传表单"""
                image = FileField(
                    '选择图片',
                    validators=[
                        FileRequired(message='请选择图片文件'),
                        FileAllowed(
                            ['jpg', 'jpeg', 'png', 'gif', 'webp'],
                            '只支持图片文件(JPG, PNG, GIF, WebP)'
                        )
                    ]
                )

                title = StringField(
                    '图片标题',
                    validators=[
                        DataRequired(message='请输入图片标题'),
                        Length(min=1, max=100, message='标题长度必须在1-100个字符之间')
                    ]
                )

                alt_text = StringField(
                    '图片描述(Alt Text)',
                    validators=[
                        Optional(),
                        Length(max=200, message='描述不能超过200个字符')
                    ],
                    render_kw={'placeholder': '用于SEO和可访问性的图片描述...'}
                )

                tags = StringField(
                    '标签',
                    validators=[
                        Optional(),
                        Length(max=200, message='标签不能超过200个字符')
                    ],
                    render_kw={'placeholder': '用逗号分隔多个标签...'}
                )

                watermark = BooleanField(
                    '添加水印',
                    default=False
                )

                auto_optimize = BooleanField(
                    '自动优化',
                    default=True
                )

                def validate_image(self, field):
                    """验证图片文件"""
                    if field.data and isinstance(field.data, FileStorage):
                        # 检查图片尺寸
                        try:
                            from PIL import Image
                            import io

                            # 读取图片数据
                            image_data = field.data.read()
                            field.data.seek(0)  # 重置文件指针

                            # 验证图片
                            img = Image.open(io.BytesIO(image_data))

                            # 检查图片尺寸
                            max_width = 5000
                            max_height = 5000
                            if img.width > max_width or img.height > max_height:
                                raise ValidationError(f'图片尺寸不能超过 {max_width}x{max_height}')

                            # 检查图片格式
                            if img.format not in ['JPEG', 'PNG', 'GIF', 'WEBP']:
                                raise ValidationError(f'不支持的图片格式: {img.format}')

                        except ImportError:
                            raise ValidationError('PIL库未安装,无法验证图片')
                        except Exception as e:
                            if 'cannot identify image file' in str(e):
                                raise ValidationError('无法识别的图片文件')
                            raise ValidationError(f'图片验证失败: {str(e)}')

            @app.route('/upload', methods=['GET', 'POST'])
            def upload_file():
                """单文件上传"""
                form = FileUploadForm()

                if form.validate_on_submit():
                    file = form.file.data
                    original_filename = secure_filename(file.filename)

                    # 生成唯一文件名
                    unique_filename = upload_manager.generate_unique_filename(original_filename)

                    # 确定文件类别
                    category = form.category.data or upload_manager.get_file_category(original_filename)

                    # 获取存储路径
                    file_path = upload_manager.get_file_path(unique_filename, category)

                    try:
                        # 保存文件
                        file.save(file_path)

                        # 扫描文件
                        is_safe, scan_result = upload_manager.scan_file_for_malware(file_path)
                        if not is_safe:
                            # 移动到隔离区
                            quarantine_path = upload_manager.get_file_path(
                                unique_filename, 'quarantine'
                            )
                            os.rename(file_path, quarantine_path)

                            flash(f'文件上传失败:{scan_result}', 'error')
                            return redirect(url_for('upload_file'))

                        # 提取元数据
                        metadata = upload_manager.extract_file_metadata(file_path, original_filename)

                        # 生成缩略图(如果是图片)
                        thumbnail_path = None
                        if (category == 'images' and
                            app.config['UPLOAD_SECURITY']['generate_thumbnails']):
                            thumbnail_filename = f"thumb_{unique_filename}"
                            thumbnail_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'thumbnails')
                            thumbnail_path = os.path.join(thumbnail_dir, thumbnail_filename)

                            success, thumb_result = upload_manager.generate_thumbnail(
                                file_path, thumbnail_path
                            )
                            if not success:
                                thumbnail_path = None

                        # 保存文件信息到数据库(这里简化处理)
                        file_info = {
                            'original_name': original_filename,
                            'stored_name': unique_filename,
                            'file_path': file_path,
                            'file_size': metadata['file_size'],
                            'mime_type': metadata['mime_type'],
                            'category': category,
                            'description': form.description.data,
                            'is_public': form.is_public.data,
                            'upload_time': metadata['upload_time'],
                            'file_hash': metadata['file_hash'],
                            'thumbnail_path': thumbnail_path,
                            'metadata': metadata
                        }

                        flash(f'文件 "{original_filename}" 上传成功!', 'success')
                        return render_template('upload/success.html', file_info=file_info)

                    except Exception as e:
                        # 清理上传的文件
                        if os.path.exists(file_path):
                            os.remove(file_path)
                        flash(f'文件上传失败:{str(e)}', 'error')
                        return redirect(url_for('upload_file'))

                return render_template('upload/upload.html', form=form)

            @app.route('/upload/multiple', methods=['GET', 'POST'])
            def upload_multiple_files():
                """多文件上传"""
                form = MultipleFileUploadForm()

                if form.validate_on_submit():
                    files = request.files.getlist('files')
                    uploaded_files = []
                    failed_files = []

                    for i, file in enumerate(files):
                        if file and file.filename:
                            original_filename = secure_filename(file.filename)
                            unique_filename = upload_manager.generate_unique_filename(original_filename)
                            category = form.category.data or upload_manager.get_file_category(original_filename)
                            file_path = upload_manager.get_file_path(unique_filename, category)

                            try:
                                # 保存文件
                                file.save(file_path)

                                # 扫描文件
                                is_safe, scan_result = upload_manager.scan_file_for_malware(file_path)
                                if not is_safe:
                                    # 移动到隔离区
                                    quarantine_path = upload_manager.get_file_path(
                                        unique_filename, 'quarantine'
                                    )
                                    os.rename(file_path, quarantine_path)
                                    failed_files.append({
                                        'filename': original_filename,
                                        'error': scan_result
                                    })
                                    continue

                                # 提取元数据
                                metadata = upload_manager.extract_file_metadata(file_path, original_filename)

                                # 保存文件信息
                                file_info = {
                                    'original_name': original_filename,
                                    'stored_name': unique_filename,
                                    'file_path': file_path,
                                    'file_size': metadata['file_size'],
                                    'mime_type': metadata['mime_type'],
                                    'category': category,
                                    'upload_time': metadata['upload_time']
                                }

                                uploaded_files.append(file_info)

                            except Exception as e:
                                failed_files.append({
                                    'filename': original_filename,
                                    'error': str(e)
                                })

                    # 返回结果
                    return render_template('upload/multiple_result.html',
                                         uploaded_files=uploaded_files,
                                         failed_files=failed_files)

                return render_template('upload/multiple.html', form=form)

            @app.route('/upload/image', methods=['GET', 'POST'])
            def upload_image():
                """图片上传"""
                form = ImageUploadForm()

                if form.validate_on_submit():
                    file = form.image.data
                    original_filename = secure_filename(file.filename)
                    unique_filename = upload_manager.generate_unique_filename(original_filename)
                    file_path = upload_manager.get_file_path(unique_filename, 'images')

                    try:
                        # 图片处理
                        from PIL import Image, ImageDraw, ImageFont
                        import io

                        # 读取图片
                        image_data = file.read()
                        file.seek(0)
                        img = Image.open(io.BytesIO(image_data))

                        # 自动优化
                        if form.auto_optimize.data:
                            # 压缩图片
                            if img.mode in ('RGBA', 'LA', 'P'):
                                img = img.convert('RGB')

                            # 限制最大尺寸
                            max_size = (1920, 1080)
                            img.thumbnail(max_size, Image.Resampling.LANCZOS)

                        # 添加水印
                        if form.watermark.data:
                            draw = ImageDraw.Draw(img)
                            watermark_text = "© My Website"

                            # 使用默认字体
                            try:
                                font = ImageFont.truetype("arial.ttf", 20)
                            except:
                                font = ImageFont.load_default()

                            # 计算水印位置
                            bbox = draw.textbbox((0, 0), watermark_text, font=font)
                            text_width = bbox - bbox[0]
                            text_height = bbox[3] - bbox

                            # 在右下角添加水印
                            margin = 10
                            x = img.width - text_width - margin
                            y = img.height - text_height - margin

                            # 添加半透明背景
                            padding = 5
                            draw.rectangle(
                                [x - padding, y - padding, x + text_width + padding, y + text_height + padding],
                                fill=(255, 255, 255, 128)
                            )

                            draw.text((x, y), watermark_text, font=font, fill=(0, 0, 0, 200))

                        # 保存处理后的图片
                        img.save(file_path, 'JPEG', quality=85, optimize=True)

                        # 生成缩略图
                        thumbnail_filename = f"thumb_{unique_filename}"
                        thumbnail_path = os.path.join(
                            app.config['UPLOAD_FOLDER'], 'thumbnails', thumbnail_filename
                        )
                        upload_manager.generate_thumbnail(file_path, thumbnail_path, (300, 300))

                        # 保存图片信息
                        image_info = {
                            'original_name': original_filename,
                            'stored_name': unique_filename,
                            'file_path': file_path,
                            'title': form.title.data,
                            'alt_text': form.alt_text.data,
                            'tags': [tag.strip() for tag in form.tags.data.split(',') if tag.strip()],
                            'image_size': img.size,
                            'file_size': os.path.getsize(file_path),
                            'thumbnail_path': thumbnail_path,
                            'upload_time': datetime.utcnow().isoformat()
                        }

                        flash(f'图片 "{original_filename}" 上传成功!', 'success')
                        return render_template('upload/image_success.html', image_info=image_info)

                    except Exception as e:
                        if os.path.exists(file_path):
                            os.remove(file_path)
                        flash(f'图片上传失败:{str(e)}', 'error')
                        return redirect(url_for('upload_image'))

                return render_template('upload/image.html', form=form)

            @app.route('/uploads/<path:filename>')
            def serve_uploaded_file(filename):
                """服务上传的文件"""
                upload_dir = app.config['UPLOAD_FOLDER']
                file_path = os.path.join(upload_dir, filename)

                if not os.path.exists(file_path):
                    return jsonify({'error': 'File not found'}), 404

                return send_from_directory(upload_dir, filename)

            @app.route('/uploads/thumbnails/<path:filename>')
            def serve_thumbnail(filename):
                """服务缩略图"""
                thumbnail_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'thumbnails')
                return send_from_directory(thumbnail_dir, filename)

            @app.route('/api/upload', methods=['POST'])
            def api_upload():
                """API文件上传"""
                if 'file' not in request.files:
                    return jsonify({'error': 'No file provided'}), 400

                file = request.files['file']
                if file.filename == '':
                    return jsonify({'error': 'No file selected'}), 400

                # 验证文件
                if not upload_manager.allowed_file(file.filename):
                    return jsonify({'error': 'File type not allowed'}), 400

                try:
                    # 保存文件
                    original_filename = secure_filename(file.filename)
                    unique_filename = upload_manager.generate_unique_filename(original_filename)
                    category = upload_manager.get_file_category(original_filename)
                    file_path = upload_manager.get_file_path(unique_filename, category)

                    file.save(file_path)

                    # 扫描文件
                    is_safe, scan_result = upload_manager.scan_file_for_malware(file_path)
                    if not is_safe:
                        os.remove(file_path)
                        return jsonify({'error': f'File scan failed: {scan_result}'}), 400

                    # 提取元数据
                    metadata = upload_manager.extract_file_metadata(file_path, original_filename)

                    # 生成缩略图
                    thumbnail_path = None
                    if category == 'images':
                        thumbnail_filename = f"thumb_{unique_filename}"
                        thumbnail_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'thumbnails')
                        thumbnail_path = os.path.join(thumbnail_dir, thumbnail_filename)
                        success, _ = upload_manager.generate_thumbnail(file_path, thumbnail_path)
                        if not success:
                            thumbnail_path = None

                    return jsonify({
                        'success': True,
                        'file_info': {
                            'original_name': original_filename,
                            'stored_name': unique_filename,
                            'file_url': url_for('serve_uploaded_file', filename=os.path.join(category, unique_filename)),
                            'thumbnail_url': url_for('serve_thumbnail', filename=thumbnail_filename) if thumbnail_path else None,
                            'file_size': metadata['file_size'],
                            'mime_type': metadata['mime_type'],
                            'category': category,
                            'upload_time': metadata['upload_time']
                        }
                    })

                except Exception as e:
                    return jsonify({'error': str(e)}), 500

            if __name__ == '__main__':
                app.run(debug=True)

6.4 表单安全和CSRF保护

01.CSRF保护机制
    a.CSRF攻击防护
        a.高级CSRF保护实现
            from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, session
            from flask_wtf import FlaskForm, CSRFProtect
            from flask_wtf.csrf import CSRFError
            from wtforms import StringField, TextAreaField, BooleanField, SelectField, IntegerField
            from wtforms.validators import DataRequired, Length, Optional, NumberRange
            from werkzeug.security import generate_password_hash, check_password_hash
            import secrets
            import time
            import hashlib
            from datetime import datetime, timedelta
            functools

            app = Flask(__name__)

            # 高级CSRF配置
            def configure_advanced_csrf(app):
                """配置高级CSRF保护"""
                app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', secrets.token_urlsafe(32))

                # CSRF令牌配置
                app.config['WTF_CSRF_ENABLED'] = True
                app.config['WTF_CSRF_TIME_LIMIT'] = 3600  # 1小时
                app.config['WTF_CSRF_SSL_STRICT'] = True  # 仅HTTPS下严格模式
                app.config['WTF_CSRF_SECRET_KEY'] = secrets.token_urlsafe(32)

                # 自定义CSRF令牌配置
                app.config['CSRF_TOKEN_LENGTH'] = 32
                app.config['CSRF_TOKEN_TIMEOUT'] = 3600
                app.config['CSRF_TOKEN_REFRESH'] = True  # 每次请求刷新令牌
                app.config['CSRF_COOKIE_SECURE'] = True  # 仅HTTPS
                app.config['CSRF_COOKIE_HTTPONLY'] = True  # 防止XSS访问
                app.config['CSRF_COOKIE_SAMESITE'] = 'Lax'  # Cookie同源策略

                # 双重提交Cookie模式
                app.config['CSRF_DOUBLE_SUBMIT_COOKIE'] = True
                app.config['CSRF_DOUBLE_SUBMIT_COOKIE_NAME'] = 'csrf_token'

                # Referer检查
                app.config['CSRF_CHECK_REFERER'] = True
                app.config['CSRF_ALLOWED_ORIGINS'] = [
                    'https://yourdomain.com',
                    'https://www.yourdomain.com',
                    'https://api.yourdomain.com'
                ]

            configure_advanced_csrf(app)

            class AdvancedCSRFProtect:
                """高级CSRF保护"""

                def __init__(self, app=None):
                    self.app = app
                    self.token_store = {}
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    """初始化高级CSRF保护"""
                    self.app = app
                    app.before_request(self._before_request)
                    app.after_request(self._after_request)
                    app.errorhandler(CSRFError)(self._handle_csrf_error)

                def _before_request(self):
                    """请求前CSRF检查"""
                    # 跳过不需要CSRF保护的请求
                    if self._should_skip_csrf():
                        return

                    # 检查CSRF令牌
                    token = self._get_csrf_token()
                    if not token:
                        return self._csrf_error('CSRF token missing')

                    # 验证CSRF令牌
                    if not self._validate_csrf_token(token):
                        return self._csrf_error('CSRF token invalid')

                    # 检查Referer头
                    if self.app.config.get('CSRF_CHECK_REFERER', True):
                        if not self._validate_referer():
                            return self._csrf_error('Invalid Referer')

                def _after_request(self, response):
                    """响应后设置CSRF令牌"""
                    if request.method == 'GET':
                        # 为GET响应设置CSRF令牌
                        token = self._generate_csrf_token()
                        self._set_csrf_token_cookie(response, token)
                        response.headers['X-CSRF-Token'] = token

                    return response

                def _should_skip_csrf(self):
                    """判断是否跳过CSRF检查"""
                    # 跳过安全方法
                    if request.method in ['GET', 'HEAD', 'OPTIONS', 'TRACE']:
                        return True

                    # 跳过特定路径
                    skip_paths = [
                        '/api/webhook/',
                        '/api/payment/callback/',
                        '/health',
                        '/metrics'
                    ]

                    for path in skip_paths:
                        if request.path.startswith(path):
                            return True

                    # 跳过API请求(如果有专门的API令牌验证)
                    if request.path.startswith('/api/'):
                        auth_header = request.headers.get('Authorization')
                        if auth_header and auth_header.startswith('Bearer '):
                            return True

                    return False

                def _get_csrf_token(self):
                    """获取CSRF令牌"""
                    # 优先从Header获取
                    token = request.headers.get('X-CSRF-Token')
                    if token:
                        return token

                    # 从表单数据获取
                    token = request.form.get('csrf_token')
                    if token:
                        return token

                    # 从JSON数据获取
                    if request.is_json:
                        data = request.get_json(silent=True) or {}
                        token = data.get('csrf_token')
                        if token:
                            return token

                    return None

                def _generate_csrf_token(self):
                    """生成CSRF令牌"""
                    timestamp = int(time.time())
                    random_data = secrets.token_bytes(16)
                    user_agent = request.headers.get('User-Agent', '')[:50]

                    # 组合数据
                    token_data = f"{timestamp}:{random_data.hex()}:{user_agent}"

                    # 生成签名
                    secret = self.app.config.get('CSRF_SECRET_KEY', self.app.config['SECRET_KEY'])
                    signature = hashlib.sha256(f"{token_data}:{secret}".encode()).hexdigest()

                    # 最终令牌
                    token = f"{timestamp}.{signature}"

                    # 存储令牌(用于验证)
                    self.token_store[token] = {
                        'timestamp': timestamp,
                        'user_agent': user_agent,
                        'ip_address': request.remote_addr
                    }

                    # 清理过期令牌
                    self._cleanup_expired_tokens()

                    return token

                def _validate_csrf_token(self, token):
                    """验证CSRF令牌"""
                    try:
                        # 解析令牌
                        timestamp_str, signature = token.split('.', 1)
                        timestamp = int(timestamp_str)

                        # 检查时间戳
                        timeout = self.app.config.get('CSRF_TOKEN_TIMEOUT', 3600)
                        if time.time() - timestamp > timeout:
                            return False

                        # 检查令牌是否存在
                        if token not in self.token_store:
                            return False

                        # 获取存储的令牌信息
                        stored_info = self.token_store[token]
                        user_agent = request.headers.get('User-Agent', '')[:50]
                        ip_address = request.remote_addr

                        # 验证用户代理
                        if stored_info['user_agent'] != user_agent:
                            return False

                        # 可选:验证IP地址(可能会因为代理而失败)
                        # if stored_info['ip_address'] != ip_address:
                        #     return False

                        return True

                    except (ValueError, KeyError):
                        return False

                def _validate_referer(self):
                    """验证Referer头"""
                    referer = request.headers.get('Referer')
                    if not referer:
                        return False  # 没有Referer头,拒绝请求

                    # 检查Referer是否在允许的域名列表中
                    allowed_origins = self.app.config.get('CSRF_ALLOWED_ORIGINS', [])
                    for origin in allowed_origins:
                        if referer.startswith(origin):
                            return True

                    return False

                def _set_csrf_token_cookie(self, response, token):
                    """设置CSRF令牌Cookie"""
                    response.set_cookie(
                        self.app.config.get('CSRF_DOUBLE_SUBMIT_COOKIE_NAME', 'csrf_token'),
                        token,
                        max_age=self.app.config.get('CSRF_TOKEN_TIMEOUT', 3600),
                        secure=self.app.config.get('CSRF_COOKIE_SECURE', True),
                        httponly=self.app.config.get('CSRF_COOKIE_HTTPONLY', True),
                        samesite=self.app.config.get('CSRF_COOKIE_SAMESITE', 'Lax')
                    )

                def _cleanup_expired_tokens(self):
                    """清理过期的CSRF令牌"""
                    current_time = time.time()
                    timeout = self.app.config.get('CSRF_TOKEN_TIMEOUT', 3600)

                    expired_tokens = [
                        token for token, info in self.token_store.items()
                        if current_time - info['timestamp'] > timeout
                    ]

                    for token in expired_tokens:
                        del self.token_store[token]

                def _csrf_error(self, message):
                    """CSRF错误处理"""
                    if request.path.startswith('/api/'):
                        return jsonify({'error': message}), 400
                    else:
                        flash(f'安全错误: {message}', 'error')
                        return redirect(url_for('index'))

                def _handle_csrf_error(self, error):
                    """CSRF异常处理"""
                    return self._csrf_error(str(error))

            # 创建高级CSRF保护实例
            advanced_csrf = AdvancedCSRFProtect(app)

            class FormSecurityManager:
                """表单安全管理器"""

                def __init__(self, app=None):
                    self.app = app
                    if app is not None:
                        self.init_app(app)

                def init_app(self, app):
                    """初始化表单安全管理器"""
                    self.app = app

                def generate_form_id(self, form_name):
                    """生成表单ID"""
                    timestamp = int(time.time())
                    random_data = secrets.token_hex(8)
                    form_id = f"{form_name}_{timestamp}_{random_data}"

                    # 存储表单ID到session
                    if 'form_ids' not in session:
                        session['form_ids'] = {}

                    session['form_ids'][form_id] = {
                        'form_name': form_name,
                        'timestamp': timestamp,
                        'used': False
                    }

                    return form_id

                def validate_form_id(self, form_id, form_name):
                    """验证表单ID"""
                    if 'form_ids' not in session:
                        return False

                    form_info = session['form_ids'].get(form_id)
                    if not form_info:
                        return False

                    if form_info['form_name'] != form_name:
                        return False

                    if form_info['used']:
                        return False

                    # 检查时间戳(防止表单重放)
                    timeout = 3600  # 1小时
                    if time.time() - form_info['timestamp'] > timeout:
                        return False

                    # 标记为已使用
                    form_info['used'] = True

                    return True

                def add_honeypot_field(self, form_class):
                    """为表单添加蜜罐字段"""
                    class HoneyPotForm(form_class):
                        # 蜜罐字段,对人类用户不可见
                        confirm_email = StringField(
                            '确认邮箱',
                            validators=[Optional()],
                            render_kw={
                                'style': 'display:none;',
                                'tabindex': '-1',
                                'autocomplete': 'off'
                            }
                        )

                        website = StringField(
                            '网站',
                            validators=[Optional()],
                            render_kw={
                                'style': 'display:none;',
                                'tabindex': '-1',
                                'autocomplete': 'off'
                            }
                        )

                        def validate_confirm_email(self, field):
                            """蜜罐字段验证"""
                            if field.data:
                                raise ValidationError('检测到机器人行为')

                        def validate_website(self, field):
                            """蜜罐字段验证"""
                            if field.data:
                                raise ValidationError('检测到机器人行为')

                    return HoneyPotForm

                def add_rate_limiting(self, form_name, max_attempts=5, window_seconds=300):
                    """添加表单提交频率限制"""
                    def decorator(f):
                        @functools.wraps(f)
                        def decorated_function(*args, **kwargs):
                            # 获取客户端标识
                            client_id = request.remote_addr
                            if request.user.is_authenticated:
                                client_id = f"user_{request.user.id}"

                            # 检查频率限制
                            key = f"rate_limit_{form_name}_{client_id}"

                            if key not in session:
                                session[key] = []

                            attempts = session[key]
                            current_time = time.time()

                            # 清理过期记录
                            attempts[:] = [attempt for attempt in attempts
                                           if current_time - attempt < window_seconds]

                            # 检查是否超过限制
                            if len(attempts) >= max_attempts:
                                return jsonify({
                                    'error': 'Too many requests. Please try again later.',
                                    'retry_after': window_seconds - (current_time - attempts[0])
                                }), 429

                            # 记录当前请求
                            attempts.append(current_time)
                            session[key] = attempts

                            return f(*args, **kwargs)
                        return decorated_function
                    return decorator

            # 创建表单安全管理器实例
            form_security = FormSecurityManager(app)

            class SecureForm(FlaskForm):
                """安全表单基类"""

                def __init__(self, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self._form_id = None
                    self._add_security_fields()

                def _add_security_fields(self):
                    """添加安全字段"""
                    # 添加表单ID字段
                    if hasattr(self, 'form_name'):
                        self._form_id = form_security.generate_form_id(self.form_name)

                def validate(self, extra_validators=None):
                    """验证表单"""
                    # 基础验证
                    if not super().validate(extra_validators):
                        return False

                    # 验证表单ID
                    if hasattr(self, 'form_name') and self._form_id:
                        if not form_security.validate_form_id(self._form_id, self.form_name):
                            self.form_errors.append('表单验证失败')
                            return False

                    return True

            # 用户注册表单(包含安全保护)
            class SecureRegistrationForm(SecureForm):
                """安全注册表单"""
                form_name = 'registration'

                username = StringField(
                    '用户名',
                    validators=[
                        DataRequired(message='用户名不能为空'),
                        Length(min=3, max=20, message='用户名长度必须在3-20个字符之间')
                    ]
                )

                email = StringField(
                    '邮箱',
                    validators=[
                        DataRequired(message='邮箱不能为空'),
                        Length(max=120, message='邮箱长度不能超过120个字符')
                    ]
                )

                password = StringField(
                    '密码',
                    validators=[
                        DataRequired(message='密码不能为空'),
                        Length(min=8, max=128, message='密码长度必须在8-128个字符之间')
                    ]
                )

                confirm_password = StringField(
                    '确认密码',
                    validators=[
                        DataRequired(message='请确认密码')
                    ]
                )

                # 添加蜜罐字段
                confirm_email = StringField(
                    '确认邮箱',
                    validators=[Optional()],
                    render_kw={
                        'style': 'display:none;',
                        'tabindex': '-1',
                        'autocomplete': 'off'
                    }
                )

                def validate_confirm_password(self, field):
                    """验证确认密码"""
                    if field.data != self.password.data:
                        raise ValidationError('两次输入的密码不一致')

                def validate_confirm_email(self, field):
                    """蜜罐字段验证"""
                    if field.data:
                        raise ValidationError('检测到机器人行为')

            # 添加频率限制装饰器
            @form_security.add_rate_limiting('registration', max_attempts=3, window_seconds=900)
            @app.route('/secure/register', methods=['GET', 'POST'])
            def secure_register():
                """安全注册"""
                form = SecureRegistrationForm()

                if form.validate_on_submit():
                    # 处理注册逻辑
                    flash('注册成功!', 'success')
                    return redirect(url_for('login'))

                return render_template('secure/register.html', form=form)

            # API表单提交(支持JSON)
            @app.route('/api/secure/register', methods=['POST'])
            def api_secure_register():
                """API安全注册"""
                # 检查CSRF令牌
                if not advanced_csrf._validate_csrf_token(request.json.get('csrf_token')):
                    return jsonify({'error': 'Invalid CSRF token'}), 400

                # 验证表单数据
                form = SecureRegistrationForm(data=request.json)
                form.csrf_token.data = request.json.get('csrf_token')  # 设置CSRF令牌

                if form.validate():
                    # 处理注册逻辑
                    return jsonify({
                        'success': True,
                        'message': '注册成功!'
                    })
                else:
                    return jsonify({
                        'success': False,
                        'errors': form.errors
                    }), 400

            # AJAX表单提交示例
            class AjaxForm(SecureForm):
                """AJAX表单示例"""
                form_name = 'ajax_form'

                message = StringField(
                    '消息',
                    validators=[
                        DataRequired(message='消息不能为空'),
                        Length(max=500, message='消息不能超过500个字符')
                    ]
                )

                # 添加蜜罐字段
                bot_field = StringField(
                    '机器人字段',
                    validators=[Optional()],
                    render_kw={
                        'style': 'display:none;',
                        'tabindex': '-1'
                    }
                )

                def validate_bot_field(self, field):
                    """蜜罐字段验证"""
                    if field.data:
                        raise ValidationError('机器人检测失败')

            @app.route('/ajax/submit', methods=['POST'])
            def ajax_submit():
                """AJAX表单提交"""
                form = AjaxForm()

                if form.validate_on_submit():
                    # 处理表单提交
                    return jsonify({
                        'success': True,
                        'message': '提交成功!',
                        'data': {
                            'message': form.message.data,
                            'timestamp': datetime.utcnow().isoformat()
                        }
                    })
                else:
                    return jsonify({
                        'success': False,
                        'errors': form.errors
                    }), 400

            # 文件上传安全保护
            class SecureUploadForm(SecureForm):
                """安全上传表单"""
                form_name = 'upload'

                # 添加蜜罐字段
                upload_type = StringField(
                    '上传类型',
                    validators=[Optional()],
                    render_kw={
                        'style': 'display:none;',
                        'tabindex': '-1'
                    }
                )

                def validate_upload_type(self, field):
                    """蜜罐字段验证"""
                    if field.data:
                        raise ValidationError('机器人上传被阻止')

            @app.route('/secure/upload', methods=['GET', 'POST'])
            def secure_upload():
                """安全上传"""
                form = SecureUploadForm()

                if form.validate_on_submit():
                    # 处理文件上传
                    return jsonify({'success': True, 'message': '上传成功'})
                else:
                    return jsonify({'success': False, 'errors': form.errors}), 400

            # 多步表单示例
            class MultiStepForm(SecureForm):
                """多步表单基类"""
                step = IntegerField('步骤')

                def __init__(self, step=1, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self.step = step

            class Step1Form(MultiStepForm):
                """第一步表单"""
                form_name = 'multistep_step1'

                name = StringField('姓名', validators=[DataRequired()])
                email = StringField('邮箱', validators=[DataRequired()])

            class Step2Form(MultiStepForm):
                """第二步表单"""
                form_name = 'multistep_step2'

                phone = StringField('电话', validators=[DataRequired()])
                address = StringField('地址', validators=[DataRequired()])

            @app.route('/multistep/<int:step>', methods=['GET', 'POST'])
            def multistep_form(step):
                """多步表单处理"""
                if step == 1:
                    form = Step1Form(step=step)
                    template = 'multistep/step1.html'
                elif step == 2:
                    form = Step2Form(step=step)
                    template = 'multistep/step2.html'
                else:
                    return redirect(url_for('index'))

                if form.validate_on_submit():
                    # 保存步骤数据到session
                    if 'multistep_data' not in session:
                        session['multistep_data'] = {}

                    session['multistep_data'][f'step{step}'] = form.data

                    if step == 1:
                        return redirect(url_for('multistep_form', step=2))
                    else:
                        # 完成多步表单
                        return redirect(url_for('form_success'))

                return render_template(template, form=form)

            # 安全检查端点
            @app.route('/security/check')
            def security_check():
                """安全检查端点"""
                return jsonify({
                    'csrf_enabled': app.config.get('WTF_CSRF_ENABLED', False),
                    'session_csrf_token': session.get('csrf_token'),
                    'cookie_csrf_token': request.cookies.get('csrf_token'),
                    'form_ids_count': len(session.get('form_ids', {})),
                    'request_method': request.method,
                    'headers_protection': {
                        'x_frame_options': response.headers.get('X-Frame-Options'),
                        'x_content_type_options': response.headers.get('X-Content-Type-Options'),
                        'x_xss_protection': response.headers.get('X-XSS-Protection')
                    }
                })

            # 清理过期数据的定时任务
            @app.before_request
            def cleanup_expired_data():
                """清理过期的表单ID和CSRF令牌"""
                current_time = time.time()

                # 清理过期的表单ID
                if 'form_ids' in session:
                    expired_form_ids = []
                    for form_id, form_info in session['form_ids'].items():
                        if current_time - form_info['timestamp'] > 3600:  # 1小时
                            expired_form_ids.append(form_id)

                    for form_id in expired_form_ids:
                        del session['form_ids'][form_id]

                # 清理过期的频率限制记录
                for key in list(session.keys()):
                    if key.startswith('rate_limit_'):
                        attempts = session[key]
                        attempts[:] = [attempt for attempt in attempts
                                       if current_time - attempt < 300]  # 5分钟
                        if not attempts:
                            del session[key]

            if __name__ == '__main__':
                app.run(debug=True)

7 功能扩展

7.1 Flask-SQLAlchemy

01.模型,有2种定义方式
    a.方式1
        import datetime
        from applications.extensions import db


        class Role(db.Model):
            __tablename__ = 'admin_role'
            id = db.Column(db.Integer, primary_key=True, comment='角色ID')
            name = db.Column(db.String(255), comment='角色名称')
            code = db.Column(db.String(255), comment='角色标识')
            enable = db.Column(db.Integer, comment='是否启用')
            remark = db.Column(db.String(255), comment='备注')
            details = db.Column(db.String(255), comment='详情')
            sort = db.Column(db.Integer, comment='排序')
            create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
            update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
            power = db.relationship('Power', secondary="admin_role_power", backref=db.backref('role'))
    b.方式2
        from applications.extensions import db

        # 创建中间表
        role_power = db.Table(
            "admin_role_power",  # 中间表名称
            db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'),  # 主键
            db.Column("power_id", db.Integer, db.ForeignKey("admin_power.id"), comment='用户编号'),  # 属性 外键
            db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'),  # 属性 外键
        )

02.Schema,有2种定义方式
    a.方式1
        # 定义User模型,表示用户表
        class User(db.Model):
          __tablename__ = 'users'  # 指定表名
          id = db.Column(db.Integer, primary_key=True)  # 主键
          username = db.Column(db.String(80), unique=True,
                               nullable=False)  # 用户名字段,唯一且不为空
          email = db.Column(db.String(120), unique=True, nullable=False)  # 邮箱字段,唯一且不为空
          password = db.Column(db.String(128), nullable=False)  # 密码字段,不为空
          created_at = db.Column(db.DateTime,
                                 default=db.func.current_timestamp())  # 创建时间,默认当前时间
          updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(),
                                 onupdate=db.func.current_timestamp())  # 更新时间,默认当前时间,在更新时自动更新

          # 定义一对多关系,用户可以有多篇文章
          posts = db.relationship('Post', backref='author', lazy=True)

          # 定义对象的官方字符串表示,便于调试和日志记录
          def __repr__(self):
            return f'<User {self.username}>'
    b.方式2
        # 定义Post模型,表示帖子表
        class Post(db.Model):
          __tablename__ = 'posts'  # 指定表名
          id = db.Column(db.Integer, primary_key=True)  # 主键
          title = db.Column(db.String(200), nullable=False)  # 标题字段,不为空
          content = db.Column(db.Text, nullable=False)  # 内容字段,不为空
          author_id = db.Column(db.Integer, db.ForeignKey('users.id'),
                                nullable=False)  # 定义外键,引用users表的id字段
          created_at = db.Column(db.DateTime,
                                 default=db.func.current_timestamp())  # 创建时间,默认当前时间
          updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(),
                                 onupdate=db.func.current_timestamp())  # 更新时间,默认当前时间,在更新时自动更新

          # 定义对象的官方字符串表示,便于调试和日志记录
          def __repr__(self):
            return f'<Post {self.title}>'

7.2 Flask-Migrate

01.常用信息1
    a.介绍
        Flask-Migrate 中的这些步骤确实主要用于管理数据库的结构变更,包括创建新表、修改表结构等操作。具体来说:
        init():初始化迁移环境,会在项目中创建一个migrations目录,用于存储迁移脚本和其他相关信息。
        migrate():根据模型类的变化生成迁移脚本,这些脚本描述了如何从当前数据库状态迁移到下一个状态。
        upgrade():执行数据库迁移,将生成的迁移脚本应用到数据库中,包括创建新表、修改表结构等操作。
        这些步骤确实是针对数据库结构的变更,如果数据库中已经存在这些表,则会按照脚本中定义的操作进行更新或者修改。但是,这些步骤本身并不会添加任何数据到数据库中。
    b.注意事项
        如果需要在迁移过程中添加初始数据,像之前提到的那样,你需要在迁移脚本中自行编写代码来添加数据,使用 db.session.add() 和 db.session.commit() 方法将数据写入数据库。
        因此,Flask-Migrate 主要负责管理数据库结构的变更,而对于数据的添加和初始化,需要额外编写代码来完成。

7.3 Flask-WTF

01.常用信息1
    a.介绍
        Flask-WTF 是一个 Flask 扩展,用于处理 Web 表单。
        它基于 WTForms 库,简化了在 Flask 应用程序中创建和处理表单的过程。
    b.主要特点和功能包括
        表单类的定义: 可以通过继承 FlaskForm 类来定义表单,使用 WTForms 提供的各种字段和验证器,例如文本字段 (StringField)、整数字段 (IntegerField)、密码字段 (PasswordField) 等,以及各种验证器来验证用户输入。
        CSRF 保护: 默认情况下,Flask-WTF 自动为表单添加 CSRF 保护,以防止跨站请求伪造攻击。
        表单渲染: 可以很方便地在 Flask 应用中渲染和处理表单,通过模板引擎(如 Jinja2)将表单对象传递到模板中,以便在 HTML 页面中显示和处理用户输入。
        表单验证: 提供了强大的数据验证功能,可以在表单提交前对用户输入进行验证,确保输入的数据符合预期的格式和规则。
        文件上传: 支持处理文件上传,通过 FileField 字段可以处理文件的上传和保存。
        集成性: 可以与 Flask 的其他扩展和功能无缝集成,例如 Flask-SQLAlchemy、Flask-Migrate 等,使得在复杂的应用中管理和处理表单变得更加简单和高效。
        总体来说,Flask-WTF 提供了一个快速、安全且易于使用的方法来处理 Web 应用程序中的表单,是开发 Flask 网站时的重要工具之一。

02.常用信息2
    a.示例
        # 导入必要的模块
        from flask import Flask, render_template, redirect, url_for
        from flask_wtf import FlaskForm
        from wtforms import StringField, SubmitField
        from wtforms.validators import DataRequired

        # 创建Flask应用程序
        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'your_secret_key_here'

        # 创建一个简单的表单类
        class MyForm(FlaskForm):
            name = StringField('Name', validators=[DataRequired()])
            submit = SubmitField('Submit')

        # 定义路由和视图函数
        @app.route('/', methods=['GET', 'POST'])
        def index():
            form = MyForm()
            if form.validate_on_submit():
                name = form.name.data
                return f'Hello, {name}! Form submitted successfully.'
            return render_template('index.html', form=form)

        # 主函数
        if __name__ == '__main__':
            app.run(debug=True)
    b.说明
        FlaskForm 是从Flask-WTF中导入的基类,用于创建表单。
        StringField 和 SubmitField 是从 wtforms 中导入的字段类,用于分别创建文本输入字段和提交按钮。
        DataRequired 是从 wtforms.validators 中导入的验证器,用于确保字段中有数据。
        MyForm 类定义了一个表单,其中 name 是一个必填的文本输入字段,submit 是一个提交按钮。
        index 视图函数处理根路由 / 的 GET 和 POST 请求。当表单通过验证提交时,会显示提交成功的消息。
        app.run(debug=True) 启动应用程序,debug=True 启用调试模式。

7.4 Flask-Login

01.常用信息1
    @login_required 装饰器用于限制只有登录用户才能访问的视图。
    使用:定义一个用户模型,通常需要继承 UserMixin,并实现 get_id() 方法和其他必要的方法
    登录:login_user(user, remember=remember)
    登出:logout_user()

7.5 Flask-Mail

01.常用信息1
    用于在 Flask 应用程序中发送电子邮件。它简化了通过 SMTP 协议发送邮件的过程,
    支持常见的邮件功能和配置选项,如安全连接、认证、附件等。

7.6 Flask-RESTful

01.常用信息1
    a.简化的路由定义
        Flask-RESTful 提供了 Resource 类,使得定义 API 资源变得简单明了。
        你可以将不同的资源(如用户、书籍、订单等)定义为继承自 Resource 的类,
        并为其定义 HTTP 方法(如 GET、POST、PUT、DELETE 等)来处理请求。
    b.自动化的输入和输出序列化
        Flask-RESTful 提供了内置的序列化和反序列化功能,
        可以方便地将请求数据转换为 Python 对象,并将 Python 对象转换为 JSON 格式的响应数据。
        这简化了数据的处理过程,减少了重复的代码。
    c.请求参数解析
        Flask-RESTful 内置了请求参数解析器,可以轻松地从请求中获取参数,并进行验证和转换。
        这使得处理各种类型的请求参数变得简单和可靠。
    d.错误处理
        Flask-RESTful 提供了统一的错误处理机制,可以自定义错误响应和处理逻辑。
        这使得在 API 开发过程中能够更好地控制和处理各种异常情况。
    e.插件扩展支持
        Flask-RESTful 可以与 Flask 的众多扩展库无缝集成,
        如 Flask-SQLAlchemy(用于数据库操作)、Flask-JWT(用于身份验证和授权)、Flask-Cache 等,
        使得开发和扩展 API 功能更加灵活和强大。
    f.RESTful 规范支持
        Flask-RESTful 遵循 RESTful API 设计的最佳实践,
        包括使用 HTTP 方法来表示资源的操作(GET 用于获取资源,POST 用于创建资源,
        PUT 用于更新资源,DELETE 用于删除资源等),使得 API 设计更加符合标准和规范。

02.常用信息2
    a.代码
        from flask import Flask, jsonify
        from flask_restful import Api, Resource

        # 创建 Flask 应用程序
        app = Flask(__name__)
        api = Api(app)

        # 创建一个简单的数据集
        books = [
            {'id': 1, 'title': 'Python Programming', 'author': 'Guido van Rossum'},
            {'id': 2, 'title': 'Flask Essentials', 'author': 'Randall Degges'}
        ]

        # 创建一个继承自 Resource 的类来定义资源
        class BookList(Resource):
            def get(self):
                # 返回所有书籍
                return jsonify(books)

        class Book(Resource):
            def get(self, book_id):
                # 返回特定 ID 的书籍
                book = next(filter(lambda x: x['id'] == book_id, books), None)
                return jsonify(book)

        # 添加资源到 API 中,并定义访问路径
        api.add_resource(BookList, '/books')
        api.add_resource(Book, '/book/<int:book_id>')

        # 定义主函数用于运行应用程序
        def main():
            app.run(debug=True)

        # 程序入口点,运行主函数
        if __name__ == '__main__':
            main()

7.7 Flask-JWT

01.常用信息1
    a.简化的身份验证机制
        Flask-JWT 提供了简单的接口,帮助开发者实现基于 JWT 的身份验证机制。
        开发者可以通过少量的代码,轻松地将 JWT 整合到他们的 Flask 应用中。
    b.无状态的认证
        JWT 能够在请求和响应之间传递用户信息,因此不需要在服务器端存储用户的认证状态。
        这样的无状态特性使得 JWT 非常适合用于分布式和跨域环境。
    c.安全性
        JWT 使用了基于加密的签名机制来保证数据的完整性和安全性。
        通过设置密钥(Secret Key),可以有效地防止 JWT 被篡改或伪造。
    d.灵活的自定义配置
        开发者可以根据自己的需求,自定义 JWT 的过期时间、加密算法以及其他参数。
        这种灵活性使得 JWT 可以适应各种不同的安全需求。
    e.与 Flask 框架的无缝集成
        Flask-JWT 与 Flask 框架天然集成,可以与 Flask 的路由和中间件无缝配合,
        方便地实现对 API 端点的身份验证和访问控制。

02.常用信息2
    a.示例
        from flask import Flask, jsonify
        from flask_jwt import JWT, jwt_required, current_identity


        # 用户数据模型
        class User(object):
          def __init__(self, id, username, password):
            self.id = id
            self.username = username
            self.password = password


        # 用户列表
        users = [
          User(1, 'user1', 'password1'),
          User(2, 'user2', 'password2')
        ]


        # 根据用户名查找用户
        def authenticate(username, password):
          user = next(
            filter(lambda u: u.username == username and u.password == password, users),
            None)
          if user:
            return user


        # 根据用户 ID 查找用户
        def identity(payload):
          user_id = payload['identity']
          return next(filter(lambda u: u.id == user_id, users), None)


        # 创建 Flask 应用程序
        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'super-secret'

        # 创建 JWT 对象
        jwt = JWT(app, authenticate, identity)


        # 受保护的资源,需要验证才能访问
        @app.route('/protected', methods=['GET'])
        @jwt_required()
        def protected():
          return jsonify(id=current_identity.id,
                         username=current_identity.username), 200


        # 定义主函数用于运行应用程序
        if __name__ == '__main__':
          app.run(debug=True)
    b.说明
        导入必要的模块 Flask、Flask-JWT 和 werkzeug.security。
        创建一个简单的 User 类来模拟用户数据,包含 id、username 和 password 属性。
        创建一个用户列表 users,存储两个示例用户。
        定义 authenticate 函数,用于验证用户名和密码是否匹配,返回用户对象。
        定义 identity 函数,根据 JWT 负载中的用户 ID 查找并返回对应的用户对象。
        创建 Flask 应用 app,设置 SECRET_KEY 以用于加密 JWT。
        创建 JWT 对象 jwt,传入 app、authenticate 和 identity 函数,用于处理身份验证和授权。
        定义受保护的路由 /protected,使用 @jwt_required() 装饰器标记,表示该资源需要进行 JWT 验证才能访问。
        在 /protected 路由中,通过 current_identity 获取当前用户的信息,并返回用户的 id 和 username。
        在程序入口处,通过 if __name__ == '__main__': 判断,如果直接运行此文件,则调用 app.run() 启动应用。

7.8 Flask-JWT-Extended

01.常用信息1
    a.确保安装了 Flask 和 Flask-JWT-Extended 库。可以使用 pip 安装:
        pip install Flask Flask-JWT-Extended
    b.配置应用
        在 Flask 应用中配置 JWT 扩展。例如:

        from flask import Flask
        from flask_jwt_extended import JWTManager

        app = Flask(__name__)

        # 设置秘钥,用于签名 JWT
        app.config['JWT_SECRET_KEY'] = 'your-secret-key'
        jwt = JWTManager(app)
    c.定义认证逻辑
        创建认证逻辑,例如登录视图函数,用于生成 JWT。

        from flask import jsonify, request
        from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity

        @app.route('/login', methods=['POST'])
        def login():
            username = request.json.get('username', None)
            password = request.json.get('password', None)
            if username != 'user' or password != 'password':
                return jsonify({"msg": "Bad username or password"}), 401

            access_token = create_access_token(identity=username)
            return jsonify(access_token=access_token), 200
    d.保护资源
        使用 jwt_required 装饰器来保护需要认证的资源。

        @app.route('/protected', methods=['GET'])
        @jwt_required()
        def protected():
            current_user = get_jwt_identity()
            return jsonify(logged_in_as=current_user), 200
    e.处理权限
        如果需要更精细的权限控制,可以使用 @jwt_required 装饰器结合 get_jwt_claims 来检查用户的权限声明。
        这个例子中,要求 JWT 的声明中包含一个 role 字段,并且其值为 admin 才能访问。

        @app.route('/admin', methods=['GET'])
        @jwt_required()
        def admin():
            current_user = get_jwt_identity()
            claims = get_jwt_claims()
            if claims['role'] != 'admin':
                return jsonify(msg='Admins only!'), 403
            return jsonify(admin_resource='secret'), 200

02.常用信息2
    a.create_access_token(identity)
        create_access_token 函数用于生成 JWT 访问令牌,基于提供的身份信息。
        参数:identity:表示用户的标识信息,通常是用户名或用户 ID。
        返回值:返回一个字符串,即生成的 JWT 访问令牌。
        -----------------------------------------------------------------------------------------------------
        from flask_jwt_extended import create_access_token
        # 假设用户登录成功后,生成 JWT 访问令牌
        username = 'user'
        access_token = create_access_token(identity=username)
    b.jwt_required()
        jwt_required 是一个装饰器,用于保护需要 JWT 认证的路由,确保请求中包含有效的 JWT 访问令牌。
        -----------------------------------------------------------------------------------------------------
        from flask import jsonify
        from flask_jwt_extended import jwt_required, get_jwt_identity

        # 受保护的路由,需要 JWT 认证
        @app.route('/protected', methods=['GET'])
        @jwt_required()
        def protected():
            # 获取 JWT 中包含的身份信息
            current_user = get_jwt_identity()
            return jsonify(logged_in_as=current_user), 200
    c.get_jwt_identity()
        get_jwt_identity 函数用于从当前请求的 JWT 访问令牌中获取身份信息。
        返回值:返回一个字符串,即 JWT 中包含的身份信息(例如用户名或用户 ID)。
        -----------------------------------------------------------------------------------------------------
        from flask import jsonify
        from flask_jwt_extended import jwt_required, get_jwt_identity

        # 受保护的路由,需要 JWT 认证
        @app.route('/protected', methods=['GET'])
        @jwt_required()
        def protected():
            # 获取 JWT 中包含的身份信息
            current_user = get_jwt_identity()
            return jsonify(logged_in_as=current_user), 200
    d.总结
        除了上述介绍的核心功能外,Flask-JWT-Extended 还提供了其他有用的功能和装饰器,例如:
            get_raw_jwt():获取原始的 JWT 数据。
            create_refresh_token(identity):生成 JWT 刷新令牌。
            jwt_refresh_token_required():保护需要刷新令牌的路由。
            get_jwt_claims():获取 JWT 中的声明信息。
            jwt_optional():标记路由为可选 JWT 认证,即可以提供或不提供有效 JWT 访问令牌。

7.9 Flask-Security

01.常用信息1
    a.代码
        from flask import Flask
        from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, \
          RoleMixin, login_required
        from flask_sqlalchemy import SQLAlchemy

        # 创建 Flask 应用
        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'super-secret'  # 应用的密钥
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///demo08.db'  # SQLite 数据库 URI
        app.config['SECURITY_PASSWORD_SALT'] = 'salt'  # 密码盐值

        # 创建 SQLAlchemy 实例
        db = SQLAlchemy(app)

        # 用户-角色关联表
        roles_users = db.Table('roles_users',
                               db.Column('user_id', db.Integer(),
                                         db.ForeignKey('user.id')),
                               db.Column('role_id', db.Integer(),
                                         db.ForeignKey('role.id'))
                               )


        # 角色模型
        class Role(db.Model, RoleMixin):
          id = db.Column(db.Integer(), primary_key=True)
          name = db.Column(db.String(80), unique=True)


        # 用户模型
        class User(db.Model, UserMixin):
          id = db.Column(db.Integer, primary_key=True)
          username = db.Column(db.String(255), unique=True)
          password = db.Column(db.String(255))
          active = db.Column(db.Boolean())
          roles = db.relationship('Role', secondary=roles_users,
                                  backref=db.backref('users', lazy='dynamic'))


        # Flask-Security 需要的用户数据存储对象
        user_datastore = SQLAlchemyUserDatastore(db, User, Role)

        # 创建 Security 实例
        security = Security(app, user_datastore)


        # 创建数据库表结构
        def create_db():
          db.create_all()


        # 保护的路由,需要登录才能访问
        @app.route('/protected')
        @login_required
        def protected_route():
          return 'This is a protected route!'


        # 主函数,用于运行 Flask 应用
        def main():
          create_db()  # 创建数据库表结构
          app.run(debug=True)


        if __name__ == '__main__':
          main()
    b.说明
        导入了 Flask 相关模块和 Flask-Security 扩展。
        创建了 Flask 应用 app,并配置了应用的 SECRET_KEY、数据库 URI 和密码盐值。
        使用 SQLAlchemy 创建了数据库实例 db。
        定义了角色模型 Role 和用户模型 User,并创建了用户-角色关联表 roles_users。
        创建了 SQLAlchemyUserDatastore 对象 user_datastore,用于处理用户和角色的数据存储。
        初始化了 Security 实例,并将 app 和 user_datastore 传递进去。
        定义了保护的路由 /protected,使用 @login_required 装饰器确保只有登录用户才能访问。
        编写了 create_db() 函数,用于创建数据库表结构。
        在 main() 函数中调用 create_db() 函数创建数据库表,并通过 app.run() 启动 Flask 应用。

7.10 Flask-Uploads

01.常用信息1
    a.代码
        from flask import Flask, request, render_template
        from flask_uploads import UploadSet, configure_uploads, IMAGES

        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'super-secret'  # 应用的密钥

        # 配置文件上传目录和允许的文件类型
        photos = UploadSet('photos', IMAGES)
        app.config['UPLOADED_PHOTOS_DEST'] = 'uploads'  # 文件上传目录
        configure_uploads(app, photos)  # 配置上传集合


        # 文件上传路由和视图函数
        @app.route('/upload', methods=['GET', 'POST'])
        def upload_file():
          if request.method == 'POST' and 'photo' in request.files:
            filename = photos.save(request.files['photo'])
            return f'File {filename} uploaded successfully!'
          return render_template('upload.html')


        # 主函数,用于运行 Flask 应用
        def main():
          app.run(debug=True)


        if __name__ == '__main__':
          main()
    b.说明
        导入 Flask 相关模块和 Flask-Uploads 扩展。
        创建 Flask 应用 app,设置应用的密钥和文件上传配置。配置了一个名为 photos 的上传集合,限制为图片类型 (IMAGES)。
        定义了 /upload 路由,用于处理文件上传。在 POST 方法中,通过 photos.save() 方法保存上传的文件,并返回成功上传的消息。
        创建了一个简单的 HTML 模板 upload.html,包含一个文件上传表单。
        定义了 main() 函数用于运行 Flask 应用,通过 app.run() 启动应用。

7.11 Flask-Session

01.常用信息1
    a.代码
        from flask import Flask, session
        from flask_session import Session

        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'super-secret-key'  # 设置应用的密钥

        # 配置 Flask-Session
        app.config['SESSION_TYPE'] = 'filesystem'  # 选择会话存储方式为文件系统
        Session(app)


        # 定义一个简单的路由,用于设置和获取会话数据
        @app.route('/set_session')
        def set_session():
          """
          设置会话数据。
          """
          session['username'] = 'user@example.com'
          return 'Session is set!'


        @app.route('/get_session')
        def get_session():
          """
          获取会话数据。
          """
          if 'username' in session:
            return f'Logged in as {session["username"]}'
          return 'Session not set'


        # 主函数,用于运行 Flask 应用
        def main():
          """
          主函数,用于运行 Flask 应用。
          """
          app.run(debug=True)


        if __name__ == '__main__':
          main()
    b.说明
        Flask:用于创建 Flask 应用。
        session:用于访问会话对象,存储和获取会话数据。
        redirect, url_for:用于重定向和 URL 构建。
        Session:Flask-Session 扩展,用于管理 Flask 中的会话。

        Flask(__name__):创建 Flask 应用对象。
        app.config['SECRET_KEY']:设置应用的密钥,用于会话加密和安全性。

        app.config['SESSION_TYPE']:设置会话存储方式为文件系统,可选的还有 'redis', 'mongodb', 'sqlalchemy' 等。
        Session(app):初始化 Flask-Session 扩展,将会话配置应用到 Flask 中。

        /set_session 路由:设置会话数据 session['username']。
        /get_session 路由:获取并显示会话数据 session['username']。

7.12 Flask-CORS

01.常用信息1
    a.代码
        from flask import Flask, jsonify
        from flask_cors import CORS

        app = Flask(__name__)
        app.config['SECRET_KEY'] = 'super-secret'  # 设置应用的密钥

        # 启用 CORS 支持,允许所有来源访问
        CORS(app)

        # 定义一个简单的路由,返回JSON数据
        @app.route('/api/data', methods=['GET'])
        def get_data():
            data = {'message': 'Hello, CORS!'}
            return jsonify(data)

        # 主函数,用于运行 Flask 应用
        def main():
            """
            主函数,用于运行 Flask 应用。
            """
            app.run(debug=True)

        if __name__ == '__main__':
            main()
    b.说明
        使用 CORS(app) 启用 CORS 支持,并允许所有来源访问。
        可以根据需求进行更精细的配置,如设置具体的来源或允许的 HTTP 方法等。

8 相关API

8.1 处理参数

01.请求参数
    a.路径参数 (Path Parameters)
        a.定义
            路径参数是 URL 路径的一部分。例如,/items/{item_id} 中的 item_id 就是一个路径参数。
        b.使用方法
            使用 Path 类来定义路径参数并可以添加描述。
            from fastapi import Path

            @app.get("/items/{item_id}")
            async def read_item(item_id: int = Path(..., description="The unique ID of the item")):
                return {"item_id": item_id}
        c.注意事项
            item_id: int 是强制类型申明,会强制类型转化,如果转化错误,会校验错误。
    b.查询参数 (Query Parameters)
        a.定义
            查询参数出现在 URL 的 ? 后面,通常用于过滤、排序等。可以是可选的。
        b.使用方法
            from fastapi import Query
            @app.get("/items/")
            async def read_items(q: str = Query(None, description="Search query")):
                return {"q": q}
    c.请求体 (Request Body)
        a.定义
            请求体用于 POST、PUT 和 PATCH 请求,通常用来发送数据(如 JSON、XML 等)。
        b.使用方法
            使用 Pydantic 模型 来定义请求体的格式,并可以为字段添加描述。
            from pydantic import BaseModel
            from fastapi import Body
            from typing import Union, Optional

            class Item(BaseModel):
                name: str
                description: str
                birth: Union[date, None] = None
                desc: Optional[str] = None

            @app.post("/items/")
            async def create_item(item: Item = Body(..., description="The item to create")):
                return {"name": item.name, "description": item.description}
        c.注意事项
            请求体常用于提交较大或复杂的数据。
    d.表单参数 (Form Parameters)
        a.定义
            表单参数通常用于 POST 请求中的表单数据提交。
        b.使用方法
            from fastapi import Form
            @app.post("/submit/")
            async def submit_form(name: str = Form(...), age: int = Form(...)):
                return {"name": name, "age": age}
    e.文件上传 (File Uploads)
        a.定义
            FastAPI 支持文件上传,允许通过表单字段上传文件。
        b.使用方法
            from fastapi import File, UploadFile

            @app.post("/upload/")
            async def upload_file(file: UploadFile = File(...)):
                return {"filename": file.filename}
    f.Cookie 参数 (Cookie Parameters)
        a.定义
            如果你需要从请求的 cookies 中获取数据,可以使用 Cookie 类。
        b.使用方法
            from fastapi import Cookie
            @app.get("/items/")
            async def get_items(cookie_id: str = Cookie(None)):
                return {"cookie_id": cookie_id}
    g.头部参数 (Header Parameters)
        a.定义
            如果你需要从请求的头部获取数据,可以使用 Header 类。
        b.使用方法
            from fastapi import Header
            @app.get("/items/")
            async def get_items(user_agent: str = Header(None)):
                return {"user_agent": user_agent}
    h.Request参数 (Request参数 Parameters)
        a.定义
            如果你需要从Request参数获取数据,可以使用 Request 类。
        b.使用方法
            from fastapi import Request
            @app.get("/items/")
            async def get_items(request: Request):
                return {"url": request.url}

8.2 示例工程

01.工程目录
    ├── api_router_demo    项目名称
    ├── handlers           路由处理模块
    │   ├── __init__.py
    │   ├── book.py
    │   ├── movie.py
    │   └── user.py
    ├── routers            路由模块
    │   ├── __init__.py
    │   ├── book.py
    │   ├── movie.py
    │   └── user.py
    └── server.py          应用服务模块

02.代码示例
    a.应用主入口
        #!/usr/bin/python3
        # -*- coding: utf-8 -*-
        # @Author: Hui
        # @File: server.py
        # @Desc: { 应用服务模块 }
        # @Date: 2024/06/28 11:35
        import uvicorn
        from fastapi import FastAPI
        from contextlib import asynccontextmanager
        from routers import api_router


        @asynccontextmanager
        async def lifespan(app: FastAPI):
            await startup()
            yield
            await shutdown()


        app = FastAPI(lifespan=lifespan, description="APIRouter模块路由Demo")
        # app = FastAPI(lifespan=lifespan, routes=api_router.routes, description="APIRouter模块路由Demo")


        async def startup():
            # 初始化路由
            app.include_router(api_router)

            # 初始化资源...


        async def shutdown():
            print("释放资源")
            print("Shutting down...")


        def main():
            uvicorn.run(app)


        if __name__ == '__main__':
            main()
    b.路由模块
        a.用户模块路由
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: user.py
            # @Desc: { 用户模块路由 }
            # @Date: 2024/06/28 11:47
            from fastapi import APIRouter
            from handlers import UserHandler

            user_router = APIRouter()

            user_router.add_api_route(
                "/api/v1/users/register", UserHandler.register, methods=["POST"], summary="用户注册"
            )
            user_router.add_api_route(
                "/api/v1/users/login", UserHandler.login, methods=["POST"], summary="用户登陆"
            )
            user_router.add_api_route(
                "/api/v1/users", UserHandler.get_users, methods=["GET"], summary="获取用户列表"
            )
            user_router.add_api_route(
                "/api/v1/users/{user_id}", UserHandler.get_user_detail, methods=["GET"], summary="用户详情"
            )
        b.图书模块路由
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: book.py
            # @Desc: { 书籍模块路由 }
            # @Date: 2024/06/28 11:48
            from fastapi import APIRouter
            from handlers import BookHandler

            book_router = APIRouter()

            book_router.add_api_route(
                "/api/v1/books", BookHandler.get_books, methods=["GET"], summary="获取图书列表"
            )
            book_router.add_api_route(
                "/api/v1/books/{book_id}", BookHandler.get_book_detail, methods=["GET"], summary="图书详情"
            )
        c.电影模块路由
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: movie.py
            # @Desc: { 电影模块路由 }
            # @Date: 2024/06/28 11:48
            from fastapi import APIRouter
            from handlers import MovieHandler

            movie_router = APIRouter()

            movie_router.add_api_route(
                "/api/v1/movies", MovieHandler.get_movies, methods=["GET"], summary="获取电影列表"
            )
            movie_router.add_api_route(
                "/api/v1/movies/{movie_id}", MovieHandler.get_movie_detail, methods=["GET"], summary="电影详情"
            )
        d.__init__模块
            不同模块各自组织路由,就是通过 APIRouter 的 add_api_route 方法来添加路由信息,常用参数如下
            path 路由路径
            endpoint 对应路由处理函数
            methods 路由请求方法列表
            response_model 响应数据模型(pydantic的model)
            summary 路由备注
            -------------------------------------------------------------------------------------------------
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: __init__.py.py
            # @Desc: { 项目路由初始化模块 }
            # @Date: 2024/06/28 11:47
            from fastapi import APIRouter
            from .book import book_router
            from .user import user_router
            from .movie import movie_router

            api_router = APIRouter()

            api_router.include_router(user_router, tags=["用户模块"])
            api_router.include_router(book_router, tags=["图书模块"])
            api_router.include_router(movie_router, tags=["电影模块"])
    c.路由处理模块
        a.图书模块handler
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: book.py
            # @Desc: { 图书模块handler }
            # @Date: 2024/06/28 11:58

            class BookHandler:
                @classmethod
                async def get_books(cls, book_name: str):
                    """获取图书列表"""
                    # 参数校验
                    # 调用业务层处理
                    # 响应出参
                    return "获取图书列表"

                @classmethod
                async def get_book_detail(cls, book_id: int):
                    return "获取图书详情"
        b.电影模块handler
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: movie.py
            # @Desc: { 电影模块handler }
            # @Date: 2024/06/28 11:58


            class MovieHandler:
                @classmethod
                async def get_movies(cls, movie_name: str, movie_type: str):
                    """获取电影列表"""
                    # 参数校验
                    # 调用业务层处理
                    # 响应出参
                    return "获取电影列表"

                @classmethod
                async def get_movie_detail(cls, movie_id: int):
                    return "获取电影详情"
        c.用户模块handler
            #!/usr/bin/python3
            # -*- coding: utf-8 -*-
            # @Author: Hui
            # @File: user.py
            # @Desc: { 用户模块handler }
            # @Date: 2024/06/28 11:58


            class UserHandler:

                @classmethod
                async def register(cls, username: str, password: str):
                    return "用户注册"

                @classmethod
                async def login(cls, username: str, password: str):
                    return "用户登录"

                @classmethod
                async def get_user_detail(cls, user_id: int):
                    return "获取用户详情"

                @classmethod
                async def get_users(cls, username: str):
                    """获取用户列表"""
                    # 参数校验
                    # 调用业务层处理
                    # 响应出参
                    return "获取用户列表"
    d.路由API展示
        直接访问 http://127.0.0.1:8000/docs#/ 就可以查看路由接口文档

'+_e+"");let bn=$e?$e.createHTML(_e):_e;if(Ul===Qi)try{at=new U().parseFromString(bn,ih)}catch{}if(!at||!at.documentElement){at=qe.createDocument(Ul,"template",null);try{at.documentElement.innerHTML=_f?Ce:bn}catch{}}let ka=at.body||at.documentElement;return _e&&It&&ka.insertBefore(Oe.createTextNode(It),ka.childNodes[0]||null),Ul===Qi?ft.call(at,yn?"html":"body")[0]:yn?at.documentElement:ka},QO=function(_e){return lt.call(_e.ownerDocument||_e,_e,de.SHOW_ELEMENT|de.SHOW_COMMENT|de.SHOW_TEXT|de.SHOW_PROCESSING_INSTRUCTION|de.SHOW_CDATA_SECTION,null)},JO=function(_e){return _e instanceof he&&(typeof _e.nodeName!="string"||typeof _e.textContent!="string"||typeof _e.removeChild!="function"||!(_e.attributes instanceof ie)||typeof _e.removeAttribute!="function"||typeof _e.setAttribute!="function"||typeof _e.namespaceURI!="string"||typeof _e.insertBefore!="function"||typeof _e.hasChildNodes!="function")},eP=function(_e){return typeof xe=="function"&&_e instanceof xe},Yc=function(_e,at,It){st[_e]&&h(st[_e],bn=>{bn.call(Ee,at,It,bi)})},tP=function(_e){let at=null;if(Yc("beforeSanitizeElements",_e,null),JO(_e))return Wl(_e),!0;let It=xn(_e.nodeName);if(Yc("uponSanitizeElement",_e,{tagName:It,allowedTags:tt}),_e.hasChildNodes()&&!eP(_e.firstElementChild)&&_(/<[/\w]/g,_e.innerHTML)&&_(/<[/\w]/g,_e.textContent)||_e.nodeType===ue.progressingInstruction||Fa&&_e.nodeType===ue.comment&&_(/<[/\w]/g,_e.data))return Wl(_e),!0;if(!tt[It]||en[It]){if(!en[It]&&nP(It)&&(Jt.tagNameCheck instanceof RegExp&&_(Jt.tagNameCheck,It)||Jt.tagNameCheck instanceof Function&&Jt.tagNameCheck(It)))return!1;if(yt&&!me[It]){let bn=ge(_e)||_e.parentNode,ka=Fe(_e)||_e.childNodes;if(ka&&bn){let ea=ka.length;for(let ls=ea-1;ls>=0;--ls){let Hl=ye(ka[ls],!0);Hl.__removalCount=(_e.__removalCount||0)+1,bn.insertBefore(Hl,Ge(_e))}}}return Wl(_e),!0}return _e instanceof q&&!$a(_e)||(It==="noscript"||It==="noembed"||It==="noframes")&&_(/<\/no(script|embed|frames)/i,_e.innerHTML)?(Wl(_e),!0):(xi&&_e.nodeType===ue.text&&(at=_e.textContent,h([Ue,Ke,it],bn=>{at=y(at,bn," ")}),_e.textContent!==at&&(d(Ee.removed,{element:_e.cloneNode()}),_e.textContent=at)),Yc("afterSanitizeElements",_e,null),!1)},rP=function(_e,at,It){if(Rt&&(at==="id"||at==="name")&&(It in Oe||It in KO))return!1;if(!(cn&&!Cr[at]&&_(mt,at))){if(!(Kn&&_(Ht,at))){if(!ur[at]||Cr[at]){if(!(nP(_e)&&(Jt.tagNameCheck instanceof RegExp&&_(Jt.tagNameCheck,_e)||Jt.tagNameCheck instanceof Function&&Jt.tagNameCheck(_e))&&(Jt.attributeNameCheck instanceof RegExp&&_(Jt.attributeNameCheck,at)||Jt.attributeNameCheck instanceof Function&&Jt.attributeNameCheck(at))||at==="is"&&Jt.allowCustomizedBuiltInElements&&(Jt.tagNameCheck instanceof RegExp&&_(Jt.tagNameCheck,It)||Jt.tagNameCheck instanceof Function&&Jt.tagNameCheck(It))))return!1}else if(!m1[at]){if(!_(bt,y(It,et,""))){if(!((at==="src"||at==="xlink:href"||at==="href")&&_e!=="script"&&x(It,"data:")===0&&p1[_e])){if(!(Rn&&!_(ot,y(It,et,"")))){if(It)return!1}}}}}}return!0},nP=function(_e){return _e!=="annotation-xml"&&m(_e,ht)},iP=function(_e){Yc("beforeSanitizeAttributes",_e,null);let{attributes:at}=_e;if(!at)return;let It={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ur},bn=at.length;for(;bn--;){let ka=at[bn],{name:ea,namespaceURI:ls,value:Hl}=ka,b1=xn(ea),Ga=ea==="value"?Hl:b(Hl);if(It.attrName=b1,It.attrValue=Ga,It.keepAttr=!0,It.forceKeepAttr=void 0,Yc("uponSanitizeAttribute",_e,It),Ga=It.attrValue,Fa&&_(/((--!?|])>)|<\/(style|title)/i,Ga)){rb(ea,_e);continue}if(It.forceKeepAttr||(rb(ea,_e),!It.keepAttr))continue;if(!Vr&&_(/\/>/i,Ga)){rb(ea,_e);continue}xi&&h([Ue,Ke,it],sP=>{Ga=y(Ga,sP," ")});let aP=xn(_e.nodeName);if(rP(aP,b1,Ga)){if(wt&&(b1==="id"||b1==="name")&&(rb(ea,_e),Ga=He+Ga),$e&&typeof ke=="object"&&typeof ke.getAttributeType=="function"&&!ls)switch(ke.getAttributeType(aP,b1)){case"TrustedHTML":{Ga=$e.createHTML(Ga);break}case"TrustedScriptURL":{Ga=$e.createScriptURL(Ga);break}}try{ls?_e.setAttributeNS(ls,ea,Ga):_e.setAttribute(ea,Ga),JO(_e)?Wl(_e):f(Ee.removed)}catch{}}}Yc("afterSanitizeAttributes",_e,null)},Pme=function Gt(_e){let at=null,It=QO(_e);for(Yc("beforeSanitizeShadowDOM",_e,null);at=It.nextNode();)Yc("uponSanitizeShadowNode",at,null),!tP(at)&&(at.content instanceof Re&&Gt(at.content),iP(at));Yc("afterSanitizeShadowDOM",_e,null)};return Ee.sanitize=function(Gt){let _e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},at=null,It=null,bn=null,ka=null;if(_f=!Gt,_f&&(Gt=""),typeof Gt!="string"&&!eP(Gt))if(typeof Gt.toString=="function"){if(Gt=Gt.toString(),typeof Gt!="string")throw k("dirty is not a string, aborting")}else throw k("toString is not a function");if(!Ee.isSupported)return Gt;if(os||Vl(_e),Ee.removed=[],typeof Gt=="string"&&(fe=!1),fe){if(Gt.nodeName){let Hl=xn(Gt.nodeName);if(!tt[Hl]||en[Hl])throw k("root node is forbidden and cannot be sanitized in-place")}}else if(Gt instanceof xe)at=ZO(""),It=at.ownerDocument.importNode(Gt,!0),It.nodeType===ue.element&&It.nodeName==="BODY"||It.nodeName==="HTML"?at=It:at.appendChild(It);else{if(!Zi&&!xi&&!yn&&Gt.indexOf("<")===-1)return $e&&pt?$e.createHTML(Gt):Gt;if(at=ZO(Gt),!at)return Zi?null:pt?Ce:""}at&&fo&&Wl(at.firstChild);let ea=QO(fe?Gt:at);for(;bn=ea.nextNode();)tP(bn)||(bn.content instanceof Re&&Pme(bn.content),iP(bn));if(fe)return Gt;if(Zi){if($i)for(ka=xt.call(at.ownerDocument);at.firstChild;)ka.appendChild(at.firstChild);else ka=at;return(ur.shadowroot||ur.shadowrootmode)&&(ka=Ze.call(De,ka,!0)),ka}let ls=yn?at.outerHTML:at.innerHTML;return yn&&tt["!doctype"]&&at.ownerDocument&&at.ownerDocument.doctype&&at.ownerDocument.doctype.name&&_(Z,at.ownerDocument.doctype.name)&&(ls=" `+ls),xi&&h([Ue,Ke,it],Hl=>{ls=y(ls,Hl," ")}),$e&&pt?$e.createHTML(ls):ls},Ee.setConfig=function(){let Gt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Vl(Gt),os=!0},Ee.clearConfig=function(){bi=null,os=!1},Ee.isValidAttribute=function(Gt,_e,at){bi||Vl({});let It=xn(Gt),bn=xn(_e);return rP(It,bn,at)},Ee.addHook=function(Gt,_e){typeof _e=="function"&&(st[Gt]=st[Gt]||[],d(st[Gt],_e))},Ee.removeHook=function(Gt){if(st[Gt])return f(st[Gt])},Ee.removeHooks=function(Gt){st[Gt]&&(st[Gt]=[])},Ee.removeAllHooks=function(){st={}},Ee}var we=ae();return we})});var cF={};vr(cF,{default:()=>Qve});function h1e(t){return String(t).replace(u1e,e=>c1e[e])}function g1e(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function k1e(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function gB(t){for(var e=0;e=wb[e]&&t<=wb[e+1])return!0;return!1}function M1e(t,e){jl[t]=e}function dS(t,e,r){if(!jl[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=jl[e][n];if(!i&&t[0]in FP&&(n=FP[t[0]].charCodeAt(0),i=jl[e][n]),!i&&r==="text"&&gB(n)&&(i=jl[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function D1e(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!UE[e]){var r=UE[e]={cssEmPerMu:cb.quad[e]/18};for(var n in cb)cb.hasOwnProperty(n)&&(r[n]=cb[n][e])}return UE[e]}function GP(t){if(t instanceof hs)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function F1e(t){if(t instanceof Of)return t;throw new Error("Expected span but got "+String(t)+".")}function G(t,e,r,n,i,a){wn[t][i]={font:e,group:r,replace:n},a&&n&&(wn[t][n]=wn[t][i])}function vt(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,o={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},l=0;l0&&(a.push(mb(s,e)),s=[]),a.push(n[o]));s.length>0&&a.push(mb(s,e));var u;r?(u=mb(Ti(r,e,!0)),u.classes=["tag"],a.push(u)):i&&a.push(i);var h=eu(["katex-html"],a);if(h.setAttribute("aria-hidden","true"),u){var f=u.children[0];f.style.height=ut(h.height+h.depth),h.depth&&(f.style.verticalAlign=ut(-h.depth))}return h}function AB(t){return new Df(t)}function qP(t,e,r,n,i){var a=fs(t,r),s;a.length===1&&a[0]instanceof us&&qt.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new rt.MathNode("mrow",a);var o=new rt.MathNode("annotation",[new rt.TextNode(e)]);o.setAttribute("encoding","application/x-tex");var l=new rt.MathNode("semantics",[s,o]),u=new rt.MathNode("math",[l]);u.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&u.setAttribute("display","block");var h=i?"katex":"katex-mathml";return Be.makeSpan([h],[u])}function hr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function vS(t){var e=Ib(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function Ib(t){return t&&(t.type==="atom"||$1e.hasOwnProperty(t.type))?t:null}function NB(t,e){var r=Ti(t.body,e,!0);return mve([t.mclass],r,e)}function IB(t,e){var r,n=fs(t.body,e);return t.mclass==="minner"?r=new rt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new rt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new rt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function xve(t,e,r){var n=vve[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),o=r.callFunction("\\\\cdright",[e[1]],[]),l={type:"ordgroup",mode:"math",body:[i,s,o]};return r.callFunction("\\\\cdparent",[l],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var u={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[u],[])}default:return{type:"textord",text:" ",mode:"math"}}}function bve(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new nt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(u)>-1)for(var f=0;f<2;f++){for(var d=!0,p=l+1;pAV=|." after @',s[l]);var g=xve(u,h,t),m={type:"styling",body:[g],mode:"math",style:"display"};n.push(m),o=YP()}a%2===0?n.push(o):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var y=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:y,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function Db(t,e){var r=Ib(t);if(r&&qt.contains(Mve,r.text))return r;throw r?new nt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new nt("Invalid delimiter type '"+t.type+"'",t)}function KP(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function Zl(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,o={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},l=0;l1||!h)&&m.pop(),x.length{Gs=class t{constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},vo=class t{constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,Gs.range(this,e))}},nt=class t{constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var o=s.lexer.input;i=s.start,a=s.end,i===o.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var l=o.slice(i,a).replace(/[^]/g,"$&\u0332"),u;i>15?u="\u2026"+o.slice(i-15,i):u=o.slice(0,i);var h;a+15":">","<":"<",'"':""","'":"'"},u1e=/[&><"']/g;pB=function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},f1e=function(e){var r=pB(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},d1e=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},p1e=function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},qt={contains:a1e,deflt:s1e,escape:h1e,hyphenate:l1e,getBaseElem:pB,isCharacterBox:f1e,protocolFromUrl:p1e},bb={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:t=>"#"+t},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(t,e)=>(e.push(t),e)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:t=>Math.max(0,t),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:t=>Math.max(0,t),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:t=>Math.max(0,t),cli:"-e, --max-expand ",cliProcessor:t=>t==="Infinity"?1/0:parseInt(t)},globalGroup:{type:"boolean",cli:!1}};R1=class{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in bb)if(bb.hasOwnProperty(r)){var n=bb[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:g1e(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new nt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=qt.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},Yl=class{constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Xl[m1e[this.id]]}sub(){return Xl[v1e[this.id]]}fracNum(){return Xl[y1e[this.id]]}fracDen(){return Xl[x1e[this.id]]}cramp(){return Xl[b1e[this.id]]}text(){return Xl[w1e[this.id]]}isTight(){return this.size>=2}},fS=0,kb=1,Y0=2,Qc=3,N1=4,mo=5,X0=6,Ua=7,Xl=[new Yl(fS,0,!1),new Yl(kb,0,!0),new Yl(Y0,1,!1),new Yl(Qc,1,!0),new Yl(N1,2,!1),new Yl(mo,2,!0),new Yl(X0,3,!1),new Yl(Ua,3,!0)],m1e=[N1,mo,N1,mo,X0,Ua,X0,Ua],v1e=[mo,mo,mo,mo,Ua,Ua,Ua,Ua],y1e=[Y0,Qc,N1,mo,X0,Ua,X0,Ua],x1e=[Qc,Qc,mo,mo,Ua,Ua,Ua,Ua],b1e=[kb,kb,Qc,Qc,mo,mo,Ua,Ua],w1e=[fS,kb,Y0,Qc,Y0,Qc,Y0,Qc],Xt={DISPLAY:Xl[fS],TEXT:Xl[Y0],SCRIPT:Xl[N1],SCRIPTSCRIPT:Xl[X0]},eS=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];wb=[];eS.forEach(t=>t.blocks.forEach(e=>wb.push(...e)));q0=80,T1e=function(e,r){return"M95,"+(622+e+r)+` c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 c69,-144,104.5,-217.7,106.5,-221 l`+e/2.075+" -"+e+` c5.3,-9.3,12,-14,20,-14 H400000v`+(40+e)+`H845.2724 s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},E1e=function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 c340,-704.7,510.7,-1060.3,512,-1067 l`+e/2.084+" -"+e+` c4.7,-7.3,11,-11,19,-11 H40000v`+(40+e)+`H1012.3 s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},S1e=function(e,r){return"M983 "+(10+e+r)+` l`+e/3.13+" -"+e+` c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 c53.7,-170.3,84.5,-266.8,92.5,-289.5z M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},C1e=function(e,r){return"M424,"+(2398+e+r)+` c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 v`+(40+e)+`H1014.6 s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 c-2,6,-10,9,-24,9 c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` h400000v`+(40+e)+"h-400000z"},A1e=function(e,r){return"M473,"+(2713+e+r)+` c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, 606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},_1e=function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},L1e=function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},R1e=function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=T1e(r,q0);break;case"sqrtSize1":i=E1e(r,q0);break;case"sqrtSize2":i=S1e(r,q0);break;case"sqrtSize3":i=C1e(r,q0);break;case"sqrtSize4":i=A1e(r,q0);break;case"sqrtTall":i=L1e(r,q0,n)}return i},N1e=function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},BP={doubleleftarrow:`M262 157 l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 -86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 -2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l -10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 -33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 -17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 -13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 -107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 -5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 -45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 -331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 435 0h399565z`,leftgroupunder:`M400000 262 H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 -3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 -18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 -196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 -4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 -10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 -152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 -2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 -83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 -68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 -.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 -53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 -5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 -320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 -451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 -480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 -707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 -16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 -40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 -12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l -6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 -174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 -3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 -10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 -18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 -7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 -27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 -64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 -13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 -52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 -167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 -70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 -40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 -37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 -19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 -2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 -68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 -8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 -11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 -11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 -11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 -11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 -11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, -5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, -11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, -11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, -11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 -27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 -84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 -119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 -12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, -231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, 1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, -152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, -231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},I1e=function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, -36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, 949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, -544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, -210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, 63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, -470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},Df=class{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return qt.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText();return this.children.map(e).join("")}},jl={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},cb={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},FP={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};UE={};O1e=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],zP=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],$P=function(e,r){return r.size<2?e:O1e[e-1][r.size-1]},Tb=class t{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=zP[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:$P(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:zP[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=$P(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=D1e(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};Tb.BASESIZE=6;tS={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},P1e={ex:!0,em:!0,mu:!0},mB=function(e){return typeof e!="string"&&(e=e.unit),e in tS||e in P1e||e==="ex"},Wn=function(e,r){var n;if(e.unit in tS)n=tS[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new nt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},ut=function(e){return+e.toFixed(4)+"em"},lh=function(e){return e.filter(r=>r).join(" ")},vB=function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},yB=function(e){var r=document.createElement(e);r.className=lh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a",r},Of=class{constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,vB.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return qt.contains(this.classes,e)}toNode(){return yB.call(this,"span")}toMarkup(){return xB.call(this,"span")}},I1=class{constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,vB.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return qt.contains(this.classes,e)}toNode(){return yB.call(this,"a")}toMarkup(){return xB.call(this,"a")}},rS=class{constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return qt.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+qt.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=ut(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=lh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=qt.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+qt.escape(n)+'"');var a=qt.escape(this.text);return e?(r+=">",r+=a,r+="",r):a}},nl=class{constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},M1=class{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);G(V,ne,be,"\u2208","\\in",!0);G(V,ne,be,"\uE020","\\@not");G(V,ne,be,"\u2282","\\subset",!0);G(V,ne,be,"\u2283","\\supset",!0);G(V,ne,be,"\u2286","\\subseteq",!0);G(V,ne,be,"\u2287","\\supseteq",!0);G(V,ve,be,"\u2288","\\nsubseteq",!0);G(V,ve,be,"\u2289","\\nsupseteq",!0);G(V,ne,be,"\u22A8","\\models");G(V,ne,be,"\u2190","\\leftarrow",!0);G(V,ne,be,"\u2264","\\le");G(V,ne,be,"\u2264","\\leq",!0);G(V,ne,be,"<","\\lt",!0);G(V,ne,be,"\u2192","\\rightarrow",!0);G(V,ne,be,"\u2192","\\to");G(V,ve,be,"\u2271","\\ngeq",!0);G(V,ve,be,"\u2270","\\nleq",!0);G(V,ne,ru,"\xA0","\\ ");G(V,ne,ru,"\xA0","\\space");G(V,ne,ru,"\xA0","\\nobreakspace");G(Je,ne,ru,"\xA0","\\ ");G(Je,ne,ru,"\xA0"," ");G(Je,ne,ru,"\xA0","\\space");G(Je,ne,ru,"\xA0","\\nobreakspace");G(V,ne,ru,null,"\\nobreak");G(V,ne,ru,null,"\\allowbreak");G(V,ne,Rb,",",",");G(V,ne,Rb,";",";");G(V,ve,Tt,"\u22BC","\\barwedge",!0);G(V,ve,Tt,"\u22BB","\\veebar",!0);G(V,ne,Tt,"\u2299","\\odot",!0);G(V,ne,Tt,"\u2295","\\oplus",!0);G(V,ne,Tt,"\u2297","\\otimes",!0);G(V,ne,Se,"\u2202","\\partial",!0);G(V,ne,Tt,"\u2298","\\oslash",!0);G(V,ve,Tt,"\u229A","\\circledcirc",!0);G(V,ve,Tt,"\u22A1","\\boxdot",!0);G(V,ne,Tt,"\u25B3","\\bigtriangleup");G(V,ne,Tt,"\u25BD","\\bigtriangledown");G(V,ne,Tt,"\u2020","\\dagger");G(V,ne,Tt,"\u22C4","\\diamond");G(V,ne,Tt,"\u22C6","\\star");G(V,ne,Tt,"\u25C3","\\triangleleft");G(V,ne,Tt,"\u25B9","\\triangleright");G(V,ne,Us,"{","\\{");G(Je,ne,Se,"{","\\{");G(Je,ne,Se,"{","\\textbraceleft");G(V,ne,Va,"}","\\}");G(Je,ne,Se,"}","\\}");G(Je,ne,Se,"}","\\textbraceright");G(V,ne,Us,"{","\\lbrace");G(V,ne,Va,"}","\\rbrace");G(V,ne,Us,"[","\\lbrack",!0);G(Je,ne,Se,"[","\\lbrack",!0);G(V,ne,Va,"]","\\rbrack",!0);G(Je,ne,Se,"]","\\rbrack",!0);G(V,ne,Us,"(","\\lparen",!0);G(V,ne,Va,")","\\rparen",!0);G(Je,ne,Se,"<","\\textless",!0);G(Je,ne,Se,">","\\textgreater",!0);G(V,ne,Us,"\u230A","\\lfloor",!0);G(V,ne,Va,"\u230B","\\rfloor",!0);G(V,ne,Us,"\u2308","\\lceil",!0);G(V,ne,Va,"\u2309","\\rceil",!0);G(V,ne,Se,"\\","\\backslash");G(V,ne,Se,"\u2223","|");G(V,ne,Se,"\u2223","\\vert");G(Je,ne,Se,"|","\\textbar",!0);G(V,ne,Se,"\u2225","\\|");G(V,ne,Se,"\u2225","\\Vert");G(Je,ne,Se,"\u2225","\\textbardbl");G(Je,ne,Se,"~","\\textasciitilde");G(Je,ne,Se,"\\","\\textbackslash");G(Je,ne,Se,"^","\\textasciicircum");G(V,ne,be,"\u2191","\\uparrow",!0);G(V,ne,be,"\u21D1","\\Uparrow",!0);G(V,ne,be,"\u2193","\\downarrow",!0);G(V,ne,be,"\u21D3","\\Downarrow",!0);G(V,ne,be,"\u2195","\\updownarrow",!0);G(V,ne,be,"\u21D5","\\Updownarrow",!0);G(V,ne,pi,"\u2210","\\coprod");G(V,ne,pi,"\u22C1","\\bigvee");G(V,ne,pi,"\u22C0","\\bigwedge");G(V,ne,pi,"\u2A04","\\biguplus");G(V,ne,pi,"\u22C2","\\bigcap");G(V,ne,pi,"\u22C3","\\bigcup");G(V,ne,pi,"\u222B","\\int");G(V,ne,pi,"\u222B","\\intop");G(V,ne,pi,"\u222C","\\iint");G(V,ne,pi,"\u222D","\\iiint");G(V,ne,pi,"\u220F","\\prod");G(V,ne,pi,"\u2211","\\sum");G(V,ne,pi,"\u2A02","\\bigotimes");G(V,ne,pi,"\u2A01","\\bigoplus");G(V,ne,pi,"\u2A00","\\bigodot");G(V,ne,pi,"\u222E","\\oint");G(V,ne,pi,"\u222F","\\oiint");G(V,ne,pi,"\u2230","\\oiiint");G(V,ne,pi,"\u2A06","\\bigsqcup");G(V,ne,pi,"\u222B","\\smallint");G(Je,ne,j0,"\u2026","\\textellipsis");G(V,ne,j0,"\u2026","\\mathellipsis");G(Je,ne,j0,"\u2026","\\ldots",!0);G(V,ne,j0,"\u2026","\\ldots",!0);G(V,ne,j0,"\u22EF","\\@cdots",!0);G(V,ne,j0,"\u22F1","\\ddots",!0);G(V,ne,Se,"\u22EE","\\varvdots");G(V,ne,Mn,"\u02CA","\\acute");G(V,ne,Mn,"\u02CB","\\grave");G(V,ne,Mn,"\xA8","\\ddot");G(V,ne,Mn,"~","\\tilde");G(V,ne,Mn,"\u02C9","\\bar");G(V,ne,Mn,"\u02D8","\\breve");G(V,ne,Mn,"\u02C7","\\check");G(V,ne,Mn,"^","\\hat");G(V,ne,Mn,"\u20D7","\\vec");G(V,ne,Mn,"\u02D9","\\dot");G(V,ne,Mn,"\u02DA","\\mathring");G(V,ne,Yt,"\uE131","\\@imath");G(V,ne,Yt,"\uE237","\\@jmath");G(V,ne,Se,"\u0131","\u0131");G(V,ne,Se,"\u0237","\u0237");G(Je,ne,Se,"\u0131","\\i",!0);G(Je,ne,Se,"\u0237","\\j",!0);G(Je,ne,Se,"\xDF","\\ss",!0);G(Je,ne,Se,"\xE6","\\ae",!0);G(Je,ne,Se,"\u0153","\\oe",!0);G(Je,ne,Se,"\xF8","\\o",!0);G(Je,ne,Se,"\xC6","\\AE",!0);G(Je,ne,Se,"\u0152","\\OE",!0);G(Je,ne,Se,"\xD8","\\O",!0);G(Je,ne,Mn,"\u02CA","\\'");G(Je,ne,Mn,"\u02CB","\\`");G(Je,ne,Mn,"\u02C6","\\^");G(Je,ne,Mn,"\u02DC","\\~");G(Je,ne,Mn,"\u02C9","\\=");G(Je,ne,Mn,"\u02D8","\\u");G(Je,ne,Mn,"\u02D9","\\.");G(Je,ne,Mn,"\xB8","\\c");G(Je,ne,Mn,"\u02DA","\\r");G(Je,ne,Mn,"\u02C7","\\v");G(Je,ne,Mn,"\xA8",'\\"');G(Je,ne,Mn,"\u02DD","\\H");G(Je,ne,Mn,"\u25EF","\\textcircled");bB={"--":!0,"---":!0,"``":!0,"''":!0};G(Je,ne,Se,"\u2013","--",!0);G(Je,ne,Se,"\u2013","\\textendash");G(Je,ne,Se,"\u2014","---",!0);G(Je,ne,Se,"\u2014","\\textemdash");G(Je,ne,Se,"\u2018","`",!0);G(Je,ne,Se,"\u2018","\\textquoteleft");G(Je,ne,Se,"\u2019","'",!0);G(Je,ne,Se,"\u2019","\\textquoteright");G(Je,ne,Se,"\u201C","``",!0);G(Je,ne,Se,"\u201C","\\textquotedblleft");G(Je,ne,Se,"\u201D","''",!0);G(Je,ne,Se,"\u201D","\\textquotedblright");G(V,ne,Se,"\xB0","\\degree",!0);G(Je,ne,Se,"\xB0","\\degree");G(Je,ne,Se,"\xB0","\\textdegree",!0);G(V,ne,Se,"\xA3","\\pounds");G(V,ne,Se,"\xA3","\\mathsterling",!0);G(Je,ne,Se,"\xA3","\\pounds");G(Je,ne,Se,"\xA3","\\textsterling",!0);G(V,ve,Se,"\u2720","\\maltese");G(Je,ve,Se,"\u2720","\\maltese");UP='0123456789/@."';for(ub=0;ub0)return rl(a,u,i,r,s.concat(h));if(l){var f,d;if(l==="boldsymbol"){var p=V1e(a,i,r,s,n);f=p.fontName,d=[p.fontClass]}else o?(f=TB[l].fontName,d=[l]):(f=gb(l,r.fontWeight,r.fontShape),d=[l,r.fontWeight,r.fontShape]);if(Nb(a,f,i).metrics)return rl(a,f,i,r,s.concat(d));if(bB.hasOwnProperty(a)&&f.slice(0,10)==="Typewriter"){for(var g=[],m=0;m{if(lh(t.classes)!==lh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},q1e=t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},cs=function(e,r,n,i){var a=new Of(e,r,n,i);return pS(a),a},wB=(t,e,r,n)=>new Of(t,e,r,n),Y1e=function(e,r,n){var i=cs([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=ut(i.height),i.maxFontSize=1,i},X1e=function(e,r,n,i){var a=new I1(e,r,n,i);return pS(a),a},kB=function(e){var r=new Df(e);return pS(r),r},j1e=function(e,r){return e instanceof Df?cs([],[e],r):e},K1e=function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=cs(["mspace"],[],e),n=Wn(t,e);return r.style.marginRight=ut(n),r},gb=function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},TB={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},EB={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},J1e=function(e,r){var[n,i,a]=EB[e],s=new Kl(n),o=new nl([s],{width:ut(i),height:ut(a),style:"width:"+ut(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),l=wB(["overlay"],[o],r);return l.height=a,l.style.height=ut(a),l.style.width=ut(i),l},Be={fontMap:TB,makeSymbol:rl,mathsym:U1e,makeSpan:cs,makeSvgSpan:wB,makeLineSpan:Y1e,makeAnchor:X1e,makeFragment:kB,wrapFragment:j1e,makeVList:Z1e,makeOrd:W1e,makeGlue:Q1e,staticSvg:J1e,svgData:EB,tryCombineChars:q1e},Vn={number:3,unit:"mu"},If={number:4,unit:"mu"},Zc={number:5,unit:"mu"},eve={mord:{mop:Vn,mbin:If,mrel:Zc,minner:Vn},mop:{mord:Vn,mop:Vn,mrel:Zc,minner:Vn},mbin:{mord:If,mop:If,mopen:If,minner:If},mrel:{mord:Zc,mop:Zc,mopen:Zc,minner:Zc},mopen:{},mclose:{mop:Vn,mbin:If,mrel:Zc,minner:Vn},mpunct:{mord:Vn,mop:Vn,mrel:Zc,mopen:Vn,mclose:Vn,mpunct:Vn,minner:Vn},minner:{mord:Vn,mop:Vn,mbin:If,mrel:Zc,mopen:Vn,mpunct:Vn,minner:Vn}},tve={mord:{mop:Vn},mop:{mord:Vn,mop:Vn},mbin:{},mrel:{},mopen:{},mclose:{mop:Vn},mpunct:{},minner:{mop:Vn}},SB={},Sb={},Cb={};Ab=function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},si=function(e){return e.type==="ordgroup"?e.body:[e]},eu=Be.makeSpan,rve=["leftmost","mbin","mopen","mrel","mop","mpunct"],nve=["rightmost","mrel","mclose","mpunct"],ive={display:Xt.DISPLAY,text:Xt.TEXT,script:Xt.SCRIPT,scriptscript:Xt.SCRIPTSCRIPT},ave={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Ti=function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var y=m.classes[0],x=g.classes[0];y==="mbin"&&qt.contains(nve,x)?m.classes[0]="mord":x==="mbin"&&qt.contains(rve,y)&&(g.classes[0]="mord")},{node:f},d,p),HP(a,(g,m)=>{var y=iS(m),x=iS(g),b=y&&x?g.hasClass("mtight")?tve[y][x]:eve[y][x]:null;if(b)return Be.makeGlue(b,u)},{node:f},d,p),a},HP=function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sd=>{e.splice(f+1,0,d),s++})(s)}i&&e.pop()},CB=function(e){return e instanceof Df||e instanceof I1||e instanceof Of&&e.hasClass("enclosing")?e:null},sve=function t(e,r){var n=CB(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},iS=function(e,r){return e?(r&&(e=sve(e,r)),ave[e.classes[0]]||null):null},D1=function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return eu(r.concat(n))},Ar=function(e,r,n){if(!e)return eu();if(Sb[e.type]){var i=Sb[e.type](e,r);if(n&&r.size!==n.size){i=eu(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new nt("Got group of unknown type: '"+e.type+"'")};us=class{constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=lh(this.classes));for(var n=0;n0&&(e+=' class ="'+qt.escape(lh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},Mf=class{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return qt.escape(this.toText())}toText(){return this.text}},sS=class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",ut(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},rt={MathNode:us,TextNode:Mf,SpaceNode:sS,newDocumentFragment:AB},yo=function(e,r,n){return wn[r][e]&&wn[r][e].replace&&e.charCodeAt(0)!==55349&&!(bB.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=wn[r][e].replace),new rt.TextNode(e)},gS=function(e){return e.length===1?e[0]:new rt.MathNode("mrow",e)},mS=function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(qt.contains(["\\imath","\\jmath"],a))return null;wn[i][a]&&wn[i][a].replace&&(a=wn[i][a].replace);var s=Be.fontMap[n].fontName;return dS(a,s,i)?Be.fontMap[n].variant:null},fs=function(e,r,n){if(e.length===1){var i=hn(e[0],r);return n&&i instanceof us&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,o=0;o0&&(f.text=f.text.slice(0,1)+"\u0338"+f.text.slice(1),a.pop())}}}a.push(l),s=l}return a},ch=function(e,r,n){return gS(fs(e,r,n))},hn=function(e,r){if(!e)return new rt.MathNode("mrow");if(Cb[e.type]){var n=Cb[e.type](e,r);return n}else throw new nt("Got group of unknown type: '"+e.type+"'")};_B=function(e){return new Tb({style:e.displayMode?Xt.DISPLAY:Xt.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},LB=function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=Be.makeSpan(n,[e])}return e},ove=function(e,r,n){var i=_B(n),a;if(n.output==="mathml")return qP(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=aS(e,i);a=Be.makeSpan(["katex"],[s])}else{var o=qP(e,r,i,n.displayMode,!1),l=aS(e,i);a=Be.makeSpan(["katex"],[o,l])}return LB(a,n)},lve=function(e,r,n){var i=_B(n),a=aS(e,i),s=Be.makeSpan(["katex"],[a]);return LB(s,n)},cve={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},uve=function(e){var r=new rt.MathNode("mo",[new rt.TextNode(cve[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},hve={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},fve=function(e){return e.type==="ordgroup"?e.body.length:1},dve=function(e,r){function n(){var o=4e5,l=e.label.slice(1);if(qt.contains(["widehat","widecheck","widetilde","utilde"],l)){var u=e,h=fve(u.base),f,d,p;if(h>5)l==="widehat"||l==="widecheck"?(f=420,o=2364,p=.42,d=l+"4"):(f=312,o=2340,p=.34,d="tilde4");else{var g=[1,1,2,2,3,3][h];l==="widehat"||l==="widecheck"?(o=[0,1062,2364,2364,2364][g],f=[0,239,300,360,420][g],p=[0,.24,.3,.3,.36,.42][g],d=l+g):(o=[0,600,1033,2339,2340][g],f=[0,260,286,306,312][g],p=[0,.26,.286,.3,.306,.34][g],d="tilde"+g)}var m=new Kl(d),y=new nl([m],{width:"100%",height:ut(p),viewBox:"0 0 "+o+" "+f,preserveAspectRatio:"none"});return{span:Be.makeSvgSpan([],[y],r),minWidth:0,height:p}}else{var x=[],b=hve[l],[w,_,k]=b,E=k/1e3,L=w.length,S,C;if(L===1){var M=b[3];S=["hide-tail"],C=[M]}else if(L===2)S=["halfarrow-left","halfarrow-right"],C=["xMinYMin","xMaxYMin"];else if(L===3)S=["brace-left","brace-center","brace-right"],C=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support `+L+" children.");for(var R=0;R0&&(i.style.minWidth=ut(a)),i},pve=function(e,r,n,i,a){var s,o=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=Be.makeSpan(["stretchy",r],[],a),r==="fbox"){var l=a.color&&a.getColor();l&&(s.style.borderColor=l)}}else{var u=[];/^[bx]cancel$/.test(r)&&u.push(new M1({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&u.push(new M1({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new nl(u,{width:"100%",height:ut(o)});s=Be.makeSvgSpan([],[h],a)}return s.height=o,s.style.height=ut(o),s},tu={encloseSpan:pve,mathMLnode:uve,svgSpan:dve};yS=(t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=hr(t.base,"accent"),r=n.base,t.base=r,i=F1e(Ar(t,e)),t.base=n):(n=hr(t,"accent"),r=n.base);var a=Ar(r,e.havingCrampedStyle()),s=n.isShifty&&qt.isCharacterBox(r),o=0;if(s){var l=qt.getBaseElem(r),u=Ar(l,e.havingCrampedStyle());o=GP(u).skew}var h=n.label==="\\c",f=h?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),d;if(n.isStretchy)d=tu.svgSpan(n,e),d=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:d,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+ut(2*o)+")",marginLeft:ut(2*o)}:void 0}]},e);else{var p,g;n.label==="\\vec"?(p=Be.staticSvg("vec",e),g=Be.svgData.vec[1]):(p=Be.makeOrd({mode:n.mode,text:n.label},e,"textord"),p=GP(p),p.italic=0,g=p.width,h&&(f+=p.depth)),d=Be.makeSpan(["accent-body"],[p]);var m=n.label==="\\textcircled";m&&(d.classes.push("accent-full"),f=a.height);var y=o;m||(y-=g/2),d.style.left=ut(y),n.label==="\\textcircled"&&(d.style.top=".2em"),d=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-f},{type:"elem",elem:d}]},e)}var x=Be.makeSpan(["mord","accent"],[d],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},RB=(t,e)=>{var r=t.isStretchy?tu.mathMLnode(t.label):new rt.MathNode("mo",[yo(t.label,t.mode)]),n=new rt.MathNode("mover",[hn(t.base,e),r]);return n.setAttribute("accent","true"),n},gve=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));vt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(t,e)=>{var r=Ab(e[0]),n=!gve.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},htmlBuilder:yS,mathmlBuilder:RB});vt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:yS,mathmlBuilder:RB});vt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},htmlBuilder:(t,e)=>{var r=Ar(t.base,e),n=tu.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=Be.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return Be.makeSpan(["mord","accentunder"],[a],e)},mathmlBuilder:(t,e)=>{var r=tu.mathMLnode(t.label),n=new rt.MathNode("munder",[hn(t.base,e),r]);return n.setAttribute("accentunder","true"),n}});vb=t=>{var e=new rt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};vt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=Be.wrapFragment(Ar(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=Be.wrapFragment(Ar(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var o=tu.svgSpan(t,e),l=-e.fontMetrics().axisHeight+.5*o.height,u=-e.fontMetrics().axisHeight-.5*o.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(u-=i.depth);var h;if(s){var f=-e.fontMetrics().axisHeight+s.height+.5*o.height+.111;h=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:u},{type:"elem",elem:o,shift:l},{type:"elem",elem:s,shift:f}]},e)}else h=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:u},{type:"elem",elem:o,shift:l}]},e);return h.children[0].children[0].children[1].classes.push("svg-align"),Be.makeSpan(["mrel","x-arrow"],[h],e)},mathmlBuilder(t,e){var r=tu.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=vb(hn(t.body,e));if(t.below){var a=vb(hn(t.below,e));n=new rt.MathNode("munderover",[r,a,i])}else n=new rt.MathNode("mover",[r,i])}else if(t.below){var s=vb(hn(t.below,e));n=new rt.MathNode("munder",[r,s])}else n=vb(),n=new rt.MathNode("mover",[r,n]);return n}});mve=Be.makeSpan;vt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:si(i),isCharacterBox:qt.isCharacterBox(i)}},htmlBuilder:NB,mathmlBuilder:IB});Mb=t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};vt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:Mb(e[0]),body:si(e[1]),isCharacterBox:qt.isCharacterBox(e[1])}}});vt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=Mb(i):s="mrel";var o={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:si(i)},l={type:"supsub",mode:a.mode,base:o,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[l],isCharacterBox:qt.isCharacterBox(l)}},htmlBuilder:NB,mathmlBuilder:IB});vt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:Mb(e[0]),body:si(e[0])}},htmlBuilder(t,e){var r=Ti(t.body,e,!0),n=Be.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=fs(t.body,e),n=new rt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});vve={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},YP=()=>({type:"styling",body:[],mode:"math",style:"display"}),XP=t=>t.type==="textord"&&t.text==="@",yve=(t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e;vt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=Be.wrapFragment(Ar(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=ut(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new rt.MathNode("mrow",[hn(t.label,e)]);return r=new rt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new rt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});vt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=Be.wrapFragment(Ar(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new rt.MathNode("mrow",[hn(t.fragment,e)])}});vt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=hr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new nt("\\@char with invalid code point "+a);return l<=65535?u=String.fromCharCode(l):(l-=65536,u=String.fromCharCode((l>>10)+55296,(l&1023)+56320)),{type:"textord",mode:r.mode,text:u}}});MB=(t,e)=>{var r=Ti(t.body,e.withColor(t.color),!1);return Be.makeFragment(r)},DB=(t,e)=>{var r=fs(t.body,e.withColor(t.color)),n=new rt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n};vt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=hr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:si(i)}},htmlBuilder:MB,mathmlBuilder:DB});vt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=hr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:MB,mathmlBuilder:DB});vt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&hr(i,"size").value}},htmlBuilder(t,e){var r=Be.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=ut(Wn(t.size,e)))),r},mathmlBuilder(t,e){var r=new rt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",ut(Wn(t.size,e)))),r}});oS={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},OB=t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new nt("Expected a control sequence",t);return e},wve=t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},PB=(t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)};vt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(oS[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=oS[n.text]),hr(e.parseFunction(),"internal");throw new nt("Invalid token after macro prefix",n)}});vt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new nt("Expected a control sequence",n);for(var a=0,s,o=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),o[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new nt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new nt('Argument number "'+n.text+'" out of order');a++,o.push([])}else{if(n.text==="EOF")throw new nt("Expected a macro definition");o[a].push(n.text)}var{tokens:l}=e.gullet.consumeArg();return s&&l.unshift(s),(r==="\\edef"||r==="\\xdef")&&(l=e.gullet.expandTokens(l),l.reverse()),e.gullet.macros.set(i,{tokens:l,numArgs:a,delimiters:o},r===oS[r]),{type:"internal",mode:e.mode}}});vt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=OB(e.gullet.popToken());e.gullet.consumeSpaces();var i=wve(e);return PB(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});vt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=OB(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return PB(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});_1=function(e,r,n){var i=wn.math[e]&&wn.math[e].replace,a=dS(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},xS=function(e,r,n,i){var a=n.havingBaseStyle(r),s=Be.makeSpan(i.concat(a.sizingClasses(n)),[e],n),o=a.sizeMultiplier/n.sizeMultiplier;return s.height*=o,s.depth*=o,s.maxFontSize=a.sizeMultiplier,s},BB=function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=ut(a),e.height-=a,e.depth+=a},kve=function(e,r,n,i,a,s){var o=Be.makeSymbol(e,"Main-Regular",a,i),l=xS(o,r,i,s);return n&&BB(l,i,r),l},Tve=function(e,r,n,i){return Be.makeSymbol(e,"Size"+r+"-Regular",n,i)},FB=function(e,r,n,i,a,s){var o=Tve(e,r,a,i),l=xS(Be.makeSpan(["delimsizing","size"+r],[o],i),Xt.TEXT,i,s);return n&&BB(l,i,Xt.TEXT),l},HE=function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=Be.makeSpan(["delimsizinginner",i],[Be.makeSpan([],[Be.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},qE=function(e,r,n){var i=jl["Size4-Regular"][e.charCodeAt(0)]?jl["Size4-Regular"][e.charCodeAt(0)][4]:jl["Size1-Regular"][e.charCodeAt(0)][4],a=new Kl("inner",N1e(e,Math.round(1e3*r))),s=new nl([a],{width:ut(i),height:ut(r),style:"width:"+ut(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),o=Be.makeSvgSpan([],[s],n);return o.height=r,o.style.height=ut(r),o.style.width=ut(i),{type:"elem",elem:o}},lS=.008,yb={type:"kern",size:-1*lS},Eve=["|","\\lvert","\\rvert","\\vert"],Sve=["\\|","\\lVert","\\rVert","\\Vert"],zB=function(e,r,n,i,a,s){var o,l,u,h,f="",d=0;o=u=h=e,l=null;var p="Size1-Regular";e==="\\uparrow"?u=h="\u23D0":e==="\\Uparrow"?u=h="\u2016":e==="\\downarrow"?o=u="\u23D0":e==="\\Downarrow"?o=u="\u2016":e==="\\updownarrow"?(o="\\uparrow",u="\u23D0",h="\\downarrow"):e==="\\Updownarrow"?(o="\\Uparrow",u="\u2016",h="\\Downarrow"):qt.contains(Eve,e)?(u="\u2223",f="vert",d=333):qt.contains(Sve,e)?(u="\u2225",f="doublevert",d=556):e==="["||e==="\\lbrack"?(o="\u23A1",u="\u23A2",h="\u23A3",p="Size4-Regular",f="lbrack",d=667):e==="]"||e==="\\rbrack"?(o="\u23A4",u="\u23A5",h="\u23A6",p="Size4-Regular",f="rbrack",d=667):e==="\\lfloor"||e==="\u230A"?(u=o="\u23A2",h="\u23A3",p="Size4-Regular",f="lfloor",d=667):e==="\\lceil"||e==="\u2308"?(o="\u23A1",u=h="\u23A2",p="Size4-Regular",f="lceil",d=667):e==="\\rfloor"||e==="\u230B"?(u=o="\u23A5",h="\u23A6",p="Size4-Regular",f="rfloor",d=667):e==="\\rceil"||e==="\u2309"?(o="\u23A4",u=h="\u23A5",p="Size4-Regular",f="rceil",d=667):e==="("||e==="\\lparen"?(o="\u239B",u="\u239C",h="\u239D",p="Size4-Regular",f="lparen",d=875):e===")"||e==="\\rparen"?(o="\u239E",u="\u239F",h="\u23A0",p="Size4-Regular",f="rparen",d=875):e==="\\{"||e==="\\lbrace"?(o="\u23A7",l="\u23A8",h="\u23A9",u="\u23AA",p="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(o="\u23AB",l="\u23AC",h="\u23AD",u="\u23AA",p="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(o="\u23A7",h="\u23A9",u="\u23AA",p="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(o="\u23AB",h="\u23AD",u="\u23AA",p="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(o="\u23A7",h="\u23AD",u="\u23AA",p="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(o="\u23AB",h="\u23A9",u="\u23AA",p="Size4-Regular");var g=_1(o,p,a),m=g.height+g.depth,y=_1(u,p,a),x=y.height+y.depth,b=_1(h,p,a),w=b.height+b.depth,_=0,k=1;if(l!==null){var E=_1(l,p,a);_=E.height+E.depth,k=2}var L=m+w+_,S=Math.max(0,Math.ceil((r-L)/(k*x))),C=L+S*k*x,M=i.fontMetrics().axisHeight;n&&(M*=i.sizeMultiplier);var R=C/2-M,T=[];if(f.length>0){var I=C-m-w,A=Math.round(C*1e3),D=I1e(f,Math.round(I*1e3)),N=new Kl(f,D),O=(d/1e3).toFixed(3)+"em",B=(A/1e3).toFixed(3)+"em",P=new nl([N],{width:O,height:B,viewBox:"0 0 "+d+" "+A}),$=Be.makeSvgSpan([],[P],i);$.height=A/1e3,$.style.width=O,$.style.height=B,T.push({type:"elem",elem:$})}else{if(T.push(HE(h,p,a)),T.push(yb),l===null){var z=C-m-w+2*lS;T.push(qE(u,z,i))}else{var H=(C-m-w-_)/2+2*lS;T.push(qE(u,H,i)),T.push(yb),T.push(HE(l,p,a)),T.push(yb),T.push(qE(u,H,i))}T.push(yb),T.push(HE(o,p,a))}var J=i.havingBaseStyle(Xt.TEXT),X=Be.makeVList({positionType:"bottom",positionData:R,children:T},J);return xS(Be.makeSpan(["delimsizing","mult"],[X],J),Xt.TEXT,i,s)},YE=80,XE=.08,jE=function(e,r,n,i,a){var s=R1e(e,i,n),o=new Kl(e,s),l=new nl([o],{width:"400em",height:ut(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return Be.makeSvgSpan(["hide-tail"],[l],a)},Cve=function(e,r){var n=r.havingBaseSizing(),i=VB("\\surd",e*n.sizeMultiplier,UB,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),o,l=0,u=0,h=0,f;return i.type==="small"?(h=1e3+1e3*s+YE,e<1?a=1:e<1.4&&(a=.7),l=(1+s+XE)/a,u=(1+s)/a,o=jE("sqrtMain",l,h,s,r),o.style.minWidth="0.853em",f=.833/a):i.type==="large"?(h=(1e3+YE)*L1[i.size],u=(L1[i.size]+s)/a,l=(L1[i.size]+s+XE)/a,o=jE("sqrtSize"+i.size,l,h,s,r),o.style.minWidth="1.02em",f=1/a):(l=e+s+XE,u=e+s,h=Math.floor(1e3*e+s)+YE,o=jE("sqrtTall",l,h,s,r),o.style.minWidth="0.742em",f=1.056),o.height=u,o.style.height=ut(l),{span:o,advanceWidth:f,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},$B=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Ave=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],GB=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],L1=[0,1.2,1.8,2.4,3],_ve=function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),qt.contains($B,e)||qt.contains(GB,e))return FB(e,r,!1,n,i,a);if(qt.contains(Ave,e))return zB(e,L1[r],!1,n,i,a);throw new nt("Illegal delimiter: '"+e+"'")},Lve=[{type:"small",style:Xt.SCRIPTSCRIPT},{type:"small",style:Xt.SCRIPT},{type:"small",style:Xt.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Rve=[{type:"small",style:Xt.SCRIPTSCRIPT},{type:"small",style:Xt.SCRIPT},{type:"small",style:Xt.TEXT},{type:"stack"}],UB=[{type:"small",style:Xt.SCRIPTSCRIPT},{type:"small",style:Xt.SCRIPT},{type:"small",style:Xt.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Nve=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},VB=function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},WB=function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var o;qt.contains(GB,e)?o=Lve:qt.contains($B,e)?o=UB:o=Rve;var l=VB(e,r,o,i);return l.type==="small"?kve(e,l.style,n,i,a,s):l.type==="large"?FB(e,l.size,n,i,a,s):zB(e,r,n,i,a,s)},Ive=function(e,r,n,i,a,s){var o=i.fontMetrics().axisHeight*i.sizeMultiplier,l=901,u=5/i.fontMetrics().ptPerEm,h=Math.max(r-o,n+o),f=Math.max(h/500*l,2*h-u);return WB(e,f,!0,i,a,s)},Jc={sqrtImage:Cve,sizedDelim:_ve,sizeToMaxHeight:L1,customSizedDelim:WB,leftRightDelim:Ive},jP={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Mve=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];vt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(t,e)=>{var r=Db(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:jP[t.funcName].size,mclass:jP[t.funcName].mclass,delim:r.text}},htmlBuilder:(t,e)=>t.delim==="."?Be.makeSpan([t.mclass]):Jc.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),mathmlBuilder:t=>{var e=[];t.delim!=="."&&e.push(yo(t.delim,t.mode));var r=new rt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=ut(Jc.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}});vt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new nt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:Db(e[0],t).text,color:r}}});vt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(t,e)=>{var r=Db(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=hr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},htmlBuilder:(t,e)=>{KP(t);for(var r=Ti(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{KP(t);var r=fs(t.body,e);if(t.left!=="."){var n=new rt.MathNode("mo",[yo(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new rt.MathNode("mo",[yo(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return gS(r)}});vt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(t,e)=>{var r=Db(e[0],t);if(!t.parser.leftrightDepth)throw new nt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},htmlBuilder:(t,e)=>{var r;if(t.delim===".")r=D1(e,[]);else{r=Jc.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},mathmlBuilder:(t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?yo("|","text"):yo(t.delim,t.mode),n=new rt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});bS=(t,e)=>{var r=Be.wrapFragment(Ar(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,o=qt.isCharacterBox(t.body);if(n==="sout")a=Be.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var l=Wn({number:.6,unit:"pt"},e),u=Wn({number:.35,unit:"ex"},e),h=e.havingBaseSizing();i=i/h.sizeMultiplier;var f=r.height+r.depth+l+u;r.style.paddingLeft=ut(f/2+l);var d=Math.floor(1e3*f*i),p=_1e(d),g=new nl([new Kl("phase",p)],{width:"400em",height:ut(d/1e3),viewBox:"0 0 400000 "+d,preserveAspectRatio:"xMinYMin slice"});a=Be.makeSvgSpan(["hide-tail"],[g],e),a.style.height=ut(f),s=r.depth+l+u}else{/cancel/.test(n)?o||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var m=0,y=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),m=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),y=m):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),m=4*x,y=Math.max(0,.25-r.depth)):(m=o?.2:0,y=m),a=tu.encloseSpan(r,n,m,y,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=ut(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=ut(x),a.style.borderRightWidth=ut(x)),s=r.depth+y,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var w=/cancel|phase/.test(n)?["svg-align"]:[];b=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:w}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!o?Be.makeSpan(["mord","cancel-lap"],[b],e):Be.makeSpan(["mord"],[b],e)},wS=(t,e)=>{var r=0,n=new rt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[hn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n};vt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=hr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:bS,mathmlBuilder:wS});vt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=hr(e[0],"color-token").color,s=hr(e[1],"color-token").color,o=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:o}},htmlBuilder:bS,mathmlBuilder:wS});vt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});vt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:bS,mathmlBuilder:wS});vt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});HB={};qB={};Ob=t=>{var e=t.parser.settings;if(!e.displayMode)throw new nt("{"+t.envName+"} can be used only in display mode.")};Ql=function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,o=0,l=new Array(a),u=[],h=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),f=1/r.fontMetrics().ptPerEm,d=5*f;if(e.colSeparationType&&e.colSeparationType==="small"){var p=r.havingStyle(Xt.SCRIPT).sizeMultiplier;d=.2778*(p/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?Wn({number:3,unit:"ex"},r):12*f,m=3*f,y=e.arraystretch*g,x=.7*y,b=.3*y,w=0;function _(we){for(var Ie=0;Ie0&&(w+=.25),u.push({pos:w,isDashed:we[Ie]})}for(_(s[0]),n=0;n0&&(R+=b,Lwe))for(n=0;n=o)){var ee=void 0;(i>0||e.hskipBeforeAndAfter)&&(ee=qt.deflt(H.pregap,d),ee!==0&&(D=Be.makeSpan(["arraycolsep"],[]),D.style.width=ut(ee),A.push(D)));var Q=[];for(n=0;n0){for(var se=Be.makeLineSpan("hline",r,h),ce=Be.makeLineSpan("hdashline",r,h),ue=[{type:"elem",elem:l,shift:0}];u.length>0;){var te=u.pop(),Ne=te.pos-T;te.isDashed?ue.push({type:"elem",elem:ce,shift:Ne}):ue.push({type:"elem",elem:se,shift:Ne})}l=Be.makeVList({positionType:"individualShift",children:ue},r)}if(O.length===0)return Be.makeSpan(["mord"],[l],r);var ae=Be.makeVList({positionType:"individualShift",children:O},r);return ae=Be.makeSpan(["tag"],[ae],r),Be.makeFragment([l,ae])},Dve={c:"center ",l:"left ",r:"right "},Jl=function(e,r){for(var n=[],i=new rt.MathNode("mtd",[],["mtr-glue"]),a=new rt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,m="",y=!1,x=0,b=g.length;g[0].type==="separator"&&(d+="top ",x=1),g[g.length-1].type==="separator"&&(d+="bottom ",b-=1);for(var w=x;w0?"left ":"",d+=S[S.length-1].length>0?"right ":"";for(var C=1;C-1?"alignat":"align",a=e.envName==="split",s=uh(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:kS(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),o,l=0,u={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var h="",f=0;f0&&p&&(y=1),n[g]={type:"align",align:m,pregap:y,postgap:0}}return s.colSeparationType=p?"align":"alignat",s};Zl({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=Ib(e[0]),n=r?[e[0]]:hr(e[0],"ordgroup").body,i=n.map(function(s){var o=vS(s),l=o.text;if("lcr".indexOf(l)!==-1)return{type:"align",align:l};if(l==="|")return{type:"separator",separator:"|"};if(l===":")return{type:"separator",separator:":"};throw new nt("Unknown column alignment: "+l,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return uh(t.parser,a,TS(t.envName))},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new nt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=uh(t.parser,n,TS(t.envName)),s=Math.max(0,...a.body.map(o=>o.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=uh(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=Ib(e[0]),n=r?[e[0]]:hr(e[0],"ordgroup").body,i=n.map(function(s){var o=vS(s),l=o.text;if("lc".indexOf(l)!==-1)return{type:"align",align:l};throw new nt("Unknown column alignment: "+l,s)});if(i.length>1)throw new nt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=uh(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new nt("{subarray} can contain only one column");return a},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=uh(t.parser,e,TS(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:YB,htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){qt.contains(["gather","gather*"],t.envName)&&Ob(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:kS(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return uh(t.parser,e,"display")},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:YB,htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){Ob(t);var e={autoTag:kS(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return uh(t.parser,e,"display")},htmlBuilder:Ql,mathmlBuilder:Jl});Zl({type:"array",names:["CD"],props:{numArgs:0},handler(t){return Ob(t),bve(t.parser)},htmlBuilder:Ql,mathmlBuilder:Jl});le("\\nonumber","\\gdef\\@eqnsw{0}");le("\\notag","\\nonumber");vt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new nt(t.funcName+" valid only within array environment")}});QP=HB;vt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new nt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return Ar(t.body,n)},jB=(t,e)=>{var r=t.font,n=e.withFont(r);return hn(t.body,n)},JP={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};vt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=Ab(e[0]),a=n;return a in JP&&(a=JP[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},htmlBuilder:XB,mathmlBuilder:jB});vt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(t,e)=>{var{parser:r}=t,n=e[0],i=qt.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:Mb(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}}});vt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),o="math"+n.slice(1);return{type:"font",mode:a,font:o,body:{type:"ordgroup",mode:r.mode,body:s}}},htmlBuilder:XB,mathmlBuilder:jB});KB=(t,e)=>{var r=e;return t==="display"?r=r.id>=Xt.SCRIPT.id?r.text():Xt.DISPLAY:t==="text"&&r.size===Xt.DISPLAY.size?r=Xt.TEXT:t==="script"?r=Xt.SCRIPT:t==="scriptscript"&&(r=Xt.SCRIPTSCRIPT),r},ES=(t,e)=>{var r=KB(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=Ar(t.numer,a,e);if(t.continued){var o=8.5/e.fontMetrics().ptPerEm,l=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*d:g=7*d,m=e.fontMetrics().denom1):(f>0?(p=e.fontMetrics().num2,g=d):(p=e.fontMetrics().num3,g=3*d),m=e.fontMetrics().denom2);var y;if(h){var b=e.fontMetrics().axisHeight;p-s.depth-(b+.5*f){var r=new rt.MathNode("mfrac",[hn(t.numer,e),hn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=Wn(t.barSize,e);r.setAttribute("linethickness",ut(n))}var i=KB(t.size,e.style);if(i.size!==e.style.size){r=new rt.MathNode("mstyle",[r]);var a=i.size===Xt.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var o=new rt.MathNode("mo",[new rt.TextNode(t.leftDelim.replace("\\",""))]);o.setAttribute("fence","true"),s.push(o)}if(s.push(r),t.rightDelim!=null){var l=new rt.MathNode("mo",[new rt.TextNode(t.rightDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}return gS(s)}return r};vt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,o=null,l=null,u="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,o="(",l=")";break;case"\\\\bracefrac":s=!1,o="\\{",l="\\}";break;case"\\\\brackfrac":s=!1,o="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":u="display";break;case"\\tfrac":case"\\tbinom":u="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:o,rightDelim:l,size:u,barSize:null}},htmlBuilder:ES,mathmlBuilder:SS});vt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}});vt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});eB=["display","text","script","scriptscript"],tB=function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r};vt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=Ab(e[0]),s=a.type==="atom"&&a.family==="open"?tB(a.text):null,o=Ab(e[1]),l=o.type==="atom"&&o.family==="close"?tB(o.text):null,u=hr(e[2],"size"),h,f=null;u.isBlank?h=!0:(f=u.value,h=f.number>0);var d="auto",p=e[3];if(p.type==="ordgroup"){if(p.body.length>0){var g=hr(p.body[0],"textord");d=eB[Number(g.text)]}}else p=hr(p,"textord"),d=eB[Number(p.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:h,barSize:f,leftDelim:s,rightDelim:l,size:d}},htmlBuilder:ES,mathmlBuilder:SS});vt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:hr(e[0],"size").value,token:i}}});vt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=d1e(hr(e[1],"infix").size),s=e[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:ES,mathmlBuilder:SS});ZB=(t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?Ar(t.sup,e.havingStyle(r.sup()),e):Ar(t.sub,e.havingStyle(r.sub()),e),i=hr(t.base,"horizBrace")):i=hr(t,"horizBrace");var a=Ar(i.base,e.havingBaseStyle(Xt.DISPLAY)),s=tu.svgSpan(i,e),o;if(i.isOver?(o=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),o.children[0].children[0].children[1].classes.push("svg-align")):(o=Be.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),o.children[0].children[0].children[0].classes.push("svg-align")),n){var l=Be.makeSpan(["mord",i.isOver?"mover":"munder"],[o],e);i.isOver?o=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:n}]},e):o=Be.makeVList({positionType:"bottom",positionData:l.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Be.makeSpan(["mord",i.isOver?"mover":"munder"],[o],e)},Ove=(t,e)=>{var r=tu.mathMLnode(t.label);return new rt.MathNode(t.isOver?"mover":"munder",[hn(t.base,e),r])};vt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:ZB,mathmlBuilder:Ove});vt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(t,e)=>{var{parser:r}=t,n=e[1],i=hr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:si(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(t,e)=>{var r=Ti(t.body,e,!1);return Be.makeAnchor(t.href,[],r,e)},mathmlBuilder:(t,e)=>{var r=ch(t.body,e);return r instanceof us||(r=new us("mrow",[r])),r.setAttribute("href",t.href),r}});vt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(t,e)=>{var{parser:r}=t,n=hr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=hr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var o,l={};switch(n){case"\\htmlClass":l.class=a,o={command:"\\htmlClass",class:a};break;case"\\htmlId":l.id=a,o={command:"\\htmlId",id:a};break;case"\\htmlStyle":l.style=a,o={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var u=a.split(","),h=0;h{var r=Ti(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=Be.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},mathmlBuilder:(t,e)=>ch(t.body,e)});vt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:si(e[0]),mathml:si(e[1])}},htmlBuilder:(t,e)=>{var r=Ti(t.html,e,!1);return Be.makeFragment(r)},mathmlBuilder:(t,e)=>ch(t.mathml,e)});KE=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new nt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!mB(n))throw new nt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n};vt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},o="";if(r[0])for(var l=hr(r[0],"raw").string,u=l.split(","),h=0;h{var r=Wn(t.height,e),n=0;t.totalheight.number>0&&(n=Wn(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=Wn(t.width,e));var a={height:ut(r+n)};i>0&&(a.width=ut(i)),n>0&&(a.verticalAlign=ut(-n));var s=new rS(t.src,t.alt,a);return s.height=r,s.depth=n,s},mathmlBuilder:(t,e)=>{var r=new rt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=Wn(t.height,e),i=0;if(t.totalheight.number>0&&(i=Wn(t.totalheight,e)-n,r.setAttribute("valign",ut(-i))),r.setAttribute("height",ut(n+i)),t.width.number>0){var a=Wn(t.width,e);r.setAttribute("width",ut(a))}return r.setAttribute("src",t.src),r}});vt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=hr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return Be.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=Wn(t.dimension,e);return new rt.SpaceNode(r)}});vt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},htmlBuilder:(t,e)=>{var r;t.alignment==="clap"?(r=Be.makeSpan([],[Ar(t.body,e)]),r=Be.makeSpan(["inner"],[r],e)):r=Be.makeSpan(["inner"],[Ar(t.body,e)]);var n=Be.makeSpan(["fix"],[]),i=Be.makeSpan([t.alignment],[r,n],e),a=Be.makeSpan(["strut"]);return a.style.height=ut(i.height+i.depth),i.depth&&(a.style.verticalAlign=ut(-i.depth)),i.children.unshift(a),i=Be.makeSpan(["thinbox"],[i],e),Be.makeSpan(["mord","vbox"],[i],e)},mathmlBuilder:(t,e)=>{var r=new rt.MathNode("mpadded",[hn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}});vt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});vt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new nt("Mismatched "+t.funcName)}});rB=(t,e)=>{switch(e.style.size){case Xt.DISPLAY.size:return t.display;case Xt.TEXT.size:return t.text;case Xt.SCRIPT.size:return t.script;case Xt.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};vt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:si(e[0]),text:si(e[1]),script:si(e[2]),scriptscript:si(e[3])}},htmlBuilder:(t,e)=>{var r=rB(t,e),n=Ti(r,e,!1);return Be.makeFragment(n)},mathmlBuilder:(t,e)=>{var r=rB(t,e);return ch(r,e)}});QB=(t,e,r,n,i,a,s)=>{t=Be.makeSpan([],[t]);var o=r&&qt.isCharacterBox(r),l,u;if(e){var h=Ar(e,n.havingStyle(i.sup()),n);u={elem:h,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-h.depth)}}if(r){var f=Ar(r,n.havingStyle(i.sub()),n);l={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-f.height)}}var d;if(u&&l){var p=n.fontMetrics().bigOpSpacing5+l.elem.height+l.elem.depth+l.kern+t.depth+s;d=Be.makeVList({positionType:"bottom",positionData:p,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:ut(-a)},{type:"kern",size:l.kern},{type:"elem",elem:t},{type:"kern",size:u.kern},{type:"elem",elem:u.elem,marginLeft:ut(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(l){var g=t.height-s;d=Be.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:ut(-a)},{type:"kern",size:l.kern},{type:"elem",elem:t}]},n)}else if(u){var m=t.depth+s;d=Be.makeVList({positionType:"bottom",positionData:m,children:[{type:"elem",elem:t},{type:"kern",size:u.kern},{type:"elem",elem:u.elem,marginLeft:ut(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var y=[d];if(l&&a!==0&&!o){var x=Be.makeSpan(["mspace"],[],n);x.style.marginRight=ut(a),y.unshift(x)}return Be.makeSpan(["mop","op-limits"],y,n)},JB=["\\smallint"],K0=(t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=hr(t.base,"op"),i=!0):a=hr(t,"op");var s=e.style,o=!1;s.size===Xt.DISPLAY.size&&a.symbol&&!qt.contains(JB,a.name)&&(o=!0);var l;if(a.symbol){var u=o?"Size2-Regular":"Size1-Regular",h="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(h=a.name.slice(1),a.name=h==="oiint"?"\\iint":"\\iiint"),l=Be.makeSymbol(a.name,u,"math",e,["mop","op-symbol",o?"large-op":"small-op"]),h.length>0){var f=l.italic,d=Be.staticSvg(h+"Size"+(o?"2":"1"),e);l=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:l,shift:0},{type:"elem",elem:d,shift:o?.08:0}]},e),a.name="\\"+h,l.classes.unshift("mop"),l.italic=f}}else if(a.body){var p=Ti(a.body,e,!0);p.length===1&&p[0]instanceof hs?(l=p[0],l.classes[0]="mop"):l=Be.makeSpan(["mop"],p,e)}else{for(var g=[],m=1;m{var r;if(t.symbol)r=new us("mo",[yo(t.name,t.mode)]),qt.contains(JB,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new us("mo",fs(t.body,e));else{r=new us("mi",[new Mf(t.name.slice(1))]);var n=new us("mo",[yo("\u2061","text")]);t.parentIsSupSub?r=new us("mrow",[r,n]):r=AB([r,n])}return r},Pve={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};vt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=Pve[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},htmlBuilder:K0,mathmlBuilder:O1});vt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:si(n)}},htmlBuilder:K0,mathmlBuilder:O1});Bve={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};vt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:K0,mathmlBuilder:O1});vt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:K0,mathmlBuilder:O1});vt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=Bve[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:K0,mathmlBuilder:O1});eF=(t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=hr(t.base,"operatorname"),i=!0):a=hr(t,"operatorname");var s;if(a.body.length>0){for(var o=a.body.map(f=>{var d=f.text;return typeof d=="string"?{type:"textord",mode:f.mode,text:d}:f}),l=Ti(o,e.withFont("mathrm"),!0),u=0;u{for(var r=fs(t.body,e.withFont("mathrm")),n=!0,i=0;ih.toText()).join("");r=[new rt.TextNode(o)]}var l=new rt.MathNode("mi",r);l.setAttribute("mathvariant","normal");var u=new rt.MathNode("mo",[yo("\u2061","text")]);return t.parentIsSupSub?new rt.MathNode("mrow",[l,u]):rt.newDocumentFragment([l,u])};vt({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:si(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:eF,mathmlBuilder:Fve});le("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");Pf({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?Be.makeFragment(Ti(t.body,e,!1)):Be.makeSpan(["mord"],Ti(t.body,e,!0),e)},mathmlBuilder(t,e){return ch(t.body,e,!0)}});vt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=Ar(t.body,e.havingCrampedStyle()),n=Be.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return Be.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new rt.MathNode("mo",[new rt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new rt.MathNode("mover",[hn(t.body,e),r]);return n.setAttribute("accent","true"),n}});vt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:si(n)}},htmlBuilder:(t,e)=>{var r=Ti(t.body,e.withPhantom(),!1);return Be.makeFragment(r)},mathmlBuilder:(t,e)=>{var r=fs(t.body,e);return new rt.MathNode("mphantom",r)}});vt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},htmlBuilder:(t,e)=>{var r=Be.makeSpan([],[Ar(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=fs(si(t.body),e),n=new rt.MathNode("mphantom",r),i=new rt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i}});vt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:(t,e)=>{var r=Be.makeSpan(["inner"],[Ar(t.body,e.withPhantom())]),n=Be.makeSpan(["fix"],[]);return Be.makeSpan(["mord","rlap"],[r,n],e)},mathmlBuilder:(t,e)=>{var r=fs(si(t.body),e),n=new rt.MathNode("mphantom",r),i=new rt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i}});vt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=hr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=Ar(t.body,e),n=Wn(t.dy,e);return Be.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new rt.MathNode("mpadded",[hn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});vt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});vt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=hr(e[0],"size"),s=hr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&hr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=Be.makeSpan(["mord","rule"],[],e),n=Wn(t.width,e),i=Wn(t.height,e),a=t.shift?Wn(t.shift,e):0;return r.style.borderRightWidth=ut(n),r.style.borderTopWidth=ut(i),r.style.bottom=ut(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=Wn(t.width,e),n=Wn(t.height,e),i=t.shift?Wn(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new rt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",ut(r)),s.setAttribute("height",ut(n));var o=new rt.MathNode("mpadded",[s]);return i>=0?o.setAttribute("height",ut(i)):(o.setAttribute("height",ut(i)),o.setAttribute("depth",ut(-i))),o.setAttribute("voffset",ut(i)),o}});nB=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],zve=(t,e)=>{var r=e.havingSize(t.size);return tF(t.body,r,e)};vt({type:"sizing",names:nB,props:{numArgs:0,allowedInText:!0},handler:(t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:nB.indexOf(n)+1,body:a}},htmlBuilder:zve,mathmlBuilder:(t,e)=>{var r=e.havingSize(t.size),n=fs(t.body,r),i=new rt.MathNode("mstyle",n);return i.setAttribute("mathsize",ut(r.sizeMultiplier)),i}});vt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&hr(r[0],"ordgroup");if(s)for(var o="",l=0;l{var r=Be.makeSpan([],[Ar(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new rt.MathNode("mpadded",[hn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r}});vt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=Ar(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=Be.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+f-r.height-r.depth)/2);var d=l.height-r.height-s-u;r.style.paddingLeft=ut(h);var p=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+d)},{type:"elem",elem:l},{type:"kern",size:u}]},e);if(t.index){var g=e.havingStyle(Xt.SCRIPTSCRIPT),m=Ar(t.index,g,e),y=.6*(p.height-p.depth),x=Be.makeVList({positionType:"shift",positionData:-y,children:[{type:"elem",elem:m}]},e),b=Be.makeSpan(["root"],[x]);return Be.makeSpan(["mord","sqrt"],[b,p],e)}else return Be.makeSpan(["mord","sqrt"],[p],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new rt.MathNode("mroot",[hn(r,e),hn(n,e)]):new rt.MathNode("msqrt",[hn(r,e)])}});iB={display:Xt.DISPLAY,text:Xt.TEXT,script:Xt.SCRIPT,scriptscript:Xt.SCRIPTSCRIPT};vt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=iB[t.style],n=e.havingStyle(r).withFont("");return tF(t.body,n,e)},mathmlBuilder(t,e){var r=iB[t.style],n=e.havingStyle(r),i=fs(t.body,n),a=new rt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},o=s[t.style];return a.setAttribute("scriptlevel",o[0]),a.setAttribute("displaystyle",o[1]),a}});$ve=function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===Xt.DISPLAY.size||n.alwaysHandleSupSub);return i?K0:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===Xt.DISPLAY.size||n.limits);return a?eF:null}else{if(n.type==="accent")return qt.isCharacterBox(n.base)?yS:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?ZB:null}else return null}else return null};Pf({type:"supsub",htmlBuilder(t,e){var r=$ve(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=Ar(n,e),o,l,u=e.fontMetrics(),h=0,f=0,d=n&&qt.isCharacterBox(n);if(i){var p=e.havingStyle(e.style.sup());o=Ar(i,p,e),d||(h=s.height-p.fontMetrics().supDrop*p.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());l=Ar(a,g,e),d||(f=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var m;e.style===Xt.DISPLAY?m=u.sup1:e.style.cramped?m=u.sup3:m=u.sup2;var y=e.sizeMultiplier,x=ut(.5/u.ptPerEm/y),b=null;if(l){var w=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof hs||w)&&(b=ut(-s.italic))}var _;if(o&&l){h=Math.max(h,m,o.depth+.25*u.xHeight),f=Math.max(f,u.sub2);var k=u.defaultRuleThickness,E=4*k;if(h-o.depth-(l.height-f)0&&(h+=L,f-=L)}var S=[{type:"elem",elem:l,shift:f,marginRight:x,marginLeft:b},{type:"elem",elem:o,shift:-h,marginRight:x}];_=Be.makeVList({positionType:"individualShift",children:S},e)}else if(l){f=Math.max(f,u.sub1,l.height-.8*u.xHeight);var C=[{type:"elem",elem:l,marginLeft:b,marginRight:x}];_=Be.makeVList({positionType:"shift",positionData:f,children:C},e)}else if(o)h=Math.max(h,m,o.depth+.25*u.xHeight),_=Be.makeVList({positionType:"shift",positionData:-h,children:[{type:"elem",elem:o,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var M=iS(s,"right")||"mord";return Be.makeSpan([M],[s,Be.makeSpan(["msupsub"],[_])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[hn(t.base,e)];t.sub&&a.push(hn(t.sub,e)),t.sup&&a.push(hn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var u=t.base;u&&u.type==="op"&&u.limits&&e.style===Xt.DISPLAY||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(e.style===Xt.DISPLAY||u.limits)?s="munderover":s="msubsup"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===Xt.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===Xt.DISPLAY)?s="munder":s="msub"}else{var o=t.base;o&&o.type==="op"&&o.limits&&(e.style===Xt.DISPLAY||o.alwaysHandleSupSub)||o&&o.type==="operatorname"&&o.alwaysHandleSupSub&&(o.limits||e.style===Xt.DISPLAY)?s="mover":s="msup"}return new rt.MathNode(s,a)}});Pf({type:"atom",htmlBuilder(t,e){return Be.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new rt.MathNode("mo",[yo(t.text,t.mode)]);if(t.family==="bin"){var n=mS(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});rF={mi:"italic",mn:"normal",mtext:"normal"};Pf({type:"mathord",htmlBuilder(t,e){return Be.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new rt.MathNode("mi",[yo(t.text,t.mode,e)]),n=mS(t,e)||"italic";return n!==rF[r.type]&&r.setAttribute("mathvariant",n),r}});Pf({type:"textord",htmlBuilder(t,e){return Be.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=yo(t.text,t.mode,e),n=mS(t,e)||"normal",i;return t.mode==="text"?i=new rt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new rt.MathNode("mn",[r]):t.text==="\\prime"?i=new rt.MathNode("mo",[r]):i=new rt.MathNode("mi",[r]),n!==rF[i.type]&&i.setAttribute("mathvariant",n),i}});ZE={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},QE={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Pf({type:"spacing",htmlBuilder(t,e){if(QE.hasOwnProperty(t.text)){var r=QE[t.text].className||"";if(t.mode==="text"){var n=Be.makeOrd(t,e,"textord");return n.classes.push(r),n}else return Be.makeSpan(["mspace",r],[Be.mathsym(t.text,t.mode,e)],e)}else{if(ZE.hasOwnProperty(t.text))return Be.makeSpan(["mspace",ZE[t.text]],[],e);throw new nt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(QE.hasOwnProperty(t.text))r=new rt.MathNode("mtext",[new rt.TextNode("\xA0")]);else{if(ZE.hasOwnProperty(t.text))return new rt.MathNode("mspace");throw new nt('Unknown type of space "'+t.text+'"')}return r}});aB=()=>{var t=new rt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};Pf({type:"tag",mathmlBuilder(t,e){var r=new rt.MathNode("mtable",[new rt.MathNode("mtr",[aB(),new rt.MathNode("mtd",[ch(t.body,e)]),aB(),new rt.MathNode("mtd",[ch(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});sB={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},oB={"\\textbf":"textbf","\\textmd":"textmd"},Gve={"\\textit":"textit","\\textup":"textup"},lB=(t,e)=>{var r=t.font;if(r){if(sB[r])return e.withTextFontFamily(sB[r]);if(oB[r])return e.withTextFontWeight(oB[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(Gve[r])};vt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:si(i),font:n}},htmlBuilder(t,e){var r=lB(t,e),n=Ti(t.body,r,!0);return Be.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=lB(t,e);return ch(t.body,r)}});vt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Ar(t.body,e),n=Be.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Be.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return Be.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new rt.MathNode("mo",[new rt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new rt.MathNode("munder",[hn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});vt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Ar(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return Be.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new rt.MathNode("mpadded",[hn(t.body,e)],["vcenter"])}});vt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new nt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=cB(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),oh=SB,nF=`[ \r ]`,Uve="\\\\[a-zA-Z@]+",Vve="\\\\[^\uD800-\uDFFF]",Wve="("+Uve+")"+nF+"*",Hve=`\\\\( |[ \r ]+ ?)[ \r ]*`,cS="[\u0300-\u036F]",qve=new RegExp(cS+"+$"),Yve="("+nF+"+)|"+(Hve+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(cS+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(cS+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+Wve)+("|"+Vve+")"),_b=class{constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(Yve,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new vo("EOF",new Gs(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new nt("Unexpected character: '"+e[r]+"'",new vo(e[r],new Gs(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` `,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new vo(i,new Gs(this,r,this.tokenRegex.lastIndex))}},uS=class{constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new nt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},Xve=qB;le("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});le("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});le("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});le("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});le("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});le("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");le("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});uB={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};le("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new nt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=uB[e.text],n==null||n>=r)throw new nt("Invalid base-"+r+" digit "+e.text);for(var i;(i=uB[t.future().text])!=null&&i{var n=t.consumeArg().tokens;if(n.length!==1)throw new nt("\\newcommand's first argument must be a macro name");var i=n[0].text,a=t.isDefined(i);if(a&&!e)throw new nt("\\newcommand{"+i+"} attempting to redefine "+(i+"; use \\renewcommand"));if(!a&&!r)throw new nt("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");var s=0;if(n=t.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var o="",l=t.expandNextToken();l.text!=="]"&&l.text!=="EOF";)o+=l.text,l=t.expandNextToken();if(!o.match(/^\s*[0-9]+\s*$/))throw new nt("Invalid number of arguments: "+o);s=parseInt(o),n=t.consumeArg().tokens}return t.macros.set(i,{tokens:n,numArgs:s}),""};le("\\newcommand",t=>CS(t,!1,!0));le("\\renewcommand",t=>CS(t,!0,!1));le("\\providecommand",t=>CS(t,!0,!0));le("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});le("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});le("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),oh[r],wn.math[r],wn.text[r]),""});le("\\bgroup","{");le("\\egroup","}");le("~","\\nobreakspace");le("\\lq","`");le("\\rq","'");le("\\aa","\\r a");le("\\AA","\\r A");le("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");le("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");le("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");le("\u212C","\\mathscr{B}");le("\u2130","\\mathscr{E}");le("\u2131","\\mathscr{F}");le("\u210B","\\mathscr{H}");le("\u2110","\\mathscr{I}");le("\u2112","\\mathscr{L}");le("\u2133","\\mathscr{M}");le("\u211B","\\mathscr{R}");le("\u212D","\\mathfrak{C}");le("\u210C","\\mathfrak{H}");le("\u2128","\\mathfrak{Z}");le("\\Bbbk","\\Bbb{k}");le("\xB7","\\cdotp");le("\\llap","\\mathllap{\\textrm{#1}}");le("\\rlap","\\mathrlap{\\textrm{#1}}");le("\\clap","\\mathclap{\\textrm{#1}}");le("\\mathstrut","\\vphantom{(}");le("\\underbar","\\underline{\\text{#1}}");le("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');le("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");le("\\ne","\\neq");le("\u2260","\\neq");le("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");le("\u2209","\\notin");le("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");le("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");le("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");le("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");le("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");le("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");le("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");le("\u27C2","\\perp");le("\u203C","\\mathclose{!\\mkern-0.8mu!}");le("\u220C","\\notni");le("\u231C","\\ulcorner");le("\u231D","\\urcorner");le("\u231E","\\llcorner");le("\u231F","\\lrcorner");le("\xA9","\\copyright");le("\xAE","\\textregistered");le("\uFE0F","\\textregistered");le("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');le("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');le("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');le("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');le("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}");le("\u22EE","\\vdots");le("\\varGamma","\\mathit{\\Gamma}");le("\\varDelta","\\mathit{\\Delta}");le("\\varTheta","\\mathit{\\Theta}");le("\\varLambda","\\mathit{\\Lambda}");le("\\varXi","\\mathit{\\Xi}");le("\\varPi","\\mathit{\\Pi}");le("\\varSigma","\\mathit{\\Sigma}");le("\\varUpsilon","\\mathit{\\Upsilon}");le("\\varPhi","\\mathit{\\Phi}");le("\\varPsi","\\mathit{\\Psi}");le("\\varOmega","\\mathit{\\Omega}");le("\\substack","\\begin{subarray}{c}#1\\end{subarray}");le("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");le("\\boxed","\\fbox{$\\displaystyle{#1}$}");le("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");le("\\implies","\\DOTSB\\;\\Longrightarrow\\;");le("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");hB={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};le("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in hB?e=hB[r]:(r.slice(0,4)==="\\not"||r in wn.math&&qt.contains(["bin","rel"],wn.math[r].group))&&(e="\\dotsb"),e});AS={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};le("\\dotso",function(t){var e=t.future().text;return e in AS?"\\ldots\\,":"\\ldots"});le("\\dotsc",function(t){var e=t.future().text;return e in AS&&e!==","?"\\ldots\\,":"\\ldots"});le("\\cdots",function(t){var e=t.future().text;return e in AS?"\\@cdots\\,":"\\@cdots"});le("\\dotsb","\\cdots");le("\\dotsm","\\cdots");le("\\dotsi","\\!\\cdots");le("\\dotsx","\\ldots\\,");le("\\DOTSI","\\relax");le("\\DOTSB","\\relax");le("\\DOTSX","\\relax");le("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");le("\\,","\\tmspace+{3mu}{.1667em}");le("\\thinspace","\\,");le("\\>","\\mskip{4mu}");le("\\:","\\tmspace+{4mu}{.2222em}");le("\\medspace","\\:");le("\\;","\\tmspace+{5mu}{.2777em}");le("\\thickspace","\\;");le("\\!","\\tmspace-{3mu}{.1667em}");le("\\negthinspace","\\!");le("\\negmedspace","\\tmspace-{4mu}{.2222em}");le("\\negthickspace","\\tmspace-{5mu}{.277em}");le("\\enspace","\\kern.5em ");le("\\enskip","\\hskip.5em\\relax");le("\\quad","\\hskip1em\\relax");le("\\qquad","\\hskip2em\\relax");le("\\tag","\\@ifstar\\tag@literal\\tag@paren");le("\\tag@paren","\\tag@literal{({#1})}");le("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new nt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});le("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");le("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");le("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");le("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");le("\\newline","\\\\\\relax");le("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");iF=ut(jl["Main-Regular"][84][1]-.7*jl["Main-Regular"][65][1]);le("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+iF+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");le("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+iF+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");le("\\hspace","\\@ifstar\\@hspacer\\@hspace");le("\\@hspace","\\hskip #1\\relax");le("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");le("\\ordinarycolon",":");le("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");le("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');le("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');le("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');le("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');le("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');le("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');le("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');le("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');le("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');le("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');le("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');le("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');le("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');le("\u2237","\\dblcolon");le("\u2239","\\eqcolon");le("\u2254","\\coloneqq");le("\u2255","\\eqqcolon");le("\u2A74","\\Coloneqq");le("\\ratio","\\vcentcolon");le("\\coloncolon","\\dblcolon");le("\\colonequals","\\coloneqq");le("\\coloncolonequals","\\Coloneqq");le("\\equalscolon","\\eqqcolon");le("\\equalscoloncolon","\\Eqqcolon");le("\\colonminus","\\coloneq");le("\\coloncolonminus","\\Coloneq");le("\\minuscolon","\\eqcolon");le("\\minuscoloncolon","\\Eqcolon");le("\\coloncolonapprox","\\Colonapprox");le("\\coloncolonsim","\\Colonsim");le("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");le("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");le("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");le("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");le("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");le("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");le("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");le("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");le("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");le("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");le("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");le("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");le("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");le("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");le("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");le("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");le("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");le("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");le("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");le("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");le("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");le("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");le("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");le("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");le("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");le("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");le("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");le("\\imath","\\html@mathml{\\@imath}{\u0131}");le("\\jmath","\\html@mathml{\\@jmath}{\u0237}");le("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");le("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");le("\u27E6","\\llbracket");le("\u27E7","\\rrbracket");le("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");le("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");le("\u2983","\\lBrace");le("\u2984","\\rBrace");le("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");le("\u29B5","\\minuso");le("\\darr","\\downarrow");le("\\dArr","\\Downarrow");le("\\Darr","\\Downarrow");le("\\lang","\\langle");le("\\rang","\\rangle");le("\\uarr","\\uparrow");le("\\uArr","\\Uparrow");le("\\Uarr","\\Uparrow");le("\\N","\\mathbb{N}");le("\\R","\\mathbb{R}");le("\\Z","\\mathbb{Z}");le("\\alef","\\aleph");le("\\alefsym","\\aleph");le("\\Alpha","\\mathrm{A}");le("\\Beta","\\mathrm{B}");le("\\bull","\\bullet");le("\\Chi","\\mathrm{X}");le("\\clubs","\\clubsuit");le("\\cnums","\\mathbb{C}");le("\\Complex","\\mathbb{C}");le("\\Dagger","\\ddagger");le("\\diamonds","\\diamondsuit");le("\\empty","\\emptyset");le("\\Epsilon","\\mathrm{E}");le("\\Eta","\\mathrm{H}");le("\\exist","\\exists");le("\\harr","\\leftrightarrow");le("\\hArr","\\Leftrightarrow");le("\\Harr","\\Leftrightarrow");le("\\hearts","\\heartsuit");le("\\image","\\Im");le("\\infin","\\infty");le("\\Iota","\\mathrm{I}");le("\\isin","\\in");le("\\Kappa","\\mathrm{K}");le("\\larr","\\leftarrow");le("\\lArr","\\Leftarrow");le("\\Larr","\\Leftarrow");le("\\lrarr","\\leftrightarrow");le("\\lrArr","\\Leftrightarrow");le("\\Lrarr","\\Leftrightarrow");le("\\Mu","\\mathrm{M}");le("\\natnums","\\mathbb{N}");le("\\Nu","\\mathrm{N}");le("\\Omicron","\\mathrm{O}");le("\\plusmn","\\pm");le("\\rarr","\\rightarrow");le("\\rArr","\\Rightarrow");le("\\Rarr","\\Rightarrow");le("\\real","\\Re");le("\\reals","\\mathbb{R}");le("\\Reals","\\mathbb{R}");le("\\Rho","\\mathrm{P}");le("\\sdot","\\cdot");le("\\sect","\\S");le("\\spades","\\spadesuit");le("\\sub","\\subset");le("\\sube","\\subseteq");le("\\supe","\\supseteq");le("\\Tau","\\mathrm{T}");le("\\thetasym","\\vartheta");le("\\weierp","\\wp");le("\\Zeta","\\mathrm{Z}");le("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");le("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");le("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");le("\\bra","\\mathinner{\\langle{#1}|}");le("\\ket","\\mathinner{|{#1}\\rangle}");le("\\braket","\\mathinner{\\langle{#1}\\rangle}");le("\\Bra","\\left\\langle#1\\right|");le("\\Ket","\\left|#1\\right\\rangle");aF=t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),o=e.macros.get("\\|");e.macros.beginGroup();var l=f=>d=>{t&&(d.macros.set("|",s),i.length&&d.macros.set("\\|",o));var p=f;if(!f&&i.length){var g=d.future();g.text==="|"&&(d.popToken(),p=!0)}return{tokens:p?i:n,numArgs:0}};e.macros.set("|",l(!1)),i.length&&e.macros.set("\\|",l(!0));var u=e.consumeArg().tokens,h=e.expandTokens([...a,...u,...r]);return e.macros.endGroup(),{tokens:h.reverse(),numArgs:0}};le("\\bra@ket",aF(!1));le("\\bra@set",aF(!0));le("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");le("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");le("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");le("\\angln","{\\angl n}");le("\\blue","\\textcolor{##6495ed}{#1}");le("\\orange","\\textcolor{##ffa500}{#1}");le("\\pink","\\textcolor{##ff00af}{#1}");le("\\red","\\textcolor{##df0030}{#1}");le("\\green","\\textcolor{##28ae7b}{#1}");le("\\gray","\\textcolor{gray}{#1}");le("\\purple","\\textcolor{##9d38bd}{#1}");le("\\blueA","\\textcolor{##ccfaff}{#1}");le("\\blueB","\\textcolor{##80f6ff}{#1}");le("\\blueC","\\textcolor{##63d9ea}{#1}");le("\\blueD","\\textcolor{##11accd}{#1}");le("\\blueE","\\textcolor{##0c7f99}{#1}");le("\\tealA","\\textcolor{##94fff5}{#1}");le("\\tealB","\\textcolor{##26edd5}{#1}");le("\\tealC","\\textcolor{##01d1c1}{#1}");le("\\tealD","\\textcolor{##01a995}{#1}");le("\\tealE","\\textcolor{##208170}{#1}");le("\\greenA","\\textcolor{##b6ffb0}{#1}");le("\\greenB","\\textcolor{##8af281}{#1}");le("\\greenC","\\textcolor{##74cf70}{#1}");le("\\greenD","\\textcolor{##1fab54}{#1}");le("\\greenE","\\textcolor{##0d923f}{#1}");le("\\goldA","\\textcolor{##ffd0a9}{#1}");le("\\goldB","\\textcolor{##ffbb71}{#1}");le("\\goldC","\\textcolor{##ff9c39}{#1}");le("\\goldD","\\textcolor{##e07d10}{#1}");le("\\goldE","\\textcolor{##a75a05}{#1}");le("\\redA","\\textcolor{##fca9a9}{#1}");le("\\redB","\\textcolor{##ff8482}{#1}");le("\\redC","\\textcolor{##f9685d}{#1}");le("\\redD","\\textcolor{##e84d39}{#1}");le("\\redE","\\textcolor{##bc2612}{#1}");le("\\maroonA","\\textcolor{##ffbde0}{#1}");le("\\maroonB","\\textcolor{##ff92c6}{#1}");le("\\maroonC","\\textcolor{##ed5fa6}{#1}");le("\\maroonD","\\textcolor{##ca337c}{#1}");le("\\maroonE","\\textcolor{##9e034e}{#1}");le("\\purpleA","\\textcolor{##ddd7ff}{#1}");le("\\purpleB","\\textcolor{##c6b9fc}{#1}");le("\\purpleC","\\textcolor{##aa87ff}{#1}");le("\\purpleD","\\textcolor{##7854ab}{#1}");le("\\purpleE","\\textcolor{##543b78}{#1}");le("\\mintA","\\textcolor{##f5f9e8}{#1}");le("\\mintB","\\textcolor{##edf2df}{#1}");le("\\mintC","\\textcolor{##e0e5cc}{#1}");le("\\grayA","\\textcolor{##f6f7f7}{#1}");le("\\grayB","\\textcolor{##f0f1f2}{#1}");le("\\grayC","\\textcolor{##e3e5e6}{#1}");le("\\grayD","\\textcolor{##d6d8da}{#1}");le("\\grayE","\\textcolor{##babec2}{#1}");le("\\grayF","\\textcolor{##888d93}{#1}");le("\\grayG","\\textcolor{##626569}{#1}");le("\\grayH","\\textcolor{##3b3e40}{#1}");le("\\grayI","\\textcolor{##21242c}{#1}");le("\\kaBlue","\\textcolor{##314453}{#1}");le("\\kaGreen","\\textcolor{##71B307}{#1}");sF={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},hS=class{constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new uS(Xve,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new _b(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new vo("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,o=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new nt("Extra }",a)}else if(a.text==="EOF")throw new nt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[o]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[o]==="{")&&a.text===e[o]){if(++o,o===e.length){r.splice(-o,o);break}}else o=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new nt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new nt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new nt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var o=a.length-1;o>=0;--o){var l=a[o];if(l.text==="#"){if(o===0)throw new nt("Incomplete placeholder at end of macro body",l);if(l=a[--o],l.text==="#")a.splice(o+1,1);else if(/^[1-9]$/.test(l.text))a.splice(o,2,...s[+l.text-1]);else throw new nt("Not a valid argument number",l)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new vo(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var o=new _b(i,this.settings),l=[],u=o.lex();u.text!=="EOF";)l.push(u),u=o.lex();l.reverse();var h={tokens:l,numArgs:a};return h}return i}isDefined(e){return this.macros.has(e)||oh.hasOwnProperty(e)||wn.math.hasOwnProperty(e)||wn.text.hasOwnProperty(e)||sF.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:oh.hasOwnProperty(e)&&!oh[e].primitive}},fB=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,xb=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),JE={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},dB={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Lb=class t{constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new hS(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new nt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new vo("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&oh[i.text]&&oh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var o=wn[this.mode][r].group,l=Gs.range(e),u;if(z1e.hasOwnProperty(o)){var h=o;u={type:"atom",mode:this.mode,family:h,loc:l,text:r}}else u={type:o,mode:this.mode,loc:l,text:r};s=u}else if(r.charCodeAt(0)>=128)this.settings.strict&&(gB(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:Gs.range(e),text:r};else return null;if(this.consume(),a)for(var f=0;f{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),Q0.default.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var mF,Q0,gF,v,MS,nu,re,Fb,xo,DS,J0,Jve,OS,Bf,F1,PS,vF,yF,RS,Hn,zb,$b,Wa,eye,tye,rye,nye,iye,z1,aye,sye,oye,lye,ec,hh,xF,bF,cye,sr,B1,uye,Ff,ds,wF,Z0,P1,Gb,kF,TF,EF,BS,FS,Or,SF,CF,$1,hye,hF,fye,AF,zf,dye,pye,LF,fF,yr,gye,mye,vye,yye,RF,xye,Wr,bye,wye,iu,NS,kye,Tye,dF,IS,Ei,ep,fh,Xe,Eye,Sye,Hr,il,Pb,Cye,Aye,NF,Ub,zS,$S,GS,US,xr,Tr,_r,Lr,Rr,tn,qr,pF,_ye,pe,VS,Vb,WS,HS,Lye,Bb,G1,Wb,Rye,or=F(()=>{mF=Gi(nb(),1);go();go();go();go();go();go();Q0=Gi(GE(),1),gF=Object.defineProperty,v=(t,e)=>gF(t,"name",{value:e,configurable:!0}),MS=(t,e)=>{for(var r in e)gF(t,r,{get:e[r],enumerable:!0})},nu={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},re={trace:v((...t)=>{},"trace"),debug:v((...t)=>{},"debug"),info:v((...t)=>{},"info"),warn:v((...t)=>{},"warn"),error:v((...t)=>{},"error"),fatal:v((...t)=>{},"fatal")},Fb=v(function(t="fatal"){let e=nu.fatal;typeof t=="string"?t.toLowerCase()in nu&&(e=nu[t]):typeof t=="number"&&(e=t),re.trace=()=>{},re.debug=()=>{},re.info=()=>{},re.warn=()=>{},re.error=()=>{},re.fatal=()=>{},e<=nu.fatal&&(re.fatal=console.error?console.error.bind(console,xo("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",xo("FATAL"))),e<=nu.error&&(re.error=console.error?console.error.bind(console,xo("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",xo("ERROR"))),e<=nu.warn&&(re.warn=console.warn?console.warn.bind(console,xo("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",xo("WARN"))),e<=nu.info&&(re.info=console.info?console.info.bind(console,xo("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",xo("INFO"))),e<=nu.debug&&(re.debug=console.debug?console.debug.bind(console,xo("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",xo("DEBUG"))),e<=nu.trace&&(re.trace=console.debug?console.debug.bind(console,xo("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",xo("TRACE")))},"setLogLevel"),xo=v(t=>`%c${(0,mF.default)().format("ss.SSS")} : ${t} : `,"format"),DS=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,J0=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Jve=/\s*%%.*\n/gm,OS=class extends Error{static{v(this,"UnknownDiagramError")}constructor(t){super(t),this.name="UnknownDiagramError"}},Bf={},F1=v(function(t,e){t=t.replace(DS,"").replace(J0,"").replace(Jve,` `);for(let[r,{detector:n}]of Object.entries(Bf))if(n(t,e))return r;throw new OS(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),PS=v((...t)=>{for(let{id:e,detector:r,loader:n}of t)vF(e,r,n)},"registerLazyLoadedDiagrams"),vF=v((t,e,r)=>{Bf[t]&&re.warn(`Detector with key ${t} already exists. Overwriting.`),Bf[t]={detector:e,loader:r},re.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),yF=v(t=>Bf[t].loader,"getDiagramLoader"),RS=v((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>RS(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=RS(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Hn=RS,zb="#ffffff",$b="#f2f2f2",Wa=v((t,e)=>e?Me(t,{s:-40,l:10}):Me(t,{s:-40,l:-10}),"mkBorder"),eye=class{static{v(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Me(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Me(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Wa(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Wa(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Wa(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Wa(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||ct(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||ct(this.tertiaryColor),this.lineColor=this.lineColor||ct(this.background),this.arrowheadColor=this.arrowheadColor||ct(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Lt(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Lt(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||ct(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||kt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e{this[r]=t[r]}),this.updateColors(),e.forEach(r=>{this[r]=t[r]})}},tye=v(t=>{let e=new eye;return e.calculate(t),e},"getThemeVariables"),rye=class{static{v(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=kt(this.primaryColor,16),this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=ct(this.background),this.secondaryBorderColor=Wa(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Wa(this.tertiaryColor,this.darkMode),this.primaryTextColor=ct(this.primaryColor),this.secondaryTextColor=ct(this.secondaryColor),this.tertiaryTextColor=ct(this.tertiaryColor),this.lineColor=ct(this.background),this.textColor=ct(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=kt(ct("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=$s(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Lt("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Lt(this.sectionBkgColor,10),this.taskBorderColor=$s(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=$s(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=kt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=kt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=kt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Me(this.primaryColor,{h:64}),this.fillType3=Me(this.secondaryColor,{h:64}),this.fillType4=Me(this.primaryColor,{h:-64}),this.fillType5=Me(this.secondaryColor,{h:-64}),this.fillType6=Me(this.primaryColor,{h:128}),this.fillType7=Me(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330});for(let t=0;t{this[r]=t[r]}),this.updateColors(),e.forEach(r=>{this[r]=t[r]})}},nye=v(t=>{let e=new rye;return e.calculate(t),e},"getThemeVariables"),iye=class{static{v(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Me(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Wa(this.primaryColor,this.darkMode),this.secondaryBorderColor=Wa(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Wa(this.tertiaryColor,this.darkMode),this.primaryTextColor=ct(this.primaryColor),this.secondaryTextColor=ct(this.secondaryColor),this.tertiaryTextColor=ct(this.tertiaryColor),this.lineColor=ct(this.background),this.textColor=ct(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=$s(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Lt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Lt(this.tertiaryColor,40);for(let t=0;t{this[r]=t[r]}),this.updateColors(),e.forEach(r=>{this[r]=t[r]})}},z1=v(t=>{let e=new iye;return e.calculate(t),e},"getThemeVariables"),aye=class{static{v(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=kt("#cde498",10),this.primaryBorderColor=Wa(this.primaryColor,this.darkMode),this.secondaryBorderColor=Wa(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Wa(this.tertiaryColor,this.darkMode),this.primaryTextColor=ct(this.primaryColor),this.secondaryTextColor=ct(this.secondaryColor),this.tertiaryTextColor=ct(this.primaryColor),this.lineColor=ct(this.background),this.textColor=ct(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Lt(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Lt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Lt(this.tertiaryColor,40);for(let t=0;t{this[r]=t[r]}),this.updateColors(),e.forEach(r=>{this[r]=t[r]})}},sye=v(t=>{let e=new aye;return e.calculate(t),e},"getThemeVariables"),oye=class{static{v(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=kt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Wa(this.primaryColor,this.darkMode),this.secondaryBorderColor=Wa(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Wa(this.tertiaryColor,this.darkMode),this.primaryTextColor=ct(this.primaryColor),this.secondaryTextColor=ct(this.secondaryColor),this.tertiaryTextColor=ct(this.tertiaryColor),this.lineColor=ct(this.background),this.textColor=ct(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=kt(this.contrast,55),this.border2=this.contrast,this.actorBorder=kt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t{this[r]=t[r]}),this.updateColors(),e.forEach(r=>{this[r]=t[r]})}},lye=v(t=>{let e=new oye;return e.calculate(t),e},"getThemeVariables"),ec={base:{getThemeVariables:tye},dark:{getThemeVariables:nye},default:{getThemeVariables:z1},forest:{getThemeVariables:sye},neutral:{getThemeVariables:lye}},hh={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1},xF={...hh,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF"},themeCSS:void 0,themeVariables:ec.default.getThemeVariables(),sequence:{...hh.sequence,messageFont:v(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:v(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:v(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...hh.gantt,tickInterval:void 0,useWidth:void 0},c4:{...hh.c4,useWidth:void 0,personFont:v(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),external_personFont:v(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:v(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:v(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:v(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:v(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:v(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:v(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:v(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:v(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:v(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:v(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:v(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:v(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:v(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:v(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:v(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:v(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:v(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:v(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:v(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:v(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...hh.pie,useWidth:984},xyChart:{...hh.xyChart,useWidth:void 0},requirement:{...hh.requirement,useWidth:void 0},packet:{...hh.packet}},bF=v((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...bF(t[n],"")]:[...r,e+n],[]),"keyify"),cye=new Set(bF(xF,"")),sr=xF,B1=v(t=>{if(re.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>B1(e));return}for(let e of Object.keys(t)){if(re.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!cye.has(e)||t[e]==null){re.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){re.debug("sanitizing object",e),B1(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(re.debug("sanitizing css option",e),t[e]=uye(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}re.debug("After sanitization",t)}},"sanitizeDirective"),uye=v(t=>{let e=0,r=0;for(let n of t){if(e{let r=Hn({},t),n={};for(let i of e)SF(i),n=Hn(n,i);if(r=Hn(r,n),n.theme&&n.theme in ec){let i=Hn({},wF),a=Hn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in ec&&(r.themeVariables=ec[r.theme].getThemeVariables(a))}return P1=r,AF(P1),P1},"updateCurrentConfig"),kF=v(t=>(ds=Hn({},Ff),ds=Hn(ds,t),t.theme&&ec[t.theme]&&(ds.themeVariables=ec[t.theme].getThemeVariables(t.themeVariables)),Gb(ds,Z0),ds),"setSiteConfig"),TF=v(t=>{wF=Hn({},t)},"saveConfigFromInitialize"),EF=v(t=>(ds=Hn(ds,t),Gb(ds,Z0),ds),"updateSiteConfig"),BS=v(()=>Hn({},ds),"getSiteConfig"),FS=v(t=>(AF(t),Hn(P1,t),Or()),"setConfig"),Or=v(()=>Hn({},P1),"getConfig"),SF=v(t=>{t&&(["secure",...ds.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(re.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&SF(t[e])}))},"sanitize"),CF=v(t=>{B1(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),Z0.push(t),Gb(ds,Z0)},"addDirective"),$1=v((t=ds)=>{Z0=[],Gb(t,Z0)},"reset"),hye={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},hF={},fye=v(t=>{hF[t]||(re.warn(hye[t]),hF[t]=!0)},"issueWarning"),AF=v(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&fye("LAZY_LOAD_DEPRECATED")},"checkConfig"),zf=//gi,dye=v(t=>t?RF(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),pye=(()=>{let t=!1;return()=>{t||(_F(),t=!0)}})();v(_F,"setupDompurifyHooks");LF=v(t=>(pye(),Q0.default.sanitize(t)),"removeScript"),fF=v((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=LF(t):r!=="loose"&&(t=RF(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=yye(t))}return t},"sanitizeMore"),yr=v((t,e)=>t&&(e.dompurifyConfig?t=Q0.default.sanitize(fF(t,e),e.dompurifyConfig).toString():t=Q0.default.sanitize(fF(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),gye=v((t,e)=>typeof t=="string"?yr(t,e):t.flat().map(r=>yr(r,e)),"sanitizeTextOrArray"),mye=v(t=>zf.test(t),"hasBreaks"),vye=v(t=>t.split(zf),"splitBreaks"),yye=v(t=>t.replace(/#br#/g,"
"),"placeholderToBreak"),RF=v(t=>t.replace(zf,"#br#"),"breakToPlaceholder"),xye=v(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},"getUrl"),Wr=v(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),bye=v(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),wye=v(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),iu=v(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),kye=v((t,e)=>{let r=NS(t,"~"),n=NS(e,"~");return r===1&&n===1},"shouldCombineSets"),Tye=v(t=>{let e=NS(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),dF=v(()=>window.MathMLElement!==void 0,"isMathMLSupported"),IS=/\$\$(.*)\$\$/g,Ei=v(t=>(t.match(IS)?.length??0)>0,"hasKatex"),ep=v(async(t,e)=>{t=await fh(t,e);let r=document.createElement("div");r.innerHTML=t,r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),fh=v(async(t,e)=>{if(!Ei(t))return t;if(!(dF()||e.legacyMathML||e.forceLegacyMathML))return t.replace(IS,"MathML is unsupported in this environment.");let{default:r}=await Promise.resolve().then(()=>(uF(),cF)),n=e.forceLegacyMathML||!dF()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(zf).map(i=>Ei(i)?`
${i}
`:`
${i}
`).join("").replace(IS,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))},"renderKatex"),Xe={getRows:dye,sanitizeText:yr,sanitizeTextOrArray:gye,hasBreaks:mye,splitBreaks:vye,lineBreakRegex:zf,removeScript:LF,getUrl:xye,evaluate:Wr,getMax:bye,getMin:wye},Eye=v(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),Sye=v(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),Hr=v(function(t,e,r,n){let i=Sye(e,r,n);Eye(t,i)},"configureSvgSize"),il=v(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;re.info(`SVG bounds: ${a}x${s}`,i);let o=0,l=0;re.info(`Graph bounds: ${o}x${l}`,t),o=a+r*2,l=s+r*2,re.info(`Calculated bounds: ${o}x${l}`),Hr(e,l,o,n);let u=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",u)},"setupGraphViewbox"),Pb={},Cye=v((t,e,r)=>{let n="";return t in Pb&&Pb[t]?n=Pb[t](r):re.warn(`No theme found for ${t}`),` & { font-family: ${r.fontFamily}; font-size: ${r.fontSize}; fill: ${r.textColor} } /* Classes common for multiple diagrams */ & .error-icon { fill: ${r.errorBkgColor}; } & .error-text { fill: ${r.errorTextColor}; stroke: ${r.errorTextColor}; } & .edge-thickness-normal { stroke-width: 1px; } & .edge-thickness-thick { stroke-width: 3.5px } & .edge-pattern-solid { stroke-dasharray: 0; } & .edge-thickness-invisible { stroke-width: 0; fill: none; } & .edge-pattern-dashed{ stroke-dasharray: 3; } .edge-pattern-dotted { stroke-dasharray: 2; } & .marker { fill: ${r.lineColor}; stroke: ${r.lineColor}; } & .marker.cross { stroke: ${r.lineColor}; } & svg { font-family: ${r.fontFamily}; font-size: ${r.fontSize}; } & p { margin: 0 } ${n} ${e} `},"getStyles"),Aye=v((t,e)=>{e!==void 0&&(Pb[t]=e)},"addStylesForDiagram"),NF=Cye,Ub={};MS(Ub,{clear:()=>xr,getAccDescription:()=>Rr,getAccTitle:()=>_r,getDiagramTitle:()=>qr,setAccDescription:()=>Lr,setAccTitle:()=>Tr,setDiagramTitle:()=>tn});zS="",$S="",GS="",US=v(t=>yr(t,Or()),"sanitizeText"),xr=v(()=>{zS="",GS="",$S=""},"clear"),Tr=v(t=>{zS=US(t).replace(/^\s+/g,"")},"setAccTitle"),_r=v(()=>zS,"getAccTitle"),Lr=v(t=>{GS=US(t).replace(/\n\s+/g,` `)},"setAccDescription"),Rr=v(()=>GS,"getAccDescription"),tn=v(t=>{$S=US(t)},"setDiagramTitle"),qr=v(()=>$S,"getDiagramTitle"),pF=re,_ye=Fb,pe=Or,VS=FS,Vb=Ff,WS=v(t=>yr(t,pe()),"sanitizeText"),HS=il,Lye=v(()=>Ub,"getCommonDb"),Bb={},G1=v((t,e,r)=>{Bb[t]&&pF.warn(`Diagram with id ${t} already registered. Overwriting.`),Bb[t]=e,r&&vF(t,r),Aye(t,e.styles),e.injectUtils?.(pF,_ye,pe,WS,HS,Lye(),()=>{})},"registerDiagram"),Wb=v(t=>{if(t in Bb)return Bb[t];throw new Rye(t)},"getDiagram"),Rye=class extends Error{static{v(this,"DiagramNotFoundError")}constructor(t){super(`Diagram ${t} not found.`)}}});function lC(t){return typeof t>"u"||t===null}function DF(t){return typeof t=="object"&&t!==null}function OF(t){return Array.isArray(t)?t:lC(t)?[]:[t]}function PF(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;ro&&(a=" ... ",e=n-o+a.length),r-n>o&&(s=" ...",r=n+o-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function qb(t,e){return Si.repeat(" ",e-t.length)+t}function zF(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var o="",l,u,h=Math.min(t.line+e.linesAfter,i.length).toString().length,f=e.maxLength-(e.indent+h+3);for(l=1;l<=e.linesBefore&&!(s-l<0);l++)u=Hb(t.buffer,n[s-l],i[s-l],t.position-(n[s]-n[s-l]),f),o=Si.repeat(" ",e.indent)+qb((t.line-l+1).toString(),h)+" | "+u.str+` `+o;for(u=Hb(t.buffer,n[s],i[s],t.position,f),o+=Si.repeat(" ",e.indent)+qb((t.line+1).toString(),h)+" | "+u.str+` `,o+=Si.repeat("-",e.indent+h+3+u.pos)+`^ `,l=1;l<=e.linesAfter&&!(s+l>=i.length);l++)u=Hb(t.buffer,n[s+l],i[s+l],t.position-(n[s]-n[s+l]),f),o+=Si.repeat(" ",e.indent)+qb((t.line+l+1).toString(),h)+" | "+u.str+` `;return o.replace(/\n$/,"")}function $F(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function GF(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(Fye.indexOf(r)===-1)throw new ps('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=$F(e.styleAliases||null),zye.indexOf(this.kind)===-1)throw new ps('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function YS(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function UF(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(v(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function nz(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Si.isNegativeZero(t))return"-0.0";return r=t.toString(10),jye.test(r)?r.replace("e",".e"):r}function iz(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Si.isNegativeZero(t))}function lz(t){return t===null?!1:sz.exec(t)!==null||oz.exec(t)!==null}function cz(t){var e,r,n,i,a,s,o,l=0,u=null,h,f,d;if(e=sz.exec(t),e===null&&(e=oz.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],o=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(h=+e[10],f=+(e[11]||0),u=(h*60+f)*6e4,e[9]==="-"&&(u=-u)),d=new Date(Date.UTC(r,n,i,a,s,o,l)),u&&d.setTime(d.getTime()-u),d}function uz(t){return t.toISOString()}function hz(t){return t==="<<"||t===null}function fz(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=uC;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function dz(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=uC,s=0,o=[];for(e=0;e>16&255),o.push(s>>8&255),o.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(o.push(s>>16&255),o.push(s>>8&255),o.push(s&255)):r===18?(o.push(s>>10&255),o.push(s>>2&255)):r===12&&o.push(s>>4&255),new Uint8Array(o)}function pz(t){var e="",r=0,n,i,a=t.length,s=uC;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function gz(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function mz(t){if(t===null)return!0;var e=[],r,n,i,a,s,o=t;for(r=0,n=o.length;r>10)+55296,(t-65536&1023)+56320)}function Mz(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||kz,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function hC(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=Bye(r),new ps(e,r)}function zt(t,e){throw hC(t,e)}function U1(t,e){t.onWarning&&t.onWarning.call(null,hC(t,e))}function au(t,e,r,n){var i,a,s,o;if(e1&&(t.result+=Si.repeat(` `,e-1))}function Dz(t,e,r){var n,i,a,s,o,l,u,h,f=t.kind,d=t.result,p;if(p=t.input.charCodeAt(t.position),Ha(p)||Gf(p)||p===35||p===38||p===42||p===33||p===124||p===62||p===39||p===34||p===37||p===64||p===96||(p===63||p===45)&&(i=t.input.charCodeAt(t.position+1),Ha(i)||r&&Gf(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,o=!1;p!==0;){if(p===58){if(i=t.input.charCodeAt(t.position+1),Ha(i)||r&&Gf(i))break}else if(p===35){if(n=t.input.charCodeAt(t.position-1),Ha(n))break}else{if(t.position===t.lineStart&&q1(t)||r&&Gf(p))break;if(al(p))if(l=t.line,u=t.lineStart,h=t.lineIndent,oi(t,!1,-1),t.lineIndent>=e){o=!0,p=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=l,t.lineStart=u,t.lineIndent=h;break}}o&&(au(t,a,s,!1),e4(t,t.line-l),a=s=t.position,o=!1),dh(p)||(s=t.position+1),p=t.input.charCodeAt(++t.position)}return au(t,a,s,!1),t.result?!0:(t.kind=f,t.result=d,!1)}function Oz(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(au(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else al(r)?(au(t,n,i,!0),e4(t,oi(t,!1,e)),n=i=t.position):t.position===t.lineStart&&q1(t)?zt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);zt(t,"unexpected end of the stream within a single quoted scalar")}function Pz(t,e){var r,n,i,a,s,o;if(o=t.input.charCodeAt(t.position),o!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(o=t.input.charCodeAt(t.position))!==0;){if(o===34)return au(t,r,t.position,!0),t.position++,!0;if(o===92){if(au(t,r,t.position,!0),o=t.input.charCodeAt(++t.position),al(o))oi(t,!1,e);else if(o<256&&Nz[o])t.result+=Iz[o],t.position++;else if((s=_z(o))>0){for(i=s,a=0;i>0;i--)o=t.input.charCodeAt(++t.position),(s=Az(o))>=0?a=(a<<4)+s:zt(t,"expected hexadecimal character");t.result+=Rz(a),t.position++}else zt(t,"unknown escape sequence");r=n=t.position}else al(o)?(au(t,r,n,!0),e4(t,oi(t,!1,e)),r=n=t.position):t.position===t.lineStart&&q1(t)?zt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}zt(t,"unexpected end of the stream within a double quoted scalar")}function Bz(t,e){var r=!0,n,i,a,s=t.tag,o,l=t.anchor,u,h,f,d,p,g=Object.create(null),m,y,x,b;if(b=t.input.charCodeAt(t.position),b===91)h=93,p=!1,o=[];else if(b===123)h=125,p=!0,o={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=o),b=t.input.charCodeAt(++t.position);b!==0;){if(oi(t,!0,e),b=t.input.charCodeAt(t.position),b===h)return t.position++,t.tag=s,t.anchor=l,t.kind=p?"mapping":"sequence",t.result=o,!0;r?b===44&&zt(t,"expected the node content, but found ','"):zt(t,"missed comma between flow collection entries"),y=m=x=null,f=d=!1,b===63&&(u=t.input.charCodeAt(t.position+1),Ha(u)&&(f=d=!0,t.position++,oi(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,Vf(t,e,Xb,!1,!0),y=t.tag,m=t.result,oi(t,!0,e),b=t.input.charCodeAt(t.position),(d||t.line===n)&&b===58&&(f=!0,b=t.input.charCodeAt(++t.position),oi(t,!0,e),Vf(t,e,Xb,!1,!0),x=t.result),p?Uf(t,o,g,y,m,x,n,i,a):f?o.push(Uf(t,null,g,y,m,x,n,i,a)):o.push(m),oi(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}zt(t,"unexpected end of the stream within a flow collection")}function Fz(t,e){var r,n,i=qS,a=!1,s=!1,o=e,l=0,u=!1,h,f;if(f=t.input.charCodeAt(t.position),f===124)n=!1;else if(f===62)n=!0;else return!1;for(t.kind="scalar",t.result="";f!==0;)if(f=t.input.charCodeAt(++t.position),f===43||f===45)qS===i?i=f===43?IF:l2e:zt(t,"repeat of a chomping mode identifier");else if((h=Lz(f))>=0)h===0?zt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?zt(t,"repeat of an indentation width identifier"):(o=e+h-1,s=!0);else break;if(dh(f)){do f=t.input.charCodeAt(++t.position);while(dh(f));if(f===35)do f=t.input.charCodeAt(++t.position);while(!al(f)&&f!==0)}for(;f!==0;){for(Jb(t),t.lineIndent=0,f=t.input.charCodeAt(t.position);(!s||t.lineIndento&&(o=t.lineIndent),al(f)){l++;continue}if(t.lineIndente)&&l!==0)zt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(y&&(s=t.line,o=t.lineStart,l=t.position),Vf(t,e,jb,!0,i)&&(y?g=t.result:m=t.result),y||(Uf(t,f,d,p,g,m,s,o,l),p=g=m=null),oi(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)zt(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),f=0,d=t.implicitTypes.length;f"),t.result!==null&&g.kind!==t.kind&&zt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):zt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||h}function Vz(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(oi(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Ha(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&zt(t,"directive name must not be less than one character in length");s!==0;){for(;dh(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!al(s));break}if(al(s))break;for(r=t.position;s!==0&&!Ha(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&Jb(t),ph.call(MF,n)?MF[n](t,n,i):U1(t,'unknown document directive "'+n+'"')}if(oi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,oi(t,!0,-1)):a&&zt(t,"directives end mark is expected"),Vf(t,t.lineIndent-1,jb,!1,!0),oi(t,!0,-1),t.checkLineBreaks&&u2e.test(t.input.slice(e,t.position))&&U1(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&q1(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,oi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=fC(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function pC(t){var e=/^\n* /;return e.test(t)}function c$(t,e,r,n,i,a,s,o){var l,u=0,h=null,f=!1,d=!1,p=n!==-1,g=-1,m=i$(rp(t,0))&&a$(rp(t,t.length-1));if(e||s)for(l=0;l=65536?l+=2:l++){if(u=rp(t,l),!ip(u))return tp;m=m&&tC(u,h,o),h=u}else{for(l=0;l=65536?l+=2:l++){if(u=rp(t,l),u===V1)f=!0,p&&(d=d||l-g-1>n&&t[g+1]!==" ",g=l);else if(!ip(u))return tp;m=m&&tC(u,h,o),h=u}d=d||p&&l-g-1>n&&t[g+1]!==" "}return!f&&!d?m&&!s&&!i(t)?s$:a===W1?tp:rC:r>9&&pC(t)?tp:s?a===W1?tp:rC:d?l$:o$}function u$(t,e,r,n,i){t.dump=function(){if(e.length===0)return t.quotingType===W1?'""':"''";if(!t.noCompatMode&&(R2e.indexOf(e)!==-1||N2e.test(e)))return t.quotingType===W1?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),o=n||t.flowLevel>-1&&r>=t.flowLevel;function l(u){return n$(t,u)}switch(v(l,"testAmbiguity"),c$(e,o,t.indent,s,l,t.quotingType,t.forceQuotes&&!n,i)){case s$:return e;case rC:return"'"+e.replace(/'/g,"''")+"'";case o$:return"|"+nC(e,t.indent)+iC(JS(e,a));case l$:return">"+nC(e,t.indent)+iC(JS(h$(e,s),a));case tp:return'"'+f$(e)+'"';default:throw new ps("impossible error: invalid scalar style")}}()}function nC(t,e){var r=pC(t)?String(e):"",n=t[t.length-1]===` `,i=n&&(t[t.length-2]===` `||t===` `),a=i?"+":n?"":"-";return r+a+` `}function iC(t){return t[t.length-1]===` `?t.slice(0,-1):t}function h$(t,e){for(var r=/(\n+)([^\n]*)/g,n=function(){var u=t.indexOf(` `);return u=u!==-1?u:t.length,r.lastIndex=u,aC(t.slice(0,u),e)}(),i=t[0]===` `||t[0]===" ",a,s;s=r.exec(t);){var o=s[1],l=s[2];a=l[0]===" ",n+=o+(!i&&!a&&l!==""?` `:"")+aC(l,e),i=a}return n}function aC(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,o=0,l="";n=r.exec(t);)o=n.index,o-i>e&&(a=s>i?s:o,l+=` `+t.slice(i,a),i=a+1),s=o;return l+=` `,t.length-i>e&&s>i?l+=t.slice(i,s)+` `+t.slice(s+1):l+=t.slice(i),l.slice(1)}function f$(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=rp(t,i),n=Sa[r],!n&&ip(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||t$(r);return e}function d$(t,e,r){var n="",i=t.tag,a,s,o;for(a=0,s=r.length;a"u"&&tc(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function sC(t,e,r,n){var i="",a=t.tag,s,o,l;for(s=0,o=r.length;s"u"&&tc(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=Zb(t,e)),t.dump&&V1===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function p$(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,o,l,u,h;for(s=0,o=a.length;s1024&&(h+="? "),h+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),tc(t,e,u,!1,!1)&&(h+=t.dump,n+=h));t.tag=i,t.dump="{"+n+"}"}function g$(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),o,l,u,h,f,d;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new ps("sortKeys must be a boolean or a function");for(o=0,l=s.length;o1024,f&&(t.dump&&V1===t.dump.charCodeAt(0)?d+="?":d+="? "),d+=t.dump,f&&(d+=Zb(t,e)),tc(t,e+1,h,!0,f)&&(t.dump&&V1===t.dump.charCodeAt(0)?d+=":":d+=": ",d+=t.dump,i+=d));t.tag=a,t.dump=i||"{}"}function oC(t,e,r){var n,i,a,s,o,l;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+l+'" style');t.dump=n}return!0}return!1}function tc(t,e,r,n,i,a,s){t.tag=null,t.dump=r,oC(t,r,!1)||oC(t,r,!0);var o=Yz.call(t.dump),l=n,u;n&&(n=t.flowLevel<0||t.flowLevel>e);var h=o==="[object Object]"||o==="[object Array]",f,d;if(h&&(f=t.duplicates.indexOf(r),d=f!==-1),(t.tag!==null&&t.tag!=="?"||d||t.indent!==2&&e>0)&&(i=!1),d&&t.usedDuplicates[f])t.dump="*ref_"+f;else{if(h&&d&&!t.usedDuplicates[f]&&(t.usedDuplicates[f]=!0),o==="[object Object]")n&&Object.keys(t.dump).length!==0?(g$(t,e,t.dump,i),d&&(t.dump="&ref_"+f+t.dump)):(p$(t,e,t.dump),d&&(t.dump="&ref_"+f+" "+t.dump));else if(o==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?sC(t,e-1,t.dump,i):sC(t,e,t.dump,i),d&&(t.dump="&ref_"+f+t.dump)):(d$(t,e,t.dump),d&&(t.dump="&ref_"+f+" "+t.dump));else if(o==="[object String]")t.tag!=="?"&&u$(t,t.dump,e,a,l);else{if(o==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new ps("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(u=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?u="!"+u:u.slice(0,18)==="tag:yaml.org,2002:"?u="!!"+u.slice(18):u="!<"+u+">",t.dump=u+" "+t.dump)}return!0}function m$(t,e){var r=[],n=[],i,a;for(Qb(t,r,n),i=0,a=n.length;i{or();v(lC,"isNothing");v(DF,"isObject");v(OF,"toArray");v(PF,"extend");v(BF,"repeat");v(FF,"isNegativeZero");Nye=lC,Iye=DF,Mye=OF,Dye=BF,Oye=FF,Pye=PF,Si={isNothing:Nye,isObject:Iye,toArray:Mye,repeat:Dye,isNegativeZero:Oye,extend:Pye};v(cC,"formatError");v(np,"YAMLException$1");np.prototype=Object.create(Error.prototype);np.prototype.constructor=np;np.prototype.toString=v(function(e){return this.name+": "+cC(this,e)},"toString");ps=np;v(Hb,"getLine");v(qb,"padStart");v(zF,"makeSnippet");Bye=zF,Fye=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],zye=["scalar","sequence","mapping"];v($F,"compileStyleAliases");v(GF,"Type$1");Ea=GF;v(YS,"compileList");v(UF,"compileMap");v(Yb,"Schema$1");Yb.prototype.extend=v(function(e){var r=[],n=[];if(e instanceof Ea)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new ps("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof Ea))throw new ps("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new ps("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new ps("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof Ea))throw new ps("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(Yb.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=YS(i,"implicit"),i.compiledExplicit=YS(i,"explicit"),i.compiledTypeMap=UF(i.compiledImplicit,i.compiledExplicit),i},"extend");$ye=Yb,Gye=new Ea("tag:yaml.org,2002:str",{kind:"scalar",construct:v(function(t){return t!==null?t:""},"construct")}),Uye=new Ea("tag:yaml.org,2002:seq",{kind:"sequence",construct:v(function(t){return t!==null?t:[]},"construct")}),Vye=new Ea("tag:yaml.org,2002:map",{kind:"mapping",construct:v(function(t){return t!==null?t:{}},"construct")}),Wye=new $ye({explicit:[Gye,Uye,Vye]});v(VF,"resolveYamlNull");v(WF,"constructYamlNull");v(HF,"isNull");Hye=new Ea("tag:yaml.org,2002:null",{kind:"scalar",resolve:VF,construct:WF,predicate:HF,represent:{canonical:v(function(){return"~"},"canonical"),lowercase:v(function(){return"null"},"lowercase"),uppercase:v(function(){return"NULL"},"uppercase"),camelcase:v(function(){return"Null"},"camelcase"),empty:v(function(){return""},"empty")},defaultStyle:"lowercase"});v(qF,"resolveYamlBoolean");v(YF,"constructYamlBoolean");v(XF,"isBoolean");qye=new Ea("tag:yaml.org,2002:bool",{kind:"scalar",resolve:qF,construct:YF,predicate:XF,represent:{lowercase:v(function(t){return t?"true":"false"},"lowercase"),uppercase:v(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:v(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});v(jF,"isHexCode");v(KF,"isOctCode");v(ZF,"isDecCode");v(QF,"resolveYamlInteger");v(JF,"constructYamlInteger");v(ez,"isInteger");Yye=new Ea("tag:yaml.org,2002:int",{kind:"scalar",resolve:QF,construct:JF,predicate:ez,represent:{binary:v(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:v(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:v(function(t){return t.toString(10)},"decimal"),hexadecimal:v(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),Xye=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");v(tz,"resolveYamlFloat");v(rz,"constructYamlFloat");jye=/^[-+]?[0-9]+e/;v(nz,"representYamlFloat");v(iz,"isFloat");Kye=new Ea("tag:yaml.org,2002:float",{kind:"scalar",resolve:tz,construct:rz,predicate:iz,represent:nz,defaultStyle:"lowercase"}),az=Wye.extend({implicit:[Hye,qye,Yye,Kye]}),Zye=az,sz=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),oz=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");v(lz,"resolveYamlTimestamp");v(cz,"constructYamlTimestamp");v(uz,"representYamlTimestamp");Qye=new Ea("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:lz,construct:cz,instanceOf:Date,represent:uz});v(hz,"resolveYamlMerge");Jye=new Ea("tag:yaml.org,2002:merge",{kind:"scalar",resolve:hz}),uC=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= \r`;v(fz,"resolveYamlBinary");v(dz,"constructYamlBinary");v(pz,"representYamlBinary");v(gz,"isBinary");e2e=new Ea("tag:yaml.org,2002:binary",{kind:"scalar",resolve:fz,construct:dz,predicate:gz,represent:pz}),t2e=Object.prototype.hasOwnProperty,r2e=Object.prototype.toString;v(mz,"resolveYamlOmap");v(vz,"constructYamlOmap");n2e=new Ea("tag:yaml.org,2002:omap",{kind:"sequence",resolve:mz,construct:vz}),i2e=Object.prototype.toString;v(yz,"resolveYamlPairs");v(xz,"constructYamlPairs");a2e=new Ea("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:yz,construct:xz}),s2e=Object.prototype.hasOwnProperty;v(bz,"resolveYamlSet");v(wz,"constructYamlSet");o2e=new Ea("tag:yaml.org,2002:set",{kind:"mapping",resolve:bz,construct:wz}),kz=Zye.extend({implicit:[Qye,Jye],explicit:[e2e,n2e,a2e,o2e]}),ph=Object.prototype.hasOwnProperty,Xb=1,Tz=2,Ez=3,jb=4,qS=1,l2e=2,IF=3,c2e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,u2e=/[\x85\u2028\u2029]/,h2e=/[,\[\]\{\}]/,Sz=/^(?:!|!!|![a-z\-]+!)$/i,Cz=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;v(XS,"_class");v(al,"is_EOL");v(dh,"is_WHITE_SPACE");v(Ha,"is_WS_OR_EOL");v(Gf,"is_FLOW_INDICATOR");v(Az,"fromHexCode");v(_z,"escapedHexLen");v(Lz,"fromDecimalCode");v(jS,"simpleEscapeSequence");v(Rz,"charFromCodepoint");Nz=new Array(256),Iz=new Array(256);for($f=0;$f<256;$f++)Nz[$f]=jS($f)?1:0,Iz[$f]=jS($f);v(Mz,"State$1");v(hC,"generateError");v(zt,"throwError");v(U1,"throwWarning");MF={YAML:v(function(e,r,n){var i,a,s;e.version!==null&&zt(e,"duplication of %YAML directive"),n.length!==1&&zt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&zt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&zt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&U1(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:v(function(e,r,n){var i,a;n.length!==2&&zt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],Sz.test(i)||zt(e,"ill-formed tag handle (first argument) of the TAG directive"),ph.call(e.tagMap,i)&&zt(e,'there is a previously declared suffix for "'+i+'" tag handle'),Cz.test(a)||zt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{zt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};v(au,"captureSegment");v(KS,"mergeMappings");v(Uf,"storeMappingPair");v(Jb,"readLineBreak");v(oi,"skipSeparationSpace");v(q1,"testDocumentSeparator");v(e4,"writeFoldedLines");v(Dz,"readPlainScalar");v(Oz,"readSingleQuotedScalar");v(Pz,"readDoubleQuotedScalar");v(Bz,"readFlowCollection");v(Fz,"readBlockScalar");v(ZS,"readBlockSequence");v(zz,"readBlockMapping");v($z,"readTagProperty");v(Gz,"readAnchorProperty");v(Uz,"readAlias");v(Vf,"composeNode");v(Vz,"readDocument");v(fC,"loadDocuments");v(Wz,"loadAll$1");v(Hz,"load$1");f2e=Wz,d2e=Hz,qz={loadAll:f2e,load:d2e},Yz=Object.prototype.toString,Xz=Object.prototype.hasOwnProperty,dC=65279,p2e=9,V1=10,g2e=13,m2e=32,v2e=33,y2e=34,QS=35,x2e=37,b2e=38,w2e=39,k2e=42,jz=44,T2e=45,Kb=58,E2e=61,S2e=62,C2e=63,A2e=64,Kz=91,Zz=93,_2e=96,Qz=123,L2e=124,Jz=125,Sa={};Sa[0]="\\0";Sa[7]="\\a";Sa[8]="\\b";Sa[9]="\\t";Sa[10]="\\n";Sa[11]="\\v";Sa[12]="\\f";Sa[13]="\\r";Sa[27]="\\e";Sa[34]='\\"';Sa[92]="\\\\";Sa[133]="\\N";Sa[160]="\\_";Sa[8232]="\\L";Sa[8233]="\\P";R2e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],N2e=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;v(e$,"compileStyleMap");v(t$,"encodeHex");I2e=1,W1=2;v(r$,"State");v(JS,"indentString");v(Zb,"generateNextLine");v(n$,"testImplicitResolving");v(H1,"isWhitespace");v(ip,"isPrintable");v(eC,"isNsCharOrWhitespace");v(tC,"isPlainSafe");v(i$,"isPlainSafeFirst");v(a$,"isPlainSafeLast");v(rp,"codePointAt");v(pC,"needIndentIndicator");s$=1,rC=2,o$=3,l$=4,tp=5;v(c$,"chooseScalarStyle");v(u$,"writeScalar");v(nC,"blockHeader");v(iC,"dropEndingNewline");v(h$,"foldString");v(aC,"foldLine");v(f$,"escapeString");v(d$,"writeFlowSequence");v(sC,"writeBlockSequence");v(p$,"writeFlowMapping");v(g$,"writeBlockMapping");v(oC,"detectType");v(tc,"writeNode");v(m$,"getDuplicateReferences");v(Qb,"inspectNode");v(v$,"dump$1");M2e=v$,D2e={dump:M2e};v(t4,"renamed");ap=az,sp=qz.load,Nrt=qz.loadAll,Irt=D2e.dump,Mrt=t4("safeLoad","load"),Drt=t4("safeLoadAll","loadAll"),Ort=t4("safeDump","dump");});var O2e,op,gC,y$,n4=F(()=>{O2e=Object.freeze({left:0,top:0,width:16,height:16}),op=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),gC=Object.freeze({...O2e,...op}),y$=Object.freeze({...gC,body:"",hidden:!1})});var P2e,x$,b$=F(()=>{n4();P2e=Object.freeze({width:null,height:null}),x$=Object.freeze({...P2e,...op})});var i4,mC,a4,w$=F(()=>{i4=/^[a-z0-9]+(-[a-z0-9]+)*$/,mC=(t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let o=i.pop(),l=i.pop(),u={provider:i.length>0?i[0]:n,prefix:l,name:o};return e&&!a4(u)?null:u}let a=i[0],s=a.split("-");if(s.length>1){let o={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!a4(o)?null:o}if(r&&n===""){let o={provider:n,prefix:"",name:a};return e&&!a4(o,r)?null:o}return null},a4=(t,e)=>t?!!((t.provider===""||t.provider.match(i4))&&(e&&t.prefix===""||t.prefix.match(i4))&&t.name.match(i4)):!1});function k$(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var T$=F(()=>{});function vC(t,e){let r=k$(t,e);for(let n in y$)n in op?n in t&&!(n in r)&&(r[n]=op[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var E$=F(()=>{n4();T$()});function S$(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let o=n[s]&&n[s].parent,l=o&&a(o);l&&(i[s]=[o].concat(l))}return i[s]}return(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var C$=F(()=>{});function A$(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(o){a=vC(n[o]||i[o],a)}return s(e),r.forEach(s),vC(t,a)}function yC(t,e){if(t.icons[e])return A$(t,e,[]);let r=S$(t,[e])[e];return r?A$(t,e,r):null}var _$=F(()=>{E$();C$()});function xC(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(B2e);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=F2e.test(a);for(;;){if(s){let o=parseFloat(a);isNaN(o)?i.push(a):i.push(Math.ceil(o*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var B2e,F2e,L$=F(()=>{B2e=/(-?[0-9.]*[0-9]+[0-9.]*)/g,F2e=/^-?[0-9.]*[0-9]+[0-9.]*$/g});function z2e(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function $2e(t,e){return t?""+t+""+e:e}function R$(t,e,r){let n=z2e(t);return $2e(n.defs,e+n.content+r)}var N$=F(()=>{});function bC(t,e){let r={...gC,...t},n={...x$,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(m=>{let y=[],x=m.hFlip,b=m.vFlip,w=m.rotate;x?b?w+=2:(y.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),y.push("scale(-1 1)"),i.top=i.left=0):b&&(y.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),y.push("scale(1 -1)"),i.top=i.left=0);let _;switch(w<0&&(w-=Math.floor(w/4)*4),w=w%4,w){case 1:_=i.height/2+i.top,y.unshift("rotate(90 "+_.toString()+" "+_.toString()+")");break;case 2:y.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:_=i.width/2+i.left,y.unshift("rotate(-90 "+_.toString()+" "+_.toString()+")");break}w%2===1&&(i.left!==i.top&&(_=i.left,i.left=i.top,i.top=_),i.width!==i.height&&(_=i.width,i.width=i.height,i.height=_)),y.length&&(a=R$(a,'',""))});let s=n.width,o=n.height,l=i.width,u=i.height,h,f;s===null?(f=o===null?"1em":o==="auto"?u:o,h=xC(f,l/u)):(h=s==="auto"?l:s,f=o===null?xC(h,u/l):o==="auto"?u:o);let d={},p=(m,y)=>{G2e(y)||(d[m]=y.toString())};p("width",h),p("height",f);let g=[i.left,i.top,l,u];return d.viewBox=g.join(" "),{attributes:d,viewBox:g,body:a}}var G2e,I$=F(()=>{n4();b$();L$();N$();G2e=t=>t==="unset"||t==="undefined"||t==="none"});function wC(t,e=V2e){let r=[],n;for(;n=U2e.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(W2e++).toString(),o=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+o+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var U2e,V2e,W2e,M$=F(()=>{U2e=/\sid="(\S+)"/g,V2e="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),W2e=0});function kC(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var D$=F(()=>{});var P$=di((int,O$)=>{var lp=1e3,cp=lp*60,up=cp*60,Wf=up*24,H2e=Wf*7,q2e=Wf*365.25;O$.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return Y2e(t);if(r==="number"&&isFinite(t))return e.long?j2e(t):X2e(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function Y2e(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*q2e;case"weeks":case"week":case"w":return r*H2e;case"days":case"day":case"d":return r*Wf;case"hours":case"hour":case"hrs":case"hr":case"h":return r*up;case"minutes":case"minute":case"mins":case"min":case"m":return r*cp;case"seconds":case"second":case"secs":case"sec":case"s":return r*lp;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function X2e(t){var e=Math.abs(t);return e>=Wf?Math.round(t/Wf)+"d":e>=up?Math.round(t/up)+"h":e>=cp?Math.round(t/cp)+"m":e>=lp?Math.round(t/lp)+"s":t+"ms"}function j2e(t){var e=Math.abs(t);return e>=Wf?s4(t,e,Wf,"day"):e>=up?s4(t,e,up,"hour"):e>=cp?s4(t,e,cp,"minute"):e>=lp?s4(t,e,lp,"second"):t+" ms"}function s4(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}});var F$=di((ant,B$)=>{function K2e(t){r.debug=r,r.default=r,r.coerce=l,r.disable=a,r.enable=i,r.enabled=s,r.humanize=P$(),r.destroy=u,Object.keys(t).forEach(h=>{r[h]=t[h]}),r.names=[],r.skips=[],r.formatters={};function e(h){let f=0;for(let d=0;d{if(E==="%%")return"%";_++;let S=r.formatters[L];if(typeof S=="function"){let C=y[_];E=S.call(x,C),y.splice(_,1),_--}return E}),r.formatArgs.call(x,y),(x.log||r.log).apply(x,y)}return m.namespace=h,m.useColors=r.useColors(),m.color=r.selectColor(h),m.extend=n,m.destroy=r.destroy,Object.defineProperty(m,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(p!==r.namespaces&&(p=r.namespaces,g=r.enabled(h)),g),set:y=>{d=y}}),typeof r.init=="function"&&r.init(m),m}function n(h,f){let d=r(this.namespace+(typeof f>"u"?":":f)+h);return d.log=this.log,d}function i(h){r.save(h),r.namespaces=h,r.names=[],r.skips=[];let f,d=(typeof h=="string"?h:"").split(/[\s,]+/),p=d.length;for(f=0;f"-"+f)].join(",");return r.enable(""),h}function s(h){if(h[h.length-1]==="*")return!0;let f,d;for(f=0,d=r.skips.length;f{Vs.formatArgs=Q2e;Vs.save=J2e;Vs.load=exe;Vs.useColors=Z2e;Vs.storage=txe();Vs.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();Vs.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Z2e(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Q2e(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+o4.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,n=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),t.splice(n,0,e)}Vs.log=console.debug||console.log||(()=>{});function J2e(t){try{t?Vs.storage.setItem("debug",t):Vs.storage.removeItem("debug")}catch{}}function exe(){let t;try{t=Vs.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function txe(){try{return localStorage}catch{}}o4.exports=F$()(Vs);var{formatters:rxe}=o4.exports;rxe.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var snt,$$=F(()=>{w$();_$();I$();M$();D$();snt=Gi(z$(),1)});var EC,TC,G$,l4,nxe,su,sl=F(()=>{or();$$();EC={body:'?',height:80,width:80},TC=new Map,G$=new Map,l4=v(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(re.debug("Registering icon pack:",e.name),"loader"in e)G$.set(e.name,e.loader);else if("icons"in e)TC.set(e.name,e.icons);else throw re.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),nxe=v(async(t,e)=>{let r=mC(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=TC.get(n);if(!i){let s=G$.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},TC.set(n,i)}catch(o){throw re.error(o),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=yC(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),su=v(async(t,e)=>{let r;try{r=await nxe(t,e?.fallbackPrefix)}catch(a){re.error(a),r=EC}let n=bC(r,e);return kC(wC(n.body),n.attributes)},"getIconSVG")});var ou,bo=F(()=>{or();ou=v(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var U$=di(Ui=>{"use strict";Object.defineProperty(Ui,"__esModule",{value:!0});Ui.BLANK_URL=Ui.relativeFirstCharacters=Ui.whitespaceEscapeCharsRegex=Ui.urlSchemeRegex=Ui.ctrlCharactersRegex=Ui.htmlCtrlEntityRegex=Ui.htmlEntitiesRegex=Ui.invalidProtocolRegex=void 0;Ui.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;Ui.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;Ui.htmlCtrlEntityRegex=/&(newline|tab);/gi;Ui.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;Ui.urlSchemeRegex=/^.+(:|:)/gim;Ui.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;Ui.relativeFirstCharacters=[".","/"];Ui.BLANK_URL="about:blank"});var hp=di(c4=>{"use strict";Object.defineProperty(c4,"__esModule",{value:!0});c4.sanitizeUrl=void 0;var Ca=U$();function ixe(t){return Ca.relativeFirstCharacters.indexOf(t[0])>-1}function axe(t){var e=t.replace(Ca.ctrlCharactersRegex,"");return e.replace(Ca.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}function sxe(t){return URL.canParse(t)}function V$(t){try{return decodeURIComponent(t)}catch{return t}}function oxe(t){if(!t)return Ca.BLANK_URL;var e,r=V$(t.trim());do r=axe(r).replace(Ca.htmlCtrlEntityRegex,"").replace(Ca.ctrlCharactersRegex,"").replace(Ca.whitespaceEscapeCharsRegex,"").trim(),r=V$(r),e=r.match(Ca.ctrlCharactersRegex)||r.match(Ca.htmlEntitiesRegex)||r.match(Ca.htmlCtrlEntityRegex)||r.match(Ca.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Ca.BLANK_URL;if(ixe(n))return n;var i=n.trimStart(),a=i.match(Ca.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Ca.invalidProtocolRegex.test(s))return Ca.BLANK_URL;var o=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return o;if(s==="http:"||s==="https:"){if(!sxe(o))return Ca.BLANK_URL;var l=new URL(o);return l.protocol=l.protocol.toLowerCase(),l.hostname=l.hostname.toLowerCase(),l.toString()}return o}c4.sanitizeUrl=oxe});function Hf(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var SC=F(()=>{});function CC(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var W$=F(()=>{});function qf(t){let e,r,n;t.length!==2?(e=Hf,r=(o,l)=>Hf(t(o),l),n=(o,l)=>t(o)-l):(e=t===Hf||t===CC?t:lxe,r=t,n=t);function i(o,l,u=0,h=o.length){if(u>>1;r(o[f],l)<0?u=f+1:h=f}while(u>>1;r(o[f],l)<=0?u=f+1:h=f}while(uu&&n(o[f-1],l)>-n(o[f],l)?f-1:f}return{left:i,center:s,right:a}}function lxe(){return 0}var AC=F(()=>{SC();W$()});function _C(t){return t===null?NaN:+t}var H$=F(()=>{});var q$,Y$,cxe,uxe,LC,X$=F(()=>{SC();AC();H$();q$=qf(Hf),Y$=q$.right,cxe=q$.left,uxe=qf(_C).center,LC=Y$});function j$({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function hxe({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function fxe({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function dxe(t){return t!==null&&typeof t=="object"?t.valueOf():t}var fp,K$=F(()=>{fp=class extends Map{constructor(e,r=dxe){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(j$(this,e))}has(e){return super.has(j$(this,e))}set(e,r){return super.set(hxe(this,e),r)}delete(e){return super.delete(fxe(this,e))}}});function u4(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=pxe?10:a>=gxe?5:a>=mxe?2:1,o,l,u;return i<0?(u=Math.pow(10,-i)/s,o=Math.round(t*u),l=Math.round(e*u),o/ue&&--l,u=-u):(u=Math.pow(10,i)*s,o=Math.round(t/u),l=Math.round(e/u),o*ue&&--l),l0))return[];if(t===e)return[t];let n=e=i))return[];let o=a-i+1,l=new Array(o);if(n)if(s<0)for(let u=0;u{pxe=Math.sqrt(50),gxe=Math.sqrt(10),mxe=Math.sqrt(2)});function f4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var Q$=F(()=>{});function d4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var J$=F(()=>{});function p4(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{});var gh=F(()=>{X$();AC();Q$();J$();eG();Z$();K$()});function tG(t){return t}var rG=F(()=>{});function vxe(t){return"translate("+t+",0)"}function yxe(t){return"translate(0,"+t+")"}function xxe(t){return e=>+t(e)}function bxe(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function wxe(){return!this.__axis}function iG(t,e){var r=[],n=null,i=null,a=6,s=6,o=3,l=typeof window<"u"&&window.devicePixelRatio>1?0:.5,u=t===m4||t===g4?-1:1,h=t===g4||t===RC?"x":"y",f=t===m4||t===NC?vxe:yxe;function d(p){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),m=i??(e.tickFormat?e.tickFormat.apply(e,r):tG),y=Math.max(a,0)+o,x=e.range(),b=+x[0]+l,w=+x[x.length-1]+l,_=(e.bandwidth?bxe:xxe)(e.copy(),l),k=p.selection?p.selection():p,E=k.selectAll(".domain").data([null]),L=k.selectAll(".tick").data(g,e).order(),S=L.exit(),C=L.enter().append("g").attr("class","tick"),M=L.select("line"),R=L.select("text");E=E.merge(E.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),L=L.merge(C),M=M.merge(C.append("line").attr("stroke","currentColor").attr(h+"2",u*a)),R=R.merge(C.append("text").attr("fill","currentColor").attr(h,u*y).attr("dy",t===m4?"0em":t===NC?"0.71em":"0.32em")),p!==k&&(E=E.transition(p),L=L.transition(p),M=M.transition(p),R=R.transition(p),S=S.transition(p).attr("opacity",nG).attr("transform",function(T){return isFinite(T=_(T))?f(T+l):this.getAttribute("transform")}),C.attr("opacity",nG).attr("transform",function(T){var I=this.parentNode.__axis;return f((I&&isFinite(I=I(T))?I:_(T))+l)})),S.remove(),E.attr("d",t===g4||t===RC?s?"M"+u*s+","+b+"H"+l+"V"+w+"H"+u*s:"M"+l+","+b+"V"+w:s?"M"+b+","+u*s+"V"+l+"H"+w+"V"+u*s:"M"+b+","+l+"H"+w),L.attr("opacity",1).attr("transform",function(T){return f(_(T)+l)}),M.attr(h+"2",u*a),R.attr(h,u*y).text(m),k.filter(wxe).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===RC?"start":t===g4?"end":"middle"),k.each(function(){this.__axis=_})}return d.scale=function(p){return arguments.length?(e=p,d):e},d.ticks=function(){return r=Array.from(arguments),d},d.tickArguments=function(p){return arguments.length?(r=p==null?[]:Array.from(p),d):r.slice()},d.tickValues=function(p){return arguments.length?(n=p==null?null:Array.from(p),d):n&&n.slice()},d.tickFormat=function(p){return arguments.length?(i=p,d):i},d.tickSize=function(p){return arguments.length?(a=s=+p,d):a},d.tickSizeInner=function(p){return arguments.length?(a=+p,d):a},d.tickSizeOuter=function(p){return arguments.length?(s=+p,d):s},d.tickPadding=function(p){return arguments.length?(o=+p,d):o},d.offset=function(p){return arguments.length?(l=+p,d):l},d}function IC(t){return iG(m4,t)}function MC(t){return iG(NC,t)}var m4,RC,NC,g4,nG,aG=F(()=>{rG();m4=1,RC=2,NC=3,g4=4,nG=1e-6});var sG=F(()=>{aG()});function lG(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function Exe(t,e){for(var r=0,n=t.length,i;r{kxe={value:()=>{}};v4.prototype=lG.prototype={constructor:v4,on:function(t,e){var r=this._,n=Txe(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{cG()});var y4,PC,BC=F(()=>{y4="http://www.w3.org/1999/xhtml",PC={svg:"http://www.w3.org/2000/svg",xhtml:y4,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function lu(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),PC.hasOwnProperty(e)?{space:PC[e],local:t}:t}var x4=F(()=>{BC()});function Sxe(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===y4&&e.documentElement.namespaceURI===y4?e.createElement(t):e.createElementNS(r,t)}}function Cxe(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function b4(t){var e=lu(t);return(e.local?Cxe:Sxe)(e)}var FC=F(()=>{x4();BC()});function Axe(){}function Yf(t){return t==null?Axe:function(){return this.querySelector(t)}}var w4=F(()=>{});function uG(t){typeof t!="function"&&(t=Yf(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{ol();w4()});function zC(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var fG=F(()=>{});function _xe(){return[]}function X1(t){return t==null?_xe:function(){return this.querySelectorAll(t)}}var $C=F(()=>{});function Lxe(t){return function(){return zC(t.apply(this,arguments))}}function dG(t){typeof t=="function"?t=Lxe(t):t=X1(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{ol();fG();$C()});function j1(t){return function(){return this.matches(t)}}function k4(t){return function(e){return e.matches(t)}}var K1=F(()=>{});function Nxe(t){return function(){return Rxe.call(this.children,t)}}function Ixe(){return this.firstElementChild}function gG(t){return this.select(t==null?Ixe:Nxe(typeof t=="function"?t:k4(t)))}var Rxe,mG=F(()=>{K1();Rxe=Array.prototype.find});function Dxe(){return Array.from(this.children)}function Oxe(t){return function(){return Mxe.call(this.children,t)}}function vG(t){return this.selectAll(t==null?Dxe:Oxe(typeof t=="function"?t:k4(t)))}var Mxe,yG=F(()=>{K1();Mxe=Array.prototype.filter});function xG(t){typeof t!="function"&&(t=j1(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{ol();K1()});function T4(t){return new Array(t.length)}var GC=F(()=>{});function wG(){return new Zn(this._enter||this._groups.map(T4),this._parents)}function Z1(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var UC=F(()=>{GC();ol();Z1.prototype={constructor:Z1,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}}});function kG(t){return function(){return t}}var TG=F(()=>{});function Pxe(t,e,r,n,i,a){for(var s=0,o,l=e.length,u=a.length;s=w&&(w=b+1);!(k=y[w])&&++w{ol();UC();TG()});function CG(){return new Zn(this._exit||this._groups.map(T4),this._parents)}var AG=F(()=>{GC();ol()});function _G(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var LG=F(()=>{});function RG(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),o=new Array(i),l=0;l{ol()});function IG(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var MG=F(()=>{});function DG(t){t||(t=$xe);function e(f,d){return f&&d?t(f.__data__,d.__data__):!f-!d}for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var OG=F(()=>{ol()});function PG(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var BG=F(()=>{});function FG(){return Array.from(this)}var zG=F(()=>{});function $G(){for(var t=this._groups,e=0,r=t.length;e{});function UG(){let t=0;for(let e of this)++t;return t}var VG=F(()=>{});function WG(){return!this.node()}var HG=F(()=>{});function qG(t){for(var e=this._groups,r=0,n=e.length;r{});function Gxe(t){return function(){this.removeAttribute(t)}}function Uxe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Vxe(t,e){return function(){this.setAttribute(t,e)}}function Wxe(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Hxe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function qxe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function XG(t,e){var r=lu(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?Uxe:Gxe:typeof e=="function"?r.local?qxe:Hxe:r.local?Wxe:Vxe)(r,e))}var jG=F(()=>{x4()});function E4(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var VC=F(()=>{});function Yxe(t){return function(){this.style.removeProperty(t)}}function Xxe(t,e,r){return function(){this.style.setProperty(t,e,r)}}function jxe(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function KG(t,e,r){return arguments.length>1?this.each((e==null?Yxe:typeof e=="function"?jxe:Xxe)(t,e,r??"")):mh(this.node(),t)}function mh(t,e){return t.style.getPropertyValue(e)||E4(t).getComputedStyle(t,null).getPropertyValue(e)}var WC=F(()=>{VC()});function Kxe(t){return function(){delete this[t]}}function Zxe(t,e){return function(){this[t]=e}}function Qxe(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function ZG(t,e){return arguments.length>1?this.each((e==null?Kxe:typeof e=="function"?Qxe:Zxe)(t,e)):this.node()[t]}var QG=F(()=>{});function JG(t){return t.trim().split(/^|\s+/)}function HC(t){return t.classList||new eU(t)}function eU(t){this._node=t,this._names=JG(t.getAttribute("class")||"")}function tU(t,e){for(var r=HC(t),n=-1,i=e.length;++n{eU.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}}});function rbe(){this.textContent=""}function nbe(t){return function(){this.textContent=t}}function ibe(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function aU(t){return arguments.length?this.each(t==null?rbe:(typeof t=="function"?ibe:nbe)(t)):this.node().textContent}var sU=F(()=>{});function abe(){this.innerHTML=""}function sbe(t){return function(){this.innerHTML=t}}function obe(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function oU(t){return arguments.length?this.each(t==null?abe:(typeof t=="function"?obe:sbe)(t)):this.node().innerHTML}var lU=F(()=>{});function lbe(){this.nextSibling&&this.parentNode.appendChild(this)}function cU(){return this.each(lbe)}var uU=F(()=>{});function cbe(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function hU(){return this.each(cbe)}var fU=F(()=>{});function dU(t){var e=typeof t=="function"?t:b4(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var pU=F(()=>{FC()});function ube(){return null}function gU(t,e){var r=typeof t=="function"?t:b4(t),n=e==null?ube:typeof e=="function"?e:Yf(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var mU=F(()=>{FC();w4()});function hbe(){var t=this.parentNode;t&&t.removeChild(this)}function vU(){return this.each(hbe)}var yU=F(()=>{});function fbe(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function dbe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function xU(t){return this.select(t?dbe:fbe)}var bU=F(()=>{});function wU(t){return arguments.length?this.property("__data__",t):this.node().__data__}var kU=F(()=>{});function pbe(t){return function(e){t.call(this,e,this.__data__)}}function gbe(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function mbe(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{});function SU(t,e,r){var n=E4(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function ybe(t,e){return function(){return SU(this,t,e)}}function xbe(t,e){return function(){return SU(this,t,e.apply(this,arguments))}}function CU(t,e){return this.each((typeof e=="function"?xbe:ybe)(t,e))}var AU=F(()=>{VC()});function*_U(){for(var t=this._groups,e=0,r=t.length;e{});function Zn(t,e){this._groups=t,this._parents=e}function RU(){return new Zn([[document.documentElement]],qC)}function bbe(){return this}var qC,cu,ol=F(()=>{hG();pG();mG();yG();bG();SG();UC();AG();LG();NG();MG();OG();BG();zG();GG();VG();HG();YG();jG();WC();QG();iU();sU();lU();uU();fU();pU();mU();yU();bU();kU();EU();AU();LU();qC=[null];Zn.prototype=RU.prototype={constructor:Zn,select:uG,selectAll:dG,selectChild:gG,selectChildren:vG,filter:xG,data:EG,enter:wG,exit:CG,join:_G,merge:RG,selection:bbe,order:IG,sort:DG,call:PG,nodes:FG,node:$G,size:UG,empty:WG,each:qG,attr:XG,style:KG,property:ZG,classed:nU,text:aU,html:oU,raise:cU,lower:hU,append:dU,insert:gU,remove:vU,clone:xU,datum:wU,on:TU,dispatch:CU,[Symbol.iterator]:_U};cu=RU});function Ve(t){return typeof t=="string"?new Zn([[document.querySelector(t)]],[document.documentElement]):new Zn([[t]],qC)}var NU=F(()=>{ol()});var ll=F(()=>{K1();x4();NU();ol();w4();$C();WC()});var IU=F(()=>{});function Xf(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function pp(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var YC=F(()=>{});function vh(){}function DU(){return this.rgb().formatHex()}function _be(){return this.rgb().formatHex8()}function Lbe(){return GU(this).formatHsl()}function OU(){return this.rgb().formatRgb()}function ul(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=wbe.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?PU(e):r===3?new ra(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?S4(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?S4(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=kbe.exec(t))?new ra(e[1],e[2],e[3],1):(e=Tbe.exec(t))?new ra(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=Ebe.exec(t))?S4(e[1],e[2],e[3],e[4]):(e=Sbe.exec(t))?S4(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Cbe.exec(t))?zU(e[1],e[2]/100,e[3]/100,1):(e=Abe.exec(t))?zU(e[1],e[2]/100,e[3]/100,e[4]):MU.hasOwnProperty(t)?PU(MU[t]):t==="transparent"?new ra(NaN,NaN,NaN,0):null}function PU(t){return new ra(t>>16&255,t>>8&255,t&255,1)}function S4(t,e,r,n){return n<=0&&(t=e=r=NaN),new ra(t,e,r,n)}function jC(t){return t instanceof vh||(t=ul(t)),t?(t=t.rgb(),new ra(t.r,t.g,t.b,t.opacity)):new ra}function mp(t,e,r,n){return arguments.length===1?jC(t):new ra(t,e,r,n??1)}function ra(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function BU(){return`#${jf(this.r)}${jf(this.g)}${jf(this.b)}`}function Rbe(){return`#${jf(this.r)}${jf(this.g)}${jf(this.b)}${jf((isNaN(this.opacity)?1:this.opacity)*255)}`}function FU(){let t=_4(this.opacity);return`${t===1?"rgb(":"rgba("}${Kf(this.r)}, ${Kf(this.g)}, ${Kf(this.b)}${t===1?")":`, ${t})`}`}function _4(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Kf(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function jf(t){return t=Kf(t),(t<16?"0":"")+t.toString(16)}function zU(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new cl(t,e,r,n)}function GU(t){if(t instanceof cl)return new cl(t.h,t.s,t.l,t.opacity);if(t instanceof vh||(t=ul(t)),!t)return new cl;if(t instanceof cl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,o=a-i,l=(a+i)/2;return o?(e===a?s=(r-n)/o+(r0&&l<1?0:s,new cl(s,o,l,t.opacity)}function UU(t,e,r,n){return arguments.length===1?GU(t):new cl(t,e,r,n??1)}function cl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function $U(t){return t=(t||0)%360,t<0?t+360:t}function C4(t){return Math.max(0,Math.min(1,t||0))}function XC(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var Q1,A4,gp,J1,rc,wbe,kbe,Tbe,Ebe,Sbe,Cbe,Abe,MU,KC=F(()=>{YC();Q1=.7,A4=1/Q1,gp="\\s*([+-]?\\d+)\\s*",J1="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",rc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",wbe=/^#([0-9a-f]{3,8})$/,kbe=new RegExp(`^rgb\\(${gp},${gp},${gp}\\)$`),Tbe=new RegExp(`^rgb\\(${rc},${rc},${rc}\\)$`),Ebe=new RegExp(`^rgba\\(${gp},${gp},${gp},${J1}\\)$`),Sbe=new RegExp(`^rgba\\(${rc},${rc},${rc},${J1}\\)$`),Cbe=new RegExp(`^hsl\\(${J1},${rc},${rc}\\)$`),Abe=new RegExp(`^hsla\\(${J1},${rc},${rc},${J1}\\)$`),MU={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Xf(vh,ul,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:DU,formatHex:DU,formatHex8:_be,formatHsl:Lbe,formatRgb:OU,toString:OU});Xf(ra,mp,pp(vh,{brighter(t){return t=t==null?A4:Math.pow(A4,t),new ra(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Q1:Math.pow(Q1,t),new ra(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new ra(Kf(this.r),Kf(this.g),Kf(this.b),_4(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:BU,formatHex:BU,formatHex8:Rbe,formatRgb:FU,toString:FU}));Xf(cl,UU,pp(vh,{brighter(t){return t=t==null?A4:Math.pow(A4,t),new cl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Q1:Math.pow(Q1,t),new cl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new ra(XC(t>=240?t-240:t+120,i,n),XC(t,i,n),XC(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new cl($U(this.h),C4(this.s),C4(this.l),_4(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=_4(this.opacity);return`${t===1?"hsl(":"hsla("}${$U(this.h)}, ${C4(this.s)*100}%, ${C4(this.l)*100}%${t===1?")":`, ${t})`}`}}))});var VU,WU,HU=F(()=>{VU=Math.PI/180,WU=180/Math.PI});function ZU(t){if(t instanceof nc)return new nc(t.l,t.a,t.b,t.opacity);if(t instanceof uu)return QU(t);t instanceof ra||(t=jC(t));var e=e7(t.r),r=e7(t.g),n=e7(t.b),i=ZC((.2225045*e+.7168786*r+.0606169*n)/YU),a,s;return e===r&&r===n?a=s=i:(a=ZC((.4360747*e+.3850649*r+.1430804*n)/qU),s=ZC((.0139322*e+.0971045*r+.7141733*n)/XU)),new nc(116*i-16,500*(a-i),200*(i-s),t.opacity)}function t7(t,e,r,n){return arguments.length===1?ZU(t):new nc(t,e,r,n??1)}function nc(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function ZC(t){return t>Nbe?Math.pow(t,1/3):t/KU+jU}function QC(t){return t>vp?t*t*t:KU*(t-jU)}function JC(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function e7(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Ibe(t){if(t instanceof uu)return new uu(t.h,t.c,t.l,t.opacity);if(t instanceof nc||(t=ZU(t)),t.a===0&&t.b===0)return new uu(NaN,0{YC();KC();HU();L4=18,qU=.96422,YU=1,XU=.82521,jU=4/29,vp=6/29,KU=3*vp*vp,Nbe=vp*vp*vp;Xf(nc,t7,pp(vh,{brighter(t){return new nc(this.l+L4*(t??1),this.a,this.b,this.opacity)},darker(t){return new nc(this.l-L4*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=qU*QC(e),t=YU*QC(t),r=XU*QC(r),new ra(JC(3.1338561*e-1.6168667*t-.4906146*r),JC(-.9787684*e+1.9161415*t+.033454*r),JC(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));Xf(uu,ev,pp(vh,{brighter(t){return new uu(this.h,this.c,this.l+L4*(t??1),this.opacity)},darker(t){return new uu(this.h,this.c,this.l-L4*(t??1),this.opacity)},rgb(){return QU(this).rgb()}}))});var yp=F(()=>{KC();JU()});function r7(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function eV(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,o=n{});function tV(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],o=t[(n+2)%e];return r7((r-n/e)*e,i,a,s,o)}}var rV=F(()=>{n7()});var xp,i7=F(()=>{xp=t=>()=>t});function nV(t,e){return function(r){return t+r*e}}function Mbe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function iV(t,e){var r=e-t;return r?nV(t,r>180||r<-180?r-360*Math.round(r/360):r):xp(isNaN(t)?e:t)}function aV(t){return(t=+t)==1?hu:function(e,r){return r-e?Mbe(e,r,t):xp(isNaN(e)?r:e)}}function hu(t,e){var r=e-t;return r?nV(t,r):xp(isNaN(t)?e:t)}var a7=F(()=>{i7()});function sV(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,o;for(s=0;s{yp();n7();rV();a7();Zf=function t(e){var r=aV(e);function n(i,a){var s=r((i=mp(i)).r,(a=mp(a)).r),o=r(i.g,a.g),l=r(i.b,a.b),u=hu(i.opacity,a.opacity);return function(h){return i.r=s(h),i.g=o(h),i.b=l(h),i.opacity=u(h),i+""}}return n.gamma=t,n}(1);Dbe=sV(eV),Obe=sV(tV)});function oV(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{});function uV(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{R4()});function fV(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var dV=F(()=>{});function na(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var tv=F(()=>{});function pV(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Qf(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var gV=F(()=>{R4()});function Pbe(t){return function(){return t}}function Bbe(t){return function(e){return t(e)+""}}function rv(t,e){var r=l7.lastIndex=o7.lastIndex=0,n,i,a,s=-1,o=[],l=[];for(t=t+"",e=e+"";(n=l7.exec(t))&&(i=o7.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),o[s]?o[s]+=a:o[++s]=a),(n=n[0])===(i=i[0])?o[s]?o[s]+=i:o[++s]=i:(o[++s]=null,l.push({i:s,x:na(n,i)})),r=o7.lastIndex;return r{tv();l7=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,o7=new RegExp(l7.source,"g")});function Qf(t,e){var r=typeof e,n;return e==null||r==="boolean"?xp(e):(r==="number"?na:r==="string"?(n=ul(e))?(e=n,Zf):rv:e instanceof ul?Zf:e instanceof Date?fV:lV(e)?oV:Array.isArray(e)?uV:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?pV:na)(t,e)}var R4=F(()=>{yp();s7();hV();dV();tv();gV();c7();i7();cV()});function u7(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var mV=F(()=>{});function h7(t,e,r,n,i,a){var s,o,l;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(l=t*r+e*n)&&(r-=t*l,n-=e*l),(o=Math.sqrt(r*r+n*n))&&(r/=o,n/=o,l/=o),t*n{vV=180/Math.PI,N4={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1}});function xV(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?N4:h7(e.a,e.b,e.c,e.d,e.e,e.f)}function bV(t){return t==null?N4:(I4||(I4=document.createElementNS("http://www.w3.org/2000/svg","g")),I4.setAttribute("transform",t),(t=I4.transform.baseVal.consolidate())?(t=t.matrix,h7(t.a,t.b,t.c,t.d,t.e,t.f)):N4)}var I4,wV=F(()=>{yV()});function kV(t,e,r,n){function i(u){return u.length?u.pop()+" ":""}function a(u,h,f,d,p,g){if(u!==f||h!==d){var m=p.push("translate(",null,e,null,r);g.push({i:m-4,x:na(u,f)},{i:m-2,x:na(h,d)})}else(f||d)&&p.push("translate("+f+e+d+r)}function s(u,h,f,d){u!==h?(u-h>180?h+=360:h-u>180&&(u+=360),d.push({i:f.push(i(f)+"rotate(",null,n)-2,x:na(u,h)})):h&&f.push(i(f)+"rotate("+h+n)}function o(u,h,f,d){u!==h?d.push({i:f.push(i(f)+"skewX(",null,n)-2,x:na(u,h)}):h&&f.push(i(f)+"skewX("+h+n)}function l(u,h,f,d,p,g){if(u!==f||h!==d){var m=p.push(i(p)+"scale(",null,",",null,")");g.push({i:m-4,x:na(u,f)},{i:m-2,x:na(h,d)})}else(f!==1||d!==1)&&p.push(i(p)+"scale("+f+","+d+")")}return function(u,h){var f=[],d=[];return u=t(u),h=t(h),a(u.translateX,u.translateY,h.translateX,h.translateY,f,d),s(u.rotate,h.rotate,f,d),o(u.skewX,h.skewX,f,d),l(u.scaleX,u.scaleY,h.scaleX,h.scaleY,f,d),u=h=null,function(p){for(var g=-1,m=d.length,y;++g{tv();wV();f7=kV(xV,"px, ","px)","deg)"),d7=kV(bV,", ",")",")")});function EV(t){return function(e,r){var n=t((e=ev(e)).h,(r=ev(r)).h),i=hu(e.c,r.c),a=hu(e.l,r.l),s=hu(e.opacity,r.opacity);return function(o){return e.h=n(o),e.c=i(o),e.l=a(o),e.opacity=s(o),e+""}}}var p7,Fbe,SV=F(()=>{yp();a7();p7=EV(iV),Fbe=EV(hu)});var bp=F(()=>{R4();tv();mV();c7();TV();s7();SV()});function lv(){return Jf||(_V(zbe),Jf=sv.now()+O4)}function zbe(){Jf=0}function ov(){this._call=this._time=this._next=null}function P4(t,e,r){var n=new ov;return n.restart(t,e,r),n}function LV(){lv(),++wp;for(var t=M4,e;t;)(e=Jf-t._time)>=0&&t._call.call(void 0,e),t=t._next;--wp}function CV(){Jf=(D4=sv.now())+O4,wp=iv=0;try{LV()}finally{wp=0,Gbe(),Jf=0}}function $be(){var t=sv.now(),e=t-D4;e>AV&&(O4-=e,D4=t)}function Gbe(){for(var t,e=M4,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:M4=r);av=t,g7(n)}function g7(t){if(!wp){iv&&(iv=clearTimeout(iv));var e=t-Jf;e>24?(t<1/0&&(iv=setTimeout(CV,t-sv.now()-O4)),nv&&(nv=clearInterval(nv))):(nv||(D4=sv.now(),nv=setInterval($be,AV)),wp=1,_V(CV))}}var wp,iv,nv,AV,M4,av,D4,Jf,O4,sv,_V,m7=F(()=>{wp=0,iv=0,nv=0,AV=1e3,D4=0,Jf=0,O4=0,sv=typeof performance=="object"&&performance.now?performance:Date,_V=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};ov.prototype=P4.prototype={constructor:ov,restart:function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?lv():+r)+(e==null?0:+e),!this._next&&av!==this&&(av?av._next=this:M4=this,av=this),this._call=t,this._time=r,g7()},stop:function(){this._call&&(this._call=null,this._time=1/0,g7())}}});function B4(t,e,r){var n=new ov;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var RV=F(()=>{m7()});var F4=F(()=>{m7();RV()});function yh(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;Wbe(t,r,{name:e,index:n,group:i,on:Ube,tween:Vbe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:MV})}function uv(t,e){var r=Ci(t,e);if(r.state>MV)throw new Error("too late; already scheduled");return r}function ia(t,e){var r=Ci(t,e);if(r.state>z4)throw new Error("too late; already running");return r}function Ci(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function Wbe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=P4(a,0,r.time);function a(u){r.state=NV,r.timer.restart(s,r.delay,r.time),r.delay<=u&&s(u-r.delay)}function s(u){var h,f,d,p;if(r.state!==NV)return l();for(h in n)if(p=n[h],p.name===r.name){if(p.state===z4)return B4(s);p.state===IV?(p.state=cv,p.timer.stop(),p.on.call("interrupt",t,t.__data__,p.index,p.group),delete n[h]):+h{OC();F4();Ube=DC("start","end","cancel","interrupt"),Vbe=[],MV=0,NV=1,$4=2,z4=3,IV=4,G4=5,cv=6});function U4(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>$4&&n.state{gs()});function OV(t){return this.each(function(){U4(this,t)})}var PV=F(()=>{DV()});function Hbe(t,e){var r,n;return function(){var i=ia(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,o=n.length;s{gs()});function V4(t,e){var r;return(typeof e=="number"?na:e instanceof ul?Zf:(r=ul(e))?(e=r,Zf):rv)(t,e)}var v7=F(()=>{yp();bp()});function Ybe(t){return function(){this.removeAttribute(t)}}function Xbe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function jbe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function Kbe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function Zbe(t,e,r){var n,i,a;return function(){var s,o=r(this),l;return o==null?void this.removeAttribute(t):(s=this.getAttribute(t),l=o+"",s===l?null:s===n&&l===i?a:(i=l,a=e(n=s,o)))}}function Qbe(t,e,r){var n,i,a;return function(){var s,o=r(this),l;return o==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),l=o+"",s===l?null:s===n&&l===i?a:(i=l,a=e(n=s,o)))}}function FV(t,e){var r=lu(t),n=r==="transform"?d7:V4;return this.attrTween(t,typeof e=="function"?(r.local?Qbe:Zbe)(r,n,kp(this,"attr."+t,e)):e==null?(r.local?Xbe:Ybe)(r):(r.local?Kbe:jbe)(r,n,e))}var zV=F(()=>{bp();ll();hv();v7()});function Jbe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function e4e(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function t4e(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&e4e(t,a)),r}return i._value=e,i}function r4e(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Jbe(t,a)),r}return i._value=e,i}function $V(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=lu(t);return this.tween(r,(n.local?t4e:r4e)(n,e))}var GV=F(()=>{ll()});function n4e(t,e){return function(){uv(this,t).delay=+e.apply(this,arguments)}}function i4e(t,e){return e=+e,function(){uv(this,t).delay=e}}function UV(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?n4e:i4e)(e,t)):Ci(this.node(),e).delay}var VV=F(()=>{gs()});function a4e(t,e){return function(){ia(this,t).duration=+e.apply(this,arguments)}}function s4e(t,e){return e=+e,function(){ia(this,t).duration=e}}function WV(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?a4e:s4e)(e,t)):Ci(this.node(),e).duration}var HV=F(()=>{gs()});function o4e(t,e){if(typeof e!="function")throw new Error;return function(){ia(this,t).ease=e}}function qV(t){var e=this._id;return arguments.length?this.each(o4e(e,t)):Ci(this.node(),e).ease}var YV=F(()=>{gs()});function l4e(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;ia(this,t).ease=r}}function XV(t){if(typeof t!="function")throw new Error;return this.each(l4e(this._id,t))}var jV=F(()=>{gs()});function KV(t){typeof t!="function"&&(t=j1(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{ll();ed()});function QV(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),o=0;o{ed()});function c4e(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function u4e(t,e,r){var n,i,a=c4e(e)?uv:ia;return function(){var s=a(this,t),o=s.on;o!==n&&(i=(n=o).copy()).on(e,r),s.on=i}}function eW(t,e){var r=this._id;return arguments.length<2?Ci(this.node(),r).on.on(t):this.each(u4e(r,t,e))}var tW=F(()=>{gs()});function h4e(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function rW(){return this.on("end.remove",h4e(this._id))}var nW=F(()=>{});function iW(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Yf(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{ll();ed();gs()});function sW(t){var e=this._name,r=this._id;typeof t!="function"&&(t=X1(t));for(var n=this._groups,i=n.length,a=[],s=[],o=0;o{ll();ed();gs()});function lW(){return new f4e(this._groups,this._parents)}var f4e,cW=F(()=>{ll();f4e=cu.prototype.constructor});function d4e(t,e){var r,n,i;return function(){var a=mh(this,t),s=(this.style.removeProperty(t),mh(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function uW(t){return function(){this.style.removeProperty(t)}}function p4e(t,e,r){var n,i=r+"",a;return function(){var s=mh(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function g4e(t,e,r){var n,i,a;return function(){var s=mh(this,t),o=r(this),l=o+"";return o==null&&(l=o=(this.style.removeProperty(t),mh(this,t))),s===l?null:s===n&&l===i?a:(i=l,a=e(n=s,o))}}function m4e(t,e){var r,n,i,a="style."+e,s="end."+a,o;return function(){var l=ia(this,t),u=l.on,h=l.value[a]==null?o||(o=uW(e)):void 0;(u!==r||i!==h)&&(n=(r=u).copy()).on(s,i=h),l.on=n}}function hW(t,e,r){var n=(t+="")=="transform"?f7:V4;return e==null?this.styleTween(t,d4e(t,n)).on("end.style."+t,uW(t)):typeof e=="function"?this.styleTween(t,g4e(t,n,kp(this,"style."+t,e))).each(m4e(this._id,t)):this.styleTween(t,p4e(t,n,e),r).on("end.style."+t,null)}var fW=F(()=>{bp();ll();gs();hv();v7()});function v4e(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function y4e(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&v4e(t,s,r)),n}return a._value=e,a}function dW(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,y4e(t,e,r??""))}var pW=F(()=>{});function x4e(t){return function(){this.textContent=t}}function b4e(t){return function(){var e=t(this);this.textContent=e??""}}function gW(t){return this.tween("text",typeof t=="function"?b4e(kp(this,"text",t)):x4e(t==null?"":t+""))}var mW=F(()=>{hv()});function w4e(t){return function(e){this.textContent=t.call(this,e)}}function k4e(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&w4e(i)),e}return n._value=t,n}function vW(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,k4e(t))}var yW=F(()=>{});function xW(){for(var t=this._name,e=this._id,r=W4(),n=this._groups,i=n.length,a=0;a{ed();gs()});function wW(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var o={value:s},l={value:function(){--i===0&&a()}};r.each(function(){var u=ia(this,n),h=u.on;h!==t&&(e=(t=h).copy(),e._.cancel.push(o),e._.interrupt.push(o),e._.end.push(l)),u.on=e}),i===0&&a()})}var kW=F(()=>{gs()});function qa(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function TW(t){return cu().transition(t)}function W4(){return++T4e}var T4e,fu,ed=F(()=>{ll();zV();GV();VV();HV();YV();jV();ZV();JV();tW();nW();aW();oW();cW();fW();pW();mW();yW();bW();hv();kW();T4e=0;fu=cu.prototype;qa.prototype=TW.prototype={constructor:qa,select:iW,selectAll:sW,selectChild:fu.selectChild,selectChildren:fu.selectChildren,filter:KV,merge:QV,selection:lW,transition:xW,call:fu.call,nodes:fu.nodes,node:fu.node,size:fu.size,empty:fu.empty,each:fu.each,on:eW,attr:FV,attrTween:$V,style:hW,styleTween:dW,text:gW,textTween:vW,remove:rW,tween:BV,delay:UV,duration:WV,ease:qV,easeVarying:XV,end:wW,[Symbol.iterator]:fu[Symbol.iterator]}});function H4(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var EW=F(()=>{});var y7=F(()=>{EW()});function S4e(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function SW(t){var e,r;t instanceof qa?(e=t._id,t=t._name):(e=W4(),(r=E4e).time=lv(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{ed();gs();y7();F4();E4e={time:null,delay:0,duration:250,ease:H4}});var AW=F(()=>{ll();PV();CW();cu.prototype.interrupt=OV;cu.prototype.transition=SW});var q4=F(()=>{AW()});var _W=F(()=>{});var LW=F(()=>{});var RW=F(()=>{});function NW(t){return[+t[0],+t[1]]}function C4e(t){return[NW(t[0]),NW(t[1])]}function x7(t){return{type:t}}var kct,Tct,Ect,Sct,Cct,Act,IW=F(()=>{q4();_W();LW();RW();({abs:kct,max:Tct,min:Ect}=Math);Sct={name:"x",handles:["w","e"].map(x7),input:function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},Cct={name:"y",handles:["n","s"].map(x7),input:function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},Act={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(x7),input:function(t){return t==null?null:C4e(t)},output:function(t){return t}}});var MW=F(()=>{IW()});function DW(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return DW;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{b7=Math.PI,w7=2*b7,td=1e-6,A4e=w7-td;rd=class{constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?DW:_4e(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,o=this._y1,l=n-e,u=i-r,h=s-e,f=o-r,d=h*h+f*f;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(d>td)if(!(Math.abs(f*l-u*h)>td)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let p=n-s,g=i-o,m=l*l+u*u,y=p*p+g*g,x=Math.sqrt(m),b=Math.sqrt(d),w=a*Math.tan((b7-Math.acos((m+d-y)/(2*x*b)))/2),_=w/b,k=w/x;Math.abs(_-1)>td&&this._append`L${e+_*h},${r+_*f}`,this._append`A${a},${a},0,0,${+(f*p>h*g)},${this._x1=e+k*l},${this._y1=r+k*u}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let o=n*Math.cos(i),l=n*Math.sin(i),u=e+o,h=r+l,f=1^s,d=s?i-a:a-i;this._x1===null?this._append`M${u},${h}`:(Math.abs(this._x1-u)>td||Math.abs(this._y1-h)>td)&&this._append`L${u},${h}`,n&&(d<0&&(d=d%w7+w7),d>A4e?this._append`A${n},${n},0,1,${f},${e-o},${r-l}A${n},${n},0,1,${f},${this._x1=u},${this._y1=h}`:d>td&&this._append`A${n},${n},0,${+(d>=b7)},${f},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};OW.prototype=rd.prototype});var k7=F(()=>{PW()});var BW=F(()=>{});var FW=F(()=>{});var zW=F(()=>{});var $W=F(()=>{});var GW=F(()=>{});var UW=F(()=>{});var VW=F(()=>{});function WW(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function nd(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var fv=F(()=>{});function ic(t){return t=nd(Math.abs(t)),t?t[1]:NaN}var dv=F(()=>{fv()});function HW(t,e){return function(r,n){for(var i=r.length,a=[],s=0,o=t[0],l=0;i>0&&o>0&&(l+o+1>n&&(o=Math.max(1,n-l)),a.push(r.substring(i-=o,i+o)),!((l+=o+1)>n));)o=t[s=(s+1)%t.length];return a.reverse().join(e)}}var qW=F(()=>{});function YW(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var XW=F(()=>{});function xh(t){if(!(e=L4e.exec(t)))throw new Error("invalid format: "+t);var e;return new Y4({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Y4(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var L4e,T7=F(()=>{L4e=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;xh.prototype=Y4.prototype;Y4.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function jW(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var KW=F(()=>{});function ZW(t,e){var r=nd(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(E7=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+nd(t,Math.max(0,e+a-1))[0]}var E7,S7=F(()=>{fv()});function C7(t,e){var r=nd(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var QW=F(()=>{fv()});var A7,JW=F(()=>{fv();S7();QW();A7={"%":(t,e)=>(t*100).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:WW,e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>C7(t*100,e),r:C7,s:ZW,X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)}});function _7(t){return t}var eH=F(()=>{});function nH(t){var e=t.grouping===void 0||t.thousands===void 0?_7:HW(tH.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?_7:YW(tH.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",o=t.minus===void 0?"\u2212":t.minus+"",l=t.nan===void 0?"NaN":t.nan+"";function u(f){f=xh(f);var d=f.fill,p=f.align,g=f.sign,m=f.symbol,y=f.zero,x=f.width,b=f.comma,w=f.precision,_=f.trim,k=f.type;k==="n"?(b=!0,k="g"):A7[k]||(w===void 0&&(w=12),_=!0,k="g"),(y||d==="0"&&p==="=")&&(y=!0,d="0",p="=");var E=m==="$"?r:m==="#"&&/[boxX]/.test(k)?"0"+k.toLowerCase():"",L=m==="$"?n:/[%p]/.test(k)?s:"",S=A7[k],C=/[defgprs%]/.test(k);w=w===void 0?6:/[gprs]/.test(k)?Math.max(1,Math.min(21,w)):Math.max(0,Math.min(20,w));function M(R){var T=E,I=L,A,D,N;if(k==="c")I=S(R)+I,R="";else{R=+R;var O=R<0||1/R<0;if(R=isNaN(R)?l:S(Math.abs(R),w),_&&(R=jW(R)),O&&+R==0&&g!=="+"&&(O=!1),T=(O?g==="("?g:o:g==="-"||g==="("?"":g)+T,I=(k==="s"?rH[8+E7/3]:"")+I+(O&&g==="("?")":""),C){for(A=-1,D=R.length;++AN||N>57){I=(N===46?i+R.slice(A+1):R.slice(A))+I,R=R.slice(0,A);break}}}b&&!y&&(R=e(R,1/0));var B=T.length+R.length+I.length,P=B>1)+T+R+I+P.slice(B);break;default:R=P+T+R+I;break}return a(R)}return M.toString=function(){return f+""},M}function h(f,d){var p=u((f=xh(f),f.type="f",f)),g=Math.max(-8,Math.min(8,Math.floor(ic(d)/3)))*3,m=Math.pow(10,-g),y=rH[8+g/3];return function(x){return p(m*x)+y}}return{format:u,formatPrefix:h}}var tH,rH,iH=F(()=>{dv();qW();XW();T7();KW();JW();S7();eH();tH=Array.prototype.map,rH=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]});function L7(t){return X4=nH(t),j4=X4.format,K4=X4.formatPrefix,X4}var X4,j4,K4,aH=F(()=>{iH();L7({thousands:",",grouping:[3],currency:["$",""]})});function R7(t){return Math.max(0,-ic(Math.abs(t)))}var sH=F(()=>{dv()});function N7(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ic(e)/3)))*3-ic(Math.abs(t)))}var oH=F(()=>{dv()});function I7(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ic(e)-ic(t))+1}var lH=F(()=>{dv()});var M7=F(()=>{aH();T7();sH();oH();lH()});var cH=F(()=>{});var uH=F(()=>{});var hH=F(()=>{});var fH=F(()=>{});function bh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var pv=F(()=>{});function du(){var t=new fp,e=[],r=[],n=D7;function i(a){let s=t.get(a);if(s===void 0){if(n!==D7)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new fp;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return du(e,r).unknown(n)},bh.apply(i,arguments),i}var D7,O7=F(()=>{gh();pv();D7=Symbol("implicit")});function Tp(){var t=du().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,o=!1,l=0,u=0,h=.5;delete t.unknown;function f(){var d=e().length,p=i{gh();pv();O7()});function P7(t){return function(){return t}}var pH=F(()=>{});function B7(t){return+t}var gH=F(()=>{});function Ep(t){return t}function F7(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:P7(isNaN(e)?NaN:.5)}function R4e(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function N4e(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?I4e:N4e,l=u=null,f}function f(d){return d==null||isNaN(d=+d)?a:(l||(l=o(t.map(n),e,r)))(n(s(d)))}return f.invert=function(d){return s(i((u||(u=o(e,t.map(n),na)))(d)))},f.domain=function(d){return arguments.length?(t=Array.from(d,B7),h()):t.slice()},f.range=function(d){return arguments.length?(e=Array.from(d),h()):e.slice()},f.rangeRound=function(d){return e=Array.from(d),r=u7,h()},f.clamp=function(d){return arguments.length?(s=d?!0:Ep,h()):s!==Ep},f.interpolate=function(d){return arguments.length?(r=d,h()):r},f.unknown=function(d){return arguments.length?(a=d,f):a},function(d,p){return n=d,i=p,h()}}function gv(){return M4e()(Ep,Ep)}var mH,z7=F(()=>{gh();bp();pH();gH();mH=[0,1]});function $7(t,e,r,n){var i=dp(t,e,r),a;switch(n=xh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=N7(i,s))&&(n.precision=a),K4(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=I7(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=R7(i))&&(n.precision=a-(n.type==="%")*2);break}}return j4(n)}var vH=F(()=>{gh();M7()});function D4e(t){var e=t.domain;return t.ticks=function(r){var n=e();return h4(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return $7(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],o=n[a],l,u,h=10;for(o0;){if(u=Y1(s,o,r),u===l)return n[i]=s,n[a]=o,e(n);if(u>0)s=Math.floor(s/u)*u,o=Math.ceil(o/u)*u;else if(u<0)s=Math.ceil(s*u)/u,o=Math.floor(o*u)/u;else break;l=u}return t},t}function hl(){var t=gv();return t.copy=function(){return Z4(t,hl())},bh.apply(t,arguments),D4e(t)}var yH=F(()=>{gh();z7();pv();vH()});function G7(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{});function fn(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),o=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,o)=>{let l=[];if(a=i.ceil(a),o=o==null?1:Math.floor(o),!(a0))return l;let u;do l.push(u=new Date(+a)),e(a,o),t(a);while(ufn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,o)=>{if(s>=s)if(o<0)for(;++o<=0;)for(;e(s,-1),!a(s););else for(;--o>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(U7.setTime(+a),V7.setTime(+s),t(U7),t(V7),Math.floor(r(U7,V7))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var U7,V7,pu=F(()=>{U7=new Date,V7=new Date});var ac,bH,W7=F(()=>{pu();ac=fn(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);ac.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?fn(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):ac);bH=ac.range});var Ws,wH,H7=F(()=>{pu();Ws=fn(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),wH=Ws.range});var gu,O4e,Q4,P4e,q7=F(()=>{pu();gu=fn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),O4e=gu.range,Q4=fn(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),P4e=Q4.range});var mu,B4e,J4,F4e,Y7=F(()=>{pu();mu=fn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),B4e=mu.range,J4=fn(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),F4e=J4.range});var wo,z4e,vv,$4e,e3,G4e,X7=F(()=>{pu();wo=fn(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),z4e=wo.range,vv=fn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),$4e=vv.range,e3=fn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),G4e=e3.range});function sd(t){return fn(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function od(t){return fn(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var fl,wh,t3,r3,oc,n3,i3,TH,U4e,V4e,W4e,H4e,q4e,Y4e,ld,Sp,EH,SH,kh,CH,AH,_H,X4e,j4e,K4e,Z4e,Q4e,J4e,j7=F(()=>{pu();fl=sd(0),wh=sd(1),t3=sd(2),r3=sd(3),oc=sd(4),n3=sd(5),i3=sd(6),TH=fl.range,U4e=wh.range,V4e=t3.range,W4e=r3.range,H4e=oc.range,q4e=n3.range,Y4e=i3.range;ld=od(0),Sp=od(1),EH=od(2),SH=od(3),kh=od(4),CH=od(5),AH=od(6),_H=ld.range,X4e=Sp.range,j4e=EH.range,K4e=SH.range,Z4e=kh.range,Q4e=CH.range,J4e=AH.range});var vu,e3e,a3,t3e,K7=F(()=>{pu();vu=fn(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),e3e=vu.range,a3=fn(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),t3e=a3.range});var Hs,r3e,dl,n3e,Z7=F(()=>{pu();Hs=fn(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());Hs.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:fn(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});r3e=Hs.range,dl=fn(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());dl.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:fn(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});n3e=dl.range});function RH(t,e,r,n,i,a){let s=[[Ws,1,1e3],[Ws,5,5*1e3],[Ws,15,15*1e3],[Ws,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function o(u,h,f){let d=hy).right(s,d);if(p===s.length)return t.every(dp(u/31536e6,h/31536e6,f));if(p===0)return ac.every(Math.max(dp(u,h,f),1));let[g,m]=s[d/s[p-1][2]{gh();W7();H7();q7();Y7();X7();j7();K7();Z7();[a3e,s3e]=RH(dl,a3,ld,e3,J4,Q4),[Q7,J7]=RH(Hs,vu,fl,wo,mu,gu)});var s3=F(()=>{W7();H7();q7();Y7();X7();j7();K7();Z7();NH()});function e8(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function t8(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function yv(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function r8(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,o=t.months,l=t.shortMonths,u=xv(i),h=bv(i),f=xv(a),d=bv(a),p=xv(s),g=bv(s),m=xv(o),y=bv(o),x=xv(l),b=bv(l),w={a:O,A:B,b:P,B:$,c:null,d:BH,e:BH,f:L3e,g:z3e,G:G3e,H:C3e,I:A3e,j:_3e,L:UH,m:R3e,M:N3e,p:z,q:H,Q:$H,s:GH,S:I3e,u:M3e,U:D3e,V:O3e,w:P3e,W:B3e,x:null,X:null,y:F3e,Y:$3e,Z:U3e,"%":zH},_={a:J,A:X,b:oe,B:K,c:null,d:FH,e:FH,f:q3e,g:r5e,G:i5e,H:V3e,I:W3e,j:H3e,L:WH,m:Y3e,M:X3e,p:ee,q:Q,Q:$H,s:GH,S:j3e,u:K3e,U:Z3e,V:Q3e,w:J3e,W:e5e,x:null,X:null,y:t5e,Y:n5e,Z:a5e,"%":zH},k={a:M,A:R,b:T,B:I,c:A,d:OH,e:OH,f:k3e,g:DH,G:MH,H:PH,I:PH,j:y3e,L:w3e,m:v3e,M:x3e,p:C,q:m3e,Q:E3e,s:S3e,S:b3e,u:h3e,U:f3e,V:d3e,w:u3e,W:p3e,x:D,X:N,y:DH,Y:MH,Z:g3e,"%":T3e};w.x=E(r,w),w.X=E(n,w),w.c=E(e,w),_.x=E(r,_),_.X=E(n,_),_.c=E(e,_);function E(W,Y){return function(Z){var se=[],ce=-1,ue=0,te=W.length,Ne,ae,we;for(Z instanceof Date||(Z=new Date(+Z));++ce53)return null;"w"in se||(se.w=1),"Z"in se?(ue=t8(yv(se.y,0,1)),te=ue.getUTCDay(),ue=te>4||te===0?Sp.ceil(ue):Sp(ue),ue=vv.offset(ue,(se.V-1)*7),se.y=ue.getUTCFullYear(),se.m=ue.getUTCMonth(),se.d=ue.getUTCDate()+(se.w+6)%7):(ue=e8(yv(se.y,0,1)),te=ue.getDay(),ue=te>4||te===0?wh.ceil(ue):wh(ue),ue=wo.offset(ue,(se.V-1)*7),se.y=ue.getFullYear(),se.m=ue.getMonth(),se.d=ue.getDate()+(se.w+6)%7)}else("W"in se||"U"in se)&&("w"in se||(se.w="u"in se?se.u%7:"W"in se?1:0),te="Z"in se?t8(yv(se.y,0,1)).getUTCDay():e8(yv(se.y,0,1)).getDay(),se.m=0,se.d="W"in se?(se.w+6)%7+se.W*7-(te+5)%7:se.w+se.U*7-(te+6)%7);return"Z"in se?(se.H+=se.Z/100|0,se.M+=se.Z%100,t8(se)):e8(se)}}function S(W,Y,Z,se){for(var ce=0,ue=Y.length,te=Z.length,Ne,ae;ce=te)return-1;if(Ne=Y.charCodeAt(ce++),Ne===37){if(Ne=Y.charAt(ce++),ae=k[Ne in IH?Y.charAt(ce++):Ne],!ae||(se=ae(W,Z,se))<0)return-1}else if(Ne!=Z.charCodeAt(se++))return-1}return se}function C(W,Y,Z){var se=u.exec(Y.slice(Z));return se?(W.p=h.get(se[0].toLowerCase()),Z+se[0].length):-1}function M(W,Y,Z){var se=p.exec(Y.slice(Z));return se?(W.w=g.get(se[0].toLowerCase()),Z+se[0].length):-1}function R(W,Y,Z){var se=f.exec(Y.slice(Z));return se?(W.w=d.get(se[0].toLowerCase()),Z+se[0].length):-1}function T(W,Y,Z){var se=x.exec(Y.slice(Z));return se?(W.m=b.get(se[0].toLowerCase()),Z+se[0].length):-1}function I(W,Y,Z){var se=m.exec(Y.slice(Z));return se?(W.m=y.get(se[0].toLowerCase()),Z+se[0].length):-1}function A(W,Y,Z){return S(W,e,Y,Z)}function D(W,Y,Z){return S(W,r,Y,Z)}function N(W,Y,Z){return S(W,n,Y,Z)}function O(W){return s[W.getDay()]}function B(W){return a[W.getDay()]}function P(W){return l[W.getMonth()]}function $(W){return o[W.getMonth()]}function z(W){return i[+(W.getHours()>=12)]}function H(W){return 1+~~(W.getMonth()/3)}function J(W){return s[W.getUTCDay()]}function X(W){return a[W.getUTCDay()]}function oe(W){return l[W.getUTCMonth()]}function K(W){return o[W.getUTCMonth()]}function ee(W){return i[+(W.getUTCHours()>=12)]}function Q(W){return 1+~~(W.getUTCMonth()/3)}return{format:function(W){var Y=E(W+="",w);return Y.toString=function(){return W},Y},parse:function(W){var Y=L(W+="",!1);return Y.toString=function(){return W},Y},utcFormat:function(W){var Y=E(W+="",_);return Y.toString=function(){return W},Y},utcParse:function(W){var Y=L(W+="",!0);return Y.toString=function(){return W},Y}}}function Pr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function u3e(t,e,r){var n=Vi.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function h3e(t,e,r){var n=Vi.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function f3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function d3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function p3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function MH(t,e,r){var n=Vi.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function DH(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function g3e(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function m3e(t,e,r){var n=Vi.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function v3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function OH(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function y3e(t,e,r){var n=Vi.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function PH(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function x3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function b3e(t,e,r){var n=Vi.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function w3e(t,e,r){var n=Vi.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function k3e(t,e,r){var n=Vi.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function T3e(t,e,r){var n=o3e.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function E3e(t,e,r){var n=Vi.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function S3e(t,e,r){var n=Vi.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function BH(t,e){return Pr(t.getDate(),e,2)}function C3e(t,e){return Pr(t.getHours(),e,2)}function A3e(t,e){return Pr(t.getHours()%12||12,e,2)}function _3e(t,e){return Pr(1+wo.count(Hs(t),t),e,3)}function UH(t,e){return Pr(t.getMilliseconds(),e,3)}function L3e(t,e){return UH(t,e)+"000"}function R3e(t,e){return Pr(t.getMonth()+1,e,2)}function N3e(t,e){return Pr(t.getMinutes(),e,2)}function I3e(t,e){return Pr(t.getSeconds(),e,2)}function M3e(t){var e=t.getDay();return e===0?7:e}function D3e(t,e){return Pr(fl.count(Hs(t)-1,t),e,2)}function VH(t){var e=t.getDay();return e>=4||e===0?oc(t):oc.ceil(t)}function O3e(t,e){return t=VH(t),Pr(oc.count(Hs(t),t)+(Hs(t).getDay()===4),e,2)}function P3e(t){return t.getDay()}function B3e(t,e){return Pr(wh.count(Hs(t)-1,t),e,2)}function F3e(t,e){return Pr(t.getFullYear()%100,e,2)}function z3e(t,e){return t=VH(t),Pr(t.getFullYear()%100,e,2)}function $3e(t,e){return Pr(t.getFullYear()%1e4,e,4)}function G3e(t,e){var r=t.getDay();return t=r>=4||r===0?oc(t):oc.ceil(t),Pr(t.getFullYear()%1e4,e,4)}function U3e(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Pr(e/60|0,"0",2)+Pr(e%60,"0",2)}function FH(t,e){return Pr(t.getUTCDate(),e,2)}function V3e(t,e){return Pr(t.getUTCHours(),e,2)}function W3e(t,e){return Pr(t.getUTCHours()%12||12,e,2)}function H3e(t,e){return Pr(1+vv.count(dl(t),t),e,3)}function WH(t,e){return Pr(t.getUTCMilliseconds(),e,3)}function q3e(t,e){return WH(t,e)+"000"}function Y3e(t,e){return Pr(t.getUTCMonth()+1,e,2)}function X3e(t,e){return Pr(t.getUTCMinutes(),e,2)}function j3e(t,e){return Pr(t.getUTCSeconds(),e,2)}function K3e(t){var e=t.getUTCDay();return e===0?7:e}function Z3e(t,e){return Pr(ld.count(dl(t)-1,t),e,2)}function HH(t){var e=t.getUTCDay();return e>=4||e===0?kh(t):kh.ceil(t)}function Q3e(t,e){return t=HH(t),Pr(kh.count(dl(t),t)+(dl(t).getUTCDay()===4),e,2)}function J3e(t){return t.getUTCDay()}function e5e(t,e){return Pr(Sp.count(dl(t)-1,t),e,2)}function t5e(t,e){return Pr(t.getUTCFullYear()%100,e,2)}function r5e(t,e){return t=HH(t),Pr(t.getUTCFullYear()%100,e,2)}function n5e(t,e){return Pr(t.getUTCFullYear()%1e4,e,4)}function i5e(t,e){var r=t.getUTCDay();return t=r>=4||r===0?kh(t):kh.ceil(t),Pr(t.getUTCFullYear()%1e4,e,4)}function a5e(){return"+0000"}function zH(){return"%"}function $H(t){return+t}function GH(t){return Math.floor(+t/1e3)}var IH,Vi,o3e,l3e,qH=F(()=>{s3();IH={"-":"",_:" ",0:"0"},Vi=/^\s*\d+/,o3e=/^%/,l3e=/[\\^$*+?|[\]().{}]/g});function n8(t){return Cp=r8(t),cd=Cp.format,YH=Cp.parse,XH=Cp.utcFormat,jH=Cp.utcParse,Cp}var Cp,cd,YH,XH,jH,KH=F(()=>{qH();n8({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]})});var i8=F(()=>{KH()});function s5e(t){return new Date(t)}function o5e(t){return t instanceof Date?+t:+new Date(+t)}function ZH(t,e,r,n,i,a,s,o,l,u){var h=gv(),f=h.invert,d=h.domain,p=u(".%L"),g=u(":%S"),m=u("%I:%M"),y=u("%I %p"),x=u("%a %d"),b=u("%b %d"),w=u("%B"),_=u("%Y");function k(E){return(l(E){s3();i8();z7();pv();xH()});var JH=F(()=>{dH();yH();O7();QH()});function eq(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{});var a8,rq=F(()=>{tq();a8=eq("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var nq=F(()=>{rq()});function Dn(t){return function(){return t}}var l3=F(()=>{});function aq(t){return t>1?0:t<-1?Ap:Math.acos(t)}function o8(t){return t>=1?wv:t<=-1?-wv:Math.asin(t)}var s8,aa,Th,iq,c3,pl,ud,Wi,Ap,wv,_p,u3=F(()=>{s8=Math.abs,aa=Math.atan2,Th=Math.cos,iq=Math.max,c3=Math.min,pl=Math.sin,ud=Math.sqrt,Wi=1e-12,Ap=Math.PI,wv=Ap/2,_p=2*Ap});function h3(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new rd(e)}var l8=F(()=>{k7()});function l5e(t){return t.innerRadius}function c5e(t){return t.outerRadius}function u5e(t){return t.startAngle}function h5e(t){return t.endAngle}function f5e(t){return t&&t.padAngle}function d5e(t,e,r,n,i,a,s,o){var l=r-t,u=n-e,h=s-i,f=o-a,d=f*l-h*u;if(!(d*dA*A+D*D&&(S=M,C=R),{cx:S,cy:C,x01:-h,y01:-f,x11:S*(i/k-1),y11:C*(i/k-1)}}function lc(){var t=l5e,e=c5e,r=Dn(0),n=null,i=u5e,a=h5e,s=f5e,o=null,l=h3(u);function u(){var h,f,d=+t.apply(this,arguments),p=+e.apply(this,arguments),g=i.apply(this,arguments)-wv,m=a.apply(this,arguments)-wv,y=s8(m-g),x=m>g;if(o||(o=h=l()),pWi))o.moveTo(0,0);else if(y>_p-Wi)o.moveTo(p*Th(g),p*pl(g)),o.arc(0,0,p,g,m,!x),d>Wi&&(o.moveTo(d*Th(m),d*pl(m)),o.arc(0,0,d,m,g,x));else{var b=g,w=m,_=g,k=m,E=y,L=y,S=s.apply(this,arguments)/2,C=S>Wi&&(n?+n.apply(this,arguments):ud(d*d+p*p)),M=c3(s8(p-d)/2,+r.apply(this,arguments)),R=M,T=M,I,A;if(C>Wi){var D=o8(C/d*pl(S)),N=o8(C/p*pl(S));(E-=D*2)>Wi?(D*=x?1:-1,_+=D,k-=D):(E=0,_=k=(g+m)/2),(L-=N*2)>Wi?(N*=x?1:-1,b+=N,w-=N):(L=0,b=w=(g+m)/2)}var O=p*Th(b),B=p*pl(b),P=d*Th(k),$=d*pl(k);if(M>Wi){var z=p*Th(w),H=p*pl(w),J=d*Th(_),X=d*pl(_),oe;if(yWi?T>Wi?(I=f3(J,X,O,B,p,T,x),A=f3(z,H,P,$,p,T,x),o.moveTo(I.cx+I.x01,I.cy+I.y01),TWi)||!(E>Wi)?o.lineTo(P,$):R>Wi?(I=f3(P,$,z,H,d,-R,x),A=f3(O,B,J,X,d,-R,x),o.lineTo(I.cx+I.x01,I.cy+I.y01),R{l3();u3();l8()});function d3(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var xft,c8=F(()=>{xft=Array.prototype.slice});function oq(t){this._context=t}function kv(t){return new oq(t)}var u8=F(()=>{oq.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}}}});function lq(t){return t[0]}function cq(t){return t[1]}var uq=F(()=>{});function ms(t,e){var r=Dn(!0),n=null,i=kv,a=null,s=h3(o);t=typeof t=="function"?t:t===void 0?lq:Dn(t),e=typeof e=="function"?e:e===void 0?cq:Dn(e);function o(l){var u,h=(l=d3(l)).length,f,d=!1,p;for(n==null&&(a=i(p=s())),u=0;u<=h;++u)!(u{c8();l3();u8();l8();uq()});function fq(t,e){return et?1:e>=t?0:NaN}var dq=F(()=>{});function pq(t){return t}var gq=F(()=>{});function h8(){var t=pq,e=fq,r=null,n=Dn(0),i=Dn(_p),a=Dn(0);function s(o){var l,u=(o=d3(o)).length,h,f,d=0,p=new Array(u),g=new Array(u),m=+n.apply(this,arguments),y=Math.min(_p,Math.max(-_p,i.apply(this,arguments)-m)),x,b=Math.min(Math.abs(y)/u,a.apply(this,arguments)),w=b*(y<0?-1:1),_;for(l=0;l0&&(d+=_);for(e!=null?p.sort(function(k,E){return e(g[k],g[E])}):r!=null&&p.sort(function(k,E){return r(o[k],o[E])}),l=0,f=d?(y-u*w)/d:0;l0?_*f:0)+w,g[h]={data:o[h],index:l,value:_,startAngle:m,endAngle:x,padAngle:b};return g}return s.value=function(o){return arguments.length?(t=typeof o=="function"?o:Dn(+o),s):t},s.sortValues=function(o){return arguments.length?(e=o,r=null,s):e},s.sort=function(o){return arguments.length?(r=o,e=null,s):r},s.startAngle=function(o){return arguments.length?(n=typeof o=="function"?o:Dn(+o),s):n},s.endAngle=function(o){return arguments.length?(i=typeof o=="function"?o:Dn(+o),s):i},s.padAngle=function(o){return arguments.length?(a=typeof o=="function"?o:Dn(+o),s):a},s}var mq=F(()=>{c8();l3();dq();gq();u3()});function f8(t){return new p3(t,!0)}function d8(t){return new p3(t,!1)}var p3,vq=F(()=>{p3=class{constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}}});function ko(){}var Tv=F(()=>{});function Lp(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function Ev(t){this._context=t}function gl(t){return new Ev(t)}var Sv=F(()=>{Ev.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Lp(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Lp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}}});function yq(t){this._context=t}function p8(t){return new yq(t)}var xq=F(()=>{Tv();Sv();yq.prototype={areaStart:ko,areaEnd:ko,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Lp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}}});function bq(t){this._context=t}function g8(t){return new bq(t)}var wq=F(()=>{Sv();bq.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Lp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}}});function kq(t,e){this._basis=new Ev(t),this._beta=e}var m8,Tq=F(()=>{Sv();kq.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,o=-1,l;++o<=r;)l=o/r,this._basis.point(this._beta*t[o]+(1-this._beta)*(n+l*a),this._beta*e[o]+(1-this._beta)*(i+l*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};m8=function t(e){function r(n){return e===1?new Ev(n):new kq(n,e)}return r.beta=function(n){return t(+n)},r}(.85)});function Rp(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function g3(t,e){this._context=t,this._k=(1-e)/6}var v8,Cv=F(()=>{g3.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Rp(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Rp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};v8=function t(e){function r(n){return new g3(n,e)}return r.tension=function(n){return t(+n)},r}(0)});function m3(t,e){this._context=t,this._k=(1-e)/6}var y8,x8=F(()=>{Tv();Cv();m3.prototype={areaStart:ko,areaEnd:ko,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Rp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};y8=function t(e){function r(n){return new m3(n,e)}return r.tension=function(n){return t(+n)},r}(0)});function v3(t,e){this._context=t,this._k=(1-e)/6}var b8,w8=F(()=>{Cv();v3.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Rp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};b8=function t(e){function r(n){return new v3(n,e)}return r.tension=function(n){return t(+n)},r}(0)});function Av(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Wi){var o=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,l=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*o-t._x0*t._l12_2a+t._x2*t._l01_2a)/l,i=(i*o-t._y0*t._l12_2a+t._y2*t._l01_2a)/l}if(t._l23_a>Wi){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,h=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*u+t._x1*t._l23_2a-e*t._l12_2a)/h,s=(s*u+t._y1*t._l23_2a-r*t._l12_2a)/h}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function Eq(t,e){this._context=t,this._alpha=e}var k8,y3=F(()=>{u3();Cv();Eq.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Av(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};k8=function t(e){function r(n){return e?new Eq(n,e):new g3(n,0)}return r.alpha=function(n){return t(+n)},r}(.5)});function Sq(t,e){this._context=t,this._alpha=e}var T8,Cq=F(()=>{x8();Tv();y3();Sq.prototype={areaStart:ko,areaEnd:ko,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Av(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};T8=function t(e){function r(n){return e?new Sq(n,e):new m3(n,0)}return r.alpha=function(n){return t(+n)},r}(.5)});function Aq(t,e){this._context=t,this._alpha=e}var E8,_q=F(()=>{w8();y3();Aq.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Av(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};E8=function t(e){function r(n){return e?new Aq(n,e):new v3(n,0)}return r.alpha=function(n){return t(+n)},r}(.5)});function Lq(t){this._context=t}function S8(t){return new Lq(t)}var Rq=F(()=>{Tv();Lq.prototype={areaStart:ko,areaEnd:ko,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}}});function Nq(t){return t<0?-1:1}function Iq(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),o=(a*i+s*n)/(n+i);return(Nq(a)+Nq(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(o))||0}function Mq(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function C8(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,o=(a-n)/3;t._context.bezierCurveTo(n+o,i+o*e,a-o,s-o*r,a,s)}function x3(t){this._context=t}function Dq(t){this._context=new Oq(t)}function Oq(t){this._context=t}function A8(t){return new x3(t)}function _8(t){return new Dq(t)}var Pq=F(()=>{x3.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:C8(this,this._t0,Mq(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,C8(this,Mq(this,r=Iq(this,t,e)),r);break;default:C8(this,this._t0,r=Iq(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}}};(Dq.prototype=Object.create(x3.prototype)).point=function(t,e){x3.prototype.point.call(this,e,t)};Oq.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)}}});function Fq(t){this._context=t}function Bq(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{Fq.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=Bq(t),i=Bq(e),a=0,s=1;s{b3.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e}}});var Gq=F(()=>{sq();hq();mq();xq();wq();Sv();vq();Tq();x8();w8();Cv();Cq();_q();y3();Rq();u8();Pq();zq();$q()});var Uq=F(()=>{});var Vq=F(()=>{});function Eh(t,e,r){this.k=t,this.x=e,this.y=r}function D8(t){for(;!t.__zoom;)if(!(t=t.parentNode))return M8;return t.__zoom}var M8,O8=F(()=>{Eh.prototype={constructor:Eh,scale:function(t){return t===1?this:new Eh(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new Eh(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};M8=new Eh(1,0,0);D8.prototype=Eh.prototype});var Wq=F(()=>{});var Hq=F(()=>{q4();Uq();Vq();O8();Wq()});var qq=F(()=>{Hq();O8()});var lr=F(()=>{gh();sG();MW();BW();yp();FW();zW();OC();IU();$W();y7();GW();VW();M7();cH();uH();bp();k7();hH();UW();fH();JH();nq();ll();Gq();s3();i8();F4();q4();qq()});var p5e,w3,P8=F(()=>{p5e=typeof global=="object"&&global&&global.Object===Object&&global,w3=p5e});var g5e,m5e,Qn,To=F(()=>{P8();g5e=typeof self=="object"&&self&&self.Object===Object&&self,m5e=w3||g5e||Function("return this")(),Qn=m5e});var v5e,Hi,hd=F(()=>{To();v5e=Qn.Symbol,Hi=v5e});function b5e(t){var e=y5e.call(t,_v),r=t[_v];try{t[_v]=void 0;var n=!0}catch{}var i=x5e.call(t);return n&&(e?t[_v]=r:delete t[_v]),i}var Yq,y5e,x5e,_v,Xq,jq=F(()=>{hd();Yq=Object.prototype,y5e=Yq.hasOwnProperty,x5e=Yq.toString,_v=Hi?Hi.toStringTag:void 0;Xq=b5e});function T5e(t){return k5e.call(t)}var w5e,k5e,Kq,Zq=F(()=>{w5e=Object.prototype,k5e=w5e.toString;Kq=T5e});function C5e(t){return t==null?t===void 0?S5e:E5e:Qq&&Qq in Object(t)?Xq(t):Kq(t)}var E5e,S5e,Qq,sa,yu=F(()=>{hd();jq();Zq();E5e="[object Null]",S5e="[object Undefined]",Qq=Hi?Hi.toStringTag:void 0;sa=C5e});function A5e(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var dn,qs=F(()=>{dn=A5e});function I5e(t){if(!dn(t))return!1;var e=sa(t);return e==L5e||e==R5e||e==_5e||e==N5e}var _5e,L5e,R5e,N5e,gi,Lv=F(()=>{yu();qs();_5e="[object AsyncFunction]",L5e="[object Function]",R5e="[object GeneratorFunction]",N5e="[object Proxy]";gi=I5e});var M5e,k3,Jq=F(()=>{To();M5e=Qn["__core-js_shared__"],k3=M5e});function D5e(t){return!!eY&&eY in t}var eY,tY,rY=F(()=>{Jq();eY=function(){var t=/[^.]+$/.exec(k3&&k3.keys&&k3.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();tY=D5e});function B5e(t){if(t!=null){try{return P5e.call(t)}catch{}try{return t+""}catch{}}return""}var O5e,P5e,xu,B8=F(()=>{O5e=Function.prototype,P5e=O5e.toString;xu=B5e});function H5e(t){if(!dn(t)||tY(t))return!1;var e=gi(t)?W5e:z5e;return e.test(xu(t))}var F5e,z5e,$5e,G5e,U5e,V5e,W5e,nY,iY=F(()=>{Lv();rY();qs();B8();F5e=/[\\^$.*+?()[\]{}|]/g,z5e=/^\[object .+?Constructor\]$/,$5e=Function.prototype,G5e=Object.prototype,U5e=$5e.toString,V5e=G5e.hasOwnProperty,W5e=RegExp("^"+U5e.call(V5e).replace(F5e,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");nY=H5e});function q5e(t,e){return t?.[e]}var aY,sY=F(()=>{aY=q5e});function Y5e(t,e){var r=aY(t,e);return nY(r)?r:void 0}var vs,Sh=F(()=>{iY();sY();vs=Y5e});var X5e,bu,Rv=F(()=>{Sh();X5e=vs(Object,"create"),bu=X5e});function j5e(){this.__data__=bu?bu(null):{},this.size=0}var oY,lY=F(()=>{Rv();oY=j5e});function K5e(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var cY,uY=F(()=>{cY=K5e});function ewe(t){var e=this.__data__;if(bu){var r=e[t];return r===Z5e?void 0:r}return J5e.call(e,t)?e[t]:void 0}var Z5e,Q5e,J5e,hY,fY=F(()=>{Rv();Z5e="__lodash_hash_undefined__",Q5e=Object.prototype,J5e=Q5e.hasOwnProperty;hY=ewe});function nwe(t){var e=this.__data__;return bu?e[t]!==void 0:rwe.call(e,t)}var twe,rwe,dY,pY=F(()=>{Rv();twe=Object.prototype,rwe=twe.hasOwnProperty;dY=nwe});function awe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=bu&&e===void 0?iwe:e,this}var iwe,gY,mY=F(()=>{Rv();iwe="__lodash_hash_undefined__";gY=awe});function Np(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{lY();uY();fY();pY();mY();Np.prototype.clear=oY;Np.prototype.delete=cY;Np.prototype.get=hY;Np.prototype.has=dY;Np.prototype.set=gY;F8=Np});function swe(){this.__data__=[],this.size=0}var yY,xY=F(()=>{yY=swe});function owe(t,e){return t===e||t!==t&&e!==e}var Eo,fd=F(()=>{Eo=owe});function lwe(t,e){for(var r=t.length;r--;)if(Eo(t[r][0],e))return r;return-1}var Ch,Nv=F(()=>{fd();Ch=lwe});function hwe(t){var e=this.__data__,r=Ch(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():uwe.call(e,r,1),--this.size,!0}var cwe,uwe,bY,wY=F(()=>{Nv();cwe=Array.prototype,uwe=cwe.splice;bY=hwe});function fwe(t){var e=this.__data__,r=Ch(e,t);return r<0?void 0:e[r][1]}var kY,TY=F(()=>{Nv();kY=fwe});function dwe(t){return Ch(this.__data__,t)>-1}var EY,SY=F(()=>{Nv();EY=dwe});function pwe(t,e){var r=this.__data__,n=Ch(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var CY,AY=F(()=>{Nv();CY=pwe});function Ip(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{xY();wY();TY();SY();AY();Ip.prototype.clear=yY;Ip.prototype.delete=bY;Ip.prototype.get=kY;Ip.prototype.has=EY;Ip.prototype.set=CY;Ah=Ip});var gwe,_h,T3=F(()=>{Sh();To();gwe=vs(Qn,"Map"),_h=gwe});function mwe(){this.size=0,this.__data__={hash:new F8,map:new(_h||Ah),string:new F8}}var _Y,LY=F(()=>{vY();Iv();T3();_Y=mwe});function vwe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var RY,NY=F(()=>{RY=vwe});function ywe(t,e){var r=t.__data__;return RY(e)?r[typeof e=="string"?"string":"hash"]:r.map}var Lh,Mv=F(()=>{NY();Lh=ywe});function xwe(t){var e=Lh(this,t).delete(t);return this.size-=e?1:0,e}var IY,MY=F(()=>{Mv();IY=xwe});function bwe(t){return Lh(this,t).get(t)}var DY,OY=F(()=>{Mv();DY=bwe});function wwe(t){return Lh(this,t).has(t)}var PY,BY=F(()=>{Mv();PY=wwe});function kwe(t,e){var r=Lh(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var FY,zY=F(()=>{Mv();FY=kwe});function Mp(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{LY();MY();OY();BY();zY();Mp.prototype.clear=_Y;Mp.prototype.delete=IY;Mp.prototype.get=DY;Mp.prototype.has=PY;Mp.prototype.set=FY;dd=Mp});function z8(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(Twe);var r=function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s};return r.cache=new(z8.Cache||dd),r}var Twe,Dp,$8=F(()=>{E3();Twe="Expected a function";z8.Cache=dd;Dp=z8});function Ewe(){this.__data__=new Ah,this.size=0}var $Y,GY=F(()=>{Iv();$Y=Ewe});function Swe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var UY,VY=F(()=>{UY=Swe});function Cwe(t){return this.__data__.get(t)}var WY,HY=F(()=>{WY=Cwe});function Awe(t){return this.__data__.has(t)}var qY,YY=F(()=>{qY=Awe});function Lwe(t,e){var r=this.__data__;if(r instanceof Ah){var n=r.__data__;if(!_h||n.length<_we-1)return n.push([t,e]),this.size=++r.size,this;r=this.__data__=new dd(n)}return r.set(t,e),this.size=r.size,this}var _we,XY,jY=F(()=>{Iv();T3();E3();_we=200;XY=Lwe});function Op(t){var e=this.__data__=new Ah(t);this.size=e.size}var cc,Dv=F(()=>{Iv();GY();VY();HY();YY();jY();Op.prototype.clear=$Y;Op.prototype.delete=UY;Op.prototype.get=WY;Op.prototype.has=qY;Op.prototype.set=XY;cc=Op});var Rwe,Pp,G8=F(()=>{Sh();Rwe=function(){try{var t=vs(Object,"defineProperty");return t({},"",{}),t}catch{}}(),Pp=Rwe});function Nwe(t,e,r){e=="__proto__"&&Pp?Pp(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var uc,Bp=F(()=>{G8();uc=Nwe});function Iwe(t,e,r){(r!==void 0&&!Eo(t[e],r)||r===void 0&&!(e in t))&&uc(t,e,r)}var Ov,U8=F(()=>{Bp();fd();Ov=Iwe});function Mwe(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),o=s.length;o--;){var l=s[t?o:++i];if(r(a[l],l,a)===!1)break}return e}}var KY,ZY=F(()=>{KY=Mwe});var Dwe,Fp,S3=F(()=>{ZY();Dwe=KY(),Fp=Dwe});function Pwe(t,e){if(e)return t.slice();var r=t.length,n=eX?eX(r):new t.constructor(r);return t.copy(n),n}var tX,QY,Owe,JY,eX,C3,V8=F(()=>{To();tX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,QY=tX&&typeof module=="object"&&module&&!module.nodeType&&module,Owe=QY&&QY.exports===tX,JY=Owe?Qn.Buffer:void 0,eX=JY?JY.allocUnsafe:void 0;C3=Pwe});var Bwe,zp,W8=F(()=>{To();Bwe=Qn.Uint8Array,zp=Bwe});function Fwe(t){var e=new t.constructor(t.byteLength);return new zp(e).set(new zp(t)),e}var $p,A3=F(()=>{W8();$p=Fwe});function zwe(t,e){var r=e?$p(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var _3,H8=F(()=>{A3();_3=zwe});function $we(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{L3=$we});var rX,Gwe,nX,iX=F(()=>{qs();rX=Object.create,Gwe=function(){function t(){}return function(e){if(!dn(e))return{};if(rX)return rX(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),nX=Gwe});function Uwe(t,e){return function(r){return t(e(r))}}var R3,Y8=F(()=>{R3=Uwe});var Vwe,Gp,N3=F(()=>{Y8();Vwe=R3(Object.getPrototypeOf,Object),Gp=Vwe});function Hwe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||Wwe;return t===r}var Wwe,hc,Up=F(()=>{Wwe=Object.prototype;hc=Hwe});function qwe(t){return typeof t.constructor=="function"&&!hc(t)?nX(Gp(t)):{}}var I3,X8=F(()=>{iX();N3();Up();I3=qwe});function Ywe(t){return t!=null&&typeof t=="object"}var qn,So=F(()=>{qn=Ywe});function jwe(t){return qn(t)&&sa(t)==Xwe}var Xwe,j8,aX=F(()=>{yu();So();Xwe="[object Arguments]";j8=jwe});var sX,Kwe,Zwe,Qwe,ml,Vp=F(()=>{aX();So();sX=Object.prototype,Kwe=sX.hasOwnProperty,Zwe=sX.propertyIsEnumerable,Qwe=j8(function(){return arguments}())?j8:function(t){return qn(t)&&Kwe.call(t,"callee")&&!Zwe.call(t,"callee")},ml=Qwe});var Jwe,Et,On=F(()=>{Jwe=Array.isArray,Et=Jwe});function tke(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=eke}var eke,Wp,M3=F(()=>{eke=9007199254740991;Wp=tke});function rke(t){return t!=null&&Wp(t.length)&&!gi(t)}var Jn,Co=F(()=>{Lv();M3();Jn=rke});function nke(t){return qn(t)&&Jn(t)}var pd,D3=F(()=>{Co();So();pd=nke});function ike(){return!1}var oX,lX=F(()=>{oX=ike});var hX,cX,ake,uX,ske,oke,vl,Hp=F(()=>{To();lX();hX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,cX=hX&&typeof module=="object"&&module&&!module.nodeType&&module,ake=cX&&cX.exports===hX,uX=ake?Qn.Buffer:void 0,ske=uX?uX.isBuffer:void 0,oke=ske||oX,vl=oke});function dke(t){if(!qn(t)||sa(t)!=lke)return!1;var e=Gp(t);if(e===null)return!0;var r=hke.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&fX.call(r)==fke}var lke,cke,uke,fX,hke,fke,dX,pX=F(()=>{yu();N3();So();lke="[object Object]",cke=Function.prototype,uke=Object.prototype,fX=cke.toString,hke=uke.hasOwnProperty,fke=fX.call(Object);dX=dke});function Fke(t){return qn(t)&&Wp(t.length)&&!!Nn[sa(t)]}var pke,gke,mke,vke,yke,xke,bke,wke,kke,Tke,Eke,Ske,Cke,Ake,_ke,Lke,Rke,Nke,Ike,Mke,Dke,Oke,Pke,Bke,Nn,gX,mX=F(()=>{yu();M3();So();pke="[object Arguments]",gke="[object Array]",mke="[object Boolean]",vke="[object Date]",yke="[object Error]",xke="[object Function]",bke="[object Map]",wke="[object Number]",kke="[object Object]",Tke="[object RegExp]",Eke="[object Set]",Ske="[object String]",Cke="[object WeakMap]",Ake="[object ArrayBuffer]",_ke="[object DataView]",Lke="[object Float32Array]",Rke="[object Float64Array]",Nke="[object Int8Array]",Ike="[object Int16Array]",Mke="[object Int32Array]",Dke="[object Uint8Array]",Oke="[object Uint8ClampedArray]",Pke="[object Uint16Array]",Bke="[object Uint32Array]",Nn={};Nn[Lke]=Nn[Rke]=Nn[Nke]=Nn[Ike]=Nn[Mke]=Nn[Dke]=Nn[Oke]=Nn[Pke]=Nn[Bke]=!0;Nn[pke]=Nn[gke]=Nn[Ake]=Nn[mke]=Nn[_ke]=Nn[vke]=Nn[yke]=Nn[xke]=Nn[bke]=Nn[wke]=Nn[kke]=Nn[Tke]=Nn[Eke]=Nn[Ske]=Nn[Cke]=!1;gX=Fke});function zke(t){return function(e){return t(e)}}var Ao,gd=F(()=>{Ao=zke});var vX,Pv,$ke,K8,Gke,_o,Bv=F(()=>{P8();vX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Pv=vX&&typeof module=="object"&&module&&!module.nodeType&&module,$ke=Pv&&Pv.exports===vX,K8=$ke&&w3.process,Gke=function(){try{var t=Pv&&Pv.require&&Pv.require("util").types;return t||K8&&K8.binding&&K8.binding("util")}catch{}}(),_o=Gke});var yX,Uke,Rh,Fv=F(()=>{mX();gd();Bv();yX=_o&&_o.isTypedArray,Uke=yX?Ao(yX):gX,Rh=Uke});function Vke(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var zv,Z8=F(()=>{zv=Vke});function qke(t,e,r){var n=t[e];(!(Hke.call(t,e)&&Eo(n,r))||r===void 0&&!(e in t))&&uc(t,e,r)}var Wke,Hke,fc,qp=F(()=>{Bp();fd();Wke=Object.prototype,Hke=Wke.hasOwnProperty;fc=qke});function Yke(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{qp();Bp();Lo=Yke});function Xke(t,e){for(var r=-1,n=Array(t);++r{xX=Xke});function Zke(t,e){var r=typeof t;return e=e??jke,!!e&&(r=="number"||r!="symbol"&&Kke.test(t))&&t>-1&&t%1==0&&t{jke=9007199254740991,Kke=/^(?:0|[1-9]\d*)$/;Nh=Zke});function eTe(t,e){var r=Et(t),n=!r&&ml(t),i=!r&&!n&&vl(t),a=!r&&!n&&!i&&Rh(t),s=r||n||i||a,o=s?xX(t.length,String):[],l=o.length;for(var u in t)(e||Jke.call(t,u))&&!(s&&(u=="length"||i&&(u=="offset"||u=="parent")||a&&(u=="buffer"||u=="byteLength"||u=="byteOffset")||Nh(u,l)))&&o.push(u);return o}var Qke,Jke,O3,Q8=F(()=>{bX();Vp();On();Hp();$v();Fv();Qke=Object.prototype,Jke=Qke.hasOwnProperty;O3=eTe});function tTe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var wX,kX=F(()=>{wX=tTe});function iTe(t){if(!dn(t))return wX(t);var e=hc(t),r=[];for(var n in t)n=="constructor"&&(e||!nTe.call(t,n))||r.push(n);return r}var rTe,nTe,TX,EX=F(()=>{qs();Up();kX();rTe=Object.prototype,nTe=rTe.hasOwnProperty;TX=iTe});function aTe(t){return Jn(t)?O3(t,!0):TX(t)}var ys,Ih=F(()=>{Q8();EX();Co();ys=aTe});function sTe(t){return Lo(t,ys(t))}var SX,CX=F(()=>{md();Ih();SX=sTe});function oTe(t,e,r,n,i,a,s){var o=zv(t,r),l=zv(e,r),u=s.get(l);if(u){Ov(t,r,u);return}var h=a?a(o,l,r+"",t,e,s):void 0,f=h===void 0;if(f){var d=Et(l),p=!d&&vl(l),g=!d&&!p&&Rh(l);h=l,d||p||g?Et(o)?h=o:pd(o)?h=L3(o):p?(f=!1,h=C3(l,!0)):g?(f=!1,h=_3(l,!0)):h=[]:dX(l)||ml(l)?(h=o,ml(o)?h=SX(o):(!dn(o)||gi(o))&&(h=I3(l))):f=!1}f&&(s.set(l,h),i(h,l,n,a,s),s.delete(l)),Ov(t,r,h)}var AX,_X=F(()=>{U8();V8();H8();q8();X8();Vp();On();D3();Hp();Lv();qs();pX();Fv();Z8();CX();AX=oTe});function LX(t,e,r,n,i){t!==e&&Fp(e,function(a,s){if(i||(i=new cc),dn(a))AX(t,e,s,r,LX,n,i);else{var o=n?n(zv(t,s),a,s+"",t,e,i):void 0;o===void 0&&(o=a),Ov(t,s,o)}},ys)}var RX,NX=F(()=>{Dv();U8();S3();_X();qs();Ih();Z8();RX=LX});function lTe(t){return t}var qi,wu=F(()=>{qi=lTe});function cTe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var IX,MX=F(()=>{IX=cTe});function uTe(t,e,r){return e=DX(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=DX(n.length-e,0),s=Array(a);++i{MX();DX=Math.max;P3=uTe});function hTe(t){return function(){return t}}var xs,eA=F(()=>{xs=hTe});var fTe,OX,PX=F(()=>{eA();G8();wu();fTe=Pp?function(t,e){return Pp(t,"toString",{configurable:!0,enumerable:!1,value:xs(e),writable:!0})}:qi,OX=fTe});function mTe(t){var e=0,r=0;return function(){var n=gTe(),i=pTe-(n-r);if(r=n,i>0){if(++e>=dTe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var dTe,pTe,gTe,BX,FX=F(()=>{dTe=800,pTe=16,gTe=Date.now;BX=mTe});var vTe,B3,tA=F(()=>{PX();FX();vTe=BX(OX),B3=vTe});function yTe(t,e){return B3(P3(t,e,qi),t+"")}var dc,Yp=F(()=>{wu();J8();tA();dc=yTe});function xTe(t,e,r){if(!dn(r))return!1;var n=typeof e;return(n=="number"?Jn(r)&&Nh(e,r.length):n=="string"&&e in r)?Eo(r[e],t):!1}var Ys,vd=F(()=>{fd();Co();$v();qs();Ys=xTe});function bTe(t){return dc(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&Ys(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{Yp();vd();F3=bTe});var wTe,Mh,nA=F(()=>{NX();rA();wTe=F3(function(t,e,r){RX(t,e,r)}),Mh=wTe});function $3(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return kTe[r]??e}function WX(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,GX.sanitizeUrl)(r):r}function aA(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function HX(t){let e,r=0;t.forEach(i=>{r+=aA(i,e),e=i});let n=r/2;return sA(t,n)}function qX(t){return t.length===1?t[0]:HX(t)}function YX(t,e,r){let n=structuredClone(r);re.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=sA(n,i),s=10+t*.5,o=Math.atan2(n[0].y-a.y,n[0].x-a.x),l={x:0,y:0};return e==="start_left"?(l.x=Math.sin(o+Math.PI)*s+(n[0].x+a.x)/2,l.y=-Math.cos(o+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(l.x=Math.sin(o-Math.PI)*s+(n[0].x+a.x)/2-5,l.y=-Math.cos(o-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(l.x=Math.sin(o)*s+(n[0].x+a.x)/2-5,l.y=-Math.cos(o)*s+(n[0].y+a.y)/2-5):(l.x=Math.sin(o)*s+(n[0].x+a.x)/2,l.y=-Math.cos(o)*s+(n[0].y+a.y)/2),l}function G3(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function XX(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;i{or();GX=Gi(hp(),1);lr();$8();nA();iA="\u200B",kTe={curveBasis:gl,curveBasisClosed:p8,curveBasisOpen:g8,curveBumpX:f8,curveBumpY:d8,curveBundle:m8,curveCardinalClosed:y8,curveCardinalOpen:b8,curveCardinal:v8,curveCatmullRomClosed:T8,curveCatmullRomOpen:E8,curveCatmullRom:k8,curveLinear:kv,curveLinearClosed:S8,curveMonotoneX:A8,curveMonotoneY:_8,curveNatural:L8,curveStep:R8,curveStepAfter:I8,curveStepBefore:N8},TTe=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,ETe=v(function(t,e){let r=UX(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(o=>o.args);B1(s),n=Hn(n,[...s])}else n=r.args;if(!n)return;let i=F1(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),UX=v(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${TTe.source})(?=[}][%]{2}).* `,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),re.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=J0.exec(t))!==null;)if(n.index===J0.lastIndex&&J0.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return re.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),VX=v(function(t){return t.replace(J0,"")},"removeDirectives"),STe=v(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");v($3,"interpolateToCurve");v(WX,"formatUrl");CTe=v((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),sA=v((t,e)=>{let r,n=e;for(let i of t){if(r){let a=aA(i,r);if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:zX((1-s)*r.x+s*i.x,5),y:zX((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),ATe=v((t,e,r)=>{re.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=sA(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),o={x:0,y:0};return o.x=Math.sin(s)*a+(e[0].x+i.x)/2,o.y=-Math.cos(s)*a+(e[0].y+i.y)/2,o},"calcCardinalityPosition");v(YX,"calcTerminalLabelPosition");v(G3,"getStylesFromArray");$X=0,oA=v(()=>($X++,"id-"+Math.random().toString(36).substr(2,12)+"-"+$X),"generateId");v(XX,"makeRandomHex");lA=v(t=>XX(t.length),"random"),_Te=v(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),LTe=v(function(t,e){let r=e.text.replace(Xe.lineBreakRegex," "),[,n]=Ro(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),cA=Dp((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
"},r),Xe.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,o)=>{let l=bs(`${s} `,r),u=bs(a,r);if(l>e){let{hyphenatedStrings:d,remainingWord:p}=RTe(s,e,"-",r);i.push(a,...d),a=p}else u+l>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");o+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),RTe=Dp((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((o,l)=>{let u=`${s}${o}`;if(bs(u,n)>=e){let f=l+1,d=i.length===f,p=`${u}${r}`;a.push(d?u:p),s=""}else s=u}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);v(Gv,"calculateTextHeight");v(bs,"calculateTextWidth");uA=Dp((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=Ro(r),s=["sans-serif",n],o=t.split(Xe.lineBreakRegex),l=[],u=Ve("body");if(!u.remove)return{width:0,height:0,lineHeight:0};let h=u.append("svg");for(let d of s){let p=0,g={width:0,height:0,lineHeight:0};for(let m of o){let y=_Te();y.text=m||iA;let x=LTe(h,y).style("font-size",a).style("font-weight",i).style("font-family",d),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),p=Math.round(b.height),g.height+=p,g.lineHeight=Math.round(Math.max(g.lineHeight,p))}l.push(g)}h.remove();let f=isNaN(l[1].height)||isNaN(l[1].width)||isNaN(l[1].lineHeight)||l[0].height>l[1].height&&l[0].width>l[1].width&&l[0].lineHeight>l[1].lineHeight?0:1;return l[f]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),NTe=class{constructor(t=!1,e){this.count=0,this.count=e?e.length:0,this.next=t?()=>this.count++:()=>Date.now()}static{v(this,"InitIDGenerator")}},ITe=v(function(t){return z3=z3||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),z3.innerHTML=t,unescape(z3.textContent)},"entityDecode");v(U3,"isDetailedError");MTe=v((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),Ro=v(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");v(ws,"cleanAndMerge");Ut={assignWithDepth:Hn,wrapLabel:cA,calculateTextHeight:Gv,calculateTextWidth:bs,calculateTextDimensions:uA,cleanAndMerge:ws,detectInit:ETe,detectDirective:UX,isSubstringInArray:STe,interpolateToCurve:$3,calcLabelPosition:qX,calcCardinalityPosition:ATe,calcTerminalLabelPosition:YX,formatUrl:WX,getStylesFromArray:G3,generateId:oA,random:lA,runFunc:CTe,entityDecode:ITe,insertTitle:MTe,parseFontSize:Ro,InitIDGenerator:NTe},jX=v(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),Xs=v(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),V3=v((t,e,{counter:r=0,prefix:n,suffix:i})=>`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");v(Aa,"handleUndefinedAttr")});function dA(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function tj(t){xd=t}function js(t,e){if(e){if(rj.test(t))return t.replace(DTe,KX)}else if(nj.test(t))return t.replace(OTe,KX);return t}function FTe(t){return t.replace(BTe,(e,r)=>(r=r.toLowerCase(),r==="colon"?":":r.charAt(0)==="#"?r.charAt(1)==="x"?String.fromCharCode(parseInt(r.substring(2),16)):String.fromCharCode(+r.substring(1)):""))}function sn(t,e){let r=typeof t=="string"?t:t.source;e=e||"";let n={replace:(i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(zTe,"$1"),r=r.replace(i,s),n},getRegex:()=>new RegExp(r,e)};return n}function ZX(t){try{t=encodeURI(t).replace(/%25/g,"%")}catch{return null}return t}function QX(t,e){let r=t.replace(/\|/g,(a,s,o)=>{let l=!1,u=s;for(;--u>=0&&o[u]==="\\";)l=!l;return l?"|":" |"}),n=r.split(/ \|/),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length{let a=i.match(/^\s+/);if(a===null)return i;let[s]=a;return s.length>=n.length?i.slice(n.length):i}).join(` `)}function Yr(t,e){return yd.parse(t,e)}var xd,rj,DTe,nj,OTe,PTe,KX,BTe,zTe,Wv,jp,UTe,VTe,WTe,qv,HTe,ij,aj,pA,qTe,gA,YTe,XTe,q3,mA,jTe,sj,KTe,vA,ej,ZTe,QTe,oj,JTe,lj,e6e,Yv,t6e,r6e,n6e,i6e,a6e,s6e,o6e,l6e,c6e,H3,u6e,cj,uj,h6e,yA,f6e,hA,d6e,W3,Vv,ku,Kp,Hv,Tu,Xp,fA,yd,gvt,mvt,vvt,yvt,xvt,bvt,wvt,hj=F(()=>{xd=dA();rj=/[&<>"']/,DTe=new RegExp(rj.source,"g"),nj=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,OTe=new RegExp(nj.source,"g"),PTe={"&":"&","<":"<",">":">",'"':""","'":"'"},KX=t=>PTe[t];BTe=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;zTe=/(^|[^\[])\^/g;Wv={exec:()=>null};jp=class{options;rules;lexer;constructor(e){this.options=e||xd}space(e){let r=this.rules.block.newline.exec(e);if(r&&r[0].length>0)return{type:"space",raw:r[0]}}code(e){let r=this.rules.block.code.exec(e);if(r){let n=r[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:r[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Uv(n,` `)}}}fences(e){let r=this.rules.block.fences.exec(e);if(r){let n=r[0],i=GTe(n,r[3]||"");return{type:"code",raw:n,lang:r[2]?r[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):r[2],text:i}}}heading(e){let r=this.rules.block.heading.exec(e);if(r){let n=r[2].trim();if(/#$/.test(n)){let i=Uv(n,"#");(this.options.pedantic||!i||/ $/.test(i))&&(n=i.trim())}return{type:"heading",raw:r[0],depth:r[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let r=this.rules.block.hr.exec(e);if(r)return{type:"hr",raw:Uv(r[0],` `)}}blockquote(e){let r=this.rules.block.blockquote.exec(e);if(r){let n=Uv(r[0],` `).split(` `),i="",a="",s=[];for(;n.length>0;){let o=!1,l=[],u;for(u=0;u/.test(n[u]))l.push(n[u]),o=!0;else if(!o)l.push(n[u]);else break;n=n.slice(u);let h=l.join(` `),f=h.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,` $1`).replace(/^ {0,3}>[ \t]?/gm,"");i=i?`${i} ${h}`:h,a=a?`${a} ${f}`:f;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(f,s,!0),this.lexer.state.top=d,n.length===0)break;let p=s[s.length-1];if(p?.type==="code")break;if(p?.type==="blockquote"){let g=p,m=g.raw+` `+n.join(` `),y=this.blockquote(m);s[s.length-1]=y,i=i.substring(0,i.length-g.raw.length)+y.raw,a=a.substring(0,a.length-g.text.length)+y.text;break}else if(p?.type==="list"){let g=p,m=g.raw+` `+n.join(` `),y=this.list(m);s[s.length-1]=y,i=i.substring(0,i.length-p.raw.length)+y.raw,a=a.substring(0,a.length-g.raw.length)+y.raw,n=m.substring(s[s.length-1].raw.length).split(` `);continue}}return{type:"blockquote",raw:i,tokens:s,text:a}}}list(e){let r=this.rules.block.list.exec(e);if(r){let n=r[1].trim(),i=n.length>1,a={type:"list",raw:"",ordered:i,start:i?+n.slice(0,-1):"",loose:!1,items:[]};n=i?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=i?n:"[*+-]");let s=new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),o=!1;for(;e;){let l=!1,u="",h="";if(!(r=s.exec(e))||this.rules.block.hr.test(e))break;u=r[0],e=e.substring(u.length);let f=r[2].split(` `,1)[0].replace(/^\t+/,x=>" ".repeat(3*x.length)),d=e.split(` `,1)[0],p=!f.trim(),g=0;if(this.options.pedantic?(g=2,h=f.trimStart()):p?g=r[1].length+1:(g=r[2].search(/[^ ]/),g=g>4?1:g,h=f.slice(g),g+=r[1].length),p&&/^ *$/.test(d)&&(u+=d+` `,e=e.substring(d.length+1),l=!0),!l){let x=new RegExp(`^ {0,${Math.min(3,g-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),b=new RegExp(`^ {0,${Math.min(3,g-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),w=new RegExp(`^ {0,${Math.min(3,g-1)}}(?:\`\`\`|~~~)`),_=new RegExp(`^ {0,${Math.min(3,g-1)}}#`);for(;e;){let k=e.split(` `,1)[0];if(d=k,this.options.pedantic&&(d=d.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),w.test(d)||_.test(d)||x.test(d)||b.test(e))break;if(d.search(/[^ ]/)>=g||!d.trim())h+=` `+d.slice(g);else{if(p||f.search(/[^ ]/)>=4||w.test(f)||_.test(f)||b.test(f))break;h+=` `+d}!p&&!d.trim()&&(p=!0),u+=k+` `,e=e.substring(k.length+1),f=d.slice(g)}}a.loose||(o?a.loose=!0:/\n *\n *$/.test(u)&&(o=!0));let m=null,y;this.options.gfm&&(m=/^\[[ xX]\] /.exec(h),m&&(y=m[0]!=="[ ] ",h=h.replace(/^\[[ xX]\] +/,""))),a.items.push({type:"list_item",raw:u,task:!!m,checked:y,loose:!1,text:h,tokens:[]}),a.raw+=u}a.items[a.items.length-1].raw=a.items[a.items.length-1].raw.trimEnd(),a.items[a.items.length-1].text=a.items[a.items.length-1].text.trimEnd(),a.raw=a.raw.trimEnd();for(let l=0;lf.type==="space"),h=u.length>0&&u.some(f=>/\n.*\n/.test(f.raw));a.loose=h}if(a.loose)for(let l=0;l$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=r[3]?r[3].substring(1,r[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):r[3];return{type:"def",tag:n,raw:r[0],href:i,title:a}}}table(e){let r=this.rules.block.table.exec(e);if(!r||!/[:|]/.test(r[2]))return;let n=QX(r[1]),i=r[2].replace(/^\||\| *$/g,"").split("|"),a=r[3]&&r[3].trim()?r[3].replace(/\n[ \t]*$/,"").split(` `):[],s={type:"table",raw:r[0],header:[],align:[],rows:[]};if(n.length===i.length){for(let o of i)/^ *-+: *$/.test(o)?s.align.push("right"):/^ *:-+: *$/.test(o)?s.align.push("center"):/^ *:-+ *$/.test(o)?s.align.push("left"):s.align.push(null);for(let o=0;o({text:l,tokens:this.lexer.inline(l),header:!1,align:s.align[u]})));return s}}lheading(e){let r=this.rules.block.lheading.exec(e);if(r)return{type:"heading",raw:r[0],depth:r[2].charAt(0)==="="?1:2,text:r[1],tokens:this.lexer.inline(r[1])}}paragraph(e){let r=this.rules.block.paragraph.exec(e);if(r){let n=r[1].charAt(r[1].length-1)===` `?r[1].slice(0,-1):r[1];return{type:"paragraph",raw:r[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let r=this.rules.block.text.exec(e);if(r)return{type:"text",raw:r[0],text:r[0],tokens:this.lexer.inline(r[0])}}escape(e){let r=this.rules.inline.escape.exec(e);if(r)return{type:"escape",raw:r[0],text:js(r[1])}}tag(e){let r=this.rules.inline.tag.exec(e);if(r)return!this.lexer.state.inLink&&/^/i.test(r[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(r[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(r[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:r[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:r[0]}}link(e){let r=this.rules.inline.link.exec(e);if(r){let n=r[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;let s=Uv(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=$Te(r[2],"()");if(s>-1){let l=(r[0].indexOf("!")===0?5:4)+r[1].length+s;r[2]=r[2].substring(0,s),r[0]=r[0].substring(0,l).trim(),r[3]=""}}let i=r[2],a="";if(this.options.pedantic){let s=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i);s&&(i=s[1],a=s[3])}else a=r[3]?r[3].slice(1,-1):"";return i=i.trim(),/^$/.test(n)?i=i.slice(1):i=i.slice(1,-1)),JX(r,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},r[0],this.lexer)}}reflink(e,r){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let i=(n[2]||n[1]).replace(/\s+/g," "),a=r[i.toLowerCase()];if(!a){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return JX(n,a,n[0],this.lexer)}}emStrong(e,r,n=""){let i=this.rules.inline.emStrongLDelim.exec(e);if(!i||i[3]&&n.match(/[\p{L}\p{N}]/u))return;if(!(i[1]||i[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...i[0]].length-1,o,l,u=s,h=0,f=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(f.lastIndex=0,r=r.slice(-1*e.length+s);(i=f.exec(r))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(l=[...o].length,i[3]||i[4]){u+=l;continue}else if((i[5]||i[6])&&s%3&&!((s+l)%3)){h+=l;continue}if(u-=l,u>0)continue;l=Math.min(l,l+u+h);let d=[...i[0]][0].length,p=e.slice(0,s+i.index+d+l);if(Math.min(s,l)%2){let m=p.slice(1,-1);return{type:"em",raw:p,text:m,tokens:this.lexer.inlineTokens(m)}}let g=p.slice(2,-2);return{type:"strong",raw:p,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let r=this.rules.inline.code.exec(e);if(r){let n=r[2].replace(/\n/g," "),i=/[^ ]/.test(n),a=/^ /.test(n)&&/ $/.test(n);return i&&a&&(n=n.substring(1,n.length-1)),n=js(n,!0),{type:"codespan",raw:r[0],text:n}}}br(e){let r=this.rules.inline.br.exec(e);if(r)return{type:"br",raw:r[0]}}del(e){let r=this.rules.inline.del.exec(e);if(r)return{type:"del",raw:r[0],text:r[2],tokens:this.lexer.inlineTokens(r[2])}}autolink(e){let r=this.rules.inline.autolink.exec(e);if(r){let n,i;return r[2]==="@"?(n=js(r[1]),i="mailto:"+n):(n=js(r[1]),i=n),{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let r;if(r=this.rules.inline.url.exec(e)){let n,i;if(r[2]==="@")n=js(r[0]),i="mailto:"+n;else{let a;do a=r[0],r[0]=this.rules.inline._backpedal.exec(r[0])?.[0]??"";while(a!==r[0]);n=js(r[0]),r[1]==="www."?i="http://"+r[0]:i=r[0]}return{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let r=this.rules.inline.text.exec(e);if(r){let n;return this.lexer.state.inRawBlock?n=r[0]:n=js(r[0]),{type:"text",raw:r[0],text:n}}}},UTe=/^(?: *(?:\n|$))+/,VTe=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,WTe=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,qv=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,HTe=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ij=/(?:[*+-]|\d{1,9}[.)])/,aj=sn(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,ij).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),pA=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,qTe=/^[^\n]+/,gA=/(?!\s*\])(?:\\.|[^\[\]\\])+/,YTe=sn(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",gA).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),XTe=sn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ij).getRegex(),q3="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",mA=/|$))/,jTe=sn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",mA).replace("tag",q3).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),sj=sn(pA).replace("hr",qv).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",q3).getRegex(),KTe=sn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",sj).getRegex(),vA={blockquote:KTe,code:VTe,def:YTe,fences:WTe,heading:HTe,hr:qv,html:jTe,lheading:aj,list:XTe,newline:UTe,paragraph:sj,table:Wv,text:qTe},ej=sn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",qv).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",q3).getRegex(),ZTe={...vA,table:ej,paragraph:sn(pA).replace("hr",qv).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ej).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",q3).getRegex()},QTe={...vA,html:sn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",mA).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Wv,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:sn(pA).replace("hr",qv).replace("heading",` *#{1,6} *[^ ]`).replace("lheading",aj).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},oj=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,JTe=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,lj=/^( {2,}|\\)\n(?!\s*$)/,e6e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,n6e=sn(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,Yv).getRegex(),i6e=sn("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,Yv).getRegex(),a6e=sn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,Yv).getRegex(),s6e=sn(/\\([punct])/,"gu").replace(/punct/g,Yv).getRegex(),o6e=sn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),l6e=sn(mA).replace("(?:-->|$)","-->").getRegex(),c6e=sn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",l6e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),H3=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,u6e=sn(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",H3).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),cj=sn(/^!?\[(label)\]\[(ref)\]/).replace("label",H3).replace("ref",gA).getRegex(),uj=sn(/^!?\[(ref)\](?:\[\])?/).replace("ref",gA).getRegex(),h6e=sn("reflink|nolink(?!\\()","g").replace("reflink",cj).replace("nolink",uj).getRegex(),yA={_backpedal:Wv,anyPunctuation:s6e,autolink:o6e,blockSkip:r6e,br:lj,code:JTe,del:Wv,emStrongLDelim:n6e,emStrongRDelimAst:i6e,emStrongRDelimUnd:a6e,escape:oj,link:u6e,nolink:uj,punctuation:t6e,reflink:cj,reflinkSearch:h6e,tag:c6e,text:e6e,url:Wv},f6e={...yA,link:sn(/^!?\[(label)\]\((.*?)\)/).replace("label",H3).getRegex(),reflink:sn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",H3).getRegex()},hA={...yA,escape:sn(oj).replace("])","~|])").getRegex(),url:sn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\l+" ".repeat(u.length));let i,a,s;for(;e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(o=>(i=o.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))){if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length),i.raw.length===1&&r.length>0?r[r.length-1].raw+=` `:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&(a.type==="paragraph"||a.type==="text")?(a.raw+=` `+i.raw,a.text+=` `+i.text,this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&(a.type==="paragraph"||a.type==="text")?(a.raw+=` `+i.raw,a.text+=` `+i.raw,this.inlineQueue[this.inlineQueue.length-1].src=a.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title});continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(s=e,this.options.extensions&&this.options.extensions.startBlock){let o=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(o=Math.min(o,u))}),o<1/0&&o>=0&&(s=e.substring(0,o+1))}if(this.state.top&&(i=this.tokenizer.paragraph(s))){a=r[r.length-1],n&&a?.type==="paragraph"?(a.raw+=` `+i.raw,a.text+=` `+i.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i),n=s.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&a.type==="text"?(a.raw+=` `+i.raw,a.text+=` `+i.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i);continue}if(e){let o="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(o);break}else throw new Error(o)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n,i,a,s=e,o,l,u;if(this.tokens.links){let h=Object.keys(this.tokens.links);if(h.length>0)for(;(o=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)h.includes(o[0].slice(o[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,o.index)+"["+"a".repeat(o[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(o=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)s=s.slice(0,o.index)+"["+"a".repeat(o[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(o=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,o.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(l||(u=""),l=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(h=>(n=h.call({lexer:this},e,r))?(e=e.substring(n.raw.length),r.push(n),!0):!1))){if(n=this.tokenizer.escape(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.tag(e)){e=e.substring(n.raw.length),i=r[r.length-1],i&&n.type==="text"&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(n=this.tokenizer.link(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(n.raw.length),i=r[r.length-1],i&&n.type==="text"&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(n=this.tokenizer.emStrong(e,s,u)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.codespan(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.br(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.del(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.autolink(e)){e=e.substring(n.raw.length),r.push(n);continue}if(!this.state.inLink&&(n=this.tokenizer.url(e))){e=e.substring(n.raw.length),r.push(n);continue}if(a=e,this.options.extensions&&this.options.extensions.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(a=e.substring(0,h+1))}if(n=this.tokenizer.inlineText(a)){e=e.substring(n.raw.length),n.raw.slice(-1)!=="_"&&(u=n.raw.slice(-1)),l=!0,i=r[r.length-1],i&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},Kp=class{options;parser;constructor(e){this.options=e||xd}space(e){return""}code({text:e,lang:r,escaped:n}){let i=(r||"").match(/^\S*/)?.[0],a=e.replace(/\n$/,"")+` `;return i?'
'+(n?a:js(a,!0))+`
`:"
"+(n?a:js(a,!0))+`
`}blockquote({tokens:e}){return`
${this.parser.parse(e)}
`}html({text:e}){return e}heading({tokens:e,depth:r}){return`${this.parser.parseInline(e)} `}hr(e){return`
`}list(e){let r=e.ordered,n=e.start,i="";for(let o=0;o `+i+" `}listitem(e){let r="";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens.length>0&&e.tokens[0].type==="paragraph"?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=n+" "+e.tokens[0].tokens[0].text)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" "}):r+=n+" "}return r+=this.parser.parse(e.tokens,!!e.loose),`
  • ${r}
  • `}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    `}table(e){let r="",n="";for(let a=0;a${i}`),` `+r+` `+i+`
    `}tablerow({text:e}){return` ${e} `}tablecell(e){let r=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+r+` `}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${e}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:r,tokens:n}){let i=this.parser.parseInline(n),a=ZX(e);if(a===null)return i;e=a;let s='
    ",s}image({href:e,title:r,text:n}){let i=ZX(e);if(i===null)return n;e=i;let a=`${n}{let o=a[s].flat(1/0);n=n.concat(this.walkTokens(o,r))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,r)))}}return n}use(...e){let r=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let i={...n};if(i.async=this.defaults.async||i.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let s=r.renderers[a.name];s?r.renderers[a.name]=function(...o){let l=a.renderer.apply(this,o);return l===!1&&(l=s.apply(this,o)),l}:r.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=r[a.level];s?s.unshift(a.tokenizer):r[a.level]=[a.tokenizer],a.start&&(a.level==="block"?r.startBlock?r.startBlock.push(a.start):r.startBlock=[a.start]:a.level==="inline"&&(r.startInline?r.startInline.push(a.start):r.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(r.childTokens[a.name]=a.childTokens)}),i.extensions=r),n.renderer){let a=this.defaults.renderer||new Kp(this.defaults);for(let s in n.renderer){if(!(s in a))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let o=s,l=n.renderer[o];n.useNewRenderer||(l=this.#t(l,o,a));let u=a[o];a[o]=(...h)=>{let f=l.apply(a,h);return f===!1&&(f=u.apply(a,h)),f||""}}i.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new jp(this.defaults);for(let s in n.tokenizer){if(!(s in a))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let o=s,l=n.tokenizer[o],u=a[o];a[o]=(...h)=>{let f=l.apply(a,h);return f===!1&&(f=u.apply(a,h)),f}}i.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new Xp;for(let s in n.hooks){if(!(s in a))throw new Error(`hook '${s}' does not exist`);if(s==="options")continue;let o=s,l=n.hooks[o],u=a[o];Xp.passThroughHooks.has(s)?a[o]=h=>{if(this.defaults.async)return Promise.resolve(l.call(a,h)).then(d=>u.call(a,d));let f=l.call(a,h);return u.call(a,f)}:a[o]=(...h)=>{let f=l.apply(a,h);return f===!1&&(f=u.apply(a,h)),f}}i.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,s=n.walkTokens;i.walkTokens=function(o){let l=[];return l.push(s.call(this,o)),a&&(l=l.concat(a.call(this,o))),l}}this.defaults={...this.defaults,...i}}),this}#t(e,r,n){switch(r){case"heading":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,n.parser.parseInline(i.tokens),i.depth,FTe(n.parser.parseInline(i.tokens,n.parser.textRenderer)))};case"code":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.lang,!!i.escaped)};case"table":return function(i){if(!i.type||i.type!==r)return e.apply(this,arguments);let a="",s="";for(let l=0;l0&&h.tokens[0].type==="paragraph"?(h.tokens[0].text=g+" "+h.tokens[0].text,h.tokens[0].tokens&&h.tokens[0].tokens.length>0&&h.tokens[0].tokens[0].type==="text"&&(h.tokens[0].tokens[0].text=g+" "+h.tokens[0].tokens[0].text)):h.tokens.unshift({type:"text",text:g+" "}):p+=g+" "}p+=this.parser.parse(h.tokens,o),l+=this.listitem({type:"list_item",raw:p,text:p,task:d,checked:!!f,loose:o,tokens:h.tokens})}return e.call(this,l,a,s)};case"html":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.block)};case"paragraph":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"escape":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"link":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,this.parser.parseInline(i.tokens))};case"image":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,i.text)};case"strong":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"em":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"codespan":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"del":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"text":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)}}return e}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,r){return ku.lex(e,r??this.defaults)}parser(e,r){return Tu.parse(e,r??this.defaults)}#e(e,r){return(n,i)=>{let a={...i},s={...this.defaults,...a};this.defaults.async===!0&&a.async===!1&&(s.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),s.async=!0);let o=this.#r(!!s.silent,!!s.async);if(typeof n>"u"||n===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(s.hooks&&(s.hooks.options=s),s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(l=>e(l,s)).then(l=>s.hooks?s.hooks.processAllTokens(l):l).then(l=>s.walkTokens?Promise.all(this.walkTokens(l,s.walkTokens)).then(()=>l):l).then(l=>r(l,s)).then(l=>s.hooks?s.hooks.postprocess(l):l).catch(o);try{s.hooks&&(n=s.hooks.preprocess(n));let l=e(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let u=r(l,s);return s.hooks&&(u=s.hooks.postprocess(u)),u}catch(l){return o(l)}}}#r(e,r){return n=>{if(n.message+=` Please report this to https://github.com/markedjs/marked.`,e){let i="

    An error occurred:

    "+js(n.message+"",!0)+"
    ";return r?Promise.resolve(i):i}if(r)return Promise.reject(n);throw n}}},yd=new fA;Yr.options=Yr.setOptions=function(t){return yd.setOptions(t),Yr.defaults=yd.defaults,tj(Yr.defaults),Yr};Yr.getDefaults=dA;Yr.defaults=xd;Yr.use=function(...t){return yd.use(...t),Yr.defaults=yd.defaults,tj(Yr.defaults),Yr};Yr.walkTokens=function(t,e){return yd.walkTokens(t,e)};Yr.parseInline=yd.parseInline;Yr.Parser=Tu;Yr.parser=Tu.parse;Yr.Renderer=Kp;Yr.TextRenderer=Hv;Yr.Lexer=ku;Yr.lexer=ku.lex;Yr.Tokenizer=jp;Yr.Hooks=Xp;Yr.parse=Yr;gvt=Yr.options,mvt=Yr.setOptions,vvt=Yr.use,yvt=Yr.walkTokens,xvt=Yr.parseInline,bvt=Tu.parse,wvt=ku.lex});function Y3(t){for(var e=[],r=1;r{});function fj(t,{markdownAutoWrap:e}){let n=t.replace(//g,` `).replace(/\n{2,}/g,` `),i=Y3(n);return e===!1?i.replace(/ /g," "):i}function dj(t,e={}){let r=fj(t,e),n=Yr.lexer(r),i=[[]],a=0;function s(o,l="normal"){o.type==="text"?o.text.split(` `).forEach((h,f)=>{f!==0&&(a++,i.push([])),h.split(" ").forEach(d=>{d=d.replace(/'/g,"'"),d&&i[a].push({content:d,type:l})})}):o.type==="strong"||o.type==="em"?o.tokens.forEach(u=>{s(u,o.type)}):o.type==="html"&&i[a].push({content:o.text,type:"normal"})}return v(s,"processNode"),n.forEach(o=>{o.type==="paragraph"?o.tokens?.forEach(l=>{s(l)}):o.type==="html"&&i[a].push({content:o.text,type:"normal"})}),i}function pj(t,{markdownAutoWrap:e}={}){let r=Yr.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:`Unsupported markdown: ${i.type}`}return v(n,"output"),r.map(n).join("")}function gj(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function mj(t,e){let r=gj(e.content);return wA(t,[],r,e.type)}function wA(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?wA(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function vj(t,e){if(t.some(({content:r})=>r.includes(` `)))throw new Error("splitLineToFitWidth does not support newlines in the line");return X3(t,e)}function X3(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return X3(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[o,l]=mj(e,a);r.push([o]),l.content&&t.unshift(l)}return X3(t,e,r)}function bA(t,e){e&&t.attr("style",e)}async function yj(t,e,r,n,i=!1){let a=t.append("foreignObject");a.attr("width",`${10*r}px`),a.attr("height",`${10*r}px`);let s=a.append("xhtml:div"),o=e.label;e.label&&Ei(e.label)&&(o=await fh(e.label.replace(Xe.lineBreakRegex,` `),pe()));let l=e.isNode?"nodeLabel":"edgeLabel",u=s.append("span");u.html(o),bA(u,e.labelStyle),u.attr("class",`${l} ${n}`),bA(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&s.attr("class","labelBkg");let h=s.node().getBoundingClientRect();return h.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),h=s.node().getBoundingClientRect()),a.node()}function j3(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function xj(t,e,r){let n=t.append("text"),i=j3(n,1,e);K3(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function kA(t,e,r){let n=t.append("text"),i=j3(n,1,e);K3(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function bj(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),o=a.append("text").attr("y","-10.1"),l=0;for(let u of r){let h=v(d=>xj(a,1.1,d)<=t,"checkWidth"),f=h(u)?[u]:vj(u,h);for(let d of f){let p=j3(o,l,1.1);K3(p,d),l++}}if(n){let u=o.node().getBBox(),h=2;return s.attr("x",u.x-h).attr("y",u.y-h).attr("width",u.width+2*h).attr("height",u.height+2*h),a.node()}else return o.node()}function K3(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}function Z3(t){return t.replace(/fa[bklrs]?:fa-[\w-]+/g,e=>``)}var oa,Ya=F(()=>{kn();or();lr();hj();xA();v(fj,"preprocessMarkdown");v(dj,"markdownToLines");v(pj,"markdownToHTML");v(gj,"splitTextToChars");v(mj,"splitWordToFitWidth");v(wA,"splitWordToFitWidthRecursion");v(vj,"splitLineToFitWidth");v(X3,"splitLineToFitWidthRecursion");v(bA,"applyStyle");v(yj,"addHtmlSpan");v(j3,"createTspan");v(xj,"computeWidthOfText");v(kA,"computeDimensionOfText");v(bj,"createFormattedText");v(K3,"updateTextContentAndStyles");v(Z3,"replaceIconSubstring");oa=v(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:o=200,addSvgBackground:l=!1}={},u)=>{if(re.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",l),a){let h=pj(e,u),f=Z3(Xs(h)),d=e.replace(/\\\\/g,"\\"),p={isNode:s,label:Ei(e)?d:f,labelStyle:r.replace("fill:","color:")};return await yj(t,p,o,i,l)}else{let h=e.replace(//g,"
    "),f=dj(h.replace("
    ","
    "),u),d=bj(o,t,f,e?l:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let p=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ve(d).attr("style",p)}else{let p=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");Ve(d).select("rect").attr("style",p.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ve(d).select("text").attr("style",g)}return d}},"createText")});function TA(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),o=Math.sin(a);for(let l of t){let[u,h]=l;l[0]=(u-n)*s-(h-i)*o+n,l[1]=(u-n)*o+(h-i)*s+i}}}function p6e(t,e){return t[0]===e[0]&&t[1]===e[1]}function g6e(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,o=[0,0];if(i)for(let u of s)TA(u,o,i);let l=function(u,h,f){let d=[];for(let b of u){let w=[...b];p6e(w[0],w[w.length-1])||w.push([w[0][0],w[0][1]]),w.length>2&&d.push(w)}let p=[];h=Math.max(h,.1);let g=[];for(let b of d)for(let w=0;wb.yminw.ymin?1:b.xw.x?1:b.ymax===w.ymax?0:(b.ymax-w.ymax)/Math.abs(b.ymax-w.ymax)),!g.length)return p;let m=[],y=g[0].ymin,x=0;for(;m.length||g.length;){if(g.length){let b=-1;for(let w=0;wy);w++)b=w;g.splice(0,b+1).forEach(w=>{m.push({s:y,edge:w})})}if(m=m.filter(b=>!(b.edge.ymax<=y)),m.sort((b,w)=>b.edge.x===w.edge.x?0:(b.edge.x-w.edge.x)/Math.abs(b.edge.x-w.edge.x)),(f!==1||x%h==0)&&m.length>1)for(let b=0;b=m.length)break;let _=m[b].edge,k=m[w].edge;p.push([[Math.round(_.x),y],[Math.round(k.x),y]])}y+=f,m.forEach(b=>{b.edge.x=b.edge.x+f*b.edge.islope}),x++}return p}(s,a,n);if(i){for(let u of s)TA(u,o,-i);(function(u,h,f){let d=[];u.forEach(p=>d.push(...p)),TA(d,h,f)})(l,o,-i)}return l}function Zv(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),g6e(t,i,n,a||1)}function s5(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function SA(t,e){return t.type===e}function zA(t){let e=[],r=function(s){let o=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))o[o.length]={type:m6e,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];o[o.length]={type:EA,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return o[o.length]={type:wj,text:""},o}(t),n="BOD",i=0,a=r[i];for(;!SA(a,wj);){let s=0,o=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return zA("M0,0"+t);i++,s=Q3[a.text],n=a.text}else SA(a,EA)?s=Q3[n]:(i++,s=Q3[a.text],n=a.text);if(!(i+sh%2?u+r:u+e);a.push({key:"C",data:l}),e=l[4],r=l[5];break}case"Q":a.push({key:"Q",data:[...o]}),e=o[2],r=o[3];break;case"q":{let l=o.map((u,h)=>h%2?u+r:u+e);a.push({key:"Q",data:l}),e=l[2],r=l[3];break}case"A":a.push({key:"A",data:[...o]}),e=o[5],r=o[6];break;case"a":e+=o[5],r+=o[6],a.push({key:"A",data:[o[0],o[1],o[2],o[3],o[4],e,r]});break;case"H":a.push({key:"H",data:[...o]}),e=o[0];break;case"h":e+=o[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...o]}),r=o[0];break;case"v":r+=o[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...o]}),e=o[2],r=o[3];break;case"s":{let l=o.map((u,h)=>h%2?u+r:u+e);a.push({key:"S",data:l}),e=l[2],r=l[3];break}case"T":a.push({key:"T",data:[...o]}),e=o[0],r=o[1];break;case"t":e+=o[0],r+=o[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function Rj(t){let e=[],r="",n=0,i=0,a=0,s=0,o=0,l=0;for(let{key:u,data:h}of t){switch(u){case"M":e.push({key:"M",data:[...h]}),[n,i]=h,[a,s]=h;break;case"C":e.push({key:"C",data:[...h]}),n=h[4],i=h[5],o=h[2],l=h[3];break;case"L":e.push({key:"L",data:[...h]}),[n,i]=h;break;case"H":n=h[0],e.push({key:"L",data:[n,i]});break;case"V":i=h[0],e.push({key:"L",data:[n,i]});break;case"S":{let f=0,d=0;r==="C"||r==="S"?(f=n+(n-o),d=i+(i-l)):(f=n,d=i),e.push({key:"C",data:[f,d,...h]}),o=h[0],l=h[1],n=h[2],i=h[3];break}case"T":{let[f,d]=h,p=0,g=0;r==="Q"||r==="T"?(p=n+(n-o),g=i+(i-l)):(p=n,g=i);let m=n+2*(p-n)/3,y=i+2*(g-i)/3,x=f+2*(p-f)/3,b=d+2*(g-d)/3;e.push({key:"C",data:[m,y,x,b,f,d]}),o=p,l=g,n=f,i=d;break}case"Q":{let[f,d,p,g]=h,m=n+2*(f-n)/3,y=i+2*(d-i)/3,x=p+2*(f-p)/3,b=g+2*(d-g)/3;e.push({key:"C",data:[m,y,x,b,p,g]}),o=f,l=d,n=p,i=g;break}case"A":{let f=Math.abs(h[0]),d=Math.abs(h[1]),p=h[2],g=h[3],m=h[4],y=h[5],x=h[6];f===0||d===0?(e.push({key:"C",data:[n,i,y,x,y,x]}),n=y,i=x):(n!==y||i!==x)&&(Nj(n,i,y,x,f,d,p,g,m).forEach(function(b){e.push({key:"C",data:b})}),n=y,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=u}return e}function Xv(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function Nj(t,e,r,n,i,a,s,o,l,u){let h=(f=s,Math.PI*f/180);var f;let d=[],p=0,g=0,m=0,y=0;if(u)[p,g,m,y]=u;else{[t,e]=Xv(t,e,-h),[r,n]=Xv(r,n,-h);let I=(t-r)/2,A=(e-n)/2,D=I*I/(i*i)+A*A/(a*a);D>1&&(D=Math.sqrt(D),i*=D,a*=D);let N=i*i,O=a*a,B=N*O-N*A*A-O*I*I,P=N*A*A+O*I*I,$=(o===l?-1:1)*Math.sqrt(Math.abs(B/P));m=$*i*A/a+(t+r)/2,y=$*-a*I/i+(e+n)/2,p=Math.asin(parseFloat(((e-y)/a).toFixed(9))),g=Math.asin(parseFloat(((n-y)/a).toFixed(9))),tg&&(p-=2*Math.PI),!l&&g>p&&(g-=2*Math.PI)}let x=g-p;if(Math.abs(x)>120*Math.PI/180){let I=g,A=r,D=n;g=l&&g>p?p+120*Math.PI/180*1:p+120*Math.PI/180*-1,d=Nj(r=m+i*Math.cos(g),n=y+a*Math.sin(g),A,D,i,a,s,0,l,[g,I,m,y])}x=g-p;let b=Math.cos(p),w=Math.sin(p),_=Math.cos(g),k=Math.sin(g),E=Math.tan(x/4),L=4/3*i*E,S=4/3*a*E,C=[t,e],M=[t+L*w,e-S*b],R=[r+L*k,n-S*_],T=[r,n];if(M[0]=2*C[0]-M[0],M[1]=2*C[1]-M[1],u)return[M,R,T].concat(d);{d=[M,R,T].concat(d);let I=[];for(let A=0;A2){let i=[];for(let a=0;a2*Math.PI&&(p=0,g=2*Math.PI);let m=2*Math.PI/l.curveStepCount,y=Math.min(m/2,(g-p)/2),x=Aj(y,u,h,f,d,p,g,1,l);if(!l.disableMultiStroke){let b=Aj(y,u,h,f,d,p,g,1.5,l);x.push(...b)}return s&&(o?x.push(...Dh(u,h,u+f*Math.cos(p),h+d*Math.sin(p),l),...Dh(u,h,u+f*Math.cos(g),h+d*Math.sin(g),l)):x.push({op:"lineTo",data:[u,h]},{op:"lineTo",data:[u+f*Math.cos(p),h+d*Math.sin(p)]})),{type:"path",ops:x}}function Ej(t,e){let r=Rj(Lj(zA(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:o}of r)switch(s){case"M":a=[o[0],o[1]],i=[o[0],o[1]];break;case"L":n.push(...Dh(a[0],a[1],o[0],o[1],e)),a=[o[0],o[1]];break;case"C":{let[l,u,h,f,d,p]=o;n.push(...x6e(l,u,h,f,d,p,a,e)),a=[d,p];break}case"Z":n.push(...Dh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function CA(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+jt(i,e),n[0][1]+jt(i,e)]});for(let s=1;s500?.4:-.0016668*l+1.233334;let h=i.maxRandomnessOffset||0;h*h*100>o&&(h=l/10);let f=h/2,d=.2+.2*Dj(i),p=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;p=jt(p,i,u),g=jt(g,i,u);let m=[],y=()=>jt(f,i,u),x=()=>jt(h,i,u),b=i.preserveVertices;return a&&(s?m.push({op:"move",data:[t+(b?0:y()),e+(b?0:y())]}):m.push({op:"move",data:[t+(b?0:jt(h,i,u)),e+(b?0:jt(h,i,u))]})),s?m.push({op:"bcurveTo",data:[p+t+(r-t)*d+y(),g+e+(n-e)*d+y(),p+t+2*(r-t)*d+y(),g+e+2*(n-e)*d+y(),r+(b?0:y()),n+(b?0:y())]}):m.push({op:"bcurveTo",data:[p+t+(r-t)*d+x(),g+e+(n-e)*d+x(),p+t+2*(r-t)*d+x(),g+e+2*(n-e)*d+x(),r+(b?0:x()),n+(b?0:x())]}),m}function J3(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+jt(e,r),t[0][1]+jt(e,r)]),n.push([t[0][0]+jt(e,r),t[0][1]+jt(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let o=1;o+21&&i.push(o)):i.push(o),i.push(t[e+3])}else{let l=t[e+0],u=t[e+1],h=t[e+2],f=t[e+3],d=bd(l,u,.5),p=bd(u,h,.5),g=bd(h,f,.5),m=bd(d,p,.5),y=bd(p,g,.5),x=bd(m,y,.5);PA([l,d,m,x],0,r,i),PA([x,y,g,f],0,r,i)}var a,s;return i}function w6e(t,e){return a5(t,0,t.length,e)}function a5(t,e,r,n,i){let a=i||[],s=t[e],o=t[r-1],l=0,u=1;for(let h=e+1;hl&&(l=f,u=h)}return Math.sqrt(l)>n?(a5(t,e,u+1,n,a),a5(t,u,r,n,a)):(a.length||a.push(s),a.push(o)),a}function AA(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?a5(n,0,n.length,r):n}var Kv,_A,LA,RA,NA,IA,ks,MA,m6e,EA,wj,Q3,v6e,Ks,Qp,BA,e5,FA,Ye,$t=F(()=>{Kv=class{constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=Zv(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};_A=class extends Kv{fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=Zv(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],o=.5*n*Math.cos(a),l=.5*n*Math.sin(a);for(let[u,h]of i)s5([u,h])&&s.push([[u[0]-o,u[1]+l],[...h]],[[u[0]+o,u[1]-l],[...h]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},LA=class extends Kv{fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},RA=class{constructor(e){this.helper=e}fillPolygons(e,r){let n=Zv(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let o of e){let l=s5(o),u=l/i,h=Math.ceil(u)-1,f=l-h*i,d=(o[0][0]+o[1][0])/2-i/4,p=Math.min(o[0][1],o[1][1]);for(let g=0;g{let o=s5(s),l=Math.floor(o/(n+i)),u=(o+i-l*(n+i))/2,h=s[0],f=s[1];h[0]>f[0]&&(h=s[1],f=s[0]);let d=Math.atan((f[1]-h[1])/(f[0]-h[0]));for(let p=0;p{let s=s5(a),o=Math.round(s/(2*r)),l=a[0],u=a[1];l[0]>u[0]&&(l=a[1],u=a[0]);let h=Math.atan((u[1]-l[1])/(u[0]-l[0]));for(let f=0;f2*Math.PI&&(L=0,S=2*Math.PI);let C=(S-L)/b.curveStepCount,M=[];for(let R=L;R<=S;R+=C)M.push([w+k*Math.cos(R),_+E*Math.sin(R)]);return M.push([w+k*Math.cos(S),_+E*Math.sin(S)]),M.push([w,_]),Zp([M],b)}(e,r,n,i,a,s,u));return u.stroke!==Ks&&h.push(f),this._d("arc",h,u)}curve(e,r){let n=this._o(r),i=[],a=kj(e,n);if(n.fill&&n.fill!==Ks)if(n.fillStyle==="solid"){let s=kj(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],o=e;if(o.length){let l=typeof o[0][0]=="number"?[o]:o;for(let u of l)u.length<3?s.push(...u):u.length===3?s.push(...AA(_j([u[0],u[0],u[1],u[2]]),10,(1+n.roughness)/2)):s.push(...AA(_j(u),10,(1+n.roughness)/2))}s.length&&i.push(Zp([s],n))}return n.stroke!==Ks&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=t5(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(CA([e],n)):i.push(Zp([e],n))),n.stroke!==Ks&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==Ks,s=n.stroke!==Ks,o=!!(n.simplification&&n.simplification<1),l=function(h,f,d){let p=Rj(Lj(zA(h))),g=[],m=[],y=[0,0],x=[],b=()=>{x.length>=4&&m.push(...AA(x,f)),x=[]},w=()=>{b(),m.length&&(g.push(m),m=[])};for(let{key:k,data:E}of p)switch(k){case"M":w(),y=[E[0],E[1]],m.push(y);break;case"L":b(),m.push([E[0],E[1]]);break;case"C":if(!x.length){let L=m.length?m[m.length-1]:y;x.push([L[0],L[1]])}x.push([E[0],E[1]]),x.push([E[2],E[3]]),x.push([E[4],E[5]]);break;case"Z":b(),m.push([y[0],y[1]])}if(w(),!d)return g;let _=[];for(let k of g){let E=w6e(k,d);E.length&&_.push(E)}return _}(e,1,o?4-4*(n.simplification||1):(1+n.roughness)/2),u=Ej(e,n);if(a)if(n.fillStyle==="solid")if(l.length===1){let h=Ej(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(h.ops)})}else i.push(CA(l,n));else i.push(Zp(l,n));return s&&(o?l.forEach(h=>{i.push(t5(h,!1,n))}):i.push(u)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map(s=>+s.toFixed(r)):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:Ks};break;case"fillPath":s={d:this.opsToPath(a),stroke:Ks,strokeWidth:0,fill:n.fill||Ks};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||Ks,strokeWidth:n,fill:Ks}}_mergedShape(e){return e.filter((r,n)=>n===0||r.op!=="move")}},BA=class{constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new Qp(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let o=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,o),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map(o=>+o.toFixed(n)):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,o=!1,l){let u=this.gen.arc(e,r,n,i,a,s,o,l);return this.draw(u),u}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},e5="http://www.w3.org/2000/svg",FA=class{constructor(e,r){this.svg=e,this.gen=new Qp(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(e5,"g"),s=e.options.fixedDecimalPlaceDigits;for(let o of r){let l=null;switch(o.type){case"path":l=i.createElementNS(e5,"path"),l.setAttribute("d",this.opsToPath(o,s)),l.setAttribute("stroke",n.stroke),l.setAttribute("stroke-width",n.strokeWidth+""),l.setAttribute("fill","none"),n.strokeLineDash&&l.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&l.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":l=i.createElementNS(e5,"path"),l.setAttribute("d",this.opsToPath(o,s)),l.setAttribute("stroke","none"),l.setAttribute("stroke-width","0"),l.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||l.setAttribute("fill-rule","evenodd");break;case"fillSketch":l=this.fillSketch(i,o,n)}l&&a.appendChild(l)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(e5,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,o=!1,l){let u=this.gen.arc(e,r,n,i,a,s,o,l);return this.draw(u)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Ye={canvas:(t,e)=>new BA(t,e),svg:(t,e)=>new FA(t,e),generator:t=>new Qp(t),newSeed:()=>Qp.newSeed()}});function Er(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Oh(t,e,r,n,i,a){let s=[],l=r-t,u=n-e,h=l/a,f=2*Math.PI/h,d=e+u/2;for(let p=0;p<=50;p++){let g=p/50,m=t+g*l,y=d+i*Math.sin(f*(m-t));s.push({x:m,y})}return s}function VA(t,e,r,n,i,a){let s=[],o=i*Math.PI/180,h=(a*Math.PI/180-o)/(n-1);for(let f=0;f"+n+""),Oj(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}function $j(t,e){return t.intersect(e)}function Gj(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,o=a-n.y,l=Math.sqrt(e*e*o*o+r*r*s*s),u=Math.abs(e*r*s/l);n.x0}function Hj(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(h){s=Math.min(s,h.x),o=Math.min(o,h.y)}):(s=Math.min(s,e.x),o=Math.min(o,e.y));let l=n-t.width/2-s,u=i-t.height/2-o;for(let h=0;h1&&a.sort(function(h,f){let d=h.x-r.x,p=h.y-r.y,g=Math.sqrt(d*d+p*p),m=f.x-r.x,y=f.y-r.y,x=Math.sqrt(m*m+y*y);return gh,":first-child");return f.attr("class","anchor").attr("style",Aa(o)),Pt(e,f),e.intersect=function(d){return re.info("Circle intersect",e,s,d),Nt.circle(e,s,d)},a}function UA(t,e,r,n,i,a,s){let l=(t+r)/2,u=(e+n)/2,h=Math.atan2(n-e,r-t),f=(r-t)/2,d=(n-e)/2,p=f/i,g=d/a,m=Math.sqrt(p**2+g**2);if(m>1)throw new Error("The given radii are too small to create an arc between the points.");let y=Math.sqrt(1-m**2),x=l+y*a*Math.sin(h)*(s?-1:1),b=u-y*i*Math.cos(h)*(s?-1:1),w=Math.atan2((e-b)/a,(t-x)/i),k=Math.atan2((n-b)/a,(r-x)/i)-w;s&&k<0&&(k+=2*Math.PI),!s&&k>0&&(k-=2*Math.PI);let E=[];for(let L=0;L<20;L++){let S=L/19,C=w+S*k,M=x+i*Math.cos(C),R=b+a*Math.sin(C);E.push({x:M,y:R})}return E}async function Yj(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=a.width+e.padding+20,o=a.height+e.padding,l=o/2,u=l/(2.5+o/50),{cssStyles:h}=e,f=[{x:s/2,y:-o/2},{x:-s/2,y:-o/2},...UA(-s/2,-o/2,-s/2,o/2,u,l,!1),{x:s/2,y:o/2},...UA(s/2,o/2,s/2,-o/2,u,l,!0)],d=Ye.svg(i),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=Er(f),m=d.path(g,p),y=i.insert(()=>m,":first-child");return y.attr("class","basic label-container"),h&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",h),n&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",n),y.attr("transform",`translate(${u/2}, 0)`),Pt(e,y),e.intersect=function(x){return Nt.polygon(e,f,x)},i}function Au(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}async function Xj(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=a.height+e.padding,o=12,l=a.width+e.padding+o,u=0,h=l,f=-s,d=0,p=[{x:u+o,y:f},{x:h,y:f},{x:h,y:d},{x:u,y:d},{x:u,y:f+o},{x:u+o,y:f}],g,{cssStyles:m}=e;if(e.look==="handDrawn"){let y=Ye.svg(i),x=Bt(e,{}),b=Er(p),w=y.path(b,x);g=i.insert(()=>w,":first-child").attr("transform",`translate(${-l/2}, ${s/2})`),m&&g.attr("style",m)}else g=Au(i,l,s,p);return n&&g.attr("style",n),Pt(e,g),e.intersect=function(y){return Nt.polygon(e,p,y)},i}function jj(t,e){let{nodeStyles:r}=Vt(e);e.label="";let n=t.insert("g").attr("class",rr(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],o=Ye.svg(n),l=Bt(e,{});e.look!=="handDrawn"&&(l.roughness=0,l.fillStyle="solid");let u=Er(s),h=o.path(u,l),f=n.insert(()=>h,":first-child");return i&&e.look!=="handDrawn"&&f.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&f.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(d){return Nt.polygon(e,s,d)},n}async function Kj(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await tr(t,e,rr(e)),o=a.width/2+s,l,{cssStyles:u}=e;if(e.look==="handDrawn"){let h=Ye.svg(i),f=Bt(e,{}),d=h.circle(0,0,o*2,f);l=i.insert(()=>d,":first-child"),l.attr("class","basic label-container").attr("style",Aa(u))}else l=i.insert("circle",":first-child").attr("class","basic label-container").attr("style",n).attr("r",o).attr("cx",0).attr("cy",0);return Pt(e,l),e.intersect=function(h){return re.info("Circle intersect",e,o,h),Nt.circle(e,o,h)},i}function Zj(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},o={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${o.x},${o.y} M ${i.x},${i.y} L ${s.x},${s.y}`}function Qj(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",rr(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,o=Ye.svg(i),l=Bt(e,{});e.look!=="handDrawn"&&(l.roughness=0,l.fillStyle="solid");let u=o.circle(0,0,a*2,l),h=Zj(a),f=o.path(h,l),d=i.insert(()=>u,":first-child");return d.insert(()=>f),s&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",n),Pt(e,d),e.intersect=function(p){return re.info("crossedCircle intersect",e,{radius:a,point:p}),Nt.circle(e,a,p)},i}function Eu(t,e,r,n=100,i=0,a=180){let s=[],o=i*Math.PI/180,h=(a*Math.PI/180-o)/(n-1);for(let f=0;fw,":first-child").attr("stroke-opacity",0),_.insert(()=>x,":first-child"),_.attr("class","text"),h&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",h),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(${u}, 0)`),s.attr("transform",`translate(${-o/2+u-(a.x-(a.left??0))},${-l/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Pt(e,_),e.intersect=function(k){return Nt.polygon(e,d,k)},i}function Su(t,e,r,n=100,i=0,a=180){let s=[],o=i*Math.PI/180,h=(a*Math.PI/180-o)/(n-1);for(let f=0;fw,":first-child").attr("stroke-opacity",0),_.insert(()=>x,":first-child"),_.attr("class","text"),h&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",h),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(${-u}, 0)`),s.attr("transform",`translate(${-o/2+(e.padding??0)/2-(a.x-(a.left??0))},${-l/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Pt(e,_),e.intersect=function(k){return Nt.polygon(e,d,k)},i}function la(t,e,r,n=100,i=0,a=180){let s=[],o=i*Math.PI/180,h=(a*Math.PI/180-o)/(n-1);for(let f=0;fL,":first-child").attr("stroke-opacity",0),S.insert(()=>b,":first-child"),S.insert(()=>k,":first-child"),S.attr("class","text"),h&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",h),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${u-u/4}, 0)`),s.attr("transform",`translate(${-o/2+(e.padding??0)/2-(a.x-(a.left??0))},${-l/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Pt(e,S),e.intersect=function(C){return Nt.polygon(e,p,C)},i}async function rK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=80,o=20,l=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),u=Math.max(o,a.height+(e.padding??0)*2,e?.height??0),h=u/2,{cssStyles:f}=e,d=Ye.svg(i),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=l,m=u,y=g-h,x=m/4,b=[{x:y,y:0},{x,y:0},{x:0,y:m/2},{x,y:m},{x:y,y:m},...VA(-y,-m/2,h,50,270,90)],w=Er(b),_=d.path(w,p),k=i.insert(()=>_,":first-child");return k.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&k.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&k.selectChildren("path").attr("style",n),k.attr("transform",`translate(${-l/2}, ${-u/2})`),Pt(e,k),e.intersect=function(E){return Nt.polygon(e,b,E)},i}async function nK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+e.padding,e.width??0),l=o/2,u=l/(2.5+o/50),h=Math.max(a.height+u+e.padding,e.height??0),f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ye.svg(i),g=B6e(0,0,o,h,l,u),m=F6e(0,u,o,h,l,u),y=p.path(g,Bt(e,{})),x=p.path(m,Bt(e,{fill:"none"}));f=i.insert(()=>x,":first-child"),f=i.insert(()=>y,":first-child"),f.attr("class","basic label-container"),d&&f.attr("style",d)}else{let p=P6e(0,0,o,h,l,u);f=i.insert("path",":first-child").attr("d",p).attr("class","basic label-container").attr("style",Aa(d)).attr("style",n)}return f.attr("label-offset-y",u),f.attr("transform",`translate(${-o/2}, ${-(h/2+u)})`),Pt(e,f),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(p){let g=Nt.rect(e,p),m=g.x-(e.x??0);if(l!=0&&(Math.abs(m)<(e.width??0)/2||Math.abs(m)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-u)){let y=u*u*(1-m*m/(l*l));y>0&&(y=Math.sqrt(y)),y=u-y,p.y-(e.y??0)>0&&(y=-y),g.y+=y}return g},i}async function iK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=a.width+e.padding,l=a.height+e.padding,u=l*.2,h=-o/2,f=-l/2-u/2,{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let m=[{x:h,y:f+u},{x:-h,y:f+u},{x:-h,y:-f},{x:h,y:-f},{x:h,y:f},{x:-h,y:f},{x:-h,y:f+u}],y=p.polygon(m.map(b=>[b.x,b.y]),g),x=i.insert(()=>y,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${h+(e.padding??0)/2-(a.x-(a.left??0))}, ${f+u+(e.padding??0)/2-(a.y-(a.top??0))})`),Pt(e,x),e.intersect=function(b){return Nt.rect(e,b)},i}async function aK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await tr(t,e,rr(e)),l=a.width/2+s+5,u=a.width/2+s,h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ye.svg(i),p=Bt(e,{roughness:.2,strokeWidth:2.5}),g=Bt(e,{roughness:.2,strokeWidth:1.5}),m=d.circle(0,0,l*2,p),y=d.circle(0,0,u*2,g);h=i.insert("g",":first-child"),h.attr("class",Aa(e.cssClasses)).attr("style",Aa(f)),h.node()?.appendChild(m),h.node()?.appendChild(y)}else{h=i.insert("g",":first-child");let d=h.insert("circle",":first-child"),p=h.insert("circle");h.attr("class","basic label-container").attr("style",n),d.attr("class","outer-circle").attr("style",n).attr("r",l).attr("cx",0).attr("cy",0),p.attr("class","inner-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0)}return Pt(e,h),e.intersect=function(d){return re.info("DoubleCircle intersect",e,l,d),Nt.circle(e,l,d)},i}function sK(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Vt(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",rr(e)).attr("id",e.domId??e.id),s=7,{cssStyles:o}=e,l=Ye.svg(a),{nodeBorder:u}=r,h=Bt(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=l.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.selectAll("path").attr("style",`fill: ${u} !important;`),o&&o.length>0&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",o),i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),Pt(e,d),e.intersect=function(p){return re.info("filledCircle intersect",e,{radius:s,point:p}),Nt.circle(e,s,p)},a}async function oK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=a.width+(e.padding??0),l=o+a.height,u=o+a.height,h=[{x:0,y:-l},{x:u,y:-l},{x:u/2,y:0}],{cssStyles:f}=e,d=Ye.svg(i),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=Er(h),m=d.path(g,p),y=i.insert(()=>m,":first-child").attr("transform",`translate(${-l/2}, ${l/2})`);return f&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",n),e.width=o,e.height=l,Pt(e,y),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-l/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return re.info("Triangle intersect",e,h,x),Nt.polygon(e,h,x)},i}function lK(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=Vt(e);e.label="";let s=t.insert("g").attr("class",rr(e)).attr("id",e.domId??e.id),{cssStyles:o}=e,l=Math.max(70,e?.width??0),u=Math.max(10,e?.height??0);r==="LR"&&(l=Math.max(10,e?.width??0),u=Math.max(70,e?.height??0));let h=-1*l/2,f=-1*u/2,d=Ye.svg(s),p=Bt(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=d.rectangle(h,f,l,u,p),m=s.insert(()=>g,":first-child");o&&e.look!=="handDrawn"&&m.selectAll("path").attr("style",o),a&&e.look!=="handDrawn"&&m.selectAll("path").attr("style",a),Pt(e,m);let y=n?.padding??0;return e.width&&e.height&&(e.width+=y/2||0,e.height+=y/2||0),e.intersect=function(x){return Nt.rect(e,x)},s}async function cK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:o}=await tr(t,e,rr(e)),l=Math.max(i,o.width+(e.padding??0)*2,e?.width??0),u=Math.max(a,o.height+(e.padding??0)*2,e?.height??0),h=u/2,{cssStyles:f}=e,d=Ye.svg(s),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=[{x:-l/2,y:-u/2},{x:l/2-h,y:-u/2},...VA(-l/2+h,0,h,50,90,270),{x:l/2-h,y:u/2},{x:-l/2,y:u/2}],m=Er(g),y=d.path(m,p),x=s.insert(()=>y,":first-child");return x.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),Pt(e,x),e.intersect=function(b){return re.info("Pill intersect",e,{radius:h,point:b}),Nt.polygon(e,g,b)},s}async function uK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=4,o=a.height+e.padding,l=o/s,u=a.width+2*l+e.padding,h=[{x:l,y:0},{x:u-l,y:0},{x:u,y:-o/2},{x:u-l,y:-o},{x:l,y:-o},{x:0,y:-o/2}],f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ye.svg(i),g=Bt(e,{}),m=z6e(0,0,u,o,l),y=p.path(m,g);f=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${o/2})`),d&&f.attr("style",d)}else f=Au(i,u,o,h);return n&&f.attr("style",n),e.width=u,e.height=o,Pt(e,f),e.intersect=function(p){return Nt.polygon(e,h,p)},i}async function hK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await tr(t,e,rr(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:o}=e,l=Ye.svg(i),u=Bt(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],f=Er(h),d=l.path(f,u),p=i.insert(()=>d,":first-child");return p.attr("class","basic label-container"),o&&e.look!=="handDrawn"&&p.selectChildren("path").attr("style",o),n&&e.look!=="handDrawn"&&p.selectChildren("path").attr("style",n),p.attr("transform",`translate(${-a/2}, ${-s/2})`),Pt(e,p),e.intersect=function(g){return re.info("Pill intersect",e,{points:h}),Nt.polygon(e,h,g)},i}async function fK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Vt(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,o=Math.max(a,s),l=n?.wrappingWidth;e.width=Math.max(o,l??0);let{shapeSvg:u,bbox:h,label:f}=await tr(t,e,"icon-shape default"),d=e.pos==="t",p=o,g=o,{nodeBorder:m}=r,{stylesMap:y}=eg(e),x=-g/2,b=-p/2,w=e.label?8:0,_=Ye.svg(u),k=Bt(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(k.roughness=0,k.fillStyle="solid");let E=_.rectangle(x,b,g,p,k),L=Math.max(g,h.width),S=p+h.height+w,C=_.rectangle(-L/2,-S/2,L,S,{...k,fill:"transparent",stroke:"none"}),M=u.insert(()=>E,":first-child"),R=u.insert(()=>C);if(e.icon){let T=u.append("g");T.html(`${await su(e.icon,{height:o,width:o,fallbackPrefix:""})}`);let I=T.node().getBBox(),A=I.width,D=I.height,N=I.x,O=I.y;T.attr("transform",`translate(${-A/2-N},${d?h.height/2+w/2-D/2-O:-h.height/2-w/2-D/2-O})`),T.attr("style",`color: ${y.get("stroke")??m};`)}return f.attr("transform",`translate(${-h.width/2-(h.x-(h.left??0))},${d?-S/2:S/2-h.height})`),M.attr("transform",`translate(0,${d?h.height/2+w/2:-h.height/2-w/2})`),Pt(e,R),e.intersect=function(T){if(re.info("iconSquare intersect",e,T),!e.label)return Nt.rect(e,T);let I=e.x??0,A=e.y??0,D=e.height??0,N=[];return d?N=[{x:I-h.width/2,y:A-D/2},{x:I+h.width/2,y:A-D/2},{x:I+h.width/2,y:A-D/2+h.height+w},{x:I+g/2,y:A-D/2+h.height+w},{x:I+g/2,y:A+D/2},{x:I-g/2,y:A+D/2},{x:I-g/2,y:A-D/2+h.height+w},{x:I-h.width/2,y:A-D/2+h.height+w}]:N=[{x:I-g/2,y:A-D/2},{x:I+g/2,y:A-D/2},{x:I+g/2,y:A-D/2+p},{x:I+h.width/2,y:A-D/2+p},{x:I+h.width/2/2,y:A+D/2},{x:I-h.width/2,y:A+D/2},{x:I-h.width/2,y:A-D/2+p},{x:I-g/2,y:A-D/2+p}],Nt.polygon(e,N,T)},u}async function dK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Vt(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,o=Math.max(a,s),l=n?.wrappingWidth;e.width=Math.max(o,l??0);let{shapeSvg:u,bbox:h,label:f}=await tr(t,e,"icon-shape default"),d=20,p=e.label?8:0,g=e.pos==="t",{nodeBorder:m,mainBkg:y}=r,{stylesMap:x}=eg(e),b=Ye.svg(u),w=Bt(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let _=x.get("fill");w.stroke=_??y;let k=u.append("g");e.icon&&k.html(`${await su(e.icon,{height:o,width:o,fallbackPrefix:""})}`);let E=k.node().getBBox(),L=E.width,S=E.height,C=E.x,M=E.y,R=Math.max(L,S)*Math.SQRT2+d*2,T=b.circle(0,0,R,w),I=Math.max(R,h.width),A=R+h.height+p,D=b.rectangle(-I/2,-A/2,I,A,{...w,fill:"transparent",stroke:"none"}),N=u.insert(()=>T,":first-child"),O=u.insert(()=>D);return k.attr("transform",`translate(${-L/2-C},${g?h.height/2+p/2-S/2-M:-h.height/2-p/2-S/2-M})`),k.attr("style",`color: ${x.get("stroke")??m};`),f.attr("transform",`translate(${-h.width/2-(h.x-(h.left??0))},${g?-A/2:A/2-h.height})`),N.attr("transform",`translate(0,${g?h.height/2+p/2:-h.height/2-p/2})`),Pt(e,O),e.intersect=function(B){return re.info("iconSquare intersect",e,B),Nt.rect(e,B)},u}async function pK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Vt(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,o=Math.max(a,s),l=n?.wrappingWidth;e.width=Math.max(o,l??0);let{shapeSvg:u,bbox:h,halfPadding:f,label:d}=await tr(t,e,"icon-shape default"),p=e.pos==="t",g=o+f*2,m=o+f*2,{nodeBorder:y,mainBkg:x}=r,{stylesMap:b}=eg(e),w=-m/2,_=-g/2,k=e.label?8:0,E=Ye.svg(u),L=Bt(e,{});e.look!=="handDrawn"&&(L.roughness=0,L.fillStyle="solid");let S=b.get("fill");L.stroke=S??x;let C=E.path(Cu(w,_,m,g,5),L),M=Math.max(m,h.width),R=g+h.height+k,T=E.rectangle(-M/2,-R/2,M,R,{...L,fill:"transparent",stroke:"none"}),I=u.insert(()=>C,":first-child").attr("class","icon-shape2"),A=u.insert(()=>T);if(e.icon){let D=u.append("g");D.html(`${await su(e.icon,{height:o,width:o,fallbackPrefix:""})}`);let N=D.node().getBBox(),O=N.width,B=N.height,P=N.x,$=N.y;D.attr("transform",`translate(${-O/2-P},${p?h.height/2+k/2-B/2-$:-h.height/2-k/2-B/2-$})`),D.attr("style",`color: ${b.get("stroke")??y};`)}return d.attr("transform",`translate(${-h.width/2-(h.x-(h.left??0))},${p?-R/2:R/2-h.height})`),I.attr("transform",`translate(0,${p?h.height/2+k/2:-h.height/2-k/2})`),Pt(e,A),e.intersect=function(D){if(re.info("iconSquare intersect",e,D),!e.label)return Nt.rect(e,D);let N=e.x??0,O=e.y??0,B=e.height??0,P=[];return p?P=[{x:N-h.width/2,y:O-B/2},{x:N+h.width/2,y:O-B/2},{x:N+h.width/2,y:O-B/2+h.height+k},{x:N+m/2,y:O-B/2+h.height+k},{x:N+m/2,y:O+B/2},{x:N-m/2,y:O+B/2},{x:N-m/2,y:O-B/2+h.height+k},{x:N-h.width/2,y:O-B/2+h.height+k}]:P=[{x:N-m/2,y:O-B/2},{x:N+m/2,y:O-B/2},{x:N+m/2,y:O-B/2+g},{x:N+h.width/2,y:O-B/2+g},{x:N+h.width/2/2,y:O+B/2},{x:N-h.width/2,y:O+B/2},{x:N-h.width/2,y:O-B/2+g},{x:N-m/2,y:O-B/2+g}],Nt.polygon(e,P,D)},u}async function gK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Vt(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,o=Math.max(a,s),l=n?.wrappingWidth;e.width=Math.max(o,l??0);let{shapeSvg:u,bbox:h,halfPadding:f,label:d}=await tr(t,e,"icon-shape default"),p=e.pos==="t",g=o+f*2,m=o+f*2,{nodeBorder:y,mainBkg:x}=r,{stylesMap:b}=eg(e),w=-m/2,_=-g/2,k=e.label?8:0,E=Ye.svg(u),L=Bt(e,{});e.look!=="handDrawn"&&(L.roughness=0,L.fillStyle="solid");let S=b.get("fill");L.stroke=S??x;let C=E.path(Cu(w,_,m,g,.1),L),M=Math.max(m,h.width),R=g+h.height+k,T=E.rectangle(-M/2,-R/2,M,R,{...L,fill:"transparent",stroke:"none"}),I=u.insert(()=>C,":first-child"),A=u.insert(()=>T);if(e.icon){let D=u.append("g");D.html(`${await su(e.icon,{height:o,width:o,fallbackPrefix:""})}`);let N=D.node().getBBox(),O=N.width,B=N.height,P=N.x,$=N.y;D.attr("transform",`translate(${-O/2-P},${p?h.height/2+k/2-B/2-$:-h.height/2-k/2-B/2-$})`),D.attr("style",`color: ${b.get("stroke")??y};`)}return d.attr("transform",`translate(${-h.width/2-(h.x-(h.left??0))},${p?-R/2:R/2-h.height})`),I.attr("transform",`translate(0,${p?h.height/2+k/2:-h.height/2-k/2})`),Pt(e,A),e.intersect=function(D){if(re.info("iconSquare intersect",e,D),!e.label)return Nt.rect(e,D);let N=e.x??0,O=e.y??0,B=e.height??0,P=[];return p?P=[{x:N-h.width/2,y:O-B/2},{x:N+h.width/2,y:O-B/2},{x:N+h.width/2,y:O-B/2+h.height+k},{x:N+m/2,y:O-B/2+h.height+k},{x:N+m/2,y:O+B/2},{x:N-m/2,y:O+B/2},{x:N-m/2,y:O-B/2+h.height+k},{x:N-h.width/2,y:O-B/2+h.height+k}]:P=[{x:N-m/2,y:O-B/2},{x:N+m/2,y:O-B/2},{x:N+m/2,y:O-B/2+g},{x:N+h.width/2,y:O-B/2+g},{x:N+h.width/2/2,y:O+B/2},{x:N-h.width/2,y:O+B/2},{x:N-h.width/2,y:O-B/2+g},{x:N-m/2,y:O-B/2+g}],Nt.polygon(e,P,D)},u}async function mK(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=Vt(e);e.labelStyle=s;let o=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let l=Math.max(e.label?o??0:0,e?.assetWidth??i),u=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:l,h=e.constraint==="on"?u/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(u,o??0);let{shapeSvg:f,bbox:d,label:p}=await tr(t,e,"image-shape default"),g=e.pos==="t",m=-u/2,y=-h/2,x=e.label?8:0,b=Ye.svg(f),w=Bt(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let _=b.rectangle(m,y,u,h,w),k=Math.max(u,d.width),E=h+d.height+x,L=b.rectangle(-k/2,-E/2,k,E,{...w,fill:"none",stroke:"none"}),S=f.insert(()=>_,":first-child"),C=f.insert(()=>L);if(e.img){let M=f.append("image");M.attr("href",e.img),M.attr("width",u),M.attr("height",h),M.attr("preserveAspectRatio","none"),M.attr("transform",`translate(${-u/2},${g?E/2-h:-E/2})`)}return p.attr("transform",`translate(${-d.width/2-(d.x-(d.left??0))},${g?-h/2-d.height/2-x/2:h/2-d.height/2+x/2})`),S.attr("transform",`translate(0,${g?d.height/2+x/2:-d.height/2-x/2})`),Pt(e,C),e.intersect=function(M){if(re.info("iconSquare intersect",e,M),!e.label)return Nt.rect(e,M);let R=e.x??0,T=e.y??0,I=e.height??0,A=[];return g?A=[{x:R-d.width/2,y:T-I/2},{x:R+d.width/2,y:T-I/2},{x:R+d.width/2,y:T-I/2+d.height+x},{x:R+u/2,y:T-I/2+d.height+x},{x:R+u/2,y:T+I/2},{x:R-u/2,y:T+I/2},{x:R-u/2,y:T-I/2+d.height+x},{x:R-d.width/2,y:T-I/2+d.height+x}]:A=[{x:R-u/2,y:T-I/2},{x:R+u/2,y:T-I/2},{x:R+u/2,y:T-I/2+h},{x:R+d.width/2,y:T-I/2+h},{x:R+d.width/2/2,y:T+I/2},{x:R-d.width/2,y:T+I/2},{x:R-d.width/2,y:T-I/2+h},{x:R-u/2,y:T-I/2+h}],Nt.polygon(e,A,M)},f}async function vK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),o=Math.max(a.height+(e.padding??0)*2,e?.height??0),l=[{x:0,y:0},{x:s,y:0},{x:s+3*o/6,y:-o},{x:-3*o/6,y:-o}],u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Ye.svg(i),d=Bt(e,{}),p=Er(l),g=f.path(p,d);u=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${o/2})`),h&&u.attr("style",h)}else u=Au(i,s,o,l);return n&&u.attr("style",n),e.width=s,e.height=o,Pt(e,u),e.intersect=function(f){return Nt.polygon(e,l,f)},i}async function o5(t,e,r){let{labelStyles:n,nodeStyles:i}=Vt(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await tr(t,e,rr(e)),o=Math.max(s.width+r.labelPaddingX*2,e?.width||0),l=Math.max(s.height+r.labelPaddingY*2,e?.height||0),u=-o/2,h=-l/2,f,{rx:d,ry:p}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(d=r.rx,p=r.ry),e.look==="handDrawn"){let m=Ye.svg(a),y=Bt(e,{}),x=d||p?m.path(Cu(u,h,o,l,d||0),y):m.rectangle(u,h,o,l,y);f=a.insert(()=>x,":first-child"),f.attr("class","basic label-container").attr("style",Aa(g))}else f=a.insert("rect",":first-child"),f.attr("class","basic label-container").attr("style",i).attr("rx",Aa(d)).attr("ry",Aa(p)).attr("x",u).attr("y",h).attr("width",o).attr("height",l);return Pt(e,f),e.intersect=function(m){return Nt.rect(e,m)},a}async function yK(t,e){let{shapeSvg:r,bbox:n,label:i}=await tr(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),Pt(e,a),e.intersect=function(l){return Nt.rect(e,l)},r}async function xK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),o=Math.max(a.height+(e.padding??0),e?.height??0),l=[{x:0,y:0},{x:s+3*o/6,y:0},{x:s,y:-o},{x:-(3*o)/6,y:-o}],u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Ye.svg(i),d=Bt(e,{}),p=Er(l),g=f.path(p,d);u=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${o/2})`),h&&u.attr("style",h)}else u=Au(i,s,o,l);return n&&u.attr("style",n),e.width=s,e.height=o,Pt(e,u),e.intersect=function(f){return Nt.polygon(e,l,f)},i}async function bK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),o=Math.max(a.height+(e.padding??0),e?.height??0),l=[{x:-3*o/6,y:0},{x:s,y:0},{x:s+3*o/6,y:-o},{x:0,y:-o}],u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Ye.svg(i),d=Bt(e,{}),p=Er(l),g=f.path(p,d);u=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${o/2})`),h&&u.attr("style",h)}else u=Au(i,s,o,l);return n&&u.attr("style",n),e.width=s,e.height=o,Pt(e,u),e.intersect=function(f){return Nt.polygon(e,l,f)},i}function wK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",rr(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),o=Math.max(35,e?.height??0),l=7,u=[{x:s,y:0},{x:0,y:o+l/2},{x:s-2*l,y:o+l/2},{x:0,y:2*o},{x:s,y:o-l/2},{x:2*l,y:o-l/2}],h=Ye.svg(i),f=Bt(e,{});e.look!=="handDrawn"&&(f.roughness=0,f.fillStyle="solid");let d=Er(u),p=h.path(d,f),g=i.insert(()=>p,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-o})`),Pt(e,g),e.intersect=function(m){return re.info("lightningBolt intersect",e,m),Nt.polygon(e,u,m)},i}async function kK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0),e.width??0),l=o/2,u=l/(2.5+o/50),h=Math.max(a.height+u+(e.padding??0),e.height??0),f=h*.1,d,{cssStyles:p}=e;if(e.look==="handDrawn"){let g=Ye.svg(i),m=G6e(0,0,o,h,l,u,f),y=U6e(0,u,o,h,l,u),x=Bt(e,{}),b=g.path(m,x),w=g.path(y,x);i.insert(()=>w,":first-child").attr("class","line"),d=i.insert(()=>b,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let g=$6e(0,0,o,h,l,u,f);d=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",Aa(p)).attr("style",n)}return d.attr("label-offset-y",u),d.attr("transform",`translate(${-o/2}, ${-(h/2+u)})`),Pt(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+u-(a.y-(a.top??0))})`),e.intersect=function(g){let m=Nt.rect(e,g),y=m.x-(e.x??0);if(l!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(m.y-(e.y??0))>(e.height??0)/2-u)){let x=u*u*(1-y*y/(l*l));x>0&&(x=Math.sqrt(x)),x=u-x,g.y-(e.y??0)>0&&(x=-x),m.y+=x}return m},i}async function TK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=l/4,h=l+u,{cssStyles:f}=e,d=Ye.svg(i),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=[{x:-o/2-o/2*.1,y:-h/2},{x:-o/2-o/2*.1,y:h/2},...Oh(-o/2-o/2*.1,h/2,o/2+o/2*.1,h/2,u,.8),{x:o/2+o/2*.1,y:-h/2},{x:-o/2-o/2*.1,y:-h/2},{x:-o/2,y:-h/2},{x:-o/2,y:h/2*1.1},{x:-o/2,y:-h/2}],m=d.polygon(g.map(x=>[x.x,x.y]),p),y=i.insert(()=>m,":first-child");return y.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",n),y.attr("transform",`translate(0,${-u/2})`),s.attr("transform",`translate(${-o/2+(e.padding??0)+o/2*.1/2-(a.x-(a.left??0))},${-l/2+(e.padding??0)-u/2-(a.y-(a.top??0))})`),Pt(e,y),e.intersect=function(x){return Nt.polygon(e,g,x)},i}async function EK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=5,h=-o/2,f=-l/2,{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{}),m=[{x:h-u,y:f+u},{x:h-u,y:f+l+u},{x:h+o-u,y:f+l+u},{x:h+o-u,y:f+l},{x:h+o,y:f+l},{x:h+o,y:f+l-u},{x:h+o+u,y:f+l-u},{x:h+o+u,y:f-u},{x:h+u,y:f-u},{x:h+u,y:f},{x:h,y:f},{x:h,y:f+u}],y=[{x:h,y:f+u},{x:h+o-u,y:f+u},{x:h+o-u,y:f+l},{x:h+o,y:f+l},{x:h+o,y:f},{x:h,y:f}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Er(m),b=p.path(x,g),w=Er(y),_=p.path(w,{...g,fill:"none"}),k=i.insert(()=>_,":first-child");return k.insert(()=>b,":first-child"),k.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-u-(a.x-(a.left??0))}, ${-(a.height/2)+u-(a.y-(a.top??0))})`),Pt(e,k),e.intersect=function(E){return Nt.polygon(e,m,E)},i}async function SK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=l/4,h=l+u,f=-o/2,d=-h/2,p=5,{cssStyles:g}=e,m=Oh(f-p,d+h+p,f+o-p,d+h+p,u,.8),y=m?.[m.length-1],x=[{x:f-p,y:d+p},{x:f-p,y:d+h+p},...m,{x:f+o-p,y:y.y-p},{x:f+o,y:y.y-p},{x:f+o,y:y.y-2*p},{x:f+o+p,y:y.y-2*p},{x:f+o+p,y:d-p},{x:f+p,y:d-p},{x:f+p,y:d},{x:f,y:d},{x:f,y:d+p}],b=[{x:f,y:d+p},{x:f+o-p,y:d+p},{x:f+o-p,y:y.y-p},{x:f+o,y:y.y-p},{x:f+o,y:d},{x:f,y:d}],w=Ye.svg(i),_=Bt(e,{});e.look!=="handDrawn"&&(_.roughness=0,_.fillStyle="solid");let k=Er(x),E=w.path(k,_),L=Er(b),S=w.path(L,_),C=i.insert(()=>E,":first-child");return C.insert(()=>S),C.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(0,${-u/2})`),s.attr("transform",`translate(${-(a.width/2)-p-(a.x-(a.left??0))}, ${-(a.height/2)+p-u/2-(a.y-(a.top??0))})`),Pt(e,C),e.intersect=function(M){return Nt.polygon(e,x,M)},i}async function CK(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Vt(e);e.labelStyle=n,e.useHtmlLabels||Or().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:o}=await tr(t,e,rr(e)),l=Math.max(o.width+(e.padding??0)*2,e?.width??0),u=Math.max(o.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Ye.svg(s),g=Bt(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let m=p.rectangle(h,f,l,u,g),y=s.insert(()=>m,":first-child");return y.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",d),i&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",i),Pt(e,y),e.intersect=function(x){return Nt.rect(e,x)},s}async function AK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=a.width+e.padding,o=a.height+e.padding,l=s+o,u=[{x:l/2,y:0},{x:l,y:-l/2},{x:l/2,y:-l},{x:0,y:-l/2}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ye.svg(i),p=Bt(e,{}),g=V6e(0,0,l),m=d.path(g,p);h=i.insert(()=>m,":first-child").attr("transform",`translate(${-l/2}, ${l/2})`),f&&h.attr("style",f)}else h=Au(i,l,l,u);return n&&h.attr("style",n),Pt(e,h),e.intersect=function(d){return re.debug(`APA12 Intersect called SPLIT point:`,d,` node: `,e,` res:`,Nt.polygon(e,u,d)),Nt.polygon(e,u,d)},i}async function _K(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=-o/2,h=-l/2,f=h/2,d=[{x:u+f,y:h},{x:u,y:0},{x:u+f,y:-h},{x:-u,y:-h},{x:-u,y:h}],{cssStyles:p}=e,g=Ye.svg(i),m=Bt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let y=Er(d),x=g.path(y,m),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-f/2},0)`),s.attr("transform",`translate(${-f/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Pt(e,b),e.intersect=function(w){return Nt.polygon(e,d,w)},i}async function LK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),o=a.insert("g").attr("class","label").attr("style",n),l=e.description,u=e.label,h=o.node().appendChild(await Ph(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(Wr(pe()?.flowchart?.htmlLabels)){let S=h.children[0],C=Ve(h);f=S.getBoundingClientRect(),C.attr("width",f.width),C.attr("height",f.height)}re.info("Text 2",l);let d=l||[],p=h.getBBox(),g=o.node().appendChild(await Ph(d.join?d.join("
    "):d,e.labelStyle,!0,!0)),m=g.children[0],y=Ve(g);f=m.getBoundingClientRect(),y.attr("width",f.width),y.attr("height",f.height);let x=(e.padding||0)/2;Ve(g).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+x+5)+")"),Ve(h).attr("transform","translate( "+(f.width(re.debug("Rough node insert CXC",M),R),":first-child"),E=a.insert(()=>(re.debug("Rough node insert CXC",M),M),":first-child")}else E=s.insert("rect",":first-child"),L=s.insert("line"),E.attr("class","outer title-state").attr("style",n).attr("x",-f.width/2-x).attr("y",-f.height/2-x).attr("width",f.width+(e.padding||0)).attr("height",f.height+(e.padding||0)),L.attr("class","divider").attr("x1",-f.width/2-x).attr("x2",f.width/2+x).attr("y1",-f.height/2-x+p.height+x).attr("y2",-f.height/2-x+p.height+x);return Pt(e,E),e.intersect=function(S){return Nt.rect(e,S)},a}async function RK(t,e){let r={rx:5,ry:5,classes:"",labelPaddingX:(e?.padding||0)*1,labelPaddingY:(e?.padding||0)*1};return o5(t,e,r)}async function NK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=e?.padding??0,l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-a.width/2-o,f=-a.height/2-o,{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let m=[{x:h,y:f},{x:h+l+8,y:f},{x:h+l+8,y:f+u},{x:h-8,y:f+u},{x:h-8,y:f},{x:h,y:f},{x:h,y:f+u}],y=p.polygon(m.map(b=>[b.x,b.y]),g),x=i.insert(()=>y,":first-child");return x.attr("class","basic label-container").attr("style",Aa(d)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),d&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-l/2+4+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-(a.y-(a.top??0))})`),Pt(e,x),e.intersect=function(b){return Nt.rect(e,b)},i}async function IK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-o/2,h=-l/2,{cssStyles:f}=e,d=Ye.svg(i),p=Bt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let g=[{x:u,y:h},{x:u,y:h+l},{x:u+o,y:h+l},{x:u+o,y:h-l/2}],m=Er(g),y=d.path(m,p),x=i.insert(()=>y,":first-child");return x.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${l/4})`),s.attr("transform",`translate(${-o/2+(e.padding??0)-(a.x-(a.left??0))}, ${-l/4+(e.padding??0)-(a.y-(a.top??0))})`),Pt(e,x),e.intersect=function(b){return Nt.polygon(e,g,b)},i}async function MK(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return o5(t,e,r)}async function DK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=a.height+e.padding,o=a.width+s/4+e.padding,l,{cssStyles:u}=e;if(e.look==="handDrawn"){let h=Ye.svg(i),f=Bt(e,{}),d=Cu(-o/2,-s/2,o,s,s/2),p=h.path(d,f);l=i.insert(()=>p,":first-child"),l.attr("class","basic label-container").attr("style",Aa(u))}else l=i.insert("rect",":first-child"),l.attr("class","basic label-container").attr("style",n).attr("rx",s/2).attr("ry",s/2).attr("x",-o/2).attr("y",-s/2).attr("width",o).attr("height",s);return Pt(e,l),e.intersect=function(h){return Nt.rect(e,h)},i}async function OK(t,e){return o5(t,e,{rx:5,ry:5,classes:"flowchart-node"})}function PK(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Vt(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:o,nodeBorder:l}=r,u=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),h=Ye.svg(u),f=Bt(e,{});e.look!=="handDrawn"&&(f.roughness=0,f.fillStyle="solid");let d=h.circle(0,0,14,{...f,stroke:s,strokeWidth:2}),p=o??l,g=h.circle(0,0,5,{...f,fill:p,stroke:p,strokeWidth:2,fillStyle:"solid"}),m=u.insert(()=>d,":first-child");return m.insert(()=>g),a&&m.selectAll("path").attr("style",a),i&&m.selectAll("path").attr("style",i),Pt(e,m),e.intersect=function(y){return Nt.circle(e,7,y)},u}function BK(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let o=Ye.svg(i).circle(0,0,14,E6e(n));a=i.insert(()=>o),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return Pt(e,a),e.intersect=function(s){return Nt.circle(e,7,s)},i}async function FK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=(e?.padding||0)/2,o=a.width+e.padding,l=a.height+e.padding,u=-a.width/2-s,h=-a.height/2-s,f=[{x:0,y:0},{x:o,y:0},{x:o,y:-l},{x:0,y:-l},{x:0,y:0},{x:-8,y:0},{x:o+8,y:0},{x:o+8,y:-l},{x:-8,y:-l},{x:-8,y:0}];if(e.look==="handDrawn"){let d=Ye.svg(i),p=Bt(e,{}),g=d.rectangle(u-8,h,o+16,l,p),m=d.line(u,h,u,h+l,p),y=d.line(u+o,h,u+o,h+l,p);i.insert(()=>m,":first-child"),i.insert(()=>y,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",Aa(b)),Pt(e,x)}else{let d=Au(i,o,l,f);n&&d.attr("style",n),Pt(e,d)}return e.intersect=function(d){return Nt.polygon(e,f,d)},i}async function zK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),o=Math.max(a.height+(e.padding??0)*2,e?.height??0),l=-s/2,u=-o/2,h=.2*o,f=.2*o,{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{}),m=[{x:l-h/2,y:u},{x:l+s+h/2,y:u},{x:l+s+h/2,y:u+o},{x:l-h/2,y:u+o}],y=[{x:l+s-h/2,y:u+o},{x:l+s+h/2,y:u+o},{x:l+s+h/2,y:u+o-f}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Er(m),b=p.path(x,g),w=Er(y),_=p.path(w,{...g,fillStyle:"solid"}),k=i.insert(()=>_,":first-child");return k.insert(()=>b,":first-child"),k.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",n),Pt(e,k),e.intersect=function(E){return Nt.polygon(e,m,E)},i}async function $K(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=l/4,h=.2*o,f=.2*l,d=l+u,{cssStyles:p}=e,g=Ye.svg(i),m=Bt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let y=[{x:-o/2-o/2*.1,y:d/2},...Oh(-o/2-o/2*.1,d/2,o/2+o/2*.1,d/2,u,.8),{x:o/2+o/2*.1,y:-d/2},{x:-o/2-o/2*.1,y:-d/2}],x=-o/2+o/2*.1,b=-d/2-f*.4,w=[{x:x+o-h,y:(b+l)*1.4},{x:x+o,y:b+l-f},{x:x+o,y:(b+l)*.9},...Oh(x+o,(b+l)*1.3,x+o-h,(b+l)*1.5,-l*.03,.5)],_=Er(y),k=g.path(_,m),E=Er(w),L=g.path(E,{...m,fillStyle:"solid"}),S=i.insert(()=>L,":first-child");return S.insert(()=>k,":first-child"),S.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-u/2})`),s.attr("transform",`translate(${-o/2+(e.padding??0)-(a.x-(a.left??0))},${-l/2+(e.padding??0)-u/2-(a.y-(a.top??0))})`),Pt(e,S),e.intersect=function(C){return Nt.polygon(e,y,C)},i}async function GK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=Math.max(a.width+e.padding,e?.width||0),o=Math.max(a.height+e.padding,e?.height||0),l=-s/2,u=-o/2,h=i.insert("rect",":first-child");return h.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",l).attr("y",u).attr("width",s).attr("height",o),Pt(e,h),e.intersect=function(f){return Nt.rect(e,f)},i}async function UK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:o}=await tr(t,e,rr(e)),l=e.look==="neo"?o*2:o,u=a.height+l,h=u/2,f=h/(2.5+u/50),d=a.width+f+l,{cssStyles:p}=e,g;if(e.look==="handDrawn"){let m=Ye.svg(i),y=H6e(0,0,d,u,f,h),x=q6e(0,0,d,u,f,h),b=m.path(y,Bt(e,{})),w=m.path(x,Bt(e,{fill:"none"}));g=i.insert(()=>w,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),p&&g.attr("style",p)}else{let m=W6e(0,0,d,u,f,h);g=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",Aa(p)).attr("style",n),g.attr("class","basic label-container"),p&&g.selectAll("path").attr("style",p),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",f),g.attr("transform",`translate(${-d/2}, ${u/2} )`),s.attr("transform",`translate(${-(a.width/2)-f-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Pt(e,g),e.intersect=function(m){let y=Nt.rect(e,m),x=y.y-(e.y??0);if(h!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(y.x-(e.x??0))>(e.width??0)/2-f)){let b=f*f*(1-x*x/(h*h));b!=0&&(b=Math.sqrt(b)),b=f-b,m.x-(e.x??0)>0&&(b=-b),y.x+=b}return y},i}async function VK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=a.width+e.padding,o=a.height+e.padding,l=[{x:-3*o/6,y:0},{x:s+3*o/6,y:0},{x:s,y:-o},{x:0,y:-o}],u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Ye.svg(i),d=Bt(e,{}),p=Er(l),g=f.path(p,d);u=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${o/2})`),h&&u.attr("style",h)}else u=Au(i,s,o,l);return n&&u.attr("style",n),e.width=s,e.height=o,Pt(e,u),e.intersect=function(f){return Nt.polygon(e,l,f)},i}async function WK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=60,o=20,l=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),u=Math.max(o,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:h}=e,f=Ye.svg(i),d=Bt(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=[{x:-l/2*.8,y:-u/2},{x:l/2*.8,y:-u/2},{x:l/2,y:-u/2*.6},{x:l/2,y:u/2},{x:-l/2,y:u/2},{x:-l/2,y:-u/2*.6}],g=Er(p),m=f.path(g,d),y=i.insert(()=>m,":first-child");return y.attr("class","basic label-container"),h&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",h),n&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",n),Pt(e,y),e.intersect=function(x){return Nt.polygon(e,p,x)},i}async function HK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Wr(pe().flowchart?.htmlLabels),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:0},{x:h,y:0},{x:h/2,y:-u}],{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let m=Er(f),y=p.path(m,g),x=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=l,e.height=u,Pt(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${u/2-(a.height+(e.padding??0)/(o?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return re.info("Triangle intersect",e,f,b),Nt.polygon(e,f,b)},i}async function qK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=l/8,h=l+u,{cssStyles:f}=e,p=70-o,g=p>0?p/2:0,m=Ye.svg(i),y=Bt(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let x=[{x:-o/2-g,y:h/2},...Oh(-o/2-g,h/2,o/2+g,h/2,u,.8),{x:o/2+g,y:-h/2},{x:-o/2-g,y:-h/2}],b=Er(x),w=m.path(b,y),_=i.insert(()=>w,":first-child");return _.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(0,${-u/2})`),s.attr("transform",`translate(${-o/2+(e.padding??0)-(a.x-(a.left??0))},${-l/2+(e.padding??0)-u-(a.y-(a.top??0))})`),Pt(e,_),e.intersect=function(k){return Nt.polygon(e,x,k)},i}async function YK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await tr(t,e,rr(e)),s=100,o=50,l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=l/u,f=l,d=u;f>d*h?d=f/h:f=d*h,f=Math.max(f,s),d=Math.max(d,o);let p=Math.min(d*.2,d/4),g=d+p*2,{cssStyles:m}=e,y=Ye.svg(i),x=Bt(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-f/2,y:g/2},...Oh(-f/2,g/2,f/2,g/2,p,1),{x:f/2,y:-g/2},...Oh(f/2,-g/2,-f/2,-g/2,p,-1)],w=Er(b),_=y.path(w,x),k=i.insert(()=>_,":first-child");return k.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&k.selectAll("path").attr("style",n),Pt(e,k),e.intersect=function(E){return Nt.polygon(e,b,E)},i}async function XK(t,e){let{labelStyles:r,nodeStyles:n}=Vt(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await tr(t,e,rr(e)),o=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=5,h=-o/2,f=-l/2,{cssStyles:d}=e,p=Ye.svg(i),g=Bt(e,{}),m=[{x:h-u,y:f-u},{x:h-u,y:f+l},{x:h+o,y:f+l},{x:h+o,y:f-u}],y=`M${h-u},${f-u} L${h+o},${f-u} L${h+o},${f+l} L${h-u},${f+l} L${h-u},${f-u} M${h-u},${f} L${h+o},${f} M${h},${f-u} L${h},${f+l}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=p.path(y,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${u/2}, ${u/2})`),b.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+u/2-(a.x-(a.left??0))}, ${-(a.height/2)+u/2-(a.y-(a.top??0))})`),Pt(e,b),e.intersect=function(w){return Nt.polygon(e,m,w)},i}async function jK(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",rr(e)).attr("id",e.domId||e.id),o=null,l=null,u=null,h=null,f=0,d=0,p=0;if(o=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await Qv(o,{text:`\xAB${b}\xBB`},0),f=o.node().getBBox().height}l=s.insert("g").attr("class","label-group text"),await Qv(l,e,0,["font-weight: bolder"]);let g=l.node().getBBox();d=g.height,u=s.insert("g").attr("class","members-group text");let m=0;for(let b of e.members){let w=await Qv(u,b,m,[b.parseClassifier()]);m+=w+a}p=u.node().getBBox().height,p<=0&&(p=i/2),h=s.insert("g").attr("class","methods-group text");let y=0;for(let b of e.methods){let w=await Qv(h,b,y,[b.parseClassifier()]);y+=w+a}let x=s.node().getBBox();if(o!==null){let b=o.node().getBBox();o.attr("transform",`translate(${-b.width/2})`)}return l.attr("transform",`translate(${-g.width/2}, ${f})`),x=s.node().getBBox(),u.attr("transform",`translate(0, ${f+d+i*2})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${f+d+(p?p+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function Qv(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=Or(),s="useHtmlLabels"in e?e.useHtmlLabels:Wr(a.htmlLabels)??!0,o="";"text"in e?o=e.text:o=e.label,!s&&o.startsWith("\\")&&(o=o.substring(1)),Ei(o)&&(s=!0);let l=await oa(i,WS(Xs(o)),{width:bs(o,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),u,h=1;if(s){let f=l.children[0],d=Ve(l);h=f.innerHTML.split("
    ").length,f.innerHTML.includes("")&&(h+=f.innerHTML.split("").length-1);let p=f.getElementsByTagName("img");if(p){let g=o.replace(/]*>/g,"").trim()==="";await Promise.all([...p].map(m=>new Promise(y=>{function x(){if(m.style.display="flex",m.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,_=parseInt(b,10)*5+"px";m.style.minWidth=_,m.style.maxWidth=_}else m.style.width="100%";y(m)}v(x,"setupImage"),setTimeout(()=>{m.complete&&x()}),m.addEventListener("error",x),m.addEventListener("load",x)})))}u=f.getBoundingClientRect(),d.attr("width",u.width),d.attr("height",u.height)}else{n.includes("font-weight: bolder")&&Ve(l).selectAll("tspan").attr("font-weight",""),h=l.children.length;let f=l.children[0];(l.textContent===""||l.textContent.includes(">"))&&(f.textContent=o[0]+o.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),o[1]===" "&&(f.textContent=f.textContent[0]+" "+f.textContent.substring(1))),f.textContent==="undefined"&&(f.textContent=""),u=l.getBBox()}return i.attr("transform","translate(0,"+(-u.height/(2*h)+r)+")"),u.height}async function KK(t,e){let r=pe(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??Wr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:o,bbox:l}=await jK(t,e,r,a,i),{labelStyles:u,nodeStyles:h}=Vt(e);e.labelStyle=u,e.cssStyles=s.styles||"";let f=s.styles?.join(";")||h||"";e.cssStyles||(e.cssStyles=f.replaceAll("!important","").split(";"));let d=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,p=Ye.svg(o),g=Bt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let m=l.width,y=l.height;s.members.length===0&&s.methods.length===0?y+=i:s.members.length>0&&s.methods.length===0&&(y+=i*2);let x=-m/2,b=-y/2,w=p.rectangle(x-n,b-n-(d?n:s.members.length===0&&s.methods.length===0?-n/2:0),m+2*n,y+2*n+(d?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),_=o.insert(()=>w,":first-child");_.attr("class","basic label-container");let k=_.node().getBBox();o.selectAll(".text").each((C,M,R)=>{let T=Ve(R[M]),I=T.attr("transform"),A=0;if(I){let B=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);B&&(A=parseFloat(B[2]))}let D=A+b+n-(d?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(D-=4);let N=x;(T.attr("class").includes("label-group")||T.attr("class").includes("annotation-group"))&&(N=-T.node()?.getBBox().width/2||0,o.selectAll("text").each(function(O,B,P){window.getComputedStyle(P[B]).textAnchor==="middle"&&(N=0)})),T.attr("transform",`translate(${N}, ${D})`)});let E=o.select(".annotation-group").node().getBBox().height-(d?n/2:0)||0,L=o.select(".label-group").node().getBBox().height-(d?n/2:0)||0,S=o.select(".members-group").node().getBBox().height-(d?n/2:0)||0;if(s.members.length>0||s.methods.length>0||d){let C=p.line(k.x,E+L+b+n,k.x+k.width,E+L+b+n,g);o.insert(()=>C).attr("class","divider").attr("style",f)}if(d||s.members.length>0||s.methods.length>0){let C=p.line(k.x,E+L+S+b+i*2+n,k.x+k.width,E+L+S+b+n+i*2,g);o.insert(()=>C).attr("class","divider").attr("style",f)}if(s.look!=="handDrawn"&&o.selectAll("path").attr("style",f),_.select(":nth-child(2)").attr("style",f),o.selectAll(".divider").select("path").attr("style",f),e.labelStyle?o.selectAll("span").attr("style",e.labelStyle):o.selectAll("span").attr("style",f),!a){let C=RegExp(/color\s*:\s*([^;]*)/),M=C.exec(f);if(M){let R=M[0].replace("color","fill");o.selectAll("tspan").attr("style",R)}else if(u){let R=C.exec(u);if(R){let T=R[0].replace("color","fill");o.selectAll("tspan").attr("style",T)}}}return Pt(e,_),e.intersect=function(C){return Nt.rect(e,C)},o}async function ZK(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=Vt(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:o,bbox:l,label:u}=await tr(t,e,rr(e)),h=e.padding||10,f="",d;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(f=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),d=o.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",f).attr("target","_blank"));let p={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,m;d?{label:g,bbox:m}=await $A(d,"ticket"in e&&e.ticket||"",p):{label:g,bbox:m}=await $A(o,"ticket"in e&&e.ticket||"",p);let{label:y,bbox:x}=await $A(o,"assigned"in e&&e.assigned||"",p);e.width=s;let b=10,w=e?.width||0,_=Math.max(m.height,x.height)/2,k=Math.max(l.height+b*2,e?.height||0)+_,E=-w/2,L=-k/2;u.attr("transform","translate("+(h-w/2)+", "+(-_-l.height/2)+")"),g.attr("transform","translate("+(h-w/2)+", "+(-_+l.height/2)+")"),y.attr("transform","translate("+(h+w/2-x.width-2*a)+", "+(-_+l.height/2)+")");let S,{rx:C,ry:M}=e,{cssStyles:R}=e;if(e.look==="handDrawn"){let T=Ye.svg(o),I=Bt(e,{}),A=C||M?T.path(Cu(E,L,w,k,C||0),I):T.rectangle(E,L,w,k,I);S=o.insert(()=>A,":first-child"),S.attr("class","basic label-container").attr("style",R||null)}else{S=o.insert("rect",":first-child"),S.attr("class","basic label-container __APA__").attr("style",i).attr("rx",C??5).attr("ry",M??5).attr("x",E).attr("y",L).attr("width",w).attr("height",k);let T="priority"in e&&e.priority;if(T){let I=o.append("line"),A=E+2,D=L+Math.floor((C??0)/2),N=L+k-Math.floor((C??0)/2);I.attr("x1",A).attr("y1",D).attr("x2",A).attr("y2",N).attr("stroke-width","4").attr("stroke",Y6e(T))}}return Pt(e,S),e.height=k,e.intersect=function(T){return Nt.rect(e,T)},o}function WA(t){return t in QK}async function wd(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?QK[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),l5.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var tr,$A,Pt,rr,k6e,Jp,T6e,Ph,Cu,E6e,eg,S6e,Vt,Bt,Bj,C6e,A6e,_6e,L6e,R6e,N6e,Fj,tg,zj,I6e,Uj,M6e,D6e,O6e,Nt,P6e,B6e,F6e,z6e,$6e,G6e,U6e,V6e,W6e,H6e,q6e,Y6e,X6e,j6e,QK,l5,JK,eZ,Jv,yl=F(()=>{sl();bo();Ya();kn();or();lr();lr();$t();lr();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();lr();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();$t();lr();$t();lr();$t();tr=v(async(t,e,r)=>{let n,i=e.useHtmlLabels||Wr(pe()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",Aa(e.labelStyle)),o;e.label===void 0?o="":o=typeof e.label=="string"?e.label:e.label[0];let l=await oa(s,yr(Xs(o),pe()),{useHtmlLabels:i,width:e.width||pe().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),u=l.getBBox(),h=(e?.padding??0)/2;if(i){let f=l.children[0],d=Ve(l),p=f.getElementsByTagName("img");if(p){let g=o.replace(/]*>/g,"").trim()==="";await Promise.all([...p].map(m=>new Promise(y=>{function x(){if(m.style.display="flex",m.style.flexDirection="column",g){let b=pe().fontSize?pe().fontSize:window.getComputedStyle(document.body).fontSize,w=5,[_=sr.fontSize]=Ro(b),k=_*w+"px";m.style.minWidth=k,m.style.maxWidth=k}else m.style.width="100%";y(m)}v(x,"setupImage"),setTimeout(()=>{m.complete&&x()}),m.addEventListener("error",x),m.addEventListener("load",x)})))}u=f.getBoundingClientRect(),d.attr("width",u.width),d.attr("height",u.height)}return i?s.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"):s.attr("transform","translate(0, "+-u.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:u,halfPadding:h,label:s}},"labelHelper"),$A=v(async(t,e,r)=>{let n=r.useHtmlLabels||Wr(pe()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await oa(i,yr(Xs(e),pe()),{useHtmlLabels:n,width:r.width||pe()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),o=r.padding/2;if(Wr(pe()?.flowchart?.htmlLabels)){let l=a.children[0],u=Ve(a);s=l.getBoundingClientRect(),u.attr("width",s.width),u.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:o,label:i}},"insertLabel"),Pt=v((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),rr=v((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");v(Er,"createPathFromPoints");v(Oh,"generateFullSineWavePoints");v(VA,"generateCirclePoints");k6e=v((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,o=t.height/2,l,u;return Math.abs(a)*s>Math.abs(i)*o?(a<0&&(o=-o),l=a===0?0:o*i/a,u=o):(i<0&&(s=-s),l=s,u=i===0?0:s*a/i),{x:r+l,y:n+u}},"intersectRect"),Jp=k6e;v(Oj,"applyStyle");v(Pj,"addHtmlLabel");T6e=v(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),Wr(pe().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),re.info("vertexText"+i);let a={isNode:n,label:Xs(i).replace(/fa[blrs]?:fa-[\w-]+/g,o=>``),labelStyle:e&&e.replace("fill:","color:")};return await Pj(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let o of s){let l=document.createElementNS("http://www.w3.org/2000/svg","tspan");l.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),l.setAttribute("dy","1em"),l.setAttribute("x","0"),r?l.setAttribute("class","title-row"):l.setAttribute("class","row"),l.textContent=o.trim(),a.appendChild(l)}return a}},"createLabel"),Ph=T6e,Cu=v((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD"),E6e=v(t=>{let{handDrawnSeed:e}=pe();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),eg=v(t=>{let e=S6e([...t.cssCompiledStyles||[],...t.cssStyles||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),S6e=v(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),Vt=v(t=>{let{stylesArray:e}=eg(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let o=s[0];o==="color"||o==="font-size"||o==="font-family"||o==="font-weight"||o==="font-style"||o==="text-decoration"||o==="text-align"||o==="text-transform"||o==="line-height"||o==="letter-spacing"||o==="word-spacing"||o==="text-shadow"||o==="text-overflow"||o==="white-space"||o==="word-wrap"||o==="word-break"||o==="overflow-wrap"||o==="hyphens"?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),o.includes("stroke")&&i.push(s.join(":")+" !important"),o==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Bt=v((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=pe(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=eg(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0]},e)},"userNodeOverrides"),Bj=v(async(t,e)=>{re.info("Creating subgraph rect for ",e.id,e);let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:o,nodeStyles:l,borderStyles:u,backgroundStyles:h}=Vt(e),f=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),d=Wr(r.flowchart.htmlLabels),p=f.insert("g").attr("class","cluster-label "),g=await oa(p,e.label,{style:e.labelStyle,useHtmlLabels:d,isNode:!0}),m=g.getBBox();if(Wr(r.flowchart.htmlLabels)){let L=g.children[0],S=Ve(g);m=L.getBoundingClientRect(),S.attr("width",m.width),S.attr("height",m.height)}let y=e.width<=m.width+e.padding?m.width+e.padding:e.width;e.width<=m.width+e.padding?e.diff=(y-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-y/2,w=e.y-x/2;re.trace("Data ",e,JSON.stringify(e));let _;if(e.look==="handDrawn"){let L=Ye.svg(f),S=Bt(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),C=L.path(Cu(b,w,y,x,0),S);_=f.insert(()=>(re.debug("Rough node insert CXC",C),C),":first-child"),_.select("path:nth-child(2)").attr("style",u.join(";")),_.select("path").attr("style",h.join(";").replace("fill","stroke"))}else _=f.insert("rect",":first-child"),_.attr("style",l).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",y).attr("height",x);let{subGraphTitleTopMargin:k}=ou(r);if(p.attr("transform",`translate(${e.x-m.width/2}, ${e.y-e.height/2+k})`),o){let L=p.select("span");L&&L.attr("style",o)}let E=_.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=m.height-e.padding/2,e.intersect=function(L){return Jp(e,L)},{cluster:f,labelBBox:m}},"rect"),C6e=v((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(o){return Jp(e,o)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),A6e=v(async(t,e)=>{let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:o,nodeBorder:l}=n,u=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),h=u.insert("g",":first-child"),f=u.insert("g").attr("class","cluster-label"),d=u.append("rect"),p=f.node().appendChild(await Ph(e.label,e.labelStyle,void 0,!0)),g=p.getBBox();if(Wr(r.flowchart.htmlLabels)){let C=p.children[0],M=Ve(p);g=C.getBoundingClientRect(),M.attr("width",g.width),M.attr("height",g.height)}let m=0*e.padding,y=m/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+m;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+m,w=e.height+m-g.height-6,_=e.x-x/2,k=e.y-b/2;e.width=x;let E=e.y-e.height/2-y+g.height+2,L;if(e.look==="handDrawn"){let C=e.cssClasses.includes("statediagram-cluster-alt"),M=Ye.svg(u),R=e.rx||e.ry?M.path(Cu(_,k,x,b,10),{roughness:.7,fill:o,fillStyle:"solid",stroke:l,seed:i}):M.rectangle(_,k,x,b,{seed:i});L=u.insert(()=>R,":first-child");let T=M.rectangle(_,E,x,w,{fill:C?a:s,fillStyle:C?"hachure":"solid",stroke:l,seed:i});L=u.insert(()=>R,":first-child"),d=u.insert(()=>T)}else L=h.insert("rect",":first-child"),L.attr("class","outer").attr("x",_).attr("y",k).attr("width",x).attr("height",b).attr("data-look",e.look),d.attr("class","inner").attr("x",_).attr("y",E).attr("width",x).attr("height",w);f.attr("transform",`translate(${e.x-g.width/2}, ${k+1-(Wr(r.flowchart.htmlLabels)?0:3)})`);let S=L.node().getBBox();return e.height=S.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(C){return Jp(e,C)},{cluster:u,labelBBox:g}},"roundedWithTitle"),_6e=v(async(t,e)=>{re.info("Creating subgraph rect for ",e.id,e);let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:o,nodeStyles:l,borderStyles:u,backgroundStyles:h}=Vt(e),f=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),d=Wr(r.flowchart.htmlLabels),p=f.insert("g").attr("class","cluster-label "),g=await oa(p,e.label,{style:e.labelStyle,useHtmlLabels:d,isNode:!0,width:e.width}),m=g.getBBox();if(Wr(r.flowchart.htmlLabels)){let L=g.children[0],S=Ve(g);m=L.getBoundingClientRect(),S.attr("width",m.width),S.attr("height",m.height)}let y=e.width<=m.width+e.padding?m.width+e.padding:e.width;e.width<=m.width+e.padding?e.diff=(y-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-y/2,w=e.y-x/2;re.trace("Data ",e,JSON.stringify(e));let _;if(e.look==="handDrawn"){let L=Ye.svg(f),S=Bt(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),C=L.path(Cu(b,w,y,x,e.rx),S);_=f.insert(()=>(re.debug("Rough node insert CXC",C),C),":first-child"),_.select("path:nth-child(2)").attr("style",u.join(";")),_.select("path").attr("style",h.join(";").replace("fill","stroke"))}else _=f.insert("rect",":first-child"),_.attr("style",l).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",y).attr("height",x);let{subGraphTitleTopMargin:k}=ou(r);if(p.attr("transform",`translate(${e.x-m.width/2}, ${e.y-e.height/2+k})`),o){let L=p.select("span");L&&L.attr("style",o)}let E=_.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=m.height-e.padding/2,e.intersect=function(L){return Jp(e,L)},{cluster:f,labelBBox:m}},"kanbanSection"),L6e=v((t,e)=>{let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),o=s.insert("g",":first-child"),l=0*e.padding,u=e.width+l;e.diff=-e.padding;let h=e.height+l,f=e.x-u/2,d=e.y-h/2;e.width=u;let p;if(e.look==="handDrawn"){let y=Ye.svg(s).rectangle(f,d,u,h,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});p=s.insert(()=>y,":first-child")}else p=o.insert("rect",":first-child"),p.attr("class","divider").attr("x",f).attr("y",d).attr("width",u).attr("height",h).attr("data-look",e.look);let g=p.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(m){return Jp(e,m)},{cluster:s,labelBBox:{}}},"divider"),R6e=Bj,N6e={rect:Bj,squareRect:R6e,roundedWithTitle:A6e,noteGroup:C6e,divider:L6e,kanbanSection:_6e},Fj=new Map,tg=v(async(t,e)=>{let r=e.shape||"rect",n=await N6e[r](t,e);return Fj.set(e.id,n),n},"insertCluster"),zj=v(()=>{Fj=new Map},"clear");v($j,"intersectNode");I6e=$j;v(Gj,"intersectEllipse");Uj=Gj;v(Vj,"intersectCircle");M6e=Vj;v(Wj,"intersectLine");v(GA,"sameSign");D6e=Wj;v(Hj,"intersectPolygon");O6e=Hj,Nt={node:I6e,circle:M6e,ellipse:Uj,polygon:O6e,rect:Jp};v(qj,"anchor");v(UA,"generateArcPoints");v(Yj,"bowTieRect");v(Au,"insertPolygonShape");v(Xj,"card");v(jj,"choice");v(Kj,"circle");v(Zj,"createLine");v(Qj,"crossedCircle");v(Eu,"generateCirclePoints");v(Jj,"curlyBraceLeft");v(Su,"generateCirclePoints");v(eK,"curlyBraceRight");v(la,"generateCirclePoints");v(tK,"curlyBraces");v(rK,"curvedTrapezoid");P6e=v((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),B6e=v((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),F6e=v((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");v(nK,"cylinder");v(iK,"dividedRectangle");v(aK,"doublecircle");v(sK,"filledCircle");v(oK,"flippedTriangle");v(lK,"forkJoin");v(cK,"halfRoundedRectangle");z6e=v((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");v(uK,"hexagon");v(hK,"hourglass");v(fK,"icon");v(dK,"iconCircle");v(pK,"iconRounded");v(gK,"iconSquare");v(mK,"imageSquare");v(vK,"inv_trapezoid");v(o5,"drawRect");v(yK,"labelRect");v(xK,"lean_left");v(bK,"lean_right");v(wK,"lightningBolt");$6e=v((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),G6e=v((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),U6e=v((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");v(kK,"linedCylinder");v(TK,"linedWaveEdgedRect");v(EK,"multiRect");v(SK,"multiWaveEdgedRectangle");v(CK,"note");V6e=v((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");v(AK,"question");v(_K,"rect_left_inv_arrow");v(LK,"rectWithTitle");v(RK,"roundedRect");v(NK,"shadedProcess");v(IK,"slopedRect");v(MK,"squareRect");v(DK,"stadium");v(OK,"state");v(PK,"stateEnd");v(BK,"stateStart");v(FK,"subroutine");v(zK,"taggedRect");v($K,"taggedWaveEdgedRectangle");v(GK,"text");W6e=v((t,e,r,n,i,a)=>`M${t},${e} a${i},${a} 0,0,1 0,${-n} l${r},0 a${i},${a} 0,0,1 0,${n} M${r},${-n} a${i},${a} 0,0,0 0,${n} l${-r},0`,"createCylinderPathD"),H6e=v((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),q6e=v((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");v(UK,"tiltedCylinder");v(VK,"trapezoid");v(WK,"trapezoidalPentagon");v(HK,"triangle");v(qK,"waveEdgedRectangle");v(YK,"waveRectangle");v(XK,"windowPane");v(jK,"textHelper");v(Qv,"addText");v(KK,"classBox");Y6e=v(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");v(ZK,"kanbanItem");X6e=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:MK},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:RK},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:DK},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:FK},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:nK},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:Kj},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:AK},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:uK},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:bK},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:xK},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:VK},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:vK},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:aK},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:GK},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:Xj},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:NK},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:BK},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:PK},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:lK},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:hK},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:Jj},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:eK},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:tK},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:wK},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:qK},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:cK},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:UK},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:kK},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:rK},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:iK},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:HK},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:XK},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:sK},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:WK},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:oK},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:IK},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:SK},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:EK},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:Yj},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:Qj},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:$K},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:zK},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:YK},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:_K},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:TK}],j6e=v(()=>{let e=[...Object.entries({state:OK,choice:jj,note:CK,rectWithTitle:LK,labelRect:yK,iconSquare:gK,iconCircle:dK,icon:fK,iconRounded:pK,imageSquare:mK,anchor:qj,kanbanItem:ZK,classBox:KK}),...X6e.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),QK=j6e();v(WA,"isValidShape");l5=new Map;v(wd,"insertNode");JK=v((t,e)=>{l5.set(e.id,t)},"setNodeElem"),eZ=v(()=>{l5.clear()},"clear"),Jv=v(t=>{let e=l5.get(t.id);re.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function ey(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Pn(t),e=Pn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,o=a-n;return{angle:Math.atan(o/s),deltaX:s,deltaY:o}}var No,Pn,c5,pc=F(()=>{or();No={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};v(ey,"calculateDeltaAndAngle");Pn=v(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),c5=v(t=>({x:v(function(e,r,n){let i=0,a=Pn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(No,t.arrowTypeEnd)){let{angle:p,deltaX:g}=ey(n[n.length-1],n[n.length-2]);i=No[t.arrowTypeEnd]*Math.cos(p)*(g>=0?1:-1)}let s=Math.abs(Pn(e).x-Pn(n[n.length-1]).x),o=Math.abs(Pn(e).y-Pn(n[n.length-1]).y),l=Math.abs(Pn(e).x-Pn(n[0]).x),u=Math.abs(Pn(e).y-Pn(n[0]).y),h=No[t.arrowTypeStart],f=No[t.arrowTypeEnd],d=1;if(s0&&o0&&u=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(No,t.arrowTypeEnd)){let{angle:p,deltaY:g}=ey(n[n.length-1],n[n.length-2]);i=No[t.arrowTypeEnd]*Math.abs(Math.sin(p))*(g>=0?1:-1)}let s=Math.abs(Pn(e).y-Pn(n[n.length-1]).y),o=Math.abs(Pn(e).x-Pn(n[n.length-1]).x),l=Math.abs(Pn(e).y-Pn(n[0]).y),u=Math.abs(Pn(e).x-Pn(n[0]).x),h=No[t.arrowTypeStart],f=No[t.arrowTypeEnd],d=1;if(s0&&o0&&u5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}var K6e,Z6e,tZ,u5,ca,iZ,ty,h5,f5,Q6e,J6e,rZ,nZ,eEe,d5,tEe,rEe,nEe,iEe,aEe,sEe,oEe,lEe,cEe,uEe,hEe,p5,_u=F(()=>{yl();pc();bo();Ya();kn();or();lr();$t();K6e=v((t,e,r,n,i)=>{e.arrowTypeStart&&tZ(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&tZ(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),Z6e={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},tZ=v((t,e,r,n,i,a)=>{let s=Z6e[r];if(!s){re.warn(`Unknown arrow type: ${r}`);return}let o=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${o})`)},"addEdgeMarker"),u5=new Map,ca=new Map,iZ=v(()=>{u5.clear(),ca.clear()},"clear"),ty=v(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),h5=v(async(t,e)=>{let r=Wr(pe().flowchart.htmlLabels),n=await oa(t,e.label,{style:ty(e.labelStyle),useHtmlLabels:r,addSvgBackground:!0,isNode:!1});re.info("abc82",e,e.labelType);let i=t.insert("g").attr("class","edgeLabel"),a=i.insert("g").attr("class","label");a.node().appendChild(n);let s=n.getBBox();if(r){let l=n.children[0],u=Ve(n);s=l.getBoundingClientRect(),u.attr("width",s.width),u.attr("height",s.height)}a.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),u5.set(e.id,i),e.width=s.width,e.height=s.height;let o;if(e.startLabelLeft){let l=await Ph(e.startLabelLeft,ty(e.labelStyle)),u=t.insert("g").attr("class","edgeTerminals"),h=u.insert("g").attr("class","inner");o=h.node().appendChild(l);let f=l.getBBox();h.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),ca.get(e.id)||ca.set(e.id,{}),ca.get(e.id).startLeft=u,ry(o,e.startLabelLeft)}if(e.startLabelRight){let l=await Ph(e.startLabelRight,ty(e.labelStyle)),u=t.insert("g").attr("class","edgeTerminals"),h=u.insert("g").attr("class","inner");o=u.node().appendChild(l),h.node().appendChild(l);let f=l.getBBox();h.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),ca.get(e.id)||ca.set(e.id,{}),ca.get(e.id).startRight=u,ry(o,e.startLabelRight)}if(e.endLabelLeft){let l=await Ph(e.endLabelLeft,ty(e.labelStyle)),u=t.insert("g").attr("class","edgeTerminals"),h=u.insert("g").attr("class","inner");o=h.node().appendChild(l);let f=l.getBBox();h.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),u.node().appendChild(l),ca.get(e.id)||ca.set(e.id,{}),ca.get(e.id).endLeft=u,ry(o,e.endLabelLeft)}if(e.endLabelRight){let l=await Ph(e.endLabelRight,ty(e.labelStyle)),u=t.insert("g").attr("class","edgeTerminals"),h=u.insert("g").attr("class","inner");o=h.node().appendChild(l);let f=l.getBBox();h.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),u.node().appendChild(l),ca.get(e.id)||ca.set(e.id,{}),ca.get(e.id).endRight=u,ry(o,e.endLabelRight)}return n},"insertEdgeLabel");v(ry,"setTerminalWidth");f5=v((t,e)=>{re.debug("Moving label abc88 ",t.id,t.label,u5.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=pe(),{subGraphTitleTotalMargin:i}=ou(n);if(t.label){let a=u5.get(t.id),s=t.x,o=t.y;if(r){let l=Ut.calcLabelPosition(r);re.debug("Moving label "+t.label+" from (",s,",",o,") to (",l.x,",",l.y,") abc88"),e.updatedPath&&(s=l.x,o=l.y)}a.attr("transform",`translate(${s}, ${o+i/2})`)}if(t.startLabelLeft){let a=ca.get(t.id).startLeft,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.startLabelRight){let a=ca.get(t.id).startRight,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.endLabelLeft){let a=ca.get(t.id).endLeft,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.endLabelRight){let a=ca.get(t.id).endRight,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}},"positionEdgeLabel"),Q6e=v((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,o=t.height/2;return i>=s||a>=o},"outsideNode"),J6e=v((t,e,r)=>{re.debug(`intersection calc abc89: outsidePoint: ${JSON.stringify(e)} insidePoint : ${JSON.stringify(r)} node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,o=r.xMath.abs(n-e.x)*l){let f=r.y{re.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(re.info("abc88 checking point",a,e),!Q6e(e,a)&&!i){let s=J6e(e,n,a);re.debug("abc88 inside",a,n,s),re.debug("abc88 intersection",s,e);let o=!1;r.forEach(l=>{o=o||l.x===s.x&&l.y===s.y}),r.some(l=>l.x===s.x&&l.y===s.y)?re.warn("abc88 no intersect",s,r):r.push(s),i=!0}else re.warn("abc88 outside",a,n),n=a,i||r.push(a)}),re.debug("returning points",r),r},"cutPathAtIntersect");v(aZ,"extractCornerPoints");nZ=v(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),eEe=v(function(t){let{cornerPointPositions:e}=aZ(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){re.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let p=5;s.x===o.x?d={x:u<0?o.x-p+f:o.x+p-f,y:h<0?o.y-f:o.y+f}:d={x:u<0?o.x-f:o.x+f,y:h<0?o.y-p+f:o.y+p-f}}else re.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(d,l)}else r.push(t[n]);return r},"fixCorners"),d5=v(function(t,e,r,n,i,a,s){let{handDrawnSeed:o}=pe(),l=e.points,u=!1,h=i;var f=a;f.intersect&&h.intersect&&(l=l.slice(1,e.points.length-1),l.unshift(h.intersect(l[0])),re.debug("Last point APA12",e.start,"-->",e.end,l[l.length-1],f,f.intersect(l[l.length-1])),l.push(f.intersect(l[l.length-1]))),e.toCluster&&(re.info("to cluster abc88",r.get(e.toCluster)),l=rZ(e.points,r.get(e.toCluster).node),u=!0),e.fromCluster&&(re.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(l,null,2)),l=rZ(l.reverse(),r.get(e.fromCluster).node).reverse(),u=!0);let d=l.filter(L=>!Number.isNaN(L.y));d=eEe(d);let p=gl;e.curve&&(p=e.curve);let{x:g,y:m}=c5(e),y=ms().x(g).y(m).curve(p),x;switch(e.thickness){case"normal":x="edge-thickness-normal";break;case"thick":x="edge-thickness-thick";break;case"invisible":x="edge-thickness-invisible";break;default:x="edge-thickness-normal"}switch(e.pattern){case"solid":x+=" edge-pattern-solid";break;case"dotted":x+=" edge-pattern-dotted";break;case"dashed":x+=" edge-pattern-dashed";break;default:x+=" edge-pattern-solid"}let b,w=y(d),_=Array.isArray(e.style)?e.style:[e.style];if(e.look==="handDrawn"){let L=Ye.svg(t);Object.assign([],d);let S=L.path(w,{roughness:.3,seed:o});x+=" transition",b=Ve(S).select("path").attr("id",e.id).attr("class"," "+x+(e.classes?" "+e.classes:"")).attr("style",_?_.reduce((M,R)=>M+";"+R,""):"");let C=b.attr("d");b.attr("d",C),t.node().appendChild(b.node())}else b=t.append("path").attr("d",w).attr("id",e.id).attr("class"," "+x+(e.classes?" "+e.classes:"")).attr("style",_?_.reduce((L,S)=>L+";"+S,""):"");let k="";(pe().flowchart.arrowMarkerAbsolute||pe().state.arrowMarkerAbsolute)&&(k=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,k=k.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),re.info("arrowTypeStart",e.arrowTypeStart),re.info("arrowTypeEnd",e.arrowTypeEnd),K6e(b,e,k,s,n);let E={};return u&&(E.updatedPath=l),E.originalPath=e.points,E},"insertEdge"),tEe=v((t,e,r,n)=>{e.forEach(i=>{hEe[i](t,r,n)})},"insertMarkers"),rEe=v((t,e,r)=>{re.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),nEe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),iEe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),aEe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),sEe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),oEe=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),lEe=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),cEe=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),uEe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),hEe={extension:rEe,composition:nEe,aggregation:iEe,dependency:aEe,lollipop:sEe,point:oEe,circle:lEe,cross:cEe,barb:uEe},p5=tEe});function dEe(t){return typeof t=="symbol"||qn(t)&&sa(t)==fEe}var fEe,Zs,kd=F(()=>{yu();So();fEe="[object Symbol]";Zs=dEe});function pEe(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{Ts=pEe});function lZ(t){if(typeof t=="string")return t;if(Et(t))return Ts(t,lZ)+"";if(Zs(t))return oZ?oZ.call(t):"";var e=t+"";return e=="0"&&1/t==-gEe?"-0":e}var gEe,sZ,oZ,cZ,uZ=F(()=>{hd();Td();On();kd();gEe=1/0,sZ=Hi?Hi.prototype:void 0,oZ=sZ?sZ.toString:void 0;cZ=lZ});function vEe(t){for(var e=t.length;e--&&mEe.test(t.charAt(e)););return e}var mEe,hZ,fZ=F(()=>{mEe=/\s/;hZ=vEe});function xEe(t){return t&&t.slice(0,hZ(t)+1).replace(yEe,"")}var yEe,dZ,pZ=F(()=>{fZ();yEe=/^\s+/;dZ=xEe});function EEe(t){if(typeof t=="number")return t;if(Zs(t))return gZ;if(dn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=dn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=dZ(t);var r=wEe.test(t);return r||kEe.test(t)?TEe(t.slice(2),r?2:8):bEe.test(t)?gZ:+t}var gZ,bEe,wEe,kEe,TEe,mZ,vZ=F(()=>{pZ();qs();kd();gZ=NaN,bEe=/^[-+]0x[0-9a-f]+$/i,wEe=/^0b[01]+$/i,kEe=/^0o[0-7]+$/i,TEe=parseInt;mZ=EEe});function CEe(t){if(!t)return t===0?t:0;if(t=mZ(t),t===yZ||t===-yZ){var e=t<0?-1:1;return e*SEe}return t===t?t:0}var yZ,SEe,rg,HA=F(()=>{vZ();yZ=1/0,SEe=17976931348623157e292;rg=CEe});function AEe(t){var e=rg(t),r=e%1;return e===e?r?e-r:e:0}var gc,ng=F(()=>{HA();gc=AEe});var _Ee,g5,xZ=F(()=>{Sh();To();_Ee=vs(Qn,"WeakMap"),g5=_Ee});function LEe(){}var Yn,qA=F(()=>{Yn=LEe});function REe(t,e){for(var r=-1,n=t==null?0:t.length;++r{m5=REe});function NEe(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{v5=NEe});function IEe(t){return t!==t}var bZ,wZ=F(()=>{bZ=IEe});function MEe(t,e,r){for(var n=r-1,i=t.length;++n{kZ=MEe});function DEe(t,e,r){return e===e?kZ(t,e,r):v5(t,bZ,r)}var ig,y5=F(()=>{XA();wZ();TZ();ig=DEe});function OEe(t,e){var r=t==null?0:t.length;return!!r&&ig(t,e,0)>-1}var x5,jA=F(()=>{y5();x5=OEe});var PEe,EZ,SZ=F(()=>{Y8();PEe=R3(Object.keys,Object),EZ=PEe});function zEe(t){if(!hc(t))return EZ(t);var e=[];for(var r in Object(t))FEe.call(t,r)&&r!="constructor"&&e.push(r);return e}var BEe,FEe,ag,b5=F(()=>{Up();SZ();BEe=Object.prototype,FEe=BEe.hasOwnProperty;ag=zEe});function $Ee(t){return Jn(t)?O3(t):ag(t)}var Nr,mc=F(()=>{Q8();b5();Co();Nr=$Ee});var GEe,UEe,VEe,ua,CZ=F(()=>{qp();md();rA();Co();Up();mc();GEe=Object.prototype,UEe=GEe.hasOwnProperty,VEe=F3(function(t,e){if(hc(e)||Jn(e)){Lo(e,Nr(e),t);return}for(var r in e)UEe.call(e,r)&&fc(t,r,e[r])}),ua=VEe});function qEe(t,e){if(Et(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Zs(t)?!0:HEe.test(t)||!WEe.test(t)||e!=null&&t in Object(e)}var WEe,HEe,sg,w5=F(()=>{On();kd();WEe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,HEe=/^\w*$/;sg=qEe});function XEe(t){var e=Dp(t,function(n){return r.size===YEe&&r.clear(),n}),r=e.cache;return e}var YEe,AZ,_Z=F(()=>{$8();YEe=500;AZ=XEe});var jEe,KEe,ZEe,LZ,RZ=F(()=>{_Z();jEe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,KEe=/\\(\\)?/g,ZEe=AZ(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(jEe,function(r,n,i,a){e.push(i?a.replace(KEe,"$1"):n||r)}),e}),LZ=ZEe});function QEe(t){return t==null?"":cZ(t)}var k5,KA=F(()=>{uZ();k5=QEe});function JEe(t,e){return Et(t)?t:sg(t,e)?[t]:LZ(k5(t))}var Bh,ny=F(()=>{On();w5();RZ();KA();Bh=JEe});function tSe(t){if(typeof t=="string"||Zs(t))return t;var e=t+"";return e=="0"&&1/t==-eSe?"-0":e}var eSe,vc,og=F(()=>{kd();eSe=1/0;vc=tSe});function rSe(t,e){e=Bh(e,t);for(var r=0,n=e.length;t!=null&&r{ny();og();Fh=rSe});function nSe(t,e,r){var n=t==null?void 0:Fh(t,e);return n===void 0?r:n}var NZ,IZ=F(()=>{iy();NZ=nSe});function iSe(t,e){for(var r=-1,n=e.length,i=t.length;++r{lg=iSe});function aSe(t){return Et(t)||ml(t)||!!(MZ&&t&&t[MZ])}var MZ,DZ,OZ=F(()=>{hd();Vp();On();MZ=Hi?Hi.isConcatSpreadable:void 0;DZ=aSe});function PZ(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=DZ),i||(i=[]);++a0&&r(o)?e>1?PZ(o,e-1,r,n,i):lg(i,o):n||(i[i.length]=o)}return i}var yc,cg=F(()=>{T5();OZ();yc=PZ});function sSe(t){var e=t==null?0:t.length;return e?yc(t,1):[]}var Br,E5=F(()=>{cg();Br=sSe});function oSe(t){return B3(P3(t,void 0,Br),t+"")}var BZ,FZ=F(()=>{E5();J8();tA();BZ=oSe});function lSe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{S5=lSe});function vSe(t){return mSe.test(t)}var cSe,uSe,hSe,fSe,dSe,pSe,gSe,mSe,zZ,$Z=F(()=>{cSe="\\ud800-\\udfff",uSe="\\u0300-\\u036f",hSe="\\ufe20-\\ufe2f",fSe="\\u20d0-\\u20ff",dSe=uSe+hSe+fSe,pSe="\\ufe0e\\ufe0f",gSe="\\u200d",mSe=RegExp("["+gSe+cSe+dSe+pSe+"]");zZ=vSe});function ySe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{GZ=ySe});function xSe(t,e){return t&&Lo(e,Nr(e),t)}var VZ,WZ=F(()=>{md();mc();VZ=xSe});function bSe(t,e){return t&&Lo(e,ys(e),t)}var HZ,qZ=F(()=>{md();Ih();HZ=bSe});function wSe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{ug=wSe});function kSe(){return[]}var A5,QA=F(()=>{A5=kSe});var TSe,ESe,YZ,SSe,hg,_5=F(()=>{C5();QA();TSe=Object.prototype,ESe=TSe.propertyIsEnumerable,YZ=Object.getOwnPropertySymbols,SSe=YZ?function(t){return t==null?[]:(t=Object(t),ug(YZ(t),function(e){return ESe.call(t,e)}))}:A5,hg=SSe});function CSe(t,e){return Lo(t,hg(t),e)}var XZ,jZ=F(()=>{md();_5();XZ=CSe});var ASe,_Se,L5,JA=F(()=>{T5();N3();_5();QA();ASe=Object.getOwnPropertySymbols,_Se=ASe?function(t){for(var e=[];t;)lg(e,hg(t)),t=Gp(t);return e}:A5,L5=_Se});function LSe(t,e){return Lo(t,L5(t),e)}var KZ,ZZ=F(()=>{md();JA();KZ=LSe});function RSe(t,e,r){var n=e(t);return Et(t)?n:lg(n,r(t))}var R5,e_=F(()=>{T5();On();R5=RSe});function NSe(t){return R5(t,Nr,hg)}var ay,t_=F(()=>{e_();_5();mc();ay=NSe});function ISe(t){return R5(t,ys,L5)}var N5,r_=F(()=>{e_();JA();Ih();N5=ISe});var MSe,I5,QZ=F(()=>{Sh();To();MSe=vs(Qn,"DataView"),I5=MSe});var DSe,M5,JZ=F(()=>{Sh();To();DSe=vs(Qn,"Promise"),M5=DSe});var OSe,zh,n_=F(()=>{Sh();To();OSe=vs(Qn,"Set"),zh=OSe});var eQ,PSe,tQ,rQ,nQ,iQ,BSe,FSe,zSe,$Se,GSe,Ed,Qs,Sd=F(()=>{QZ();T3();JZ();n_();xZ();yu();B8();eQ="[object Map]",PSe="[object Object]",tQ="[object Promise]",rQ="[object Set]",nQ="[object WeakMap]",iQ="[object DataView]",BSe=xu(I5),FSe=xu(_h),zSe=xu(M5),$Se=xu(zh),GSe=xu(g5),Ed=sa;(I5&&Ed(new I5(new ArrayBuffer(1)))!=iQ||_h&&Ed(new _h)!=eQ||M5&&Ed(M5.resolve())!=tQ||zh&&Ed(new zh)!=rQ||g5&&Ed(new g5)!=nQ)&&(Ed=function(t){var e=sa(t),r=e==PSe?t.constructor:void 0,n=r?xu(r):"";if(n)switch(n){case BSe:return iQ;case FSe:return eQ;case zSe:return tQ;case $Se:return rQ;case GSe:return nQ}return e});Qs=Ed});function WSe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&VSe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var USe,VSe,aQ,sQ=F(()=>{USe=Object.prototype,VSe=USe.hasOwnProperty;aQ=WSe});function HSe(t,e){var r=e?$p(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var oQ,lQ=F(()=>{A3();oQ=HSe});function YSe(t){var e=new t.constructor(t.source,qSe.exec(t));return e.lastIndex=t.lastIndex,e}var qSe,cQ,uQ=F(()=>{qSe=/\w*$/;cQ=YSe});function XSe(t){return fQ?Object(fQ.call(t)):{}}var hQ,fQ,dQ,pQ=F(()=>{hd();hQ=Hi?Hi.prototype:void 0,fQ=hQ?hQ.valueOf:void 0;dQ=XSe});function pCe(t,e,r){var n=t.constructor;switch(e){case nCe:return $p(t);case jSe:case KSe:return new n(+t);case iCe:return oQ(t,r);case aCe:case sCe:case oCe:case lCe:case cCe:case uCe:case hCe:case fCe:case dCe:return _3(t,r);case ZSe:return new n;case QSe:case tCe:return new n(t);case JSe:return cQ(t);case eCe:return new n;case rCe:return dQ(t)}}var jSe,KSe,ZSe,QSe,JSe,eCe,tCe,rCe,nCe,iCe,aCe,sCe,oCe,lCe,cCe,uCe,hCe,fCe,dCe,gQ,mQ=F(()=>{A3();lQ();uQ();pQ();H8();jSe="[object Boolean]",KSe="[object Date]",ZSe="[object Map]",QSe="[object Number]",JSe="[object RegExp]",eCe="[object Set]",tCe="[object String]",rCe="[object Symbol]",nCe="[object ArrayBuffer]",iCe="[object DataView]",aCe="[object Float32Array]",sCe="[object Float64Array]",oCe="[object Int8Array]",lCe="[object Int16Array]",cCe="[object Int32Array]",uCe="[object Uint8Array]",hCe="[object Uint8ClampedArray]",fCe="[object Uint16Array]",dCe="[object Uint32Array]";gQ=pCe});function mCe(t){return qn(t)&&Qs(t)==gCe}var gCe,vQ,yQ=F(()=>{Sd();So();gCe="[object Map]";vQ=mCe});var xQ,vCe,bQ,wQ=F(()=>{yQ();gd();Bv();xQ=_o&&_o.isMap,vCe=xQ?Ao(xQ):vQ,bQ=vCe});function xCe(t){return qn(t)&&Qs(t)==yCe}var yCe,kQ,TQ=F(()=>{Sd();So();yCe="[object Set]";kQ=xCe});var EQ,bCe,SQ,CQ=F(()=>{TQ();gd();Bv();EQ=_o&&_o.isSet,bCe=EQ?Ao(EQ):kQ,SQ=bCe});function D5(t,e,r,n,i,a){var s,o=e&wCe,l=e&kCe,u=e&TCe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!dn(t))return t;var h=Et(t);if(h){if(s=aQ(t),!o)return L3(t,s)}else{var f=Qs(t),d=f==_Q||f==_Ce;if(vl(t))return C3(t,o);if(f==LQ||f==AQ||d&&!i){if(s=l||d?{}:I3(t),!o)return l?KZ(t,HZ(s,t)):XZ(t,VZ(s,t))}else{if(!Tn[f])return i?t:{};s=gQ(t,f,o)}}a||(a=new cc);var p=a.get(t);if(p)return p;a.set(t,s),SQ(t)?t.forEach(function(y){s.add(D5(y,e,r,y,t,a))}):bQ(t)&&t.forEach(function(y,x){s.set(x,D5(y,e,r,x,t,a))});var g=u?l?N5:ay:l?ys:Nr,m=h?void 0:g(t);return m5(m||t,function(y,x){m&&(x=y,y=t[x]),fc(s,x,D5(y,e,r,x,t,a))}),s}var wCe,kCe,TCe,AQ,ECe,SCe,CCe,ACe,_Q,_Ce,LCe,RCe,LQ,NCe,ICe,MCe,DCe,OCe,PCe,BCe,FCe,zCe,$Ce,GCe,UCe,VCe,WCe,HCe,qCe,Tn,O5,i_=F(()=>{Dv();YA();qp();WZ();qZ();V8();q8();jZ();ZZ();t_();r_();Sd();sQ();mQ();X8();On();Hp();wQ();qs();CQ();mc();Ih();wCe=1,kCe=2,TCe=4,AQ="[object Arguments]",ECe="[object Array]",SCe="[object Boolean]",CCe="[object Date]",ACe="[object Error]",_Q="[object Function]",_Ce="[object GeneratorFunction]",LCe="[object Map]",RCe="[object Number]",LQ="[object Object]",NCe="[object RegExp]",ICe="[object Set]",MCe="[object String]",DCe="[object Symbol]",OCe="[object WeakMap]",PCe="[object ArrayBuffer]",BCe="[object DataView]",FCe="[object Float32Array]",zCe="[object Float64Array]",$Ce="[object Int8Array]",GCe="[object Int16Array]",UCe="[object Int32Array]",VCe="[object Uint8Array]",WCe="[object Uint8ClampedArray]",HCe="[object Uint16Array]",qCe="[object Uint32Array]",Tn={};Tn[AQ]=Tn[ECe]=Tn[PCe]=Tn[BCe]=Tn[SCe]=Tn[CCe]=Tn[FCe]=Tn[zCe]=Tn[$Ce]=Tn[GCe]=Tn[UCe]=Tn[LCe]=Tn[RCe]=Tn[LQ]=Tn[NCe]=Tn[ICe]=Tn[MCe]=Tn[DCe]=Tn[VCe]=Tn[WCe]=Tn[HCe]=Tn[qCe]=!0;Tn[ACe]=Tn[_Q]=Tn[OCe]=!1;O5=D5});function XCe(t){return O5(t,YCe)}var YCe,jr,a_=F(()=>{i_();YCe=4;jr=XCe});function ZCe(t){return O5(t,jCe|KCe)}var jCe,KCe,s_,RQ=F(()=>{i_();jCe=1,KCe=4;s_=ZCe});function QCe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{xc=QCe});function e7e(t){return this.__data__.set(t,JCe),this}var JCe,IQ,MQ=F(()=>{JCe="__lodash_hash_undefined__";IQ=e7e});function t7e(t){return this.__data__.has(t)}var DQ,OQ=F(()=>{DQ=t7e});function P5(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new dd;++e{E3();MQ();OQ();P5.prototype.add=P5.prototype.push=IQ;P5.prototype.has=DQ;fg=P5});function r7e(t,e){for(var r=-1,n=t==null?0:t.length;++r{F5=r7e});function n7e(t,e){return t.has(e)}var dg,z5=F(()=>{dg=n7e});function s7e(t,e,r,n,i,a){var s=r&i7e,o=t.length,l=e.length;if(o!=l&&!(s&&l>o))return!1;var u=a.get(t),h=a.get(e);if(u&&h)return u==e&&h==t;var f=-1,d=!0,p=r&a7e?new fg:void 0;for(a.set(t,e),a.set(e,t);++f{B5();o_();z5();i7e=1,a7e=2;$5=s7e});function o7e(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var PQ,BQ=F(()=>{PQ=o7e});function l7e(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var pg,G5=F(()=>{pg=l7e});function k7e(t,e,r,n,i,a,s){switch(r){case w7e:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case b7e:return!(t.byteLength!=e.byteLength||!a(new zp(t),new zp(e)));case h7e:case f7e:case g7e:return Eo(+t,+e);case d7e:return t.name==e.name&&t.message==e.message;case m7e:case y7e:return t==e+"";case p7e:var o=PQ;case v7e:var l=n&c7e;if(o||(o=pg),t.size!=e.size&&!l)return!1;var u=s.get(t);if(u)return u==e;n|=u7e,s.set(t,e);var h=$5(o(t),o(e),n,i,a,s);return s.delete(t),h;case x7e:if(c_)return c_.call(t)==c_.call(e)}return!1}var c7e,u7e,h7e,f7e,d7e,p7e,g7e,m7e,v7e,y7e,x7e,b7e,w7e,FQ,c_,zQ,$Q=F(()=>{hd();W8();fd();l_();BQ();G5();c7e=1,u7e=2,h7e="[object Boolean]",f7e="[object Date]",d7e="[object Error]",p7e="[object Map]",g7e="[object Number]",m7e="[object RegExp]",v7e="[object Set]",y7e="[object String]",x7e="[object Symbol]",b7e="[object ArrayBuffer]",w7e="[object DataView]",FQ=Hi?Hi.prototype:void 0,c_=FQ?FQ.valueOf:void 0;zQ=k7e});function C7e(t,e,r,n,i,a){var s=r&T7e,o=ay(t),l=o.length,u=ay(e),h=u.length;if(l!=h&&!s)return!1;for(var f=l;f--;){var d=o[f];if(!(s?d in e:S7e.call(e,d)))return!1}var p=a.get(t),g=a.get(e);if(p&&g)return p==e&&g==t;var m=!0;a.set(t,e),a.set(e,t);for(var y=s;++f{t_();T7e=1,E7e=Object.prototype,S7e=E7e.hasOwnProperty;GQ=C7e});function L7e(t,e,r,n,i,a){var s=Et(t),o=Et(e),l=s?WQ:Qs(t),u=o?WQ:Qs(e);l=l==VQ?U5:l,u=u==VQ?U5:u;var h=l==U5,f=u==U5,d=l==u;if(d&&vl(t)){if(!vl(e))return!1;s=!0,h=!1}if(d&&!h)return a||(a=new cc),s||Rh(t)?$5(t,e,r,n,i,a):zQ(t,e,l,r,n,i,a);if(!(r&A7e)){var p=h&&HQ.call(t,"__wrapped__"),g=f&&HQ.call(e,"__wrapped__");if(p||g){var m=p?t.value():t,y=g?e.value():e;return a||(a=new cc),i(m,y,r,n,a)}}return d?(a||(a=new cc),GQ(t,e,r,n,i,a)):!1}var A7e,VQ,WQ,U5,_7e,HQ,qQ,YQ=F(()=>{Dv();l_();$Q();UQ();Sd();On();Hp();Fv();A7e=1,VQ="[object Arguments]",WQ="[object Array]",U5="[object Object]",_7e=Object.prototype,HQ=_7e.hasOwnProperty;qQ=L7e});function XQ(t,e,r,n,i){return t===e?!0:t==null||e==null||!qn(t)&&!qn(e)?t!==t&&e!==e:qQ(t,e,r,n,XQ,i)}var V5,u_=F(()=>{YQ();So();V5=XQ});function I7e(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var o=r[i];if(s&&o[2]?o[1]!==t[o[0]]:!(o[0]in t))return!1}for(;++i{Dv();u_();R7e=1,N7e=2;jQ=I7e});function M7e(t){return t===t&&!dn(t)}var W5,h_=F(()=>{qs();W5=M7e});function D7e(t){for(var e=Nr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,W5(i)]}return e}var ZQ,QQ=F(()=>{h_();mc();ZQ=D7e});function O7e(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var H5,f_=F(()=>{H5=O7e});function P7e(t){var e=ZQ(t);return e.length==1&&e[0][2]?H5(e[0][0],e[0][1]):function(r){return r===t||jQ(r,t,e)}}var JQ,eJ=F(()=>{KQ();QQ();f_();JQ=P7e});function B7e(t,e){return t!=null&&e in Object(t)}var tJ,rJ=F(()=>{tJ=B7e});function F7e(t,e,r){e=Bh(e,t);for(var n=-1,i=e.length,a=!1;++n{ny();Vp();On();$v();M3();og();q5=F7e});function z7e(t,e){return t!=null&&q5(t,e,tJ)}var Y5,p_=F(()=>{rJ();d_();Y5=z7e});function U7e(t,e){return sg(t)&&W5(e)?H5(vc(t),e):function(r){var n=NZ(r,t);return n===void 0&&n===e?Y5(r,t):V5(e,n,$7e|G7e)}}var $7e,G7e,nJ,iJ=F(()=>{u_();IZ();p_();w5();h_();f_();og();$7e=1,G7e=2;nJ=U7e});function V7e(t){return function(e){return e?.[t]}}var X5,g_=F(()=>{X5=V7e});function W7e(t){return function(e){return Fh(e,t)}}var aJ,sJ=F(()=>{iy();aJ=W7e});function H7e(t){return sg(t)?X5(vc(t)):aJ(t)}var oJ,lJ=F(()=>{g_();sJ();w5();og();oJ=H7e});function q7e(t){return typeof t=="function"?t:t==null?qi:typeof t=="object"?Et(t)?nJ(t[0],t[1]):JQ(t):oJ(t)}var on,Xa=F(()=>{eJ();iJ();wu();On();lJ();on=q7e});function Y7e(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{cJ=Y7e});function X7e(t,e){return t&&Fp(t,e,Nr)}var gg,j5=F(()=>{S3();mc();gg=X7e});function j7e(t,e){return function(r,n){if(r==null)return r;if(!Jn(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{Co();hJ=j7e});var K7e,Es,$h=F(()=>{j5();fJ();K7e=hJ(gg),Es=K7e});function Z7e(t,e,r,n){return Es(t,function(i,a,s){e(n,i,r(i),s)}),n}var dJ,pJ=F(()=>{$h();dJ=Z7e});function Q7e(t,e){return function(r,n){var i=Et(r)?cJ:dJ,a=e?e():{};return i(r,t,on(n,2),a)}}var gJ,mJ=F(()=>{uJ();pJ();Xa();On();gJ=Q7e});var J7e,K5,vJ=F(()=>{To();J7e=function(){return Qn.Date.now()},K5=J7e});var yJ,e8e,t8e,Gh,xJ=F(()=>{Yp();fd();vd();Ih();yJ=Object.prototype,e8e=yJ.hasOwnProperty,t8e=dc(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&Ys(e[0],e[1],i)&&(n=1);++r{Z5=r8e});function i8e(t,e,r,n){var i=-1,a=x5,s=!0,o=t.length,l=[],u=e.length;if(!o)return l;r&&(e=Ts(e,Ao(r))),n?(a=Z5,s=!1):e.length>=n8e&&(a=dg,s=!1,e=new fg(e));e:for(;++i{B5();jA();m_();Td();gd();z5();n8e=200;bJ=i8e});var a8e,Uh,kJ=F(()=>{wJ();cg();Yp();D3();a8e=dc(function(t,e){return pd(t)?bJ(t,yc(e,1,pd,!0)):[]}),Uh=a8e});function s8e(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ha,TJ=F(()=>{ha=s8e});function o8e(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:gc(e),S5(t,e<0?0:e,n)):[]}var li,EJ=F(()=>{ZA();ng();li=o8e});function l8e(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:gc(e),e=n-e,S5(t,0,e<0?0:e)):[]}var Lu,SJ=F(()=>{ZA();ng();Lu=l8e});function c8e(t){return typeof t=="function"?t:qi}var mg,Q5=F(()=>{wu();mg=c8e});function u8e(t,e){var r=Et(t)?m5:Es;return r(t,mg(e))}var Te,J5=F(()=>{YA();$h();Q5();On();Te=u8e});var CJ=F(()=>{J5()});function h8e(t,e){for(var r=-1,n=t==null?0:t.length;++r{AJ=h8e});function f8e(t,e){var r=!0;return Es(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var LJ,RJ=F(()=>{$h();LJ=f8e});function d8e(t,e,r){var n=Et(t)?AJ:LJ;return r&&Ys(t,e,r)&&(e=void 0),n(t,on(e,3))}var _a,NJ=F(()=>{_J();RJ();Xa();On();vd();_a=d8e});function p8e(t,e){var r=[];return Es(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var ew,v_=F(()=>{$h();ew=p8e});function g8e(t,e){var r=Et(t)?ug:ew;return r(t,on(e,3))}var Fr,y_=F(()=>{C5();v_();Xa();On();Fr=g8e});function m8e(t){return function(e,r,n){var i=Object(e);if(!Jn(e)){var a=on(r,3);e=Nr(e),r=function(o){return a(i[o],o,i)}}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var IJ,MJ=F(()=>{Xa();Co();mc();IJ=m8e});function y8e(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:gc(r);return i<0&&(i=v8e(n+i,0)),v5(t,on(e,3),i)}var v8e,DJ,OJ=F(()=>{XA();Xa();ng();v8e=Math.max;DJ=y8e});var x8e,ja,PJ=F(()=>{MJ();OJ();x8e=IJ(DJ),ja=x8e});function b8e(t){return t&&t.length?t[0]:void 0}var Yi,BJ=F(()=>{Yi=b8e});var FJ=F(()=>{BJ()});function w8e(t,e){var r=-1,n=Jn(t)?Array(t.length):[];return Es(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var tw,x_=F(()=>{$h();Co();tw=w8e});function k8e(t,e){var r=Et(t)?Ts:tw;return r(t,on(e,3))}var je,vg=F(()=>{Td();Xa();x_();On();je=k8e});function T8e(t,e){return yc(je(t,e),1)}var fa,b_=F(()=>{cg();vg();fa=T8e});function E8e(t,e){return t==null?t:Fp(t,mg(e),ys)}var w_,zJ=F(()=>{S3();Q5();Ih();w_=E8e});function S8e(t,e){return t&&gg(t,mg(e))}var k_,$J=F(()=>{j5();Q5();k_=S8e});var C8e,A8e,_8e,T_,GJ=F(()=>{Bp();mJ();C8e=Object.prototype,A8e=C8e.hasOwnProperty,_8e=gJ(function(t,e,r){A8e.call(t,r)?t[r].push(e):uc(t,r,[e])}),T_=_8e});function L8e(t,e){return t>e}var UJ,VJ=F(()=>{UJ=L8e});function I8e(t,e){return t!=null&&N8e.call(t,e)}var R8e,N8e,WJ,HJ=F(()=>{R8e=Object.prototype,N8e=R8e.hasOwnProperty;WJ=I8e});function M8e(t,e){return t!=null&&q5(t,e,WJ)}var St,qJ=F(()=>{HJ();d_();St=M8e});function O8e(t){return typeof t=="string"||!Et(t)&&qn(t)&&sa(t)==D8e}var D8e,ci,rw=F(()=>{yu();On();So();D8e="[object String]";ci=O8e});function P8e(t,e){return Ts(e,function(r){return t[r]})}var YJ,XJ=F(()=>{Td();YJ=P8e});function B8e(t){return t==null?[]:YJ(t,Nr(t))}var fr,E_=F(()=>{XJ();mc();fr=B8e});function z8e(t,e,r,n){t=Jn(t)?t:fr(t),r=r&&!n?gc(r):0;var i=t.length;return r<0&&(r=F8e(i+r,0)),ci(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&ig(t,e,r)>-1}var F8e,Bn,jJ=F(()=>{y5();Co();rw();ng();E_();F8e=Math.max;Bn=z8e});function G8e(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:gc(r);return i<0&&(i=$8e(n+i,0)),ig(t,e,i)}var $8e,nw,KJ=F(()=>{y5();ng();$8e=Math.max;nw=G8e});function q8e(t){if(t==null)return!0;if(Jn(t)&&(Et(t)||typeof t=="string"||typeof t.splice=="function"||vl(t)||Rh(t)||ml(t)))return!t.length;var e=Qs(t);if(e==U8e||e==V8e)return!t.size;if(hc(t))return!ag(t).length;for(var r in t)if(H8e.call(t,r))return!1;return!0}var U8e,V8e,W8e,H8e,ir,iw=F(()=>{b5();Sd();Vp();On();Co();Hp();Up();Fv();U8e="[object Map]",V8e="[object Set]",W8e=Object.prototype,H8e=W8e.hasOwnProperty;ir=q8e});function X8e(t){return qn(t)&&sa(t)==Y8e}var Y8e,ZJ,QJ=F(()=>{yu();So();Y8e="[object RegExp]";ZJ=X8e});var JJ,j8e,Io,eee=F(()=>{QJ();gd();Bv();JJ=_o&&_o.isRegExp,j8e=JJ?Ao(JJ):ZJ,Io=j8e});function K8e(t){return t===void 0}var ar,tee=F(()=>{ar=K8e});function Z8e(t,e){return t{aw=Z8e});function Q8e(t,e){var r={};return e=on(e,3),gg(t,function(n,i,a){uc(r,i,e(n,i,a))}),r}var Cd,ree=F(()=>{Bp();j5();Xa();Cd=Q8e});function J8e(t,e,r){for(var n=-1,i=t.length;++n{kd();yg=J8e});function eAe(t){return t&&t.length?yg(t,qi,UJ):void 0}var Ss,nee=F(()=>{sw();VJ();wu();Ss=eAe});function tAe(t){return t&&t.length?yg(t,qi,aw):void 0}var xl,C_=F(()=>{sw();S_();wu();xl=tAe});function rAe(t,e){return t&&t.length?yg(t,on(e,2),aw):void 0}var Ad,iee=F(()=>{sw();Xa();S_();Ad=rAe});function iAe(t){if(typeof t!="function")throw new TypeError(nAe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var nAe,aee,see=F(()=>{nAe="Expected a function";aee=iAe});function aAe(t,e,r,n){if(!dn(t))return t;e=Bh(e,t);for(var i=-1,a=e.length,s=a-1,o=t;o!=null&&++i{qp();ny();$v();qs();og();oee=aAe});function sAe(t,e,r){for(var n=-1,i=e.length,a={};++n{iy();lee();ny();ow=sAe});function oAe(t,e){if(t==null)return{};var r=Ts(N5(t),function(n){return[n]});return e=on(e),ow(t,r,function(n,i){return e(n,i[0])})}var Cs,cee=F(()=>{Td();Xa();A_();r_();Cs=oAe});function lAe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var uee,hee=F(()=>{uee=lAe});function cAe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=Zs(t),s=e!==void 0,o=e===null,l=e===e,u=Zs(e);if(!o&&!u&&!a&&t>e||a&&s&&l&&!o&&!u||n&&s&&l||!r&&l||!i)return 1;if(!n&&!a&&!u&&t{kd();fee=cAe});function uAe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,o=r.length;++n=o)return l;var u=r[n];return l*(u=="desc"?-1:1)}}return t.index-e.index}var pee,gee=F(()=>{dee();pee=uAe});function hAe(t,e,r){e.length?e=Ts(e,function(a){return Et(a)?function(s){return Fh(s,a.length===1?a[0]:a)}:a}):e=[qi];var n=-1;e=Ts(e,Ao(on));var i=tw(t,function(a,s,o){var l=Ts(e,function(u){return u(a)});return{criteria:l,index:++n,value:a}});return uee(i,function(a,s){return pee(a,s,r)})}var mee,vee=F(()=>{Td();iy();Xa();x_();hee();gd();gee();wu();On();mee=hAe});var fAe,yee,xee=F(()=>{g_();fAe=X5("length"),yee=fAe});function EAe(t){for(var e=bee.lastIndex=0;bee.test(t);)++e;return e}var wee,dAe,pAe,gAe,mAe,vAe,yAe,__,L_,xAe,kee,Tee,Eee,bAe,See,Cee,wAe,kAe,TAe,bee,Aee,_ee=F(()=>{wee="\\ud800-\\udfff",dAe="\\u0300-\\u036f",pAe="\\ufe20-\\ufe2f",gAe="\\u20d0-\\u20ff",mAe=dAe+pAe+gAe,vAe="\\ufe0e\\ufe0f",yAe="["+wee+"]",__="["+mAe+"]",L_="\\ud83c[\\udffb-\\udfff]",xAe="(?:"+__+"|"+L_+")",kee="[^"+wee+"]",Tee="(?:\\ud83c[\\udde6-\\uddff]){2}",Eee="[\\ud800-\\udbff][\\udc00-\\udfff]",bAe="\\u200d",See=xAe+"?",Cee="["+vAe+"]?",wAe="(?:"+bAe+"(?:"+[kee,Tee,Eee].join("|")+")"+Cee+See+")*",kAe=Cee+See+wAe,TAe="(?:"+[kee+__+"?",__,Tee,Eee,yAe].join("|")+")",bee=RegExp(L_+"(?="+L_+")|"+TAe+kAe,"g");Aee=EAe});function SAe(t){return zZ(t)?Aee(t):yee(t)}var Lee,Ree=F(()=>{xee();$Z();_ee();Lee=SAe});function CAe(t,e){return ow(t,e,function(r,n){return Y5(t,n)})}var Nee,Iee=F(()=>{A_();p_();Nee=CAe});var AAe,_d,Mee=F(()=>{Iee();FZ();AAe=BZ(function(t,e){return t==null?{}:Nee(t,e)}),_d=AAe});function RAe(t,e,r,n){for(var i=-1,a=LAe(_Ae((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var _Ae,LAe,Dee,Oee=F(()=>{_Ae=Math.ceil,LAe=Math.max;Dee=RAe});function NAe(t){return function(e,r,n){return n&&typeof n!="number"&&Ys(e,r,n)&&(r=n=void 0),e=rg(e),r===void 0?(r=e,e=0):r=rg(r),n=n===void 0?e{Oee();vd();HA();Pee=NAe});var IAe,Mo,Fee=F(()=>{Bee();IAe=Pee(),Mo=IAe});function MAe(t,e,r,n,i){return i(t,function(a,s,o){r=n?(n=!1,a):e(r,a,s,o)}),r}var zee,$ee=F(()=>{zee=MAe});function DAe(t,e,r){var n=Et(t)?GZ:zee,i=arguments.length<3;return n(t,on(e,4),r,i,Es)}var zr,R_=F(()=>{UZ();$h();Xa();$ee();On();zr=DAe});function OAe(t,e){var r=Et(t)?ug:ew;return r(t,aee(on(e,3)))}var Vh,Gee=F(()=>{C5();v_();Xa();On();see();Vh=OAe});function FAe(t){if(t==null)return 0;if(Jn(t))return ci(t)?Lee(t):t.length;var e=Qs(t);return e==PAe||e==BAe?t.size:ag(t).length}var PAe,BAe,N_,Uee=F(()=>{b5();Sd();Co();rw();Ree();PAe="[object Map]",BAe="[object Set]";N_=FAe});function zAe(t,e){var r;return Es(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var Vee,Wee=F(()=>{$h();Vee=zAe});function $Ae(t,e,r){var n=Et(t)?F5:Vee;return r&&Ys(t,e,r)&&(e=void 0),n(t,on(e,3))}var sy,Hee=F(()=>{o_();Xa();Wee();On();vd();sy=$Ae});var GAe,bc,qee=F(()=>{cg();vee();Yp();vd();GAe=dc(function(t,e){if(t==null)return[];var r=e.length;return r>1&&Ys(t,e[0],e[1])?e=[]:r>2&&Ys(e[0],e[1],e[2])&&(e=[e[0]]),mee(t,yc(e,1),[])}),bc=GAe});var UAe,VAe,Yee,Xee=F(()=>{n_();qA();G5();UAe=1/0,VAe=zh&&1/pg(new zh([,-0]))[1]==UAe?function(t){return new zh(t)}:Yn,Yee=VAe});function HAe(t,e,r){var n=-1,i=x5,a=t.length,s=!0,o=[],l=o;if(r)s=!1,i=Z5;else if(a>=WAe){var u=e?null:Yee(t);if(u)return pg(u);s=!1,i=dg,l=new fg}else l=e?[]:o;e:for(;++n{B5();jA();m_();z5();Xee();G5();WAe=200;xg=HAe});var qAe,I_,jee=F(()=>{cg();Yp();lw();D3();qAe=dc(function(t){return xg(yc(t,1,pd,!0))}),I_=qAe});function YAe(t){return t&&t.length?xg(t):[]}var bg,Kee=F(()=>{lw();bg=YAe});function XAe(t,e){return t&&t.length?xg(t,on(e,2)):[]}var Zee,Qee=F(()=>{Xa();lw();Zee=XAe});function KAe(t){var e=++jAe;return k5(t)+e}var jAe,Ld,Jee=F(()=>{KA();jAe=0;Ld=KAe});function ZAe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{ete=ZAe});function QAe(t,e){return ete(t||[],e||[],fc)}var cw,rte=F(()=>{qp();tte();cw=QAe});var Ot=F(()=>{CZ();a_();RQ();NQ();eA();xJ();kJ();EJ();SJ();CJ();NJ();y_();PJ();FJ();b_();E5();J5();zJ();$J();GJ();qJ();wu();jJ();KJ();On();iw();Lv();qs();eee();rw();tee();mc();TJ();vg();ree();nee();nA();C_();iee();qA();vJ();Mee();cee();Fee();R_();Gee();Uee();Hee();qee();jee();Kee();Jee();E_();rte();});function ite(t,e){t[e]?t[e]++:t[e]=1}function ate(t,e){--t[e]||delete t[e]}function oy(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+nte+a+nte+(ar(n)?JAe:n)}function e_e(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var o={v:i,w:a};return n&&(o.name=n),o}function M_(t,e){return oy(t,e.v,e.w,e.name)}var JAe,Rd,nte,Sr,uw=F(()=>{Ot();JAe="\0",Rd="\0",nte="",Sr=class{constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=xs(void 0),this._defaultEdgeLabelFn=xs(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[Rd]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return gi(e)||(e=xs(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return Nr(this._nodes)}sources(){var e=this;return Fr(this.nodes(),function(r){return ir(e._in[r])})}sinks(){var e=this;return Fr(this.nodes(),function(r){return ir(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Te(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=Rd,this._children[e]={},this._children[Rd][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=n=>this.removeEdge(this._edgeObjs[n]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Te(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Te(Nr(this._in[e]),r),delete this._in[e],delete this._preds[e],Te(Nr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(ar(r))r=Rd;else{r+="";for(var n=r;!ar(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==Rd)return r}}children(e){if(ar(e)&&(e=Rd),this._isCompound){var r=this._children[e];if(r)return Nr(r)}else{if(e===Rd)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return Nr(r)}successors(e){var r=this._sucs[e];if(r)return Nr(r)}neighbors(e){var r=this.predecessors(e);if(r)return I_(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Te(this._nodes,function(s,o){e(o)&&r.setNode(o,s)}),Te(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var o=n.parent(s);return o===void 0||r.hasNode(o)?(i[s]=o,o):o in i?i[o]:a(o)}return this._isCompound&&Te(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return gi(e)||(e=xs(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return fr(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return zr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,ar(n)||(n=""+n);var o=oy(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,o))return a&&(this._edgeLabels[o]=i),this;if(!ar(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[o]=a?i:this._defaultEdgeLabelFn(e,r,n);var l=e_e(this._isDirected,e,r,n);return e=l.v,r=l.w,Object.freeze(l),this._edgeObjs[o]=l,ite(this._preds[r],e),ite(this._sucs[e],r),this._in[r][o]=l,this._out[e][o]=l,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?M_(this._isDirected,arguments[0]):oy(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?M_(this._isDirected,arguments[0]):oy(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?M_(this._isDirected,arguments[0]):oy(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],ate(this._preds[r],e),ate(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=fr(n);return r?Fr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=fr(n);return r?Fr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};Sr.prototype._nodeCount=0;Sr.prototype._edgeCount=0});var As=F(()=>{uw()});function ste(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function t_e(t,e){if(t!=="_next"&&t!=="_prev")return e}var hw,ote=F(()=>{hw=class{constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return ste(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&ste(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,t_e)),n=n._prev;return"["+e.join(", ")+"]"}}});function lte(t,e){if(t.nodeCount()<=1)return[];var r=i_e(t,e||r_e),n=n_e(r.graph,r.buckets,r.zeroIdx);return Br(je(n,function(i){return t.outEdges(i.v,i.w)}))}function n_e(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)D_(t,e,r,s);for(;s=i.dequeue();)D_(t,e,r,s);if(t.nodeCount()){for(var o=e.length-2;o>0;--o)if(s=e[o].dequeue(),s){n=n.concat(D_(t,e,r,s,!0));break}}}return n}function D_(t,e,r,n,i){var a=i?[]:void 0;return Te(t.inEdges(n.v),function(s){var o=t.edge(s),l=t.node(s.v);i&&a.push({v:s.v,w:s.w}),l.out-=o,O_(e,r,l)}),Te(t.outEdges(n.v),function(s){var o=t.edge(s),l=s.w,u=t.node(l);u.in-=o,O_(e,r,u)}),t.removeNode(n.v),a}function i_e(t,e){var r=new Sr,n=0,i=0;Te(t.nodes(),function(o){r.setNode(o,{v:o,in:0,out:0})}),Te(t.edges(),function(o){var l=r.edge(o.v,o.w)||0,u=e(o),h=l+u;r.setEdge(o.v,o.w,h),i=Math.max(i,r.node(o.v).out+=u),n=Math.max(n,r.node(o.w).in+=u)});var a=Mo(i+n+3).map(function(){return new hw}),s=n+1;return Te(r.nodes(),function(o){O_(a,s,r.node(o))}),{graph:r,buckets:a,zeroIdx:s}}function O_(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var r_e,cte=F(()=>{Ot();As();ote();r_e=xs(1)});function ute(t){var e=t.graph().acyclicer==="greedy"?lte(t,r(t)):a_e(t);Te(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,Ld("rev"))});function r(n){return function(i){return n.edge(i).weight}}}function a_e(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Te(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return Te(t.nodes(),i),e}function hte(t){Te(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var P_=F(()=>{Ot();cte()});function wc(t,e,r,n){var i;do i=Ld(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function dte(t){var e=new Sr().setGraph(t.graph());return Te(t.nodes(),function(r){e.setNode(r,t.node(r))}),Te(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function fw(t){var e=new Sr({multigraph:t.isMultigraph()}).setGraph(t.graph());return Te(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Te(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function B_(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,o=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var l,u;return Math.abs(a)*s>Math.abs(i)*o?(a<0&&(o=-o),l=o*i/a,u=o):(i<0&&(s=-s),l=s,u=s*a/i),{x:r+l,y:n+u}}function Wh(t){var e=je(Mo(z_(t)+1),function(){return[]});return Te(t.nodes(),function(r){var n=t.node(r),i=n.rank;ar(i)||(e[i][n.order]=r)}),e}function pte(t){var e=xl(je(t.nodes(),function(r){return t.node(r).rank}));Te(t.nodes(),function(r){var n=t.node(r);St(n,"rank")&&(n.rank-=e)})}function gte(t){var e=xl(je(t.nodes(),function(a){return t.node(a).rank})),r=[];Te(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Te(r,function(a,s){ar(a)&&s%i!==0?--n:n&&Te(a,function(o){t.node(o).rank+=n})})}function F_(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),wc(t,"border",i,e)}function z_(t){return Ss(je(t.nodes(),function(e){var r=t.node(e).rank;if(!ar(r))return r}))}function mte(t,e){var r={lhs:[],rhs:[]};return Te(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function vte(t,e){var r=K5();try{return e()}finally{console.log(t+" time: "+(K5()-r)+"ms")}}function yte(t,e){return e()}var kc=F(()=>{Ot();As()});function bte(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Te(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{Ot();kc()});function Tte(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&Ste(t)}function Ete(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&s_e(t),(e==="lr"||e==="rl")&&(o_e(t),Ste(t))}function Ste(t){Te(t.nodes(),function(e){kte(t.node(e))}),Te(t.edges(),function(e){kte(t.edge(e))})}function kte(t){var e=t.width;t.width=t.height,t.height=e}function s_e(t){Te(t.nodes(),function(e){$_(t.node(e))}),Te(t.edges(),function(e){var r=t.edge(e);Te(r.points,$_),Object.prototype.hasOwnProperty.call(r,"y")&&$_(r)})}function $_(t){t.y=-t.y}function o_e(t){Te(t.nodes(),function(e){G_(t.node(e))}),Te(t.edges(),function(e){var r=t.edge(e);Te(r.points,G_),Object.prototype.hasOwnProperty.call(r,"x")&&G_(r)})}function G_(t){var e=t.x;t.x=t.y,t.y=e}var Cte=F(()=>{Ot()});function Ate(t){t.graph().dummyChains=[],Te(t.edges(),function(e){c_e(t,e)})}function c_e(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,o=t.edge(e),l=o.labelRank;if(a!==n+1){t.removeEdge(e);var u=void 0,h,f;for(f=0,++n;n{Ot();kc()});function ly(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=xl(je(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}Te(t.sources(),r)}function Nd(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var dw=F(()=>{Ot()});function pw(t){var e=new Sr({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;u_e(e,t){Ot();As();dw()});var Rte=F(()=>{});var W_=F(()=>{});var kSt,H_=F(()=>{Ot();W_();kSt=xs(1)});var Nte=F(()=>{H_()});var q_=F(()=>{});var Ite=F(()=>{q_()});var LSt,Mte=F(()=>{Ot();LSt=xs(1)});function Y_(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new cy;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Te(t.predecessors(a),i),delete r[a],n.push(a))}if(Te(t.sinks(),i),N_(e)!==t.nodeCount())throw new cy;return n}function cy(){}var X_=F(()=>{Ot();Y_.CycleException=cy;cy.prototype=new Error});var Dte=F(()=>{X_()});function gw(t,e,r){Et(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Te(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);Ote(t,s,r==="post",a,n,i)}),i}function Ote(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Te(i(e),function(s){Ote(t,s,r,n,i,a)}),r&&a.push(e))}var j_=F(()=>{Ot()});function K_(t,e){return gw(t,e,"post")}var Pte=F(()=>{j_()});function Z_(t,e){return gw(t,e,"pre")}var Bte=F(()=>{j_()});var Fte=F(()=>{W_();uw()});var zte=F(()=>{Rte();H_();Nte();Ite();Mte();Dte();Pte();Bte();Fte();q_();X_()});function qh(t){t=dte(t),ly(t);var e=pw(t);J_(e),Q_(e,t);for(var r,n;r=Vte(e);)n=Wte(e,t,r),Hte(e,t,r,n)}function Q_(t,e){var r=K_(t,t.nodes());r=r.slice(0,r.length-1),Te(r,function(n){v_e(t,e,n)})}function v_e(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=Gte(t,e,r)}function Gte(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),o=0;return s||(a=!1,s=e.edge(i,r)),o=s.weight,Te(e.nodeEdges(r),function(l){var u=l.v===r,h=u?l.w:l.v;if(h!==i){var f=u===a,d=e.edge(l).weight;if(o+=f?d:-d,x_e(t,r,h)){var p=t.edge(r,h).cutvalue;o+=f?-p:p}}}),o}function J_(t,e){arguments.length<2&&(e=t.nodes()[0]),Ute(t,{},1,e)}function Ute(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Te(t.neighbors(n),function(o){Object.prototype.hasOwnProperty.call(e,o)||(r=Ute(t,e,r,o,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function Vte(t){return ja(t.edges(),function(e){return t.edge(e).cutvalue<0})}function Wte(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),o=a,l=!1;a.lim>s.lim&&(o=s,l=!0);var u=Fr(e.edges(),function(h){return l===$te(t,t.node(h.v),o)&&l!==$te(t,t.node(h.w),o)});return Ad(u,function(h){return Nd(e,h)})}function Hte(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),J_(t),Q_(t,e),y_e(t,e)}function y_e(t,e){var r=ja(t.nodes(),function(i){return!e.node(i).parent}),n=Z_(t,r);n=n.slice(1),Te(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),o=!1;s||(s=e.edge(a,i),o=!0),e.node(i).rank=e.node(a).rank+(o?s.minlen:-s.minlen)})}function x_e(t,e,r){return t.hasEdge(e,r)}function $te(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var qte=F(()=>{Ot();zte();kc();V_();dw();qh.initLowLimValues=J_;qh.initCutValues=Q_;qh.calcCutValue=Gte;qh.leaveEdge=Vte;qh.enterEdge=Wte;qh.exchangeEdges=Hte});function e9(t){switch(t.graph().ranker){case"network-simplex":Yte(t);break;case"tight-tree":w_e(t);break;case"longest-path":b_e(t);break;default:Yte(t)}}function w_e(t){ly(t),pw(t)}function Yte(t){qh(t)}var b_e,t9=F(()=>{V_();qte();dw();b_e=ly});function Xte(t){var e=wc(t,"root",{},"_root"),r=k_e(t),n=Ss(fr(r))-1,i=2*n+1;t.graph().nestingRoot=e,Te(t.edges(),function(s){t.edge(s).minlen*=i});var a=T_e(t)+1;Te(t.children(),function(s){jte(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function jte(t,e,r,n,i,a,s){var o=t.children(s);if(!o.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var l=F_(t,"_bt"),u=F_(t,"_bb"),h=t.node(s);t.setParent(l,s),h.borderTop=l,t.setParent(u,s),h.borderBottom=u,Te(o,function(f){jte(t,e,r,n,i,a,f);var d=t.node(f),p=d.borderTop?d.borderTop:f,g=d.borderBottom?d.borderBottom:f,m=d.borderTop?n:2*n,y=p!==g?1:i-a[s]+1;t.setEdge(l,p,{weight:m,minlen:y,nestingEdge:!0}),t.setEdge(g,u,{weight:m,minlen:y,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,l,{weight:0,minlen:i+a[s]})}function k_e(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Te(a,function(s){r(s,i+1)}),e[n]=i}return Te(t.children(),function(n){r(n,1)}),e}function T_e(t){return zr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function Kte(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Te(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var Zte=F(()=>{Ot();kc()});function Qte(t,e,r){var n={},i;Te(r,function(a){for(var s=t.parent(a),o,l;s;){if(o=t.parent(s),o?(l=n[o],n[o]=s):(l=i,i=s),l&&l!==s){e.setEdge(l,s);return}s=o}})}var Jte=F(()=>{Ot()});function ere(t,e,r){var n=S_e(t),i=new Sr({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Te(t.nodes(),function(a){var s=t.node(a),o=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,o||n),Te(t[r](a),function(l){var u=l.v===a?l.w:l.v,h=i.edge(u,a),f=ar(h)?0:h.weight;i.setEdge(u,a,{weight:t.edge(l).weight+f})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function S_e(t){for(var e;t.hasNode(e=Ld("_root")););return e}var tre=F(()=>{Ot();As()});function rre(t,e){for(var r=0,n=1;n0;)h%2&&(f+=o[h+1]),h=h-1>>1,o[h]+=u.weight;l+=u.weight*f})),l}var nre=F(()=>{Ot()});function ire(t){var e={},r=Fr(t.nodes(),function(o){return!t.children(o).length}),n=Ss(je(r,function(o){return t.node(o).rank})),i=je(Mo(n+1),function(){return[]});function a(o){if(!St(e,o)){e[o]=!0;var l=t.node(o);i[l.rank].push(o),Te(t.successors(o),a)}}var s=bc(r,function(o){return t.node(o).rank});return Te(s,a),i}var are=F(()=>{Ot()});function sre(t,e){return je(e,function(r){var n=t.inEdges(r);if(n.length){var i=zr(n,function(a,s){var o=t.edge(s),l=t.node(s.v);return{sum:a.sum+o.weight*l.order,weight:a.weight+o.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var ore=F(()=>{Ot()});function lre(t,e){var r={};Te(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};ar(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Te(e.edges(),function(i){var a=r[i.v],s=r[i.w];!ar(a)&&!ar(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Fr(r,function(i){return!i.indegree});return A_e(n)}function A_e(t){var e=[];function r(a){return function(s){s.merged||(ar(s.barycenter)||ar(a.barycenter)||s.barycenter>=a.barycenter)&&__e(a,s)}}function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(;t.length;){var i=t.pop();e.push(i),Te(i.in.reverse(),r(i)),Te(i.out,n(i))}return je(Fr(e,function(a){return!a.merged}),function(a){return _d(a,["vs","i","barycenter","weight"])})}function __e(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var cre=F(()=>{Ot()});function hre(t,e){var r=mte(t,function(h){return Object.prototype.hasOwnProperty.call(h,"barycenter")}),n=r.lhs,i=bc(r.rhs,function(h){return-h.i}),a=[],s=0,o=0,l=0;n.sort(L_e(!!e)),l=ure(a,i,l),Te(n,function(h){l+=h.vs.length,a.push(h.vs),s+=h.barycenter*h.weight,o+=h.weight,l=ure(a,i,l)});var u={vs:Br(a)};return o&&(u.barycenter=s/o,u.weight=o),u}function ure(t,e,r){for(var n;e.length&&(n=ha(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function L_e(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var fre=F(()=>{Ot();kc()});function r9(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,o=a?a.borderRight:void 0,l={};s&&(i=Fr(i,function(g){return g!==s&&g!==o}));var u=sre(t,i);Te(u,function(g){if(t.children(g.v).length){var m=r9(t,g.v,r,n);l[g.v]=m,Object.prototype.hasOwnProperty.call(m,"barycenter")&&N_e(g,m)}});var h=lre(u,r);R_e(h,l);var f=hre(h,n);if(s&&(f.vs=Br([s,f.vs,o]),t.predecessors(s).length)){var d=t.node(t.predecessors(s)[0]),p=t.node(t.predecessors(o)[0]);Object.prototype.hasOwnProperty.call(f,"barycenter")||(f.barycenter=0,f.weight=0),f.barycenter=(f.barycenter*f.weight+d.order+p.order)/(f.weight+2),f.weight+=2}return f}function R_e(t,e){Te(t,function(r){r.vs=Br(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function N_e(t,e){ar(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var dre=F(()=>{Ot();ore();cre();fre()});function mre(t){var e=z_(t),r=pre(t,Mo(1,e+1),"inEdges"),n=pre(t,Mo(e-1,-1,-1),"outEdges"),i=ire(t);gre(t,i);for(var a=Number.POSITIVE_INFINITY,s,o=0,l=0;l<4;++o,++l){I_e(o%2?r:n,o%4>=2),i=Wh(t);var u=rre(t,i);u{Ot();As();kc();Jte();tre();nre();are();dre()});function yre(t){var e=D_e(t);Te(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=M_e(t,e,i.v,i.w),s=a.path,o=a.lca,l=0,u=s[l],h=!0;r!==i.w;){if(n=t.node(r),h){for(;(u=s[l])!==o&&t.node(u).maxRanks||o>e[l].lim));for(u=l,l=n;(l=t.parent(l))!==u;)a.push(l);return{path:i.concat(a.reverse()),lca:u}}function D_e(t){var e={},r=0;function n(i){var a=r;Te(t.children(i),n),e[i]={low:a,lim:r++}}return Te(t.children(),n),e}var xre=F(()=>{Ot()});function O_e(t,e){var r={};function n(i,a){var s=0,o=0,l=i.length,u=ha(a);return Te(a,function(h,f){var d=B_e(t,h),p=d?t.node(d).order:l;(d||h===u)&&(Te(a.slice(o,f+1),function(g){Te(t.predecessors(g),function(m){var y=t.node(m),x=y.order;(xu)&&bre(r,d,h)})})}function i(a,s){var o=-1,l,u=0;return Te(s,function(h,f){if(t.node(h).dummy==="border"){var d=t.predecessors(h);d.length&&(l=t.node(d[0]).order,n(s,u,f,o,l),u=f,o=l)}n(s,u,s.length,l,a.length)}),s}return zr(e,i),r}function B_e(t,e){if(t.node(e).dummy)return ja(t.predecessors(e),function(r){return t.node(r).dummy})}function bre(t,e,r){if(e>r){var n=e;e=r,r=n}var i=t[e];i||(t[e]=i={}),i[r]=!0}function F_e(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function z_e(t,e,r,n){var i={},a={},s={};return Te(e,function(o){Te(o,function(l,u){i[l]=l,a[l]=l,s[l]=u})}),Te(e,function(o){var l=-1;Te(o,function(u){var h=n(u);if(h.length){h=bc(h,function(m){return s[m]});for(var f=(h.length-1)/2,d=Math.floor(f),p=Math.ceil(f);d<=p;++d){var g=h[d];a[u]===u&&l{Ot();As();kc()});function Tre(t){t=fw(t),Y_e(t),k_(wre(t),function(e,r){t.node(r).x=e})}function Y_e(t){var e=Wh(t),r=t.graph().ranksep,n=0;Te(e,function(i){var a=Ss(je(i,function(s){return t.node(s).height}));Te(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var Ere=F(()=>{Ot();kc();kre()});function Ru(t,e){var r=e&&e.debugTiming?vte:yte;r("layout",()=>{var n=r(" buildLayoutGraph",()=>i9e(t));r(" runLayout",()=>X_e(n,r)),r(" updateInputGraph",()=>j_e(t,n))})}function X_e(t,e){e(" makeSpaceForEdgeLabels",()=>a9e(t)),e(" removeSelfEdges",()=>p9e(t)),e(" acyclic",()=>ute(t)),e(" nestingGraph.run",()=>Xte(t)),e(" rank",()=>e9(fw(t))),e(" injectEdgeLabelProxies",()=>s9e(t)),e(" removeEmptyRanks",()=>gte(t)),e(" nestingGraph.cleanup",()=>Kte(t)),e(" normalizeRanks",()=>pte(t)),e(" assignRankMinMax",()=>o9e(t)),e(" removeEdgeLabelProxies",()=>l9e(t)),e(" normalize.run",()=>Ate(t)),e(" parentDummyChains",()=>yre(t)),e(" addBorderSegments",()=>bte(t)),e(" order",()=>mre(t)),e(" insertSelfEdges",()=>g9e(t)),e(" adjustCoordinateSystem",()=>Tte(t)),e(" position",()=>Tre(t)),e(" positionSelfEdges",()=>m9e(t)),e(" removeBorderNodes",()=>d9e(t)),e(" normalize.undo",()=>_te(t)),e(" fixupEdgeLabelCoords",()=>h9e(t)),e(" undoCoordinateSystem",()=>Ete(t)),e(" translateGraph",()=>c9e(t)),e(" assignNodeIntersects",()=>u9e(t)),e(" reversePoints",()=>f9e(t)),e(" acyclic.undo",()=>hte(t))}function j_e(t,e){Te(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Te(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function i9e(t){var e=new Sr({multigraph:!0,compound:!0}),r=i9(t.graph());return e.setGraph(Mh({},Z_e,n9(r,K_e),_d(r,Q_e))),Te(t.nodes(),function(n){var i=i9(t.node(n));e.setNode(n,Gh(n9(i,J_e),e9e)),e.setParent(n,t.parent(n))}),Te(t.edges(),function(n){var i=i9(t.edge(n));e.setEdge(n,Mh({},r9e,n9(i,t9e),_d(i,n9e)))}),e}function a9e(t){var e=t.graph();e.ranksep/=2,Te(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function s9e(t){Te(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};wc(t,"edge-proxy",a,"_ep")}})}function o9e(t){var e=0;Te(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=Ss(e,n.maxRank))}),t.graph().maxRank=e}function l9e(t){Te(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function c9e(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,o=a.marginy||0;function l(u){var h=u.x,f=u.y,d=u.width,p=u.height;e=Math.min(e,h-d/2),r=Math.max(r,h+d/2),n=Math.min(n,f-p/2),i=Math.max(i,f+p/2)}Te(t.nodes(),function(u){l(t.node(u))}),Te(t.edges(),function(u){var h=t.edge(u);Object.prototype.hasOwnProperty.call(h,"x")&&l(h)}),e-=s,n-=o,Te(t.nodes(),function(u){var h=t.node(u);h.x-=e,h.y-=n}),Te(t.edges(),function(u){var h=t.edge(u);Te(h.points,function(f){f.x-=e,f.y-=n}),Object.prototype.hasOwnProperty.call(h,"x")&&(h.x-=e),Object.prototype.hasOwnProperty.call(h,"y")&&(h.y-=n)}),a.width=r-e+s,a.height=i-n+o}function u9e(t){Te(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(B_(n,a)),r.points.push(B_(i,s))})}function h9e(t){Te(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function f9e(t){Te(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function d9e(t){Te(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ha(r.borderLeft)),s=t.node(ha(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Te(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function p9e(t){Te(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function g9e(t){var e=Wh(t);Te(e,function(r){var n=0;Te(r,function(i,a){var s=t.node(i);s.order=a+n,Te(s.selfEdges,function(o){wc(t,"selfedge",{width:o.label.width,height:o.label.height,rank:s.rank,order:a+ ++n,e:o.e,label:o.label},"_se")}),delete s.selfEdges})})}function m9e(t){Te(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,o=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-o},{x:i+5*s/6,y:a-o},{x:i+s,y:a},{x:i+5*s/6,y:a+o},{x:i+2*s/3,y:a+o}],r.label.x=r.x,r.label.y=r.y}})}function n9(t,e){return Cd(_d(t,e),Number)}function i9(t){var e={};return Te(t,function(r,n){e[n.toLowerCase()]=r}),e}var K_e,Z_e,Q_e,J_e,e9e,t9e,r9e,n9e,Sre=F(()=>{Ot();As();wte();Cte();P_();U_();t9();Zte();vre();xre();Ere();kc();K_e=["nodesep","edgesep","ranksep","marginx","marginy"],Z_e={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Q_e=["acyclicer","ranker","rankdir","align"],J_e=["width","height"],e9e={width:0,height:0},t9e=["minlen","weight","width","height","labeloffset"],r9e={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},n9e=["labelpos"]});var uy=F(()=>{P_();Sre();U_();t9()});function Do(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:v9e(t),edges:y9e(t)};return ar(t.graph())||(e.value=jr(t.graph())),e}function v9e(t){return je(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return ar(r)||(i.value=r),ar(n)||(i.parent=n),i})}function y9e(t){return je(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return ar(e.name)||(n.name=e.name),ar(r)||(n.value=r),n})}var a9=F(()=>{Ot();uw()});var Dre={};vr(Dre,{render:()=>E9e});var dr,Id,_re,x9e,mw,b9e,Lre,Rre,w9e,hy,Are,k9e,Nre,Ire,T9e,Mre,E9e,Ore=F(()=>{_u();yl();sl();pc();bo();Ya();kn();or();uy();a9();As();As();a9();dr=new Map,Id=new Map,_re=new Map,x9e=v(()=>{Id.clear(),_re.clear(),dr.clear()},"clear"),mw=v((t,e)=>{let r=Id.get(e)||[];return re.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),b9e=v((t,e)=>{let r=Id.get(e)||[];return re.info("Descendants of ",e," is ",r),re.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||mw(t.v,e)||mw(t.w,e)||r.includes(t.w):(re.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),Lre=v((t,e,r,n)=>{re.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),re.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)Lre(a,e,r,n);else{let s=e.node(a);re.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(re.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(re.debug("Setting parent",a,t),r.setParent(a,t)):(re.info("In copy ",t,"root",n,"data",e.node(t),n),re.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let o=e.edges(a);re.debug("Copying Edges",o),o.forEach(l=>{re.info("Edge",l);let u=e.edge(l.v,l.w,l.name);re.info("Edge data",u,n);try{b9e(l,n)?(re.info("Copying as ",l.v,l.w,u,l.name),r.setEdge(l.v,l.w,u,l.name),re.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):re.info("Skipping copy of edge ",l.v,"-->",l.w," rootId: ",n," clusterId:",t)}catch(h){re.error(h)}})}re.debug("Removing node",a),e.removeNode(a)})},"copy"),Rre=v((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)_re.set(i,t),n=[...n,...Rre(i,e)];return n},"extractDescendants"),w9e=v((t,e,r)=>{let n=t.edges().filter(l=>l.v===e||l.w===e),i=t.edges().filter(l=>l.v===r||l.w===r),a=n.map(l=>({v:l.v===e?r:l.v,w:l.w===e?e:l.w})),s=i.map(l=>({v:l.v,w:l.w}));return a.filter(l=>s.some(u=>l.v===u.v&&l.w===u.w))},"findCommonEdges"),hy=v((t,e,r)=>{let n=e.children(t);if(re.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=hy(a,e,r),o=w9e(e,r,s);if(s)if(o.length>0)i=s;else return s}return i},"findNonClusterChild"),Are=v(t=>!dr.has(t)||!dr.get(t).externalConnections?t:dr.has(t)?dr.get(t).id:t,"getAnchorId"),k9e=v((t,e)=>{if(!t||e>10){re.debug("Opting out, no graph ");return}else re.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(re.warn("Cluster identified",r," Replacement id in edges: ",hy(r,t,r)),Id.set(r,Rre(r,t)),dr.set(r,{id:hy(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(re.debug("Cluster identified",r,Id),i.forEach(a=>{let s=mw(a.v,r),o=mw(a.w,r);s^o&&(re.warn("Edge: ",a," leaves cluster ",r),re.warn("Descendants of XXX ",r,": ",Id.get(r)),dr.get(r).externalConnections=!0)})):re.debug("Not a cluster ",r,Id)});for(let r of dr.keys()){let n=dr.get(r).id,i=t.parent(n);i!==r&&dr.has(i)&&!dr.get(i).externalConnections&&(dr.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);re.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),re.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(re.warn("Fix XXX",dr,"ids:",r.v,r.w,"Translating: ",dr.get(r.v)," --- ",dr.get(r.w)),dr.get(r.v)||dr.get(r.w)){if(re.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=Are(r.v),a=Are(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);dr.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);dr.get(s).externalConnections=!0,n.toCluster=r.w}re.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),re.warn("Adjusted Graph",Do(t)),Nre(t,0),re.trace(dr)},"adjustClustersAndEdges"),Nre=v((t,e)=>{if(re.warn("extractor - ",e,Do(t),t.children("D")),e>10){re.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){re.debug("Done, no node has children",t.nodes());return}re.debug("Nodes = ",r,e);for(let i of r)if(re.debug("Extracting node",i,dr,dr.has(i)&&!dr.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!dr.has(i))re.debug("Not a cluster",i,e);else if(!dr.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){re.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";dr.get(i)?.clusterData?.dir&&(s=dr.get(i).clusterData.dir,re.warn("Fixing dir",dr.get(i).clusterData.dir,s));let o=new Sr({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});re.warn("Old graph before copy",Do(t)),Lre(i,t,o,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:dr.get(i).clusterData,label:dr.get(i).label,graph:o}),re.warn("New graph after copy node: (",i,")",Do(o)),re.debug("Old graph after copy",Do(t))}else re.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!dr.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),re.debug(dr);r=t.nodes(),re.warn("New list of nodes",r);for(let i of r){let a=t.node(i);re.warn(" Now next level",i,a),a?.clusterNode&&Nre(a.graph,e+1)}},"extractor"),Ire=v((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Ire(t,i);r=[...r,...a]}),r},"sorter"),T9e=v(t=>Ire(t,t.children()),"sortNodesByHierarchy"),Mre=v(async(t,e,r,n,i,a)=>{re.warn("Graph in recursive render:XAX",Do(e),i);let s=e.graph().rankdir;re.trace("Dir in recursive render - dir:",s);let o=t.insert("g").attr("class","root");e.nodes()?re.info("Recursive render XXX",e.nodes()):re.info("No nodes found for",e),e.edges().length>0&&re.info("Recursive edges",e.edge(e.edges()[0]));let l=o.insert("g").attr("class","clusters"),u=o.insert("g").attr("class","edgePaths"),h=o.insert("g").attr("class","edgeLabels"),f=o.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(m){let y=e.node(m);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));re.trace(`Setting data for parent cluster XXX Node.id = `,m,` data=`,x.height,` Parent cluster`,i.height),e.setNode(i.id,x),e.parent(m)||(re.trace("Setting parent",m,i.id),e.setParent(m,i.id,x))}if(re.info("(Insert) Node XXX"+m+": "+JSON.stringify(e.node(m))),y?.clusterNode){re.info("Cluster identified XBX",m,y.width,e.node(m));let{ranksep:x,nodesep:b}=e.graph();y.graph.setGraph({...y.graph.graph(),ranksep:x+25,nodesep:b});let w=await Mre(f,y.graph,r,n,e.node(m),a),_=w.elem;Pt(y,_),y.diff=w.diff||0,re.info("New compound node after recursive render XAX",m,"width",y.width,"height",y.height),JK(_,y)}else e.children(m).length>0?(re.trace("Cluster - the non recursive path XBX",m,y.id,y,y.width,"Graph:",e),re.trace(hy(y.id,e)),dr.set(y.id,{id:hy(y.id,e),node:y})):(re.trace("Node - the non recursive path XAX",m,f,e.node(m),s),await wd(f,e.node(m),{config:a,dir:s}))})),await v(async()=>{let m=e.edges().map(async function(y){let x=e.edge(y.v,y.w,y.name);re.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(y)),re.info("Edge "+y.v+" -> "+y.w+": ",y," ",JSON.stringify(e.edge(y))),re.info("Fix",dr,"ids:",y.v,y.w,"Translating: ",dr.get(y.v),dr.get(y.w)),await h5(h,x)});await Promise.all(m)},"processEdges")(),re.info("Graph before layout:",JSON.stringify(Do(e))),re.info("############################################# XXX"),re.info("### Layout ### XXX"),re.info("############################################# XXX"),Ru(e),re.info("Graph after layout:",JSON.stringify(Do(e)));let p=0,{subGraphTitleTotalMargin:g}=ou(a);return await Promise.all(T9e(e).map(async function(m){let y=e.node(m);if(re.info("Position XBX => "+m+": ("+y.x,","+y.y,") width: ",y.width," height: ",y.height),y?.clusterNode)y.y+=g,re.info("A tainted cluster node XBX1",m,y.id,y.width,y.height,y.x,y.y,e.parent(m)),dr.get(y.id).node=y,Jv(y);else if(e.children(m).length>0){re.info("A pure cluster node XBX1",m,y.id,y.x,y.y,y.width,y.height,e.parent(m)),y.height+=g,e.node(y.parentId);let x=y?.padding/2||0,b=y?.labelBBox?.height||0,w=b-x||0;re.debug("OffsetY",w,"labelHeight",b,"halfPadding",x),await tg(l,y),dr.get(y.id).node=y}else{let x=e.node(y.parentId);y.y+=g/2,re.info("A regular node XBX1 - using the padding",y.id,"parent",y.parentId,y.width,y.height,y.x,y.y,"offsetY",y.offsetY,"parent",x,x?.offsetY,y),Jv(y)}})),e.edges().forEach(function(m){let y=e.edge(m);re.info("Edge "+m.v+" -> "+m.w+": "+JSON.stringify(y),y),y.points.forEach(_=>_.y+=g/2);let x=e.node(m.v);var b=e.node(m.w);let w=d5(u,y,dr,r,x,b,n);f5(y,w)}),e.nodes().forEach(function(m){let y=e.node(m);re.info(m,y.type,y.diff),y.isGroup&&(p=y.diff)}),re.warn("Returning from recursive render XAX",o,p),{elem:o,diff:p}},"recursiveRender"),E9e=v(async(t,e)=>{let r=new Sr({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");p5(n,t.markers,t.type,t.diagramId),eZ(),iZ(),zj(),x9e(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),re.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,o=s+"---"+s+"---1",l=s+"---"+s+"---2",u=r.node(s);r.setNode(o,{domId:o,id:o,parentId:u.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(o,u.parentId),r.setNode(l,{domId:l,id:l,parentId:u.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(l,u.parentId);let h=structuredClone(a),f=structuredClone(a),d=structuredClone(a);h.label="",h.arrowTypeEnd="none",h.id=s+"-cyclic-special-1",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-mid",d.label="",u.isGroup&&(h.fromCluster=s,d.toCluster=s),d.id=s+"-cyclic-special-2",r.setEdge(s,o,h,s+"-cyclic-special-0"),r.setEdge(o,l,f,s+"-cyclic-special-1"),r.setEdge(l,s,d,s+"-cyc{_u();yl();kn();or();S9e={common:Xe,getConfig:Or,insertCluster:tg,insertEdge:d5,insertEdgeLabel:h5,insertMarkers:p5,insertNode:wd,interpolateToCurve:$3,labelHelper:tr,log:re,positionEdgeLabel:f5},fy={},s9=v(t=>{for(let e of t)fy[e.name]=e},"registerLayoutLoaders"),C9e=v(()=>{s9([{name:"dagre",loader:v(async()=>await Promise.resolve().then(()=>(Ore(),Dre)),"loader")}])},"registerDefaultLayoutLoaders");C9e();kg=v(async(t,e)=>{if(!(t.layoutAlgorithm in fy))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=fy[t.layoutAlgorithm];return(await r.loader()).render(t,e,S9e,{algorithm:r.algorithm})},"render"),vw=v((t="",{fallback:e="dagre"}={})=>{if(t in fy)return t;if(e in fy)return re.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var dy,o9=F(()=>{dy="11.4.0"});var La,Iu=F(()=>{or();lr();La=v(t=>{let{securityLevel:e}=pe(),r=Ve("body");if(e==="sandbox"){let a=Ve(`#i${t}`).node()?.contentDocument??document;r=Ve(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var u9,Dd,_w,ene,tne,rne,Tc,Lw,Rw=F(()=>{or();u9=Gi(hp(),1),Dd=v((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),_w=v((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};Dd(t,r).lower()},"drawBackgroundRect"),ene=v((t,e)=>{let r=e.text.replace(zf," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),tne=v((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,u9.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),rne=v((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,u9.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),Tc=v(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),Lw=v(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var pne={};vr(pne,{diagram:()=>wLe});function Fo(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=cA(e[t].text,i,n),e[t].textLines=e[t].text.split(Xe.lineBreakRegex).length,e[t].width=i,e[t].height=Gv(e[t].text,n);else{let a=e[t].text.split(Xe.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let o of a)e[t].width=Math.max(bs(o,n),e[t].width),s=Gv(o,n),e[t].height=e[t].height+s}}function v9(t,e,r,n,i){let a=new hne(i);a.data.widthLimit=r.data.widthLimit/Math.min(f9,n.length);for(let[s,o]of n.entries()){let l=0;o.image={width:0,height:0,Y:0},o.sprite&&(o.image.width=48,o.image.height=48,o.image.Y=l,l=o.image.Y+o.image.height);let u=o.wrap&&Mt.wrap,h=Nw(Mt);if(h.fontSize=h.fontSize+2,h.fontWeight="bold",Fo("label",o,u,h,a.data.widthLimit),o.label.Y=l+8,l=o.label.Y+o.label.height,o.type&&o.type.text!==""){o.type.text="["+o.type.text+"]";let g=Nw(Mt);Fo("type",o,u,g,a.data.widthLimit),o.type.Y=l+5,l=o.type.Y+o.type.height}if(o.descr&&o.descr.text!==""){let g=Nw(Mt);g.fontSize=g.fontSize-2,Fo("descr",o,u,g,a.data.widthLimit),o.descr.Y=l+20,l=o.descr.Y+o.descr.height}if(s==0||s%f9===0){let g=r.data.startx+Mt.diagramMarginX,m=r.data.stopy+Mt.diagramMarginY+l;a.setData(g,g,m,m)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Mt.diagramMarginX:a.data.startx,m=a.data.starty;a.setData(g,g,m,m)}a.name=o.alias;let f=i.db.getC4ShapeArray(o.alias),d=i.db.getC4ShapeKeys(o.alias);d.length>0&&dne(a,t,f,d),e=o.alias;let p=i.db.getBoundarys(e);p.length>0&&v9(t,e,a,p,i),o.alias!=="global"&&fne(t,o,a),r.data.stopy=Math.max(a.data.stopy+Mt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Mt.c4ShapeMargin,r.data.stopx),Ow=Math.max(Ow,r.data.stopx),Pw=Math.max(Pw,r.data.stopy)}}var lne,Iw,_9e,wl,Xh,Ka,bl,Sc,yy,p9,g9,Mw,Dw,ane,L9e,R9e,N9e,I9e,M9e,D9e,O9e,P9e,B9e,F9e,z9e,$9e,G9e,U9e,V9e,W9e,H9e,sne,q9e,Y9e,one,X9e,j9e,K9e,Z9e,jh,Q9e,J9e,eLe,tLe,rLe,h9,m9,cne,nLe,iLe,aLe,sLe,oLe,lLe,cLe,uLe,hLe,fLe,dLe,pLe,Du,Ec,Ow,Pw,une,f9,Mt,hne,d9,vy,Nw,gLe,fne,dne,Bo,nne,mLe,vLe,yLe,ine,xLe,bLe,wLe,gne=F(()=>{Rw();kn();or();lr();lne=Gi(hp(),1),Iw=function(){var t=v(function(We,Re,Pe,xe){for(Pe=Pe||{},xe=We.length;xe--;Pe[We[xe]]=Re);return Pe},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],o=[1,64],l=[1,65],u=[1,66],h=[1,67],f=[1,68],d=[1,69],p=[1,29],g=[1,30],m=[1,31],y=[1,32],x=[1,33],b=[1,34],w=[1,35],_=[1,36],k=[1,37],E=[1,38],L=[1,39],S=[1,40],C=[1,41],M=[1,42],R=[1,43],T=[1,44],I=[1,45],A=[1,46],D=[1,47],N=[1,48],O=[1,50],B=[1,51],P=[1,52],$=[1,53],z=[1,54],H=[1,55],J=[1,56],X=[1,57],oe=[1,58],K=[1,59],ee=[1,60],Q=[14,42],W=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Y=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Z=[1,82],se=[1,83],ce=[1,84],ue=[1,85],te=[12,14,42],Ne=[12,14,33,42],ae=[12,14,33,42,76,77,79,80],we=[12,33],Ie=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ee={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:v(function(Re,Pe,xe,q,de,ie,he){var U=ie.length-1;switch(de){case 3:q.setDirection("TB");break;case 4:q.setDirection("BT");break;case 5:q.setDirection("RL");break;case 6:q.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:q.setC4Type(ie[U-3]);break;case 19:q.setTitle(ie[U].substring(6)),this.$=ie[U].substring(6);break;case 20:q.setAccDescription(ie[U].substring(15)),this.$=ie[U].substring(15);break;case 21:this.$=ie[U].trim(),q.setTitle(this.$);break;case 22:case 23:this.$=ie[U].trim(),q.setAccDescription(this.$);break;case 28:ie[U].splice(2,0,"ENTERPRISE"),q.addPersonOrSystemBoundary(...ie[U]),this.$=ie[U];break;case 29:ie[U].splice(2,0,"SYSTEM"),q.addPersonOrSystemBoundary(...ie[U]),this.$=ie[U];break;case 30:q.addPersonOrSystemBoundary(...ie[U]),this.$=ie[U];break;case 31:ie[U].splice(2,0,"CONTAINER"),q.addContainerBoundary(...ie[U]),this.$=ie[U];break;case 32:q.addDeploymentNode("node",...ie[U]),this.$=ie[U];break;case 33:q.addDeploymentNode("nodeL",...ie[U]),this.$=ie[U];break;case 34:q.addDeploymentNode("nodeR",...ie[U]),this.$=ie[U];break;case 35:q.popBoundaryParseStack();break;case 39:q.addPersonOrSystem("person",...ie[U]),this.$=ie[U];break;case 40:q.addPersonOrSystem("external_person",...ie[U]),this.$=ie[U];break;case 41:q.addPersonOrSystem("system",...ie[U]),this.$=ie[U];break;case 42:q.addPersonOrSystem("system_db",...ie[U]),this.$=ie[U];break;case 43:q.addPersonOrSystem("system_queue",...ie[U]),this.$=ie[U];break;case 44:q.addPersonOrSystem("external_system",...ie[U]),this.$=ie[U];break;case 45:q.addPersonOrSystem("external_system_db",...ie[U]),this.$=ie[U];break;case 46:q.addPersonOrSystem("external_system_queue",...ie[U]),this.$=ie[U];break;case 47:q.addContainer("container",...ie[U]),this.$=ie[U];break;case 48:q.addContainer("container_db",...ie[U]),this.$=ie[U];break;case 49:q.addContainer("container_queue",...ie[U]),this.$=ie[U];break;case 50:q.addContainer("external_container",...ie[U]),this.$=ie[U];break;case 51:q.addContainer("external_container_db",...ie[U]),this.$=ie[U];break;case 52:q.addContainer("external_container_queue",...ie[U]),this.$=ie[U];break;case 53:q.addComponent("component",...ie[U]),this.$=ie[U];break;case 54:q.addComponent("component_db",...ie[U]),this.$=ie[U];break;case 55:q.addComponent("component_queue",...ie[U]),this.$=ie[U];break;case 56:q.addComponent("external_component",...ie[U]),this.$=ie[U];break;case 57:q.addComponent("external_component_db",...ie[U]),this.$=ie[U];break;case 58:q.addComponent("external_component_queue",...ie[U]),this.$=ie[U];break;case 60:q.addRel("rel",...ie[U]),this.$=ie[U];break;case 61:q.addRel("birel",...ie[U]),this.$=ie[U];break;case 62:q.addRel("rel_u",...ie[U]),this.$=ie[U];break;case 63:q.addRel("rel_d",...ie[U]),this.$=ie[U];break;case 64:q.addRel("rel_l",...ie[U]),this.$=ie[U];break;case 65:q.addRel("rel_r",...ie[U]),this.$=ie[U];break;case 66:q.addRel("rel_b",...ie[U]),this.$=ie[U];break;case 67:ie[U].splice(0,1),q.addRel("rel",...ie[U]),this.$=ie[U];break;case 68:q.updateElStyle("update_el_style",...ie[U]),this.$=ie[U];break;case 69:q.updateRelStyle("update_rel_style",...ie[U]),this.$=ie[U];break;case 70:q.updateLayoutConfig("update_layout_config",...ie[U]),this.$=ie[U];break;case 71:this.$=[ie[U]];break;case 72:ie[U].unshift(ie[U-1]),this.$=ie[U];break;case 73:case 75:this.$=ie[U].trim();break;case 74:let ke={};ke[ie[U-1].trim()]=ie[U].trim(),this.$=ke;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{14:[1,74]},t(Q,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:o,37:l,38:u,39:h,40:f,41:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee}),t(Q,[2,14]),t(W,[2,16],{12:[1,76]}),t(Q,[2,36],{12:[1,77]}),t(Y,[2,19]),t(Y,[2,20]),{25:[1,78]},{27:[1,79]},t(Y,[2,23]),{35:80,75:81,76:Z,77:se,79:ce,80:ue},{35:86,75:81,76:Z,77:se,79:ce,80:ue},{35:87,75:81,76:Z,77:se,79:ce,80:ue},{35:88,75:81,76:Z,77:se,79:ce,80:ue},{35:89,75:81,76:Z,77:se,79:ce,80:ue},{35:90,75:81,76:Z,77:se,79:ce,80:ue},{35:91,75:81,76:Z,77:se,79:ce,80:ue},{35:92,75:81,76:Z,77:se,79:ce,80:ue},{35:93,75:81,76:Z,77:se,79:ce,80:ue},{35:94,75:81,76:Z,77:se,79:ce,80:ue},{35:95,75:81,76:Z,77:se,79:ce,80:ue},{35:96,75:81,76:Z,77:se,79:ce,80:ue},{35:97,75:81,76:Z,77:se,79:ce,80:ue},{35:98,75:81,76:Z,77:se,79:ce,80:ue},{35:99,75:81,76:Z,77:se,79:ce,80:ue},{35:100,75:81,76:Z,77:se,79:ce,80:ue},{35:101,75:81,76:Z,77:se,79:ce,80:ue},{35:102,75:81,76:Z,77:se,79:ce,80:ue},{35:103,75:81,76:Z,77:se,79:ce,80:ue},{35:104,75:81,76:Z,77:se,79:ce,80:ue},t(te,[2,59]),{35:105,75:81,76:Z,77:se,79:ce,80:ue},{35:106,75:81,76:Z,77:se,79:ce,80:ue},{35:107,75:81,76:Z,77:se,79:ce,80:ue},{35:108,75:81,76:Z,77:se,79:ce,80:ue},{35:109,75:81,76:Z,77:se,79:ce,80:ue},{35:110,75:81,76:Z,77:se,79:ce,80:ue},{35:111,75:81,76:Z,77:se,79:ce,80:ue},{35:112,75:81,76:Z,77:se,79:ce,80:ue},{35:113,75:81,76:Z,77:se,79:ce,80:ue},{35:114,75:81,76:Z,77:se,79:ce,80:ue},{35:115,75:81,76:Z,77:se,79:ce,80:ue},{20:116,29:49,30:61,32:62,34:s,36:o,37:l,38:u,39:h,40:f,41:d,43:23,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee},{12:[1,118],33:[1,117]},{35:119,75:81,76:Z,77:se,79:ce,80:ue},{35:120,75:81,76:Z,77:se,79:ce,80:ue},{35:121,75:81,76:Z,77:se,79:ce,80:ue},{35:122,75:81,76:Z,77:se,79:ce,80:ue},{35:123,75:81,76:Z,77:se,79:ce,80:ue},{35:124,75:81,76:Z,77:se,79:ce,80:ue},{35:125,75:81,76:Z,77:se,79:ce,80:ue},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(Q,[2,15]),t(W,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(Q,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:o,37:l,38:u,39:h,40:f,41:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w,51:_,52:k,53:E,54:L,55:S,56:C,57:M,58:R,59:T,60:I,61:A,62:D,63:N,64:O,65:B,66:P,67:$,68:z,69:H,70:J,71:X,72:oe,73:K,74:ee}),t(Y,[2,21]),t(Y,[2,22]),t(te,[2,39]),t(Ne,[2,71],{75:81,35:132,76:Z,77:se,79:ce,80:ue}),t(ae,[2,73]),{78:[1,133]},t(ae,[2,75]),t(ae,[2,76]),t(te,[2,40]),t(te,[2,41]),t(te,[2,42]),t(te,[2,43]),t(te,[2,44]),t(te,[2,45]),t(te,[2,46]),t(te,[2,47]),t(te,[2,48]),t(te,[2,49]),t(te,[2,50]),t(te,[2,51]),t(te,[2,52]),t(te,[2,53]),t(te,[2,54]),t(te,[2,55]),t(te,[2,56]),t(te,[2,57]),t(te,[2,58]),t(te,[2,60]),t(te,[2,61]),t(te,[2,62]),t(te,[2,63]),t(te,[2,64]),t(te,[2,65]),t(te,[2,66]),t(te,[2,67]),t(te,[2,68]),t(te,[2,69]),t(te,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(we,[2,28]),t(we,[2,29]),t(we,[2,30]),t(we,[2,31]),t(we,[2,32]),t(we,[2,33]),t(we,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(W,[2,18]),t(Q,[2,38]),t(Ne,[2,72]),t(ae,[2,74]),t(te,[2,24]),t(te,[2,35]),t(Ie,[2,25]),t(Ie,[2,26],{12:[1,138]}),t(Ie,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:v(function(Re,Pe){if(Pe.recoverable)this.trace(Re);else{var xe=new Error(Re);throw xe.hash=Pe,xe}},"parseError"),parse:v(function(Re){var Pe=this,xe=[0],q=[],de=[null],ie=[],he=this.table,U="",ke=0,j=0,ye=0,Ae=2,Ge=1,Fe=ie.slice.call(arguments,1),ge=Object.create(this.lexer),$e={yy:{}};for(var Ce in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ce)&&($e.yy[Ce]=this.yy[Ce]);ge.setInput(Re,$e.yy),$e.yy.lexer=ge,$e.yy.parser=this,typeof ge.yylloc>"u"&&(ge.yylloc={});var qe=ge.yylloc;ie.push(qe);var lt=ge.options&&ge.options.ranges;typeof $e.yy.parseError=="function"?this.parseError=$e.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(_t){xe.length=xe.length-2*_t,de.length=de.length-_t,ie.length=ie.length-_t}v(xt,"popStack");function ft(){var _t;return _t=q.pop()||ge.lex()||Ge,typeof _t!="number"&&(_t instanceof Array&&(q=_t,_t=q.pop()),_t=Pe.symbols_[_t]||_t),_t}v(ft,"lex");for(var Ze,st,Ue,Ke,it,mt,Ht={},ot,et,ht,bt;;){if(Ue=xe[xe.length-1],this.defaultActions[Ue]?Ke=this.defaultActions[Ue]:((Ze===null||typeof Ze>"u")&&(Ze=ft()),Ke=he[Ue]&&he[Ue][Ze]),typeof Ke>"u"||!Ke.length||!Ke[0]){var tt="";bt=[];for(ot in he[Ue])this.terminals_[ot]&&ot>Ae&&bt.push("'"+this.terminals_[ot]+"'");ge.showPosition?tt="Parse error on line "+(ke+1)+`: `+ge.showPosition()+` Expecting `+bt.join(", ")+", got '"+(this.terminals_[Ze]||Ze)+"'":tt="Parse error on line "+(ke+1)+": Unexpected "+(Ze==Ge?"end of input":"'"+(this.terminals_[Ze]||Ze)+"'"),this.parseError(tt,{text:ge.match,token:this.terminals_[Ze]||Ze,line:ge.yylineno,loc:qe,expected:bt})}if(Ke[0]instanceof Array&&Ke.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ue+", token: "+Ze);switch(Ke[0]){case 1:xe.push(Ze),de.push(ge.yytext),ie.push(ge.yylloc),xe.push(Ke[1]),Ze=null,st?(Ze=st,st=null):(j=ge.yyleng,U=ge.yytext,ke=ge.yylineno,qe=ge.yylloc,ye>0&&ye--);break;case 2:if(et=this.productions_[Ke[1]][1],Ht.$=de[de.length-et],Ht._$={first_line:ie[ie.length-(et||1)].first_line,last_line:ie[ie.length-1].last_line,first_column:ie[ie.length-(et||1)].first_column,last_column:ie[ie.length-1].last_column},lt&&(Ht._$.range=[ie[ie.length-(et||1)].range[0],ie[ie.length-1].range[1]]),mt=this.performAction.apply(Ht,[U,j,ke,$e.yy,Ke[1],de,ie].concat(Fe)),typeof mt<"u")return mt;et&&(xe=xe.slice(0,-1*et*2),de=de.slice(0,-1*et),ie=ie.slice(0,-1*et)),xe.push(this.productions_[Ke[1]][0]),de.push(Ht.$),ie.push(Ht._$),ht=he[xe[xe.length-2]][xe[xe.length-1]],xe.push(ht);break;case 3:return!0}}return!0},"parse")},Oe=function(){var We={EOF:1,parseError:v(function(Pe,xe){if(this.yy.parser)this.yy.parser.parseError(Pe,xe);else throw new Error(Pe)},"parseError"),setInput:v(function(Re,Pe){return this.yy=Pe||this.yy||{},this._input=Re,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var Re=this._input[0];this.yytext+=Re,this.yyleng++,this.offset++,this.match+=Re,this.matched+=Re;var Pe=Re.match(/(?:\r\n?|\n).*/g);return Pe?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Re},"input"),unput:v(function(Re){var Pe=Re.length,xe=Re.split(/(?:\r\n?|\n)/g);this._input=Re+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Pe),this.offset-=Pe;var q=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),xe.length-1&&(this.yylineno-=xe.length-1);var de=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:xe?(xe.length===q.length?this.yylloc.first_column:0)+q[q.length-xe.length].length-xe[0].length:this.yylloc.first_column-Pe},this.options.ranges&&(this.yylloc.range=[de[0],de[0]+this.yyleng-Pe]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(Re){this.unput(this.match.slice(Re))},"less"),pastInput:v(function(){var Re=this.matched.substr(0,this.matched.length-this.match.length);return(Re.length>20?"...":"")+Re.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var Re=this.match;return Re.length<20&&(Re+=this._input.substr(0,20-Re.length)),(Re.substr(0,20)+(Re.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var Re=this.pastInput(),Pe=new Array(Re.length+1).join("-");return Re+this.upcomingInput()+` `+Pe+"^"},"showPosition"),test_match:v(function(Re,Pe){var xe,q,de;if(this.options.backtrack_lexer&&(de={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(de.yylloc.range=this.yylloc.range.slice(0))),q=Re[0].match(/(?:\r\n?|\n).*/g),q&&(this.yylineno+=q.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:q?q[q.length-1].length-q[q.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Re[0].length},this.yytext+=Re[0],this.match+=Re[0],this.matches=Re,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Re[0].length),this.matched+=Re[0],xe=this.performAction.call(this,this.yy,this,Pe,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),xe)return xe;if(this._backtrack){for(var ie in de)this[ie]=de[ie];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Re,Pe,xe,q;this._more||(this.yytext="",this.match="");for(var de=this._currentRules(),ie=0;iePe[0].length)){if(Pe=xe,q=ie,this.options.backtrack_lexer){if(Re=this.test_match(xe,de[ie]),Re!==!1)return Re;if(this._backtrack){Pe=!1;continue}else return!1}else if(!this.options.flex)break}return Pe?(Re=this.test_match(Pe,de[q]),Re!==!1?Re:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var Pe=this.next();return Pe||this.lex()},"lex"),begin:v(function(Pe){this.conditionStack.push(Pe)},"begin"),popState:v(function(){var Pe=this.conditionStack.length-1;return Pe>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(Pe){return Pe=this.conditionStack.length-1-Math.abs(Pe||0),Pe>=0?this.conditionStack[Pe]:"INITIAL"},"topState"),pushState:v(function(Pe){this.begin(Pe)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:v(function(Pe,xe,q,de){var ie=de;switch(q){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return We}();Ee.lexer=Oe;function De(){this.yy={}}return v(De,"Parser"),De.prototype=Ee,Ee.Parser=De,new De}();Iw.parser=Iw;_9e=Iw,wl=[],Xh=[""],Ka="global",bl="",Sc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],yy=[],p9="",g9=!1,Mw=4,Dw=2,L9e=v(function(){return ane},"getC4Type"),R9e=v(function(t){ane=yr(t,pe())},"setC4Type"),N9e=v(function(t,e,r,n,i,a,s,o,l){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let u={},h=yy.find(f=>f.from===e&&f.to===r);if(h?u=h:yy.push(u),u.type=t,u.from=e,u.to=r,u.label={text:n},i==null)u.techn={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.techn={text:i};if(a==null)u.descr={text:""};else if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]={text:d}}else u.descr={text:a};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.sprite=s;if(typeof o=="object"){let[f,d]=Object.entries(o)[0];u[f]=d}else u.tags=o;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=jh()},"addRel"),I9e=v(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let o={},l=wl.find(u=>u.alias===e);if(l&&e===l.alias?o=l:(o.alias=e,wl.push(o)),r==null?o.label={text:""}:o.label={text:r},n==null)o.descr={text:""};else if(typeof n=="object"){let[u,h]=Object.entries(n)[0];o[u]={text:h}}else o.descr={text:n};if(typeof i=="object"){let[u,h]=Object.entries(i)[0];o[u]=h}else o.sprite=i;if(typeof a=="object"){let[u,h]=Object.entries(a)[0];o[u]=h}else o.tags=a;if(typeof s=="object"){let[u,h]=Object.entries(s)[0];o[u]=h}else o.link=s;o.typeC4Shape={text:t},o.parentBoundary=Ka,o.wrap=jh()},"addPersonOrSystem"),M9e=v(function(t,e,r,n,i,a,s,o){if(e===null||r===null)return;let l={},u=wl.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,wl.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.techn={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.techn={text:n};if(i==null)l.descr={text:""};else if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]={text:f}}else l.descr={text:i};if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.sprite=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.tags=s;if(typeof o=="object"){let[h,f]=Object.entries(o)[0];l[h]=f}else l.link=o;l.wrap=jh(),l.typeC4Shape={text:t},l.parentBoundary=Ka},"addContainer"),D9e=v(function(t,e,r,n,i,a,s,o){if(e===null||r===null)return;let l={},u=wl.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,wl.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.techn={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.techn={text:n};if(i==null)l.descr={text:""};else if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]={text:f}}else l.descr={text:i};if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.sprite=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.tags=s;if(typeof o=="object"){let[h,f]=Object.entries(o)[0];l[h]=f}else l.link=o;l.wrap=jh(),l.typeC4Shape={text:t},l.parentBoundary=Ka},"addComponent"),O9e=v(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=Sc.find(o=>o.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,Sc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[o,l]=Object.entries(r)[0];a[o]={text:l}}else a.type={text:r};if(typeof n=="object"){let[o,l]=Object.entries(n)[0];a[o]=l}else a.tags=n;if(typeof i=="object"){let[o,l]=Object.entries(i)[0];a[o]=l}else a.link=i;a.parentBoundary=Ka,a.wrap=jh(),bl=Ka,Ka=t,Xh.push(bl)},"addPersonOrSystemBoundary"),P9e=v(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=Sc.find(o=>o.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,Sc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[o,l]=Object.entries(r)[0];a[o]={text:l}}else a.type={text:r};if(typeof n=="object"){let[o,l]=Object.entries(n)[0];a[o]=l}else a.tags=n;if(typeof i=="object"){let[o,l]=Object.entries(i)[0];a[o]=l}else a.link=i;a.parentBoundary=Ka,a.wrap=jh(),bl=Ka,Ka=t,Xh.push(bl)},"addContainerBoundary"),B9e=v(function(t,e,r,n,i,a,s,o){if(e===null||r===null)return;let l={},u=Sc.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,Sc.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.type={text:"node"};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.type={text:n};if(i==null)l.descr={text:""};else if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]={text:f}}else l.descr={text:i};if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.tags=s;if(typeof o=="object"){let[h,f]=Object.entries(o)[0];l[h]=f}else l.link=o;l.nodeType=t,l.parentBoundary=Ka,l.wrap=jh(),bl=Ka,Ka=e,Xh.push(bl)},"addDeploymentNode"),F9e=v(function(){Ka=bl,Xh.pop(),bl=Xh.pop(),Xh.push(bl)},"popBoundaryParseStack"),z9e=v(function(t,e,r,n,i,a,s,o,l,u,h){let f=wl.find(d=>d.alias===e);if(!(f===void 0&&(f=Sc.find(d=>d.alias===e),f===void 0))){if(r!=null)if(typeof r=="object"){let[d,p]=Object.entries(r)[0];f[d]=p}else f.bgColor=r;if(n!=null)if(typeof n=="object"){let[d,p]=Object.entries(n)[0];f[d]=p}else f.fontColor=n;if(i!=null)if(typeof i=="object"){let[d,p]=Object.entries(i)[0];f[d]=p}else f.borderColor=i;if(a!=null)if(typeof a=="object"){let[d,p]=Object.entries(a)[0];f[d]=p}else f.shadowing=a;if(s!=null)if(typeof s=="object"){let[d,p]=Object.entries(s)[0];f[d]=p}else f.shape=s;if(o!=null)if(typeof o=="object"){let[d,p]=Object.entries(o)[0];f[d]=p}else f.sprite=o;if(l!=null)if(typeof l=="object"){let[d,p]=Object.entries(l)[0];f[d]=p}else f.techn=l;if(u!=null)if(typeof u=="object"){let[d,p]=Object.entries(u)[0];f[d]=p}else f.legendText=u;if(h!=null)if(typeof h=="object"){let[d,p]=Object.entries(h)[0];f[d]=p}else f.legendSprite=h}},"updateElStyle"),$9e=v(function(t,e,r,n,i,a,s){let o=yy.find(l=>l.from===e&&l.to===r);if(o!==void 0){if(n!=null)if(typeof n=="object"){let[l,u]=Object.entries(n)[0];o[l]=u}else o.textColor=n;if(i!=null)if(typeof i=="object"){let[l,u]=Object.entries(i)[0];o[l]=u}else o.lineColor=i;if(a!=null)if(typeof a=="object"){let[l,u]=Object.entries(a)[0];o[l]=parseInt(u)}else o.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[l,u]=Object.entries(s)[0];o[l]=parseInt(u)}else o.offsetY=parseInt(s)}},"updateRelStyle"),G9e=v(function(t,e,r){let n=Mw,i=Dw;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(Mw=n),i>=1&&(Dw=i)},"updateLayoutConfig"),U9e=v(function(){return Mw},"getC4ShapeInRow"),V9e=v(function(){return Dw},"getC4BoundaryInRow"),W9e=v(function(){return Ka},"getCurrentBoundaryParse"),H9e=v(function(){return bl},"getParentBoundaryParse"),sne=v(function(t){return t==null?wl:wl.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),q9e=v(function(t){return wl.find(e=>e.alias===t)},"getC4Shape"),Y9e=v(function(t){return Object.keys(sne(t))},"getC4ShapeKeys"),one=v(function(t){return t==null?Sc:Sc.filter(e=>e.parentBoundary===t)},"getBoundaries"),X9e=one,j9e=v(function(){return yy},"getRels"),K9e=v(function(){return p9},"getTitle"),Z9e=v(function(t){g9=t},"setWrap"),jh=v(function(){return g9},"autoWrap"),Q9e=v(function(){wl=[],Sc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],bl="",Ka="global",Xh=[""],yy=[],Xh=[""],p9="",g9=!1,Mw=4,Dw=2},"clear"),J9e={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},eLe={FILLED:0,OPEN:1},tLe={LEFTOF:0,RIGHTOF:1,OVER:2},rLe=v(function(t){p9=yr(t,pe())},"setTitle"),h9={addPersonOrSystem:I9e,addPersonOrSystemBoundary:O9e,addContainer:M9e,addContainerBoundary:P9e,addComponent:D9e,addDeploymentNode:B9e,popBoundaryParseStack:F9e,addRel:N9e,updateElStyle:z9e,updateRelStyle:$9e,updateLayoutConfig:G9e,autoWrap:jh,setWrap:Z9e,getC4ShapeArray:sne,getC4Shape:q9e,getC4ShapeKeys:Y9e,getBoundaries:one,getBoundarys:X9e,getCurrentBoundaryParse:W9e,getParentBoundaryParse:H9e,getRels:j9e,getTitle:K9e,getC4Type:L9e,getC4ShapeInRow:U9e,getC4BoundaryInRow:V9e,setAccTitle:Tr,getAccTitle:_r,getAccDescription:Rr,setAccDescription:Lr,getConfig:v(()=>pe().c4,"getConfig"),clear:Q9e,LINETYPE:J9e,ARROWTYPE:eLe,PLACEMENT:tLe,setTitle:rLe,setC4Type:R9e},m9=v(function(t,e){return Dd(t,e)},"drawRect"),cne=v(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let o=a.startsWith("data:image/png;base64")?a:(0,lne.sanitizeUrl)(a);s.attr("xlink:href",o)},"drawImage"),nLe=v((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",o=a.lineColor?a.lineColor:"#444444",l=a.offsetX?parseInt(a.offsetX):0,u=a.offsetY?parseInt(a.offsetY):0,h="";if(i===0){let d=n.append("line");d.attr("x1",a.startPoint.x),d.attr("y1",a.startPoint.y),d.attr("x2",a.endPoint.x),d.attr("y2",a.endPoint.y),d.attr("stroke-width","1"),d.attr("stroke",o),d.style("fill","none"),a.type!=="rel_b"&&d.attr("marker-end","url("+h+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&d.attr("marker-start","url("+h+"#arrowend)"),i=-1}else{let d=n.append("path");d.attr("fill","none").attr("stroke-width","1").attr("stroke",o).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&d.attr("marker-end","url("+h+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&d.attr("marker-start","url("+h+"#arrowend)")}let f=r.messageFont();Du(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+l,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+u,a.label.width,a.label.height,{fill:s},f),a.techn&&a.techn.text!==""&&(f=r.messageFont(),Du(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+l,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+u,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},f))}},"drawRels"),iLe=v(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",o={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(o={"stroke-width":1});let l={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:o};m9(n,l);let u=r.boundaryFont();u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=s,Du(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},u),e.type&&e.type.text!==""&&(u=r.boundaryFont(),u.fontColor=s,Du(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},u)),e.descr&&e.descr.text!==""&&(u=r.boundaryFont(),u.fontSize=u.fontSize-2,u.fontColor=s,Du(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},u))},"drawBoundary"),aLe=v(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let o=t.append("g");o.attr("class","person-man");let l=Tc();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":l.x=e.x,l.y=e.y,l.fill=n,l.width=e.width,l.height=e.height,l.stroke=i,l.rx=2.5,l.ry=2.5,l.attrs={"stroke-width":.5},m9(o,l);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":o.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":o.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let u=pLe(r,e.typeC4Shape.text);switch(o.append("text").attr("fill",a).attr("font-family",u.fontFamily).attr("font-size",u.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":cne(o,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let h=r[e.typeC4Shape.text+"Font"]();return h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=a,Du(r)(e.label.text,o,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},h),h=r[e.typeC4Shape.text+"Font"](),h.fontColor=a,e.techn&&e.techn?.text!==""?Du(r)(e.techn.text,o,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},h):e.type&&e.type.text!==""&&Du(r)(e.type.text,o,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},h),e.descr&&e.descr.text!==""&&(h=r.personFont(),h.fontColor=a,Du(r)(e.descr.text,o,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},h)),e.height},"drawC4Shape"),sLe=v(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),oLe=v(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),lLe=v(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),cLe=v(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),uLe=v(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),hLe=v(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),fLe=v(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),dLe=v(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),pLe=v((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),Du=function(){function t(i,a,s,o,l,u,h){let f=a.append("text").attr("x",s+l/2).attr("y",o+u/2+5).style("text-anchor","middle").text(i);n(f,h)}v(t,"byText");function e(i,a,s,o,l,u,h,f){let{fontSize:d,fontFamily:p,fontWeight:g}=f,m=i.split(Xe.lineBreakRegex);for(let y=0;y=this.data.widthLimit||r>=this.data.widthLimit||this.nextData.cnt>une)&&(e=this.nextData.startx+t.margin+Mt.nextLinePaddingX,n=this.nextData.stopy+t.margin*2,this.nextData.stopx=r=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=i=n+t.height,this.nextData.cnt=1),t.x=e,t.y=n,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",n,Math.min),this.updateVal(this.data,"stopx",r,Math.max),this.updateVal(this.data,"stopy",i,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",n,Math.min),this.updateVal(this.nextData,"stopx",r,Math.max),this.updateVal(this.nextData,"stopy",i,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},d9(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}},d9=v(function(t){Hn(Mt,t),t.fontFamily&&(Mt.personFontFamily=Mt.systemFontFamily=Mt.messageFontFamily=t.fontFamily),t.fontSize&&(Mt.personFontSize=Mt.systemFontSize=Mt.messageFontSize=t.fontSize),t.fontWeight&&(Mt.personFontWeight=Mt.systemFontWeight=Mt.messageFontWeight=t.fontWeight)},"setConf"),vy=v((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),Nw=v(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),gLe=v(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");v(Fo,"calcC4ShapeTextWH");fne=v(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Mt.c4ShapeMargin-35;let n=e.wrap&&Mt.wrap,i=Nw(Mt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=bs(e.label.text,i);Fo("label",e,n,i,a),Ec.drawBoundary(t,e,Mt)},"drawBoundary"),dne=v(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],o=vy(Mt,s.typeC4Shape.text);switch(o.fontSize=o.fontSize-2,s.typeC4Shape.width=bs("\xAB"+s.typeC4Shape.text+"\xBB",o),s.typeC4Shape.height=o.fontSize+2,s.typeC4Shape.Y=Mt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let l=s.wrap&&Mt.wrap,u=Mt.width-Mt.c4ShapePadding*2,h=vy(Mt,s.typeC4Shape.text);if(h.fontSize=h.fontSize+2,h.fontWeight="bold",Fo("label",s,l,h,u),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let p=vy(Mt,s.typeC4Shape.text);Fo("type",s,l,p,u),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let p=vy(Mt,s.techn.text);Fo("techn",s,l,p,u),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let f=i,d=s.label.width;if(s.descr&&s.descr.text!==""){let p=vy(Mt,s.typeC4Shape.text);Fo("descr",s,l,p,u),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,d=Math.max(s.label.width,s.descr.width),f=i-s.descr.textLines*5}d=d+Mt.c4ShapePadding,s.width=Math.max(s.width||Mt.width,d,Mt.width),s.height=Math.max(s.height||Mt.height,f,Mt.height),s.margin=s.margin||Mt.c4ShapeMargin,t.insert(s),Ec.drawC4Shape(e,s,Mt)}t.bumpLastMargin(Mt.c4ShapeMargin)},"drawC4ShapeArray"),Bo=class{static{v(this,"Point")}constructor(t,e){this.x=t,this.y=e}},nne=v(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,o=n+t.height/2,l=Math.abs(r-i),u=Math.abs(n-a),h=u/l,f=t.height/t.width,d=null;return n==a&&ri?d=new Bo(r,o):r==i&&na&&(d=new Bo(s,n)),r>i&&n=h?d=new Bo(r,o+h*t.width/2):d=new Bo(s-l/u*t.height/2,n+t.height):r=h?d=new Bo(r+t.width,o+h*t.width/2):d=new Bo(s+l/u*t.height/2,n+t.height):ra?f>=h?d=new Bo(r+t.width,o-h*t.width/2):d=new Bo(s+t.height/2*l/u,n):r>i&&n>a&&(f>=h?d=new Bo(r,o-t.width/2*h):d=new Bo(s-t.height/2*l/u,n)),d},"getIntersectPoint"),mLe=v(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=nne(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=nne(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),vLe=v(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Mt.wrap,o=gLe(Mt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let u=bs(a.label.text,o);Fo("label",a,s,o,u),a.techn&&a.techn.text!==""&&(u=bs(a.techn.text,o),Fo("techn",a,s,o,u)),a.descr&&a.descr.text!==""&&(u=bs(a.descr.text,o),Fo("descr",a,s,o,u));let h=r(a.from),f=r(a.to),d=mLe(h,f);a.startPoint=d.startPoint,a.endPoint=d.endPoint}Ec.drawRels(t,e,Mt)},"drawRels");v(v9,"drawInsideBoundary");yLe=v(function(t,e,r,n){Mt=pe().c4;let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let s=i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body"),o=n.db;n.db.setWrap(Mt.wrap),une=o.getC4ShapeInRow(),f9=o.getC4BoundaryInRow(),re.debug(`C:${JSON.stringify(Mt,null,2)}`);let l=i==="sandbox"?s.select(`[id="${e}"]`):Ve(`[id="${e}"]`);Ec.insertComputerIcon(l),Ec.insertDatabaseIcon(l),Ec.insertClockIcon(l);let u=new hne(n);u.setData(Mt.diagramMarginX,Mt.diagramMarginX,Mt.diagramMarginY,Mt.diagramMarginY),u.data.widthLimit=screen.availWidth,Ow=Mt.diagramMarginX,Pw=Mt.diagramMarginY;let h=n.db.getTitle(),f=n.db.getBoundarys("");v9(l,"",u,f,n),Ec.insertArrowHead(l),Ec.insertArrowEnd(l),Ec.insertArrowCrossHead(l),Ec.insertArrowFilledHead(l),vLe(l,n.db.getRels(),n.db.getC4Shape,n),u.data.stopx=Ow,u.data.stopy=Pw;let d=u.data,g=d.stopy-d.starty+2*Mt.diagramMarginY,y=d.stopx-d.startx+2*Mt.diagramMarginX;h&&l.append("text").text(h).attr("x",(d.stopx-d.startx)/2-4*Mt.diagramMarginX).attr("y",d.starty+Mt.diagramMarginY),Hr(l,g,y,Mt.useMaxWidth);let x=h?60:0;l.attr("viewBox",d.startx-Mt.diagramMarginX+" -"+(Mt.diagramMarginY+x)+" "+y+" "+(g+x)),re.debug("models:",d)},"draw"),ine={drawPersonOrSystemArray:dne,drawBoundary:fne,setConf:d9,draw:yLe},xLe=v(t=>`.person { stroke: ${t.personBorder}; fill: ${t.personBkg}; } `,"getStyles"),bLe=xLe,wLe={parser:_9e,db:h9,renderer:ine,styles:bLe,init:v(({c4:t,wrap:e})=>{ine.setConf(t),h9.setWrap(e)},"init")}});var Ag,_g,kLe,TLe,Kh=F(()=>{or();lr();Ag=v((t,e)=>{let r;return e==="sandbox"&&(r=Ve("#i"+t)),(e==="sandbox"?Ve(r.nodes()[0].contentDocument.body):Ve("body")).select(`[id="${t}"]`)},"getDiagramElement"),_g=v((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:o}=kLe(t,e);Hr(t,a,i,n);let l=TLe(s,o,i,a,e);t.attr("viewBox",l),re.debug(`viewBox configured: ${l} with padding: ${e}`)},"setupViewPortForSVG"),kLe=v((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),TLe=v((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var Vw={};vr(Vw,{diagram:()=>cRe});function Fw(t){let e=[];for(let r of t){let n=by.get(r);n?.styles&&(e=[...e,...n.styles??[]].map(i=>i.trim())),n?.textStyles&&(e=[...e,...n.textStyles??[]].map(i=>i.trim()))}return e}var ELe,mne,Lg,Zh,_s,by,Ou,w9,k9,Bw,x9,zo,zw,$w,Gw,Uw,SLe,CLe,ALe,_Le,LLe,RLe,NLe,T9,ILe,MLe,DLe,vne,OLe,PLe,yne,xne,bne,BLe,wne,FLe,zLe,$Le,GLe,ULe,xy,kne,Tne,VLe,WLe,Ene,HLe,qLe,YLe,XLe,jLe,Sne,Cne,KLe,ZLe,QLe,JLe,eRe,tRe,y9,rRe,nRe,iRe,b9,aRe,sRe,oRe,lRe,cRe,Ww=F(()=>{Kh();r4();Nu();_u();yl();sl();pc();bo();Ya();kn();or();lr();lr();go();ELe="flowchart-",mne=0,Lg=pe(),Zh=new Map,_s=[],by=new Map,Ou=[],w9=new Map,k9=new Map,Bw=0,x9=!0,$w=[],Gw=v(t=>Xe.sanitizeText(t,Lg),"sanitizeText"),Uw=v(function(t){for(let e of Zh.values())if(e.id===t)return e.domId;return t},"lookUpDomId"),SLe=v(function(t,e,r,n,i,a,s={},o){if(!t||t.trim().length===0)return;let l,u=Zh.get(t);if(u===void 0&&(u={id:t,labelType:"text",domId:ELe+t+"-"+mne,styles:[],classes:[]},Zh.set(t,u)),mne++,e!==void 0?(Lg=pe(),l=Gw(e.text.trim()),u.labelType=e.type,l.startsWith('"')&&l.endsWith('"')&&(l=l.substring(1,l.length-1)),u.text=l):u.text===void 0&&(u.text=t),r!==void 0&&(u.type=r),n?.forEach(function(h){u.styles.push(h)}),i?.forEach(function(h){u.classes.push(h)}),a!==void 0&&(u.dir=a),u.props===void 0?u.props=s:s!==void 0&&Object.assign(u.props,s),o!==void 0){let h;o.includes(` `)?h=o+` `:h=`{ `+o+` }`;let f=sp(h,{schema:ap});if(f.shape){if(f.shape!==f.shape.toLowerCase()||f.shape.includes("_"))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);if(!WA(f.shape))throw new Error(`No such shape: ${f.shape}.`);u.type=f?.shape}f?.label&&(u.text=f?.label),f?.icon&&(u.icon=f?.icon,!f.label?.trim()&&u.text===t&&(u.text="")),f?.form&&(u.form=f?.form),f?.pos&&(u.pos=f?.pos),f?.img&&(u.img=f?.img,!f.label?.trim()&&u.text===t&&(u.text="")),f?.constraint&&(u.constraint=f.constraint),f.w&&(u.assetWidth=Number(f.w)),f.h&&(u.assetHeight=Number(f.h))}},"addVertex"),CLe=v(function(t,e,r){let a={start:t,end:e,type:void 0,text:"",labelType:"text"};re.info("abc78 Got edge...",a);let s=r.text;if(s!==void 0&&(a.text=Gw(s.text.trim()),a.text.startsWith('"')&&a.text.endsWith('"')&&(a.text=a.text.substring(1,a.text.length-1)),a.labelType=s.type),r!==void 0&&(a.type=r.type,a.stroke=r.stroke,a.length=r.length>10?10:r.length),_s.length<(Lg.maxEdges??500))re.info("Pushing edge..."),_s.push(a);else throw new Error(`Edge limit exceeded. ${_s.length} edges found, but the limit is ${Lg.maxEdges}. Initialize mermaid with maxEdges set to a higher number to allow more edges. You cannot set this config via configuration inside the diagram as it is a secure config. You have to call mermaid.initialize.`)},"addSingleLink"),ALe=v(function(t,e,r){re.info("addLink",t,e,r);for(let n of t)for(let i of e)CLe(n,i,r)},"addLink"),_Le=v(function(t,e){t.forEach(function(r){r==="default"?_s.defaultInterpolate=e:_s[r].interpolate=e})},"updateLinkInterpolate"),LLe=v(function(t,e){t.forEach(function(r){if(typeof r=="number"&&r>=_s.length)throw new Error(`The index ${r} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${_s.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);r==="default"?_s.defaultStyle=e:(_s[r].style=e,(_s[r]?.style?.length??0)>0&&!_s[r]?.style?.some(n=>n?.startsWith("fill"))&&_s[r]?.style?.push("fill:none"))})},"updateLink"),RLe=v(function(t,e){t.split(",").forEach(function(r){let n=by.get(r);n===void 0&&(n={id:r,styles:[],textStyles:[]},by.set(r,n)),e?.forEach(function(i){if(/color/.exec(i)){let a=i.replace("fill","bgFill");n.textStyles.push(a)}n.styles.push(i)})})},"addClass"),NLe=v(function(t){zo=t,/.*/.exec(zo)&&(zo="LR"),/.*v/.exec(zo)&&(zo="TB"),zo==="TD"&&(zo="TB")},"setDirection"),T9=v(function(t,e){for(let r of t.split(",")){let n=Zh.get(r);n&&n.classes.push(e);let i=w9.get(r);i&&i.classes.push(e)}},"setClass"),ILe=v(function(t,e){if(e!==void 0){e=Gw(e);for(let r of t.split(","))k9.set(zw==="gen-1"?Uw(r):r,e)}},"setTooltip"),MLe=v(function(t,e,r){let n=Uw(t);if(pe().securityLevel!=="loose"||e===void 0)return;let i=[];if(typeof r=="string"){i=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let s=0;s")),i.classed("hover",!0)}).on("mouseout",function(){e.transition().duration(500).style("opacity",0),Ve(this).classed("hover",!1)})},"setupToolTips");$w.push(wne);FLe=v(function(t="gen-1"){Zh=new Map,by=new Map,_s=[],$w=[wne],Ou=[],w9=new Map,Bw=0,k9=new Map,x9=!0,zw=t,Lg=pe(),xr()},"clear"),zLe=v(t=>{zw=t||"gen-2"},"setGen"),$Le=v(function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},"defaultStyle"),GLe=v(function(t,e,r){let n=t.text.trim(),i=r.text;t===r&&/\s/.exec(r.text)&&(n=void 0);function a(u){let h={boolean:{},number:{},string:{}},f=[],d;return{nodeList:u.filter(function(g){let m=typeof g;return g.stmt&&g.stmt==="dir"?(d=g.value,!1):g.trim()===""?!1:m in h?h[m].hasOwnProperty(g)?!1:h[m][g]=!0:f.includes(g)?!1:f.push(g)}),dir:d}}v(a,"uniq");let{nodeList:s,dir:o}=a(e.flat());if(zw==="gen-1")for(let u=0;u2e3)return{result:!1,count:0};if(kne[xy]=e,Ou[e].id===t)return{result:!0,count:0};let n=0,i=1;for(;n=0){let s=Tne(t,a);if(s.result)return{result:!0,count:i+s.count};i=i+s.count}n=n+1}return{result:!1,count:i}},"indexNodes2"),VLe=v(function(t){return kne[t]},"getDepthFirstPos"),WLe=v(function(){xy=-1,Ou.length>0&&Tne("none",Ou.length-1)},"indexNodes"),Ene=v(function(){return Ou},"getSubGraphs"),HLe=v(()=>x9?(x9=!1,!0):!1,"firstGraph"),qLe=v(t=>{let e=t.trim(),r="arrow_open";switch(e[0]){case"<":r="arrow_point",e=e.slice(1);break;case"x":r="arrow_cross",e=e.slice(1);break;case"o":r="arrow_circle",e=e.slice(1);break}let n="normal";return e.includes("=")&&(n="thick"),e.includes(".")&&(n="dotted"),{type:r,stroke:n}},"destructStartLink"),YLe=v((t,e)=>{let r=e.length,n=0;for(let i=0;i{let e=t.trim(),r=e.slice(0,-1),n="arrow_open";switch(e.slice(-1)){case"x":n="arrow_cross",e.startsWith("x")&&(n="double_"+n,r=r.slice(1));break;case">":n="arrow_point",e.startsWith("<")&&(n="double_"+n,r=r.slice(1));break;case"o":n="arrow_circle",e.startsWith("o")&&(n="double_"+n,r=r.slice(1));break}let i="normal",a=r.length-1;r.startsWith("=")&&(i="thick"),r.startsWith("~")&&(i="invisible");let s=YLe(".",r);return s&&(i="dotted",a=s),{type:n,stroke:i,length:a}},"destructEndLink"),jLe=v((t,e)=>{let r=XLe(t),n;if(e){if(n=qLe(e),n.stroke!==r.stroke)return{type:"INVALID",stroke:"INVALID"};if(n.type==="arrow_open")n.type=r.type;else{if(n.type!==r.type)return{type:"INVALID",stroke:"INVALID"};n.type="double_"+n.type}return n.type==="double_arrow"&&(n.type="double_arrow_point"),n.length=r.length,n}return r},"destructLink"),Sne=v((t,e)=>{for(let r of t)if(r.nodes.includes(e))return!0;return!1},"exists"),Cne=v((t,e)=>{let r=[];return t.nodes.forEach((n,i)=>{Sne(e,n)||r.push(t.nodes[i])}),{nodes:r}},"makeUniq"),KLe={firstGraph:HLe},ZLe=v(t=>{if(t.img)return"imageSquare";if(t.icon)return t.form==="circle"?"iconCircle":t.form==="square"?"iconSquare":t.form==="rounded"?"iconRounded":"icon";switch(t.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return t.type}},"getTypeFromVertex"),QLe=v((t,e)=>t.find(r=>r.id===e),"findNode"),JLe=v(t=>{let e="none",r="arrow_point";switch(t){case"arrow_point":case"arrow_circle":case"arrow_cross":r=t;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":e=t.replace("double_",""),r=e;break}return{arrowTypeStart:e,arrowTypeEnd:r}},"destructEdgeType"),eRe=v((t,e,r,n,i,a)=>{let s=r.get(t.id),o=n.get(t.id)??!1,l=QLe(e,t.id);if(l)l.cssStyles=t.styles,l.cssCompiledStyles=Fw(t.classes),l.cssClasses=t.classes.join(" ");else{let u={id:t.id,label:t.text,labelStyle:"",parentId:s,padding:i.flowchart?.padding||8,cssStyles:t.styles,cssCompiledStyles:Fw(["default","node",...t.classes]),cssClasses:"default "+t.classes.join(" "),dir:t.dir,domId:t.domId,look:a,link:t.link,linkTarget:t.linkTarget,tooltip:vne(t.id),icon:t.icon,pos:t.pos,img:t.img,assetWidth:t.assetWidth,assetHeight:t.assetHeight,constraint:t.constraint};o?e.push({...u,isGroup:!0,shape:"rect"}):e.push({...u,isGroup:!1,shape:ZLe(t)})}},"addNodeFromVertex");v(Fw,"getCompiledStyles");tRe=v(()=>{let t=pe(),e=[],r=[],n=Ene(),i=new Map,a=new Map;for(let l=n.length-1;l>=0;l--){let u=n[l];u.nodes.length>0&&a.set(u.id,!0);for(let h of u.nodes)i.set(h,u.id)}for(let l=n.length-1;l>=0;l--){let u=n[l];e.push({id:u.id,label:u.title,labelStyle:"",parentId:i.get(u.id),padding:8,cssCompiledStyles:Fw(u.classes),cssClasses:u.classes.join(" "),shape:"rect",dir:u.dir,isGroup:!0,look:t.look})}xne().forEach(l=>{eRe(l,e,i,a,t,t.look||"classic")});let o=bne();return o.forEach((l,u)=>{let{arrowTypeStart:h,arrowTypeEnd:f}=JLe(l.type),d=[...o.defaultStyle??[]];l.style&&d.push(...l.style);let p={id:V3(l.start,l.end,{counter:u,prefix:"L"}),start:l.start,end:l.end,type:l.type??"normal",label:l.text,labelpos:"c",thickness:l.stroke,minlen:l.length,classes:l?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:l?.stroke==="invisible"?"none":h,arrowTypeEnd:l?.stroke==="invisible"?"none":f,arrowheadStyle:"fill: #333",labelStyle:d,style:d,pattern:l.stroke,look:t.look};r.push(p)}),{nodes:e,edges:r,other:{},config:t}},"getData"),y9={defaultConfig:v(()=>Vb.flowchart,"defaultConfig"),setAccTitle:Tr,getAccTitle:_r,getAccDescription:Rr,getData:tRe,setAccDescription:Lr,addVertex:SLe,lookUpDomId:Uw,addLink:ALe,updateLinkInterpolate:_Le,updateLink:LLe,addClass:RLe,setDirection:NLe,setClass:T9,setTooltip:ILe,getTooltip:vne,setClickEvent:OLe,setLink:DLe,bindFunctions:PLe,getDirection:yne,getVertices:xne,getEdges:bne,getClasses:BLe,clear:FLe,setGen:zLe,defaultStyle:$Le,addSubGraph:GLe,getDepthFirstPos:VLe,indexNodes:WLe,getSubGraphs:Ene,destructLink:jLe,lex:KLe,exists:Sne,makeUniq:Cne,setDiagramTitle:tn,getDiagramTitle:qr},rRe=v(function(t,e){return e.db.getClasses()},"getClasses"),nRe=v(async function(t,e,r,n){re.info("REF0:"),re.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=pe(),o;i==="sandbox"&&(o=Ve("#i"+e));let l=i==="sandbox"?o.nodes()[0].contentDocument:document;re.debug("Before getData: ");let u=n.db.getData();re.debug("Data: ",u);let h=Ag(e,i),f=yne();u.type=n.type,u.layoutAlgorithm=vw(s),u.layoutAlgorithm==="dagre"&&s==="elk"&&re.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),u.direction=f,u.nodeSpacing=a?.nodeSpacing||50,u.rankSpacing=a?.rankSpacing||50,u.markers=["point","circle","cross"],u.diagramId=e,re.debug("REF1:",u),await kg(u,h);let d=u.config.flowchart?.diagramPadding??8;Ut.insertTitle(h,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),_g(h,d,"flowchart",a?.useMaxWidth||!1);for(let p of u.nodes){let g=Ve(`#${e} [id="${p.id}"]`);if(!g||!p.link)continue;let m=l.createElementNS("http://www.w3.org/2000/svg","a");m.setAttributeNS("http://www.w3.org/2000/svg","class",p.cssClasses),m.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?m.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):p.linkTarget&&m.setAttributeNS("http://www.w3.org/2000/svg","target",p.linkTarget);let y=g.insert(function(){return m},":first-child"),x=g.select(".label-container");x&&y.append(function(){return x.node()});let b=g.select(".label");b&&y.append(function(){return b.node()})}},"draw"),iRe={getClasses:rRe,draw:nRe},b9=function(){var t=v(function($i,pt,Rt,wt){for(Rt=Rt||{},wt=$i.length;wt--;Rt[$i[wt]]=pt);return Rt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],a=[2,2],s=[1,13],o=[1,14],l=[1,15],u=[1,16],h=[1,23],f=[1,25],d=[1,26],p=[1,27],g=[1,49],m=[1,48],y=[1,29],x=[1,30],b=[1,31],w=[1,32],_=[1,33],k=[1,44],E=[1,46],L=[1,42],S=[1,47],C=[1,43],M=[1,50],R=[1,45],T=[1,51],I=[1,52],A=[1,34],D=[1,35],N=[1,36],O=[1,37],B=[1,57],P=[1,8,9,10,11,27,32,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],$=[1,61],z=[1,60],H=[1,62],J=[8,9,11,75,77],X=[1,77],oe=[1,90],K=[1,95],ee=[1,94],Q=[1,91],W=[1,87],Y=[1,93],Z=[1,89],se=[1,96],ce=[1,92],ue=[1,97],te=[1,88],Ne=[8,9,10,11,40,75,77],ae=[8,9,10,11,40,46,75,77],we=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,88,101,104,105,108,110,113,114,115],Ie=[8,9,11,44,60,75,77,88,101,104,105,108,110,113,114,115],Ee=[44,60,88,101,104,105,108,110,113,114,115],Oe=[1,123],De=[1,122],We=[1,130],Re=[1,144],Pe=[1,145],xe=[1,146],q=[1,147],de=[1,132],ie=[1,134],he=[1,138],U=[1,139],ke=[1,140],j=[1,141],ye=[1,142],Ae=[1,143],Ge=[1,148],Fe=[1,149],ge=[1,128],$e=[1,129],Ce=[1,136],qe=[1,131],lt=[1,135],xt=[1,133],ft=[8,9,10,11,27,32,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],Ze=[1,151],st=[1,153],Ue=[8,9,11],Ke=[8,9,10,11,14,44,60,88,104,105,108,110,113,114,115],it=[1,173],mt=[1,169],Ht=[1,170],ot=[1,174],et=[1,171],ht=[1,172],bt=[77,115,118],tt=[8,9,10,11,12,14,27,29,32,44,60,75,83,84,85,86,87,88,89,104,108,110,113,114,115],_t=[10,105],ur=[31,49,51,53,55,57,62,64,66,67,69,71,115,116,117],Qt=[1,242],Jt=[1,240],en=[1,244],Cr=[1,238],Kn=[1,239],cn=[1,241],Rn=[1,243],Vr=[1,245],xi=[1,263],Fa=[8,9,11,105],yn=[8,9,10,11,60,83,104,105,108,109,110,111],os={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,edgeTextToken:78,STR:79,MD_STR:80,textToken:81,keywords:82,STYLE:83,LINKSTYLE:84,CLASSDEF:85,CLASS:86,CLICK:87,DOWN:88,UP:89,textNoTagsToken:90,stylesOpt:91,"idString[vertex]":92,"idString[class]":93,CALLBACKNAME:94,CALLBACKARGS:95,HREF:96,LINK_TARGET:97,"STR[link]":98,"STR[tooltip]":99,alphaNum:100,DEFAULT:101,numList:102,INTERPOLATE:103,NUM:104,COMMA:105,style:106,styleComponent:107,NODE_STRING:108,UNIT:109,BRKT:110,PCT:111,idStringToken:112,MINUS:113,MULT:114,UNICODE_TEXT:115,TEXT:116,TAGSTART:117,EDGE_TEXT:118,alphaNumToken:119,direction_tb:120,direction_bt:121,direction_rl:122,direction_lr:123,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",79:"STR",80:"MD_STR",83:"STYLE",84:"LINKSTYLE",85:"CLASSDEF",86:"CLASS",87:"CLICK",88:"DOWN",89:"UP",92:"idString[vertex]",93:"idString[class]",94:"CALLBACKNAME",95:"CALLBACKARGS",96:"HREF",97:"LINK_TARGET",98:"STR[link]",99:"STR[tooltip]",101:"DEFAULT",103:"INTERPOLATE",104:"NUM",105:"COMMA",108:"NODE_STRING",109:"UNIT",110:"BRKT",111:"PCT",113:"MINUS",114:"MULT",115:"UNICODE_TEXT",116:"TEXT",117:"TAGSTART",118:"EDGE_TEXT",120:"direction_tb",121:"direction_bt",122:"direction_rl",123:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[76,1],[76,2],[76,1],[76,1],[72,1],[73,3],[30,1],[30,2],[30,1],[30,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[102,1],[102,3],[91,1],[91,3],[106,1],[106,2],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[81,1],[81,1],[81,1],[81,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[78,1],[78,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[47,1],[47,2],[100,1],[100,2],[33,1],[33,1],[33,1],[33,1]],performAction:v(function(pt,Rt,wt,He,yt,fe,un){var me=fe.length-1;switch(yt){case 2:this.$=[];break;case 3:(!Array.isArray(fe[me])||fe[me].length>0)&&fe[me-1].push(fe[me]),this.$=fe[me-1];break;case 4:case 181:this.$=fe[me];break;case 11:He.setDirection("TB"),this.$="TB";break;case 12:He.setDirection(fe[me-1]),this.$=fe[me-1];break;case 27:this.$=fe[me-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=He.addSubGraph(fe[me-6],fe[me-1],fe[me-4]);break;case 34:this.$=He.addSubGraph(fe[me-3],fe[me-1],fe[me-3]);break;case 35:this.$=He.addSubGraph(void 0,fe[me-1],void 0);break;case 37:this.$=fe[me].trim(),He.setAccTitle(this.$);break;case 38:case 39:this.$=fe[me].trim(),He.setAccDescription(this.$);break;case 43:this.$=fe[me-1]+fe[me];break;case 44:this.$=fe[me];break;case 45:He.addVertex(fe[me-1][0],void 0,void 0,void 0,void 0,void 0,void 0,fe[me]),He.addLink(fe[me-3].stmt,fe[me-1],fe[me-2]),this.$={stmt:fe[me-1],nodes:fe[me-1].concat(fe[me-3].nodes)};break;case 46:He.addLink(fe[me-2].stmt,fe[me],fe[me-1]),this.$={stmt:fe[me],nodes:fe[me].concat(fe[me-2].nodes)};break;case 47:He.addLink(fe[me-3].stmt,fe[me-1],fe[me-2]),this.$={stmt:fe[me-1],nodes:fe[me-1].concat(fe[me-3].nodes)};break;case 48:this.$={stmt:fe[me-1],nodes:fe[me-1]};break;case 49:He.addVertex(fe[me-1][0],void 0,void 0,void 0,void 0,void 0,void 0,fe[me]),this.$={stmt:fe[me-1],nodes:fe[me-1],shapeData:fe[me]};break;case 50:this.$={stmt:fe[me],nodes:fe[me]};break;case 51:this.$=[fe[me]];break;case 52:He.addVertex(fe[me-5][0],void 0,void 0,void 0,void 0,void 0,void 0,fe[me-4]),this.$=fe[me-5].concat(fe[me]);break;case 53:this.$=fe[me-4].concat(fe[me]);break;case 54:this.$=fe[me];break;case 55:this.$=fe[me-2],He.setClass(fe[me-2],fe[me]);break;case 56:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"square");break;case 57:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"doublecircle");break;case 58:this.$=fe[me-5],He.addVertex(fe[me-5],fe[me-2],"circle");break;case 59:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"ellipse");break;case 60:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"stadium");break;case 61:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"subroutine");break;case 62:this.$=fe[me-7],He.addVertex(fe[me-7],fe[me-1],"rect",void 0,void 0,void 0,Object.fromEntries([[fe[me-5],fe[me-3]]]));break;case 63:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"cylinder");break;case 64:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"round");break;case 65:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"diamond");break;case 66:this.$=fe[me-5],He.addVertex(fe[me-5],fe[me-2],"hexagon");break;case 67:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"odd");break;case 68:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"trapezoid");break;case 69:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"inv_trapezoid");break;case 70:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"lean_right");break;case 71:this.$=fe[me-3],He.addVertex(fe[me-3],fe[me-1],"lean_left");break;case 72:this.$=fe[me],He.addVertex(fe[me]);break;case 73:fe[me-1].text=fe[me],this.$=fe[me-1];break;case 74:case 75:fe[me-2].text=fe[me-1],this.$=fe[me-2];break;case 76:this.$=fe[me];break;case 77:var za=He.destructLink(fe[me],fe[me-2]);this.$={type:za.type,stroke:za.stroke,length:za.length,text:fe[me-1]};break;case 78:this.$={text:fe[me],type:"text"};break;case 79:this.$={text:fe[me-1].text+""+fe[me],type:fe[me-1].type};break;case 80:this.$={text:fe[me],type:"string"};break;case 81:this.$={text:fe[me],type:"markdown"};break;case 82:var za=He.destructLink(fe[me]);this.$={type:za.type,stroke:za.stroke,length:za.length};break;case 83:this.$=fe[me-1];break;case 84:this.$={text:fe[me],type:"text"};break;case 85:this.$={text:fe[me-1].text+""+fe[me],type:fe[me-1].type};break;case 86:this.$={text:fe[me],type:"string"};break;case 87:case 102:this.$={text:fe[me],type:"markdown"};break;case 99:this.$={text:fe[me],type:"text"};break;case 100:this.$={text:fe[me-1].text+""+fe[me],type:fe[me-1].type};break;case 101:this.$={text:fe[me],type:"text"};break;case 103:this.$=fe[me-4],He.addClass(fe[me-2],fe[me]);break;case 104:this.$=fe[me-4],He.setClass(fe[me-2],fe[me]);break;case 105:case 113:this.$=fe[me-1],He.setClickEvent(fe[me-1],fe[me]);break;case 106:case 114:this.$=fe[me-3],He.setClickEvent(fe[me-3],fe[me-2]),He.setTooltip(fe[me-3],fe[me]);break;case 107:this.$=fe[me-2],He.setClickEvent(fe[me-2],fe[me-1],fe[me]);break;case 108:this.$=fe[me-4],He.setClickEvent(fe[me-4],fe[me-3],fe[me-2]),He.setTooltip(fe[me-4],fe[me]);break;case 109:this.$=fe[me-2],He.setLink(fe[me-2],fe[me]);break;case 110:this.$=fe[me-4],He.setLink(fe[me-4],fe[me-2]),He.setTooltip(fe[me-4],fe[me]);break;case 111:this.$=fe[me-4],He.setLink(fe[me-4],fe[me-2],fe[me]);break;case 112:this.$=fe[me-6],He.setLink(fe[me-6],fe[me-4],fe[me]),He.setTooltip(fe[me-6],fe[me-2]);break;case 115:this.$=fe[me-1],He.setLink(fe[me-1],fe[me]);break;case 116:this.$=fe[me-3],He.setLink(fe[me-3],fe[me-2]),He.setTooltip(fe[me-3],fe[me]);break;case 117:this.$=fe[me-3],He.setLink(fe[me-3],fe[me-2],fe[me]);break;case 118:this.$=fe[me-5],He.setLink(fe[me-5],fe[me-4],fe[me]),He.setTooltip(fe[me-5],fe[me-2]);break;case 119:this.$=fe[me-4],He.addVertex(fe[me-2],void 0,void 0,fe[me]);break;case 120:this.$=fe[me-4],He.updateLink([fe[me-2]],fe[me]);break;case 121:this.$=fe[me-4],He.updateLink(fe[me-2],fe[me]);break;case 122:this.$=fe[me-8],He.updateLinkInterpolate([fe[me-6]],fe[me-2]),He.updateLink([fe[me-6]],fe[me]);break;case 123:this.$=fe[me-8],He.updateLinkInterpolate(fe[me-6],fe[me-2]),He.updateLink(fe[me-6],fe[me]);break;case 124:this.$=fe[me-6],He.updateLinkInterpolate([fe[me-4]],fe[me]);break;case 125:this.$=fe[me-6],He.updateLinkInterpolate(fe[me-4],fe[me]);break;case 126:case 128:this.$=[fe[me]];break;case 127:case 129:fe[me-2].push(fe[me]),this.$=fe[me-2];break;case 131:this.$=fe[me-1]+fe[me];break;case 179:this.$=fe[me];break;case 180:this.$=fe[me-1]+""+fe[me];break;case 182:this.$=fe[me-1]+""+fe[me];break;case 183:this.$={stmt:"dir",value:"TB"};break;case 184:this.$={stmt:"dir",value:"BT"};break;case 185:this.$={stmt:"dir",value:"RL"};break;case 186:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:o,10:l,11:u,20:17,22:18,23:19,24:20,25:21,26:22,27:h,33:24,34:f,36:d,38:p,42:28,43:38,44:g,45:39,47:40,60:m,83:y,84:x,85:b,86:w,87:_,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I,120:A,121:D,122:N,123:O},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:B,15:53,18:56},t(P,[2,3]),t(P,[2,4]),t(P,[2,5]),t(P,[2,6]),t(P,[2,7]),t(P,[2,8]),{8:$,9:z,11:H,21:58,41:59,72:63,75:[1,64],77:[1,65]},{8:$,9:z,11:H,21:66},{8:$,9:z,11:H,21:67},{8:$,9:z,11:H,21:68},{8:$,9:z,11:H,21:69},{8:$,9:z,11:H,21:70},{8:$,9:z,10:[1,71],11:H,21:72},t(P,[2,36]),{35:[1,73]},{37:[1,74]},t(P,[2,39]),t(J,[2,50],{18:75,39:76,10:B,40:X}),{10:[1,78]},{10:[1,79]},{10:[1,80]},{10:[1,81]},{14:oe,44:K,60:ee,79:[1,85],88:Q,94:[1,82],96:[1,83],100:84,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te,119:86},t(P,[2,183]),t(P,[2,184]),t(P,[2,185]),t(P,[2,186]),t(Ne,[2,51]),t(Ne,[2,54],{46:[1,98]}),t(ae,[2,72],{112:111,29:[1,99],44:g,48:[1,100],50:[1,101],52:[1,102],54:[1,103],56:[1,104],58:[1,105],60:m,63:[1,106],65:[1,107],67:[1,108],68:[1,109],70:[1,110],88:k,101:E,104:L,105:S,108:C,110:M,113:R,114:T,115:I}),t(we,[2,179]),t(we,[2,140]),t(we,[2,141]),t(we,[2,142]),t(we,[2,143]),t(we,[2,144]),t(we,[2,145]),t(we,[2,146]),t(we,[2,147]),t(we,[2,148]),t(we,[2,149]),t(we,[2,150]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,112]},t(Ie,[2,26],{18:113,10:B}),t(P,[2,27]),{42:114,43:38,44:g,45:39,47:40,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},t(P,[2,40]),t(P,[2,41]),t(P,[2,42]),t(Ee,[2,76],{73:115,62:[1,117],74:[1,116]}),{76:118,78:119,79:[1,120],80:[1,121],115:Oe,118:De},t([44,60,62,74,88,101,104,105,108,110,113,114,115],[2,82]),t(P,[2,28]),t(P,[2,29]),t(P,[2,30]),t(P,[2,31]),t(P,[2,32]),{10:We,12:Re,14:Pe,27:xe,28:124,32:q,44:de,60:ie,75:he,79:[1,126],80:[1,127],82:137,83:U,84:ke,85:j,86:ye,87:Ae,88:Ge,89:Fe,90:125,104:ge,108:$e,110:Ce,113:qe,114:lt,115:xt},t(ft,a,{5:150}),t(P,[2,37]),t(P,[2,38]),t(J,[2,48],{44:Ze}),t(J,[2,49],{18:152,10:B,40:st}),t(Ne,[2,44]),{44:g,47:154,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},{101:[1,155],102:156,104:[1,157]},{44:g,47:158,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},{44:g,47:159,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},t(Ue,[2,105],{10:[1,160],95:[1,161]}),{79:[1,162]},t(Ue,[2,113],{119:164,10:[1,163],14:oe,44:K,60:ee,88:Q,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te}),t(Ue,[2,115],{10:[1,165]}),t(Ke,[2,181]),t(Ke,[2,168]),t(Ke,[2,169]),t(Ke,[2,170]),t(Ke,[2,171]),t(Ke,[2,172]),t(Ke,[2,173]),t(Ke,[2,174]),t(Ke,[2,175]),t(Ke,[2,176]),t(Ke,[2,177]),t(Ke,[2,178]),{44:g,47:166,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},{30:167,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:175,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:177,50:[1,176],67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:178,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:179,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:180,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{108:[1,181]},{30:182,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:183,65:[1,184],67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:185,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:186,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{30:187,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},t(we,[2,180]),t(i,[2,20]),t(Ie,[2,25]),t(J,[2,46],{39:188,18:189,10:B,40:X}),t(Ee,[2,73],{10:[1,190]}),{10:[1,191]},{30:192,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{77:[1,193],78:194,115:Oe,118:De},t(bt,[2,78]),t(bt,[2,80]),t(bt,[2,81]),t(bt,[2,166]),t(bt,[2,167]),{8:$,9:z,10:We,11:H,12:Re,14:Pe,21:196,27:xe,29:[1,195],32:q,44:de,60:ie,75:he,82:137,83:U,84:ke,85:j,86:ye,87:Ae,88:Ge,89:Fe,90:197,104:ge,108:$e,110:Ce,113:qe,114:lt,115:xt},t(tt,[2,99]),t(tt,[2,101]),t(tt,[2,102]),t(tt,[2,155]),t(tt,[2,156]),t(tt,[2,157]),t(tt,[2,158]),t(tt,[2,159]),t(tt,[2,160]),t(tt,[2,161]),t(tt,[2,162]),t(tt,[2,163]),t(tt,[2,164]),t(tt,[2,165]),t(tt,[2,88]),t(tt,[2,89]),t(tt,[2,90]),t(tt,[2,91]),t(tt,[2,92]),t(tt,[2,93]),t(tt,[2,94]),t(tt,[2,95]),t(tt,[2,96]),t(tt,[2,97]),t(tt,[2,98]),{6:11,7:12,8:s,9:o,10:l,11:u,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,198],33:24,34:f,36:d,38:p,42:28,43:38,44:g,45:39,47:40,60:m,83:y,84:x,85:b,86:w,87:_,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I,120:A,121:D,122:N,123:O},{10:B,18:199},{44:[1,200]},t(Ne,[2,43]),{10:[1,201],44:g,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:111,113:R,114:T,115:I},{10:[1,202]},{10:[1,203],105:[1,204]},t(_t,[2,126]),{10:[1,205],44:g,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:111,113:R,114:T,115:I},{10:[1,206],44:g,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:111,113:R,114:T,115:I},{79:[1,207]},t(Ue,[2,107],{10:[1,208]}),t(Ue,[2,109],{10:[1,209]}),{79:[1,210]},t(Ke,[2,182]),{79:[1,211],97:[1,212]},t(Ne,[2,55],{112:111,44:g,60:m,88:k,101:E,104:L,105:S,108:C,110:M,113:R,114:T,115:I}),{31:[1,213],67:it,81:214,115:ot,116:et,117:ht},t(ur,[2,84]),t(ur,[2,86]),t(ur,[2,87]),t(ur,[2,151]),t(ur,[2,152]),t(ur,[2,153]),t(ur,[2,154]),{49:[1,215],67:it,81:214,115:ot,116:et,117:ht},{30:216,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{51:[1,217],67:it,81:214,115:ot,116:et,117:ht},{53:[1,218],67:it,81:214,115:ot,116:et,117:ht},{55:[1,219],67:it,81:214,115:ot,116:et,117:ht},{57:[1,220],67:it,81:214,115:ot,116:et,117:ht},{60:[1,221]},{64:[1,222],67:it,81:214,115:ot,116:et,117:ht},{66:[1,223],67:it,81:214,115:ot,116:et,117:ht},{30:224,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},{31:[1,225],67:it,81:214,115:ot,116:et,117:ht},{67:it,69:[1,226],71:[1,227],81:214,115:ot,116:et,117:ht},{67:it,69:[1,229],71:[1,228],81:214,115:ot,116:et,117:ht},t(J,[2,45],{18:152,10:B,40:st}),t(J,[2,47],{44:Ze}),t(Ee,[2,75]),t(Ee,[2,74]),{62:[1,230],67:it,81:214,115:ot,116:et,117:ht},t(Ee,[2,77]),t(bt,[2,79]),{30:231,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},t(ft,a,{5:232}),t(tt,[2,100]),t(P,[2,35]),{43:233,44:g,45:39,47:40,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},{10:B,18:234},{10:Qt,60:Jt,83:en,91:235,104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},{10:Qt,60:Jt,83:en,91:246,103:[1,247],104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},{10:Qt,60:Jt,83:en,91:248,103:[1,249],104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},{104:[1,250]},{10:Qt,60:Jt,83:en,91:251,104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},{44:g,47:252,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},t(Ue,[2,106]),{79:[1,253]},{79:[1,254],97:[1,255]},t(Ue,[2,114]),t(Ue,[2,116],{10:[1,256]}),t(Ue,[2,117]),t(ae,[2,56]),t(ur,[2,85]),t(ae,[2,57]),{51:[1,257],67:it,81:214,115:ot,116:et,117:ht},t(ae,[2,64]),t(ae,[2,59]),t(ae,[2,60]),t(ae,[2,61]),{108:[1,258]},t(ae,[2,63]),t(ae,[2,65]),{66:[1,259],67:it,81:214,115:ot,116:et,117:ht},t(ae,[2,67]),t(ae,[2,68]),t(ae,[2,70]),t(ae,[2,69]),t(ae,[2,71]),t([10,44,60,88,101,104,105,108,110,113,114,115],[2,83]),{31:[1,260],67:it,81:214,115:ot,116:et,117:ht},{6:11,7:12,8:s,9:o,10:l,11:u,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,261],33:24,34:f,36:d,38:p,42:28,43:38,44:g,45:39,47:40,60:m,83:y,84:x,85:b,86:w,87:_,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I,120:A,121:D,122:N,123:O},t(Ne,[2,53]),{43:262,44:g,45:39,47:40,60:m,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I},t(Ue,[2,119],{105:xi}),t(Fa,[2,128],{107:264,10:Qt,60:Jt,83:en,104:Cr,108:Kn,109:cn,110:Rn,111:Vr}),t(yn,[2,130]),t(yn,[2,132]),t(yn,[2,133]),t(yn,[2,134]),t(yn,[2,135]),t(yn,[2,136]),t(yn,[2,137]),t(yn,[2,138]),t(yn,[2,139]),t(Ue,[2,120],{105:xi}),{10:[1,265]},t(Ue,[2,121],{105:xi}),{10:[1,266]},t(_t,[2,127]),t(Ue,[2,103],{105:xi}),t(Ue,[2,104],{112:111,44:g,60:m,88:k,101:E,104:L,105:S,108:C,110:M,113:R,114:T,115:I}),t(Ue,[2,108]),t(Ue,[2,110],{10:[1,267]}),t(Ue,[2,111]),{97:[1,268]},{51:[1,269]},{62:[1,270]},{66:[1,271]},{8:$,9:z,11:H,21:272},t(P,[2,34]),t(Ne,[2,52]),{10:Qt,60:Jt,83:en,104:Cr,106:273,107:237,108:Kn,109:cn,110:Rn,111:Vr},t(yn,[2,131]),{14:oe,44:K,60:ee,88:Q,100:274,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te,119:86},{14:oe,44:K,60:ee,88:Q,100:275,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te,119:86},{97:[1,276]},t(Ue,[2,118]),t(ae,[2,58]),{30:277,67:it,79:mt,80:Ht,81:168,115:ot,116:et,117:ht},t(ae,[2,66]),t(ft,a,{5:278}),t(Fa,[2,129],{107:264,10:Qt,60:Jt,83:en,104:Cr,108:Kn,109:cn,110:Rn,111:Vr}),t(Ue,[2,124],{119:164,10:[1,279],14:oe,44:K,60:ee,88:Q,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te}),t(Ue,[2,125],{119:164,10:[1,280],14:oe,44:K,60:ee,88:Q,104:W,105:Y,108:Z,110:se,113:ce,114:ue,115:te}),t(Ue,[2,112]),{31:[1,281],67:it,81:214,115:ot,116:et,117:ht},{6:11,7:12,8:s,9:o,10:l,11:u,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,282],33:24,34:f,36:d,38:p,42:28,43:38,44:g,45:39,47:40,60:m,83:y,84:x,85:b,86:w,87:_,88:k,101:E,104:L,105:S,108:C,110:M,112:41,113:R,114:T,115:I,120:A,121:D,122:N,123:O},{10:Qt,60:Jt,83:en,91:283,104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},{10:Qt,60:Jt,83:en,91:284,104:Cr,106:236,107:237,108:Kn,109:cn,110:Rn,111:Vr},t(ae,[2,62]),t(P,[2,33]),t(Ue,[2,122],{105:xi}),t(Ue,[2,123],{105:xi})],defaultActions:{},parseError:v(function(pt,Rt){if(Rt.recoverable)this.trace(pt);else{var wt=new Error(pt);throw wt.hash=Rt,wt}},"parseError"),parse:v(function(pt){var Rt=this,wt=[0],He=[],yt=[null],fe=[],un=this.table,me="",za=0,p1=0,g1=0,m1=2,v1=1,V0=fe.slice.call(arguments,1),Gn=Object.create(this.lexer),Qi={yy:{}};for(var Ul in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ul)&&(Qi.yy[Ul]=this.yy[Ul]);Gn.setInput(pt,Qi.yy),Qi.yy.lexer=Gn,Qi.yy.parser=this,typeof Gn.yylloc>"u"&&(Gn.yylloc={});var _f=Gn.yylloc;fe.push(_f);var y1=Gn.options&&Gn.options.ranges;typeof Qi.yy.parseError=="function"?this.parseError=Qi.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function AE($a){wt.length=wt.length-2*$a,yt.length=yt.length-$a,fe.length=fe.length-$a}v(AE,"popStack");function ih(){var $a;return $a=He.pop()||Gn.lex()||v1,typeof $a!="number"&&($a instanceof Array&&(He=$a,$a=He.pop()),$a=Rt.symbols_[$a]||$a),$a}v(ih,"lex");for(var Ji,x1,xn,bi,KO,W0,Vl={},Lf,po,tb,Rf;;){if(xn=wt[wt.length-1],this.defaultActions[xn]?bi=this.defaultActions[xn]:((Ji===null||typeof Ji>"u")&&(Ji=ih()),bi=un[xn]&&un[xn][Ji]),typeof bi>"u"||!bi.length||!bi[0]){var H0="";Rf=[];for(Lf in un[xn])this.terminals_[Lf]&&Lf>m1&&Rf.push("'"+this.terminals_[Lf]+"'");Gn.showPosition?H0="Parse error on line "+(za+1)+`: `+Gn.showPosition()+` Expecting `+Rf.join(", ")+", got '"+(this.terminals_[Ji]||Ji)+"'":H0="Parse error on line "+(za+1)+": Unexpected "+(Ji==v1?"end of input":"'"+(this.terminals_[Ji]||Ji)+"'"),this.parseError(H0,{text:Gn.match,token:this.terminals_[Ji]||Ji,line:Gn.yylineno,loc:_f,expected:Rf})}if(bi[0]instanceof Array&&bi.length>1)throw new Error("Parse Error: multiple actions possible at state: "+xn+", token: "+Ji);switch(bi[0]){case 1:wt.push(Ji),yt.push(Gn.yytext),fe.push(Gn.yylloc),wt.push(bi[1]),Ji=null,x1?(Ji=x1,x1=null):(p1=Gn.yyleng,me=Gn.yytext,za=Gn.yylineno,_f=Gn.yylloc,g1>0&&g1--);break;case 2:if(po=this.productions_[bi[1]][1],Vl.$=yt[yt.length-po],Vl._$={first_line:fe[fe.length-(po||1)].first_line,last_line:fe[fe.length-1].last_line,first_column:fe[fe.length-(po||1)].first_column,last_column:fe[fe.length-1].last_column},y1&&(Vl._$.range=[fe[fe.length-(po||1)].range[0],fe[fe.length-1].range[1]]),W0=this.performAction.apply(Vl,[me,p1,za,Qi.yy,bi[1],yt,fe].concat(V0)),typeof W0<"u")return W0;po&&(wt=wt.slice(0,-1*po*2),yt=yt.slice(0,-1*po),fe=fe.slice(0,-1*po)),wt.push(this.productions_[bi[1]][0]),yt.push(Vl.$),fe.push(Vl._$),tb=un[wt[wt.length-2]][wt[wt.length-1]],wt.push(tb);break;case 3:return!0}}return!0},"parse")},fo=function(){var $i={EOF:1,parseError:v(function(Rt,wt){if(this.yy.parser)this.yy.parser.parseError(Rt,wt);else throw new Error(Rt)},"parseError"),setInput:v(function(pt,Rt){return this.yy=Rt||this.yy||{},this._input=pt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var pt=this._input[0];this.yytext+=pt,this.yyleng++,this.offset++,this.match+=pt,this.matched+=pt;var Rt=pt.match(/(?:\r\n?|\n).*/g);return Rt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),pt},"input"),unput:v(function(pt){var Rt=pt.length,wt=pt.split(/(?:\r\n?|\n)/g);this._input=pt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Rt),this.offset-=Rt;var He=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),wt.length-1&&(this.yylineno-=wt.length-1);var yt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:wt?(wt.length===He.length?this.yylloc.first_column:0)+He[He.length-wt.length].length-wt[0].length:this.yylloc.first_column-Rt},this.options.ranges&&(this.yylloc.range=[yt[0],yt[0]+this.yyleng-Rt]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(pt){this.unput(this.match.slice(pt))},"less"),pastInput:v(function(){var pt=this.matched.substr(0,this.matched.length-this.match.length);return(pt.length>20?"...":"")+pt.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var pt=this.match;return pt.length<20&&(pt+=this._input.substr(0,20-pt.length)),(pt.substr(0,20)+(pt.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var pt=this.pastInput(),Rt=new Array(pt.length+1).join("-");return pt+this.upcomingInput()+` `+Rt+"^"},"showPosition"),test_match:v(function(pt,Rt){var wt,He,yt;if(this.options.backtrack_lexer&&(yt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(yt.yylloc.range=this.yylloc.range.slice(0))),He=pt[0].match(/(?:\r\n?|\n).*/g),He&&(this.yylineno+=He.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:He?He[He.length-1].length-He[He.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+pt[0].length},this.yytext+=pt[0],this.match+=pt[0],this.matches=pt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(pt[0].length),this.matched+=pt[0],wt=this.performAction.call(this,this.yy,this,Rt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),wt)return wt;if(this._backtrack){for(var fe in yt)this[fe]=yt[fe];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var pt,Rt,wt,He;this._more||(this.yytext="",this.match="");for(var yt=this._currentRules(),fe=0;feRt[0].length)){if(Rt=wt,He=fe,this.options.backtrack_lexer){if(pt=this.test_match(wt,yt[fe]),pt!==!1)return pt;if(this._backtrack){Rt=!1;continue}else return!1}else if(!this.options.flex)break}return Rt?(pt=this.test_match(Rt,yt[He]),pt!==!1?pt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var Rt=this.next();return Rt||this.lex()},"lex"),begin:v(function(Rt){this.conditionStack.push(Rt)},"begin"),popState:v(function(){var Rt=this.conditionStack.length-1;return Rt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(Rt){return Rt=this.conditionStack.length-1-Math.abs(Rt||0),Rt>=0?this.conditionStack[Rt]:"INITIAL"},"topState"),pushState:v(function(Rt){this.begin(Rt)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:v(function(Rt,wt,He,yt){var fe=yt;switch(He){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),wt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let un=/\n\s*/g;return wt.yytext=wt.yytext.replace(un,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 94;case 17:this.popState();break;case 18:return 95;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 83;case 26:return 101;case 27:return 84;case 28:return 103;case 29:return 85;case 30:return 86;case 31:return 96;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 87;case 35:return Rt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return Rt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return Rt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 97;case 41:return 97;case 42:return 97;case 43:return 97;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 120;case 56:return 121;case 57:return 122;case 58:return 123;case 59:return 104;case 60:return 110;case 61:return 46;case 62:return 60;case 63:return 44;case 64:return 8;case 65:return 105;case 66:return 114;case 67:return this.popState(),77;break;case 68:return this.pushState("edgeText"),75;break;case 69:return 118;case 70:return this.popState(),77;break;case 71:return this.pushState("thickEdgeText"),75;break;case 72:return 118;case 73:return this.popState(),77;break;case 74:return this.pushState("dottedEdgeText"),75;break;case 75:return 118;case 76:return 77;case 77:return this.popState(),53;break;case 78:return"TEXT";case 79:return this.pushState("ellipseText"),52;break;case 80:return this.popState(),55;break;case 81:return this.pushState("text"),54;break;case 82:return this.popState(),57;break;case 83:return this.pushState("text"),56;break;case 84:return 58;case 85:return this.pushState("text"),67;break;case 86:return this.popState(),64;break;case 87:return this.pushState("text"),63;break;case 88:return this.popState(),49;break;case 89:return this.pushState("text"),48;break;case 90:return this.popState(),69;break;case 91:return this.popState(),71;break;case 92:return 116;case 93:return this.pushState("trapText"),68;break;case 94:return this.pushState("trapText"),70;break;case 95:return 117;case 96:return 67;case 97:return 89;case 98:return"SEP";case 99:return 88;case 100:return 114;case 101:return 110;case 102:return 44;case 103:return 108;case 104:return 113;case 105:return 115;case 106:return this.popState(),62;break;case 107:return this.pushState("text"),62;break;case 108:return this.popState(),51;break;case 109:return this.pushState("text"),50;break;case 110:return this.popState(),31;break;case 111:return this.pushState("text"),29;break;case 112:return this.popState(),66;break;case 113:return this.pushState("text"),65;break;case 114:return"TEXT";case 115:return"QUOTE";case 116:return 9;case 117:return 10;case 118:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},shapeData:{rules:[8,11,12,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},callbackargs:{rules:[17,18,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},callbackname:{rules:[14,15,16,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},href:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},click:{rules:[21,24,33,34,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},dottedEdgeText:{rules:[21,24,73,75,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},thickEdgeText:{rules:[21,24,70,72,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},edgeText:{rules:[21,24,67,69,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},trapText:{rules:[21,24,76,79,81,83,87,89,90,91,92,93,94,107,109,111,113],inclusive:!1},ellipseText:{rules:[21,24,76,77,78,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},text:{rules:[21,24,76,79,80,81,82,83,86,87,88,89,93,94,106,107,108,109,110,111,112,113,114],inclusive:!1},vertex:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_descr:{rules:[3,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_title:{rules:[1,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},md_string:{rules:[19,20,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},string:{rules:[21,22,23,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,76,79,81,83,84,85,87,89,93,94,95,96,97,98,99,100,101,102,103,104,105,107,109,111,113,115,116,117,118],inclusive:!0}}};return $i}();os.lexer=fo;function Zi(){this.yy={}}return v(Zi,"Parser"),Zi.prototype=os,os.Parser=Zi,new Zi}();b9.parser=b9;aRe=b9,sRe=v((t,e)=>{let r=S1,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return $s(n,i,a,e)},"fade"),oRe=v(t=>`.label { font-family: ${t.fontFamily}; color: ${t.nodeTextColor||t.textColor}; } .cluster-label text { fill: ${t.titleColor}; } .cluster-label span { color: ${t.titleColor}; } .cluster-label span p { background-color: transparent; } .label text,span { fill: ${t.nodeTextColor||t.textColor}; color: ${t.nodeTextColor||t.textColor}; } .node rect, .node circle, .node ellipse, .node polygon, .node path { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; stroke-width: 1px; } .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { text-anchor: middle; } // .flowchart-label .text-outer-tspan { // text-anchor: middle; // } // .flowchart-label .text-inner-tspan { // text-anchor: start; // } .node .katex path { fill: #000; stroke: #000; stroke-width: 1px; } .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { text-align: center; } .node.clickable { cursor: pointer; } .root .anchor path { fill: ${t.lineColor} !important; stroke-width: 0; stroke: ${t.lineColor}; } .arrowheadPath { fill: ${t.arrowheadColor}; } .edgePath .path { stroke: ${t.lineColor}; stroke-width: 2.0px; } .flowchart-link { stroke: ${t.lineColor}; fill: none; } .edgeLabel { background-color: ${t.edgeLabelBackground}; p { background-color: ${t.edgeLabelBackground}; } rect { opacity: 0.5; background-color: ${t.edgeLabelBackground}; fill: ${t.edgeLabelBackground}; } text-align: center; } /* For html labels only */ .labelBkg { background-color: ${sRe(t.edgeLabelBackground,.5)}; // background-color: } .cluster rect { fill: ${t.clusterBkg}; stroke: ${t.clusterBorder}; stroke-width: 1px; } .cluster text { fill: ${t.titleColor}; } .cluster span { color: ${t.titleColor}; } /* .cluster div { color: ${t.titleColor}; } */ div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: ${t.fontFamily}; font-size: 12px; background: ${t.tertiaryColor}; border: 1px solid ${t.border2}; border-radius: 2px; pointer-events: none; z-index: 100; } .flowchartTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } rect.text { fill: none; stroke-width: 0; } .icon-shape, .image-shape { background-color: ${t.edgeLabelBackground}; p { background-color: ${t.edgeLabelBackground}; padding: 2px; } rect { opacity: 0.5; background-color: ${t.edgeLabelBackground}; fill: ${t.edgeLabelBackground}; } text-align: center; } `,"getStyles"),lRe=oRe,cRe={parser:aRe,db:y9,renderer:iRe,styles:lRe,init:v(t=>{t.flowchart||(t.flowchart={}),t.layout&&VS({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,VS({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),y9.clear(),y9.setGen("gen-2")},"init")}});var Ane,_ne=F(()=>{Ane=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i});function uRe(t){return typeof t=="string"&&Ane.test(t)}var Lne,Rne=F(()=>{_ne();Lne=uRe});function Nne(t,e=0){return da[t[e+0]]+da[t[e+1]]+da[t[e+2]]+da[t[e+3]]+"-"+da[t[e+4]]+da[t[e+5]]+"-"+da[t[e+6]]+da[t[e+7]]+"-"+da[t[e+8]]+da[t[e+9]]+"-"+da[t[e+10]]+da[t[e+11]]+da[t[e+12]]+da[t[e+13]]+da[t[e+14]]+da[t[e+15]]}var da,Ine=F(()=>{da=[];for(let t=0;t<256;++t)da.push((t+256).toString(16).slice(1))});function hRe(t){if(!Lne(t))throw TypeError("Invalid UUID");let e,r=new Uint8Array(16);return r[0]=(e=parseInt(t.slice(0,8),16))>>>24,r[1]=e>>>16&255,r[2]=e>>>8&255,r[3]=e&255,r[4]=(e=parseInt(t.slice(9,13),16))>>>8,r[5]=e&255,r[6]=(e=parseInt(t.slice(14,18),16))>>>8,r[7]=e&255,r[8]=(e=parseInt(t.slice(19,23),16))>>>8,r[9]=e&255,r[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,r[11]=e/4294967296&255,r[12]=e>>>24&255,r[13]=e>>>16&255,r[14]=e>>>8&255,r[15]=e&255,r}var Mne,Dne=F(()=>{Rne();Mne=hRe});function fRe(t){t=unescape(encodeURIComponent(t));let e=[];for(let r=0;r{Ine();Dne();dRe="6ba7b810-9dad-11d1-80b4-00c04fd430c8",pRe="6ba7b811-9dad-11d1-80b4-00c04fd430c8"});function gRe(t,e,r,n){switch(t){case 0:return e&r^~e&n;case 1:return e^r^n;case 2:return e&r^e&n^r&n;case 3:return e^r^n}}function S9(t,e){return t<>>32-e}function mRe(t){let e=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if(typeof t=="string"){let s=unescape(encodeURIComponent(t));t=[];for(let o=0;o>>0;d=f,f=h,h=S9(u,30)>>>0,u=l,l=m}r[0]=r[0]+l>>>0,r[1]=r[1]+u>>>0,r[2]=r[2]+h>>>0,r[3]=r[3]+f>>>0,r[4]=r[4]+d>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,r[0]&255,r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,r[1]&255,r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,r[2]&255,r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,r[3]&255,r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,r[4]&255]}var Pne,Bne=F(()=>{Pne=mRe});var vRe,C9,Fne=F(()=>{One();Bne();vRe=E9("v5",80,Pne),C9=vRe});var zne=F(()=>{Fne()});var Wne={};vr(Wne,{diagram:()=>$Re});function Vne(t="",e=""){let r=t.replace(_Re,"");return`${_9(e)}${_9(r)}${C9(t,PRe)}`}function _9(t=""){return t.length>0?`${t}-`:""}var A9,yRe,Od,L9,xRe,bRe,Gne,wRe,kRe,TRe,ERe,SRe,CRe,kl,ARe,Tl,_Re,Ai,wy,LRe,RRe,NRe,IRe,Une,MRe,$ne,DRe,ORe,PRe,BRe,FRe,zRe,$Re,Hne=F(()=>{kn();or();As();lr();uy();zne();A9=function(){var t=v(function(S,C,M,R){for(M=M||{},R=S.length;R--;M[S[R]]=C);return M},"o"),e=[6,8,10,20,22,24,26,27,28],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,14],o=[1,15],l=[1,21],u=[1,22],h=[1,23],f=[1,24],d=[1,25],p=[6,8,10,13,15,18,19,20,22,24,26,27,28,41,42,43,44,45],g=[1,34],m=[27,28,46,47],y=[41,42,43,44,45],x=[17,34],b=[1,54],w=[1,53],_=[17,34,36,38],k={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,":":13,role:14,BLOCK_START:15,attributes:16,BLOCK_STOP:17,SQS:18,SQE:19,title:20,title_value:21,acc_title:22,acc_title_value:23,acc_descr:24,acc_descr_value:25,acc_descr_multiline_value:26,ALPHANUM:27,ENTITY_NAME:28,attribute:29,attributeType:30,attributeName:31,attributeKeyTypeList:32,attributeComment:33,ATTRIBUTE_WORD:34,attributeKeyType:35,COMMA:36,ATTRIBUTE_KEY:37,COMMENT:38,cardinality:39,relType:40,ZERO_OR_ONE:41,ZERO_OR_MORE:42,ONE_OR_MORE:43,ONLY_ONE:44,MD_PARENT:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:":",15:"BLOCK_START",17:"BLOCK_STOP",18:"SQS",19:"SQE",20:"title",21:"title_value",22:"acc_title",23:"acc_title_value",24:"acc_descr",25:"acc_descr_value",26:"acc_descr_multiline_value",27:"ALPHANUM",28:"ENTITY_NAME",34:"ATTRIBUTE_WORD",36:"COMMA",37:"ATTRIBUTE_KEY",38:"COMMENT",41:"ZERO_OR_ONE",42:"ZERO_OR_MORE",43:"ONE_OR_MORE",44:"ONLY_ONE",45:"MD_PARENT",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,4],[9,3],[9,1],[9,7],[9,6],[9,4],[9,2],[9,2],[9,2],[9,1],[11,1],[11,1],[16,1],[16,2],[29,2],[29,3],[29,3],[29,4],[30,1],[31,1],[32,1],[32,3],[35,1],[33,1],[12,3],[39,1],[39,1],[39,1],[39,1],[39,1],[40,1],[40,1],[14,1],[14,1],[14,1]],performAction:v(function(C,M,R,T,I,A,D){var N=A.length-1;switch(I){case 1:break;case 2:this.$=[];break;case 3:A[N-1].push(A[N]),this.$=A[N-1];break;case 4:case 5:this.$=A[N];break;case 6:case 7:this.$=[];break;case 8:T.addEntity(A[N-4]),T.addEntity(A[N-2]),T.addRelationship(A[N-4],A[N],A[N-2],A[N-3]);break;case 9:T.addEntity(A[N-3]),T.addAttributes(A[N-3],A[N-1]);break;case 10:T.addEntity(A[N-2]);break;case 11:T.addEntity(A[N]);break;case 12:T.addEntity(A[N-6],A[N-4]),T.addAttributes(A[N-6],A[N-1]);break;case 13:T.addEntity(A[N-5],A[N-3]);break;case 14:T.addEntity(A[N-3],A[N-1]);break;case 15:case 16:this.$=A[N].trim(),T.setAccTitle(this.$);break;case 17:case 18:this.$=A[N].trim(),T.setAccDescription(this.$);break;case 19:case 43:this.$=A[N];break;case 20:case 41:case 42:this.$=A[N].replace(/"/g,"");break;case 21:case 29:this.$=[A[N]];break;case 22:A[N].push(A[N-1]),this.$=A[N];break;case 23:this.$={attributeType:A[N-1],attributeName:A[N]};break;case 24:this.$={attributeType:A[N-2],attributeName:A[N-1],attributeKeyTypeList:A[N]};break;case 25:this.$={attributeType:A[N-2],attributeName:A[N-1],attributeComment:A[N]};break;case 26:this.$={attributeType:A[N-3],attributeName:A[N-2],attributeKeyTypeList:A[N-1],attributeComment:A[N]};break;case 27:case 28:case 31:this.$=A[N];break;case 30:A[N-2].push(A[N]),this.$=A[N-2];break;case 32:this.$=A[N].replace(/"/g,"");break;case 33:this.$={cardA:A[N],relType:A[N-1],cardB:A[N-2]};break;case 34:this.$=T.Cardinality.ZERO_OR_ONE;break;case 35:this.$=T.Cardinality.ZERO_OR_MORE;break;case 36:this.$=T.Cardinality.ONE_OR_MORE;break;case 37:this.$=T.Cardinality.ONLY_ONE;break;case 38:this.$=T.Cardinality.MD_PARENT;break;case 39:this.$=T.Identification.NON_IDENTIFYING;break;case 40:this.$=T.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,20:r,22:n,24:i,26:a,27:s,28:o},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:16,11:9,20:r,22:n,24:i,26:a,27:s,28:o},t(e,[2,5]),t(e,[2,6]),t(e,[2,11],{12:17,39:20,15:[1,18],18:[1,19],41:l,42:u,43:h,44:f,45:d}),{21:[1,26]},{23:[1,27]},{25:[1,28]},t(e,[2,18]),t(p,[2,19]),t(p,[2,20]),t(e,[2,4]),{11:29,27:s,28:o},{16:30,17:[1,31],29:32,30:33,34:g},{11:35,27:s,28:o},{40:36,46:[1,37],47:[1,38]},t(m,[2,34]),t(m,[2,35]),t(m,[2,36]),t(m,[2,37]),t(m,[2,38]),t(e,[2,15]),t(e,[2,16]),t(e,[2,17]),{13:[1,39]},{17:[1,40]},t(e,[2,10]),{16:41,17:[2,21],29:32,30:33,34:g},{31:42,34:[1,43]},{34:[2,27]},{19:[1,44]},{39:45,41:l,42:u,43:h,44:f,45:d},t(y,[2,39]),t(y,[2,40]),{14:46,27:[1,49],28:[1,48],48:[1,47]},t(e,[2,9]),{17:[2,22]},t(x,[2,23],{32:50,33:51,35:52,37:b,38:w}),t([17,34,37,38],[2,28]),t(e,[2,14],{15:[1,55]}),t([27,28],[2,33]),t(e,[2,8]),t(e,[2,41]),t(e,[2,42]),t(e,[2,43]),t(x,[2,24],{33:56,36:[1,57],38:w}),t(x,[2,25]),t(_,[2,29]),t(x,[2,32]),t(_,[2,31]),{16:58,17:[1,59],29:32,30:33,34:g},t(x,[2,26]),{35:60,37:b},{17:[1,61]},t(e,[2,13]),t(_,[2,30]),t(e,[2,12])],defaultActions:{34:[2,27],41:[2,22]},parseError:v(function(C,M){if(M.recoverable)this.trace(C);else{var R=new Error(C);throw R.hash=M,R}},"parseError"),parse:v(function(C){var M=this,R=[0],T=[],I=[null],A=[],D=this.table,N="",O=0,B=0,P=0,$=2,z=1,H=A.slice.call(arguments,1),J=Object.create(this.lexer),X={yy:{}};for(var oe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,oe)&&(X.yy[oe]=this.yy[oe]);J.setInput(C,X.yy),X.yy.lexer=J,X.yy.parser=this,typeof J.yylloc>"u"&&(J.yylloc={});var K=J.yylloc;A.push(K);var ee=J.options&&J.options.ranges;typeof X.yy.parseError=="function"?this.parseError=X.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Q(De){R.length=R.length-2*De,I.length=I.length-De,A.length=A.length-De}v(Q,"popStack");function W(){var De;return De=T.pop()||J.lex()||z,typeof De!="number"&&(De instanceof Array&&(T=De,De=T.pop()),De=M.symbols_[De]||De),De}v(W,"lex");for(var Y,Z,se,ce,ue,te,Ne={},ae,we,Ie,Ee;;){if(se=R[R.length-1],this.defaultActions[se]?ce=this.defaultActions[se]:((Y===null||typeof Y>"u")&&(Y=W()),ce=D[se]&&D[se][Y]),typeof ce>"u"||!ce.length||!ce[0]){var Oe="";Ee=[];for(ae in D[se])this.terminals_[ae]&&ae>$&&Ee.push("'"+this.terminals_[ae]+"'");J.showPosition?Oe="Parse error on line "+(O+1)+`: `+J.showPosition()+` Expecting `+Ee.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":Oe="Parse error on line "+(O+1)+": Unexpected "+(Y==z?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(Oe,{text:J.match,token:this.terminals_[Y]||Y,line:J.yylineno,loc:K,expected:Ee})}if(ce[0]instanceof Array&&ce.length>1)throw new Error("Parse Error: multiple actions possible at state: "+se+", token: "+Y);switch(ce[0]){case 1:R.push(Y),I.push(J.yytext),A.push(J.yylloc),R.push(ce[1]),Y=null,Z?(Y=Z,Z=null):(B=J.yyleng,N=J.yytext,O=J.yylineno,K=J.yylloc,P>0&&P--);break;case 2:if(we=this.productions_[ce[1]][1],Ne.$=I[I.length-we],Ne._$={first_line:A[A.length-(we||1)].first_line,last_line:A[A.length-1].last_line,first_column:A[A.length-(we||1)].first_column,last_column:A[A.length-1].last_column},ee&&(Ne._$.range=[A[A.length-(we||1)].range[0],A[A.length-1].range[1]]),te=this.performAction.apply(Ne,[N,B,O,X.yy,ce[1],I,A].concat(H)),typeof te<"u")return te;we&&(R=R.slice(0,-1*we*2),I=I.slice(0,-1*we),A=A.slice(0,-1*we)),R.push(this.productions_[ce[1]][0]),I.push(Ne.$),A.push(Ne._$),Ie=D[R[R.length-2]][R[R.length-1]],R.push(Ie);break;case 3:return!0}}return!0},"parse")},E=function(){var S={EOF:1,parseError:v(function(M,R){if(this.yy.parser)this.yy.parser.parseError(M,R);else throw new Error(M)},"parseError"),setInput:v(function(C,M){return this.yy=M||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var M=C.match(/(?:\r\n?|\n).*/g);return M?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:v(function(C){var M=C.length,R=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-M),this.offset-=M;var T=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),R.length-1&&(this.yylineno-=R.length-1);var I=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:R?(R.length===T.length?this.yylloc.first_column:0)+T[T.length-R.length].length-R[0].length:this.yylloc.first_column-M},this.options.ranges&&(this.yylloc.range=[I[0],I[0]+this.yyleng-M]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(C){this.unput(this.match.slice(C))},"less"),pastInput:v(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var C=this.pastInput(),M=new Array(C.length+1).join("-");return C+this.upcomingInput()+` `+M+"^"},"showPosition"),test_match:v(function(C,M){var R,T,I;if(this.options.backtrack_lexer&&(I={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(I.yylloc.range=this.yylloc.range.slice(0))),T=C[0].match(/(?:\r\n?|\n).*/g),T&&(this.yylineno+=T.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:T?T[T.length-1].length-T[T.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],R=this.performAction.call(this,this.yy,this,M,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),R)return R;if(this._backtrack){for(var A in I)this[A]=I[A];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,M,R,T;this._more||(this.yytext="",this.match="");for(var I=this._currentRules(),A=0;AM[0].length)){if(M=R,T=A,this.options.backtrack_lexer){if(C=this.test_match(R,I[A]),C!==!1)return C;if(this._backtrack){M=!1;continue}else return!1}else if(!this.options.flex)break}return M?(C=this.test_match(M,I[T]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var M=this.next();return M||this.lex()},"lex"),begin:v(function(M){this.conditionStack.push(M)},"begin"),popState:v(function(){var M=this.conditionStack.length-1;return M>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(M){return M=this.conditionStack.length-1-Math.abs(M||0),M>=0?this.conditionStack[M]:"INITIAL"},"topState"),pushState:v(function(M){this.begin(M)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(M,R,T,I){var A=I;switch(T){case 0:return this.begin("acc_title"),22;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),24;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 10;case 8:break;case 9:return 8;case 10:return 28;case 11:return 48;case 12:return 4;case 13:return this.begin("block"),15;break;case 14:return 36;case 15:break;case 16:return 37;case 17:return 34;case 18:return 34;case 19:return 38;case 20:break;case 21:return this.popState(),17;break;case 22:return R.yytext[0];case 23:return 18;case 24:return 19;case 25:return 41;case 26:return 43;case 27:return 43;case 28:return 43;case 29:return 41;case 30:return 41;case 31:return 42;case 32:return 42;case 33:return 42;case 34:return 42;case 35:return 42;case 36:return 43;case 37:return 42;case 38:return 43;case 39:return 44;case 40:return 44;case 41:return 44;case 42:return 44;case 43:return 41;case 44:return 42;case 45:return 43;case 46:return 45;case 47:return 46;case 48:return 47;case 49:return 47;case 50:return 46;case 51:return 46;case 52:return 46;case 53:return 27;case 54:return R.yytext[0];case 55:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:,)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[\*A-Za-z_][A-Za-z0-9\-_\[\]\(\)]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[14,15,16,17,18,19,20,21,22],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55],inclusive:!0}}};return S}();k.lexer=E;function L(){this.yy={}}return v(L,"Parser"),L.prototype=k,k.Parser=L,new L}();A9.parser=A9;yRe=A9,Od=new Map,L9=[],xRe={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},bRe={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},Gne=v(function(t,e=void 0){return Od.has(t)?!Od.get(t).alias&&e&&(Od.get(t).alias=e,re.info(`Add alias '${e}' to entity '${t}'`)):(Od.set(t,{attributes:[],alias:e}),re.info("Added new entity :",t)),Od.get(t)},"addEntity"),wRe=v(()=>Od,"getEntities"),kRe=v(function(t,e){let r=Gne(t),n;for(n=e.length-1;n>=0;n--)r.attributes.push(e[n]),re.debug("Added attribute ",e[n].attributeName)},"addAttributes"),TRe=v(function(t,e,r,n){let i={entityA:t,roleA:e,entityB:r,relSpec:n};L9.push(i),re.debug("Added new relationship :",i)},"addRelationship"),ERe=v(()=>L9,"getRelationships"),SRe=v(function(){Od=new Map,L9=[],xr()},"clear"),CRe={Cardinality:xRe,Identification:bRe,getConfig:v(()=>pe().er,"getConfig"),addEntity:Gne,addAttributes:kRe,getEntities:wRe,addRelationship:TRe,getRelationships:ERe,clear:SRe,setAccTitle:Tr,getAccTitle:_r,setAccDescription:Lr,getAccDescription:Rr,setDiagramTitle:tn,getDiagramTitle:qr},kl={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END",MD_PARENT_END:"MD_PARENT_END",MD_PARENT_START:"MD_PARENT_START"},ARe=v(function(t,e){let r;t.append("defs").append("marker").attr("id",kl.MD_PARENT_START).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",kl.MD_PARENT_END).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",kl.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",kl.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),r=t.append("defs").append("marker").attr("id",kl.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),r=t.append("defs").append("marker").attr("id",kl.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",kl.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",kl.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),r=t.append("defs").append("marker").attr("id",kl.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),r=t.append("defs").append("marker").attr("id",kl.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"insertMarkers"),Tl={ERMarkers:kl,insertMarkers:ARe},_Re=/[^\dA-Za-z](\W)*/g,Ai={},wy=new Map,LRe=v(function(t){let e=Object.keys(t);for(let r of e)Ai[r]=t[r]},"setConf"),RRe=v((t,e,r)=>{let n=Ai.entityPadding/3,i=Ai.entityPadding/3,a=Ai.fontSize*.85,s=e.node().getBBox(),o=[],l=!1,u=!1,h=0,f=0,d=0,p=0,g=s.height+n*2,m=1;r.forEach(w=>{w.attributeKeyTypeList!==void 0&&w.attributeKeyTypeList.length>0&&(l=!0),w.attributeComment!==void 0&&(u=!0)}),r.forEach(w=>{let _=`${e.node().id}-attr-${m}`,k=0,E=iu(w.attributeType),L=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(E),S=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(w.attributeName),C={};C.tn=L,C.nn=S;let M=L.node().getBBox(),R=S.node().getBBox();if(h=Math.max(h,M.width),f=Math.max(f,R.width),k=Math.max(M.height,R.height),l){let T=w.attributeKeyTypeList!==void 0?w.attributeKeyTypeList.join(","):"",I=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(T);C.kn=I;let A=I.node().getBBox();d=Math.max(d,A.width),k=Math.max(k,A.height)}if(u){let T=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(w.attributeComment||"");C.cn=T;let I=T.node().getBBox();p=Math.max(p,I.width),k=Math.max(k,I.height)}C.height=k,o.push(C),g+=k+n*2,m+=1});let y=4;l&&(y+=2),u&&(y+=2);let x=h+f+d+p,b={width:Math.max(Ai.minEntityWidth,Math.max(s.width+Ai.entityPadding*2,x+i*y)),height:r.length>0?g:Math.max(Ai.minEntityHeight,s.height+Ai.entityPadding*2)};if(r.length>0){let w=Math.max(0,(b.width-x-i*y)/(y/2));e.attr("transform","translate("+b.width/2+","+(n+s.height/2)+")");let _=s.height+n*2,k="attributeBoxOdd";o.forEach(E=>{let L=_+n+E.height/2;E.tn.attr("transform","translate("+i+","+L+")");let S=t.insert("rect","#"+E.tn.node().id).classed(`er ${k}`,!0).attr("x",0).attr("y",_).attr("width",h+i*2+w).attr("height",E.height+n*2),C=parseFloat(S.attr("x"))+parseFloat(S.attr("width"));E.nn.attr("transform","translate("+(C+i)+","+L+")");let M=t.insert("rect","#"+E.nn.node().id).classed(`er ${k}`,!0).attr("x",C).attr("y",_).attr("width",f+i*2+w).attr("height",E.height+n*2),R=parseFloat(M.attr("x"))+parseFloat(M.attr("width"));if(l){E.kn.attr("transform","translate("+(R+i)+","+L+")");let T=t.insert("rect","#"+E.kn.node().id).classed(`er ${k}`,!0).attr("x",R).attr("y",_).attr("width",d+i*2+w).attr("height",E.height+n*2);R=parseFloat(T.attr("x"))+parseFloat(T.attr("width"))}u&&(E.cn.attr("transform","translate("+(R+i)+","+L+")"),t.insert("rect","#"+E.cn.node().id).classed(`er ${k}`,"true").attr("x",R).attr("y",_).attr("width",p+i*2+w).attr("height",E.height+n*2)),_+=E.height+n*2,k=k==="attributeBoxOdd"?"attributeBoxEven":"attributeBoxOdd"})}else b.height=Math.max(Ai.minEntityHeight,g),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b},"drawAttributes"),NRe=v(function(t,e,r){let n=[...e.keys()],i;return n.forEach(function(a){let s=Vne(a,"entity");wy.set(a,s);let o=t.append("g").attr("id",s);i=i===void 0?s:i;let l="text-"+s,u=o.append("text").classed("er entityLabel",!0).attr("id",l).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",pe().fontFamily).style("font-size",Ai.fontSize+"px").text(e.get(a).alias??a),{width:h,height:f}=RRe(o,u,e.get(a).attributes),p=o.insert("rect","#"+l).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",h).attr("height",f).node().getBBox();r.setNode(s,{width:p.width,height:p.height,shape:"rect",id:s})}),i},"drawEntities"),IRe=v(function(t,e){e.nodes().forEach(function(r){r!==void 0&&e.node(r)!==void 0&&t.select("#"+r).attr("transform","translate("+(e.node(r).x-e.node(r).width/2)+","+(e.node(r).y-e.node(r).height/2)+" )")})},"adjustEntities"),Une=v(function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")},"getEdgeName"),MRe=v(function(t,e){return t.forEach(function(r){e.setEdge(wy.get(r.entityA),wy.get(r.entityB),{relationship:r},Une(r))}),t},"addRelationships"),$ne=0,DRe=v(function(t,e,r,n,i){$ne++;let a=r.edge(wy.get(e.entityA),wy.get(e.entityB),Une(e)),s=ms().x(function(m){return m.x}).y(function(m){return m.y}).curve(gl),o=t.insert("path","#"+n).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",Ai.stroke).style("fill","none");e.relSpec.relType===i.db.Identification.NON_IDENTIFYING&&o.attr("stroke-dasharray","8,8");let l="";switch(Ai.arrowMarkerAbsolute&&(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,l=l.replace(/\(/g,"\\("),l=l.replace(/\)/g,"\\)")),e.relSpec.cardA){case i.db.Cardinality.ZERO_OR_ONE:o.attr("marker-end","url("+l+"#"+Tl.ERMarkers.ZERO_OR_ONE_END+")");break;case i.db.Cardinality.ZERO_OR_MORE:o.attr("marker-end","url("+l+"#"+Tl.ERMarkers.ZERO_OR_MORE_END+")");break;case i.db.Cardinality.ONE_OR_MORE:o.attr("marker-end","url("+l+"#"+Tl.ERMarkers.ONE_OR_MORE_END+")");break;case i.db.Cardinality.ONLY_ONE:o.attr("marker-end","url("+l+"#"+Tl.ERMarkers.ONLY_ONE_END+")");break;case i.db.Cardinality.MD_PARENT:o.attr("marker-end","url("+l+"#"+Tl.ERMarkers.MD_PARENT_END+")");break}switch(e.relSpec.cardB){case i.db.Cardinality.ZERO_OR_ONE:o.attr("marker-start","url("+l+"#"+Tl.ERMarkers.ZERO_OR_ONE_START+")");break;case i.db.Cardinality.ZERO_OR_MORE:o.attr("marker-start","url("+l+"#"+Tl.ERMarkers.ZERO_OR_MORE_START+")");break;case i.db.Cardinality.ONE_OR_MORE:o.attr("marker-start","url("+l+"#"+Tl.ERMarkers.ONE_OR_MORE_START+")");break;case i.db.Cardinality.ONLY_ONE:o.attr("marker-start","url("+l+"#"+Tl.ERMarkers.ONLY_ONE_START+")");break;case i.db.Cardinality.MD_PARENT:o.attr("marker-start","url("+l+"#"+Tl.ERMarkers.MD_PARENT_START+")");break}let u=o.node().getTotalLength(),h=o.node().getPointAtLength(u*.5),f="rel"+$ne,d=e.roleA.split(/
    /g),p=t.append("text").classed("er relationshipLabel",!0).attr("id",f).attr("x",h.x).attr("y",h.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",pe().fontFamily).style("font-size",Ai.fontSize+"px");if(d.length==1)p.text(e.roleA);else{let m=-(d.length-1)*.5;d.forEach((y,x)=>{p.append("tspan").attr("x",h.x).attr("dy",`${x===0?m:1}em`).text(y)})}let g=p.node().getBBox();t.insert("rect","#"+f).classed("er relationshipLabelBox",!0).attr("x",h.x-g.width/2).attr("y",h.y-g.height/2).attr("width",g.width).attr("height",g.height)},"drawRelationshipFromLayout"),ORe=v(function(t,e,r,n){Ai=pe().er,re.info("Drawing ER diagram");let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let o=(i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body")).select(`[id='${e}']`);Tl.insertMarkers(o,Ai);let l;l=new Sr({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:Ai.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}});let u=NRe(o,n.db.getEntities(),l),h=MRe(n.db.getRelationships(),l);Ru(l),IRe(o,l),h.forEach(function(m){DRe(o,m,l,u,n)});let f=Ai.diagramPadding;Ut.insertTitle(o,"entityTitleText",Ai.titleTopMargin,n.db.getDiagramTitle());let d=o.node().getBBox(),p=d.width+f*2,g=d.height+f*2;Hr(o,g,p,Ai.useMaxWidth),o.attr("viewBox",`${d.x-f} ${d.y-f} ${p} ${g}`)},"draw"),PRe="28e9f9db-3c8d-5aa5-9faf-44286ae5937c";v(Vne,"generateId");v(_9,"strWithHyphen");BRe={setConf:LRe,draw:ORe},FRe=v(t=>` .entityBox { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; } .attributeBoxOdd { fill: ${t.attributeBackgroundColorOdd}; stroke: ${t.nodeBorder}; } .attributeBoxEven { fill: ${t.attributeBackgroundColorEven}; stroke: ${t.nodeBorder}; } .relationshipLabelBox { fill: ${t.tertiaryColor}; opacity: 0.7; background-color: ${t.tertiaryColor}; rect { opacity: 0.5; } } .relationshipLine { stroke: ${t.lineColor}; } .entityTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } #MD_PARENT_START { fill: #f5f5f5 !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #MD_PARENT_END { fill: #f5f5f5 !important; stroke: ${t.lineColor} !important; stroke-width: 1; } `,"getStyles"),zRe=FRe,$Re={parser:yRe,db:CRe,renderer:BRe,styles:zRe}});function Pu(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var ky=F(()=>{or();v(Pu,"populateCommonDb")});var Rg,Hw=F(()=>{or();Rg=class{constructor(t){this.init=t,this.records=this.init()}static{v(this,"ImperativeState")}reset(){this.records=this.init()}}});function Xn(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function pa(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function R9(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function Bd(t){return typeof t=="object"&&t!==null&&Xn(t.container)&&pa(t.reference)&&typeof t.message=="string"}function eo(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function Qh(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function Ty(t){return eo(t)&&typeof t.fullText=="string"}var Pd,$o=F(()=>{Pd=class{constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return Xn(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}}});function GRe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function qw(t){return!!t&&typeof t[Symbol.iterator]=="function"}function Xr(...t){if(t.length===1){let e=t[0];if(e instanceof to)return e;if(qw(e))return new to(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new to(()=>({index:0}),r=>r.index1?new to(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{to=class t{constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){let r=e[Symbol.iterator]();return new t(()=>({first:this.startFn(),firstDone:!1}),n=>{let i;if(!n.firstDone){do if(i=this.nextFn(n.first),!i.done)return i;while(!i.done);n.firstDone=!0}do if(i=r.next(),!i.done)return i;while(!i.done);return Za})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=GRe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?Za:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return Za})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(qw(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return Za})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(qw(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return Za})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?Za:this.nextFn(r.state)))}distinct(e){let r=new Set;return this.filter(n=>{let i=e?e(n):n;return r.has(i)?!1:(r.add(i),!0)})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};Ey=new to(()=>{},()=>Za),Za=Object.freeze({done:!0,value:void 0});Cc=class extends to{constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return Za})}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),prune:()=>{e.state.pruned=!0},[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,o)=>s+o,0)}t.sum=e;function r(a){return a.reduce((s,o)=>s*o,0)}t.product=r;function n(a){return a.reduce((s,o)=>Math.min(s,o))}t.min=n;function i(a){return a.reduce((s,o)=>Math.max(s,o))}t.max=i})(Ng||(Ng={}))});var Xw={};vr(Xw,{DefaultNameRegexp:()=>Yw,RangeComparison:()=>Bu,compareRange:()=>Yne,findCommentNode:()=>D9,findDeclarationNodeAtOffset:()=>VRe,findLeafNodeAtOffset:()=>O9,findLeafNodeBeforeOffset:()=>Xne,flattenCst:()=>URe,getInteriorNodes:()=>qRe,getNextNode:()=>WRe,getPreviousNode:()=>Kne,getStartlineNode:()=>HRe,inRange:()=>M9,isChildNode:()=>I9,isCommentNode:()=>N9,streamCst:()=>Fd,toDocumentSegment:()=>zd,tokenToRange:()=>Ig});function Fd(t){return new Cc(t,e=>eo(e)?e.content:[],{includeRoot:!0})}function URe(t){return Fd(t).filter(Qh)}function I9(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function Ig(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function zd(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function Yne(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>e.end.character)return Bu.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineBu.After}function VRe(t,e,r=Yw){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return O9(t,e)}}function D9(t,e){if(t){let r=Kne(t,!0);if(r&&N9(r,e))return r;if(Ty(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(N9(a,e))return a}}}}function N9(t,e){return Qh(t)&&e.includes(t.tokenType.name)}function O9(t,e){if(Qh(t))return t;if(eo(t)){let r=jne(t,e,!1);if(r)return O9(r,e)}}function Xne(t,e){if(Qh(t))return t;if(eo(t)){let r=jne(t,e,!0);if(r)return Xne(r,e)}}function jne(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),o=t.content[s];if(o.offset<=e&&o.end>e)return o;o.end<=e?(a=r?o:void 0,n=s+1):i=s-1}return a}function Kne(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function WRe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{$o();Ls();(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside"})(Bu||(Bu={}));Yw=/^[\w\p{L}]$/u});function Jh(t){throw new Error("Error! The input value was not handled.")}var $d,jw=F(()=>{$d=class extends Error{constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}}});var Ly={};vr(Ly,{AbstractElement:()=>B9,AbstractRule:()=>Sy,AbstractType:()=>Cy,Action:()=>hL,Alternatives:()=>fL,ArrayLiteral:()=>F9,ArrayType:()=>z9,Assignment:()=>dL,BooleanLiteral:()=>G9,CharacterRange:()=>pL,Condition:()=>Kw,Conjunction:()=>V9,CrossReference:()=>mL,Disjunction:()=>H9,EndOfFile:()=>vL,Grammar:()=>Y9,GrammarImport:()=>Qne,Group:()=>xL,InferredType:()=>X9,Interface:()=>j9,Keyword:()=>bL,LangiumGrammarAstReflection:()=>Mg,LangiumGrammarTerminals:()=>XRe,NamedArgument:()=>Jne,NegatedToken:()=>wL,Negation:()=>K9,NumberLiteral:()=>Q9,Parameter:()=>J9,ParameterReference:()=>eL,ParserRule:()=>rL,ReferenceType:()=>nL,RegexToken:()=>TL,ReturnType:()=>eie,RuleCall:()=>SL,SimpleType:()=>sL,StringLiteral:()=>oL,TerminalAlternatives:()=>CL,TerminalGroup:()=>_L,TerminalRule:()=>Qw,TerminalRuleCall:()=>RL,Type:()=>lL,TypeAttribute:()=>tie,TypeDefinition:()=>P9,UnionType:()=>cL,UnorderedGroup:()=>NL,UntilToken:()=>IL,ValueLiteral:()=>Zw,Wildcard:()=>DL,isAbstractElement:()=>Ay,isAbstractRule:()=>jRe,isAbstractType:()=>KRe,isAction:()=>Fu,isAlternatives:()=>rk,isArrayLiteral:()=>tNe,isArrayType:()=>$9,isAssignment:()=>Sl,isBooleanLiteral:()=>U9,isCharacterRange:()=>gL,isCondition:()=>ZRe,isConjunction:()=>W9,isCrossReference:()=>Gd,isDisjunction:()=>q9,isEndOfFile:()=>yL,isFeatureName:()=>QRe,isGrammar:()=>rNe,isGrammarImport:()=>nNe,isGroup:()=>ef,isInferredType:()=>Jw,isInterface:()=>ek,isKeyword:()=>Uo,isNamedArgument:()=>iNe,isNegatedToken:()=>kL,isNegation:()=>Z9,isNumberLiteral:()=>aNe,isParameter:()=>sNe,isParameterReference:()=>tL,isParserRule:()=>Ra,isPrimitiveType:()=>Zne,isReferenceType:()=>iL,isRegexToken:()=>EL,isReturnType:()=>aL,isRuleCall:()=>Cl,isSimpleType:()=>tk,isStringLiteral:()=>oNe,isTerminalAlternatives:()=>AL,isTerminalGroup:()=>LL,isTerminalRule:()=>Go,isTerminalRuleCall:()=>nk,isType:()=>_y,isTypeAttribute:()=>lNe,isTypeDefinition:()=>JRe,isUnionType:()=>uL,isUnorderedGroup:()=>ik,isUntilToken:()=>ML,isValueLiteral:()=>eNe,isWildcard:()=>OL,reflection:()=>nr});function jRe(t){return nr.isInstance(t,Sy)}function KRe(t){return nr.isInstance(t,Cy)}function ZRe(t){return nr.isInstance(t,Kw)}function QRe(t){return Zne(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function Zne(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function JRe(t){return nr.isInstance(t,P9)}function eNe(t){return nr.isInstance(t,Zw)}function Ay(t){return nr.isInstance(t,B9)}function tNe(t){return nr.isInstance(t,F9)}function $9(t){return nr.isInstance(t,z9)}function U9(t){return nr.isInstance(t,G9)}function W9(t){return nr.isInstance(t,V9)}function q9(t){return nr.isInstance(t,H9)}function rNe(t){return nr.isInstance(t,Y9)}function nNe(t){return nr.isInstance(t,Qne)}function Jw(t){return nr.isInstance(t,X9)}function ek(t){return nr.isInstance(t,j9)}function iNe(t){return nr.isInstance(t,Jne)}function Z9(t){return nr.isInstance(t,K9)}function aNe(t){return nr.isInstance(t,Q9)}function sNe(t){return nr.isInstance(t,J9)}function tL(t){return nr.isInstance(t,eL)}function Ra(t){return nr.isInstance(t,rL)}function iL(t){return nr.isInstance(t,nL)}function aL(t){return nr.isInstance(t,eie)}function tk(t){return nr.isInstance(t,sL)}function oNe(t){return nr.isInstance(t,oL)}function Go(t){return nr.isInstance(t,Qw)}function _y(t){return nr.isInstance(t,lL)}function lNe(t){return nr.isInstance(t,tie)}function uL(t){return nr.isInstance(t,cL)}function Fu(t){return nr.isInstance(t,hL)}function rk(t){return nr.isInstance(t,fL)}function Sl(t){return nr.isInstance(t,dL)}function gL(t){return nr.isInstance(t,pL)}function Gd(t){return nr.isInstance(t,mL)}function yL(t){return nr.isInstance(t,vL)}function ef(t){return nr.isInstance(t,xL)}function Uo(t){return nr.isInstance(t,bL)}function kL(t){return nr.isInstance(t,wL)}function EL(t){return nr.isInstance(t,TL)}function Cl(t){return nr.isInstance(t,SL)}function AL(t){return nr.isInstance(t,CL)}function LL(t){return nr.isInstance(t,_L)}function nk(t){return nr.isInstance(t,RL)}function ik(t){return nr.isInstance(t,NL)}function ML(t){return nr.isInstance(t,IL)}function OL(t){return nr.isInstance(t,DL)}var XRe,Sy,Cy,Kw,P9,Zw,B9,F9,z9,G9,V9,H9,Y9,Qne,X9,j9,Jne,K9,Q9,J9,eL,rL,nL,eie,sL,oL,Qw,lL,tie,cL,hL,fL,dL,pL,mL,vL,xL,bL,wL,TL,SL,CL,_L,RL,NL,IL,DL,Mg,nr,Ac=F(()=>{$o();XRe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},Sy="AbstractRule";Cy="AbstractType";Kw="Condition";P9="TypeDefinition";Zw="ValueLiteral";B9="AbstractElement";F9="ArrayLiteral";z9="ArrayType";G9="BooleanLiteral";V9="Conjunction";H9="Disjunction";Y9="Grammar";Qne="GrammarImport";X9="InferredType";j9="Interface";Jne="NamedArgument";K9="Negation";Q9="NumberLiteral";J9="Parameter";eL="ParameterReference";rL="ParserRule";nL="ReferenceType";eie="ReturnType";sL="SimpleType";oL="StringLiteral";Qw="TerminalRule";lL="Type";tie="TypeAttribute";cL="UnionType";hL="Action";fL="Alternatives";dL="Assignment";pL="CharacterRange";mL="CrossReference";vL="EndOfFile";xL="Group";bL="Keyword";wL="NegatedToken";TL="RegexToken";SL="RuleCall";CL="TerminalAlternatives";_L="TerminalGroup";RL="TerminalRuleCall";NL="UnorderedGroup";IL="UntilToken";DL="Wildcard";Mg=class extends Pd{getAllTypes(){return["AbstractElement","AbstractRule","AbstractType","Action","Alternatives","ArrayLiteral","ArrayType","Assignment","BooleanLiteral","CharacterRange","Condition","Conjunction","CrossReference","Disjunction","EndOfFile","Grammar","GrammarImport","Group","InferredType","Interface","Keyword","NamedArgument","NegatedToken","Negation","NumberLiteral","Parameter","ParameterReference","ParserRule","ReferenceType","RegexToken","ReturnType","RuleCall","SimpleType","StringLiteral","TerminalAlternatives","TerminalGroup","TerminalRule","TerminalRuleCall","Type","TypeAttribute","TypeDefinition","UnionType","UnorderedGroup","UntilToken","ValueLiteral","Wildcard"]}computeIsSubtype(e,r){switch(e){case hL:case fL:case dL:case pL:case mL:case vL:case xL:case bL:case wL:case TL:case SL:case CL:case _L:case RL:case NL:case IL:case DL:return this.isSubtype(B9,r);case F9:case Q9:case oL:return this.isSubtype(Zw,r);case z9:case nL:case sL:case cL:return this.isSubtype(P9,r);case G9:return this.isSubtype(Kw,r)||this.isSubtype(Zw,r);case V9:case H9:case K9:case eL:return this.isSubtype(Kw,r);case X9:case j9:case lL:return this.isSubtype(Cy,r);case rL:return this.isSubtype(Sy,r)||this.isSubtype(Cy,r);case Qw:return this.isSubtype(Sy,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Cy;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return Sy;case"Grammar:usedGrammars":return Y9;case"NamedArgument:parameter":case"ParameterReference:parameter":return J9;case"TerminalRuleCall:rule":return Qw;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case"AbstractElement":return{name:"AbstractElement",properties:[{name:"cardinality"},{name:"lookahead"}]};case"ArrayLiteral":return{name:"ArrayLiteral",properties:[{name:"elements",defaultValue:[]}]};case"ArrayType":return{name:"ArrayType",properties:[{name:"elementType"}]};case"BooleanLiteral":return{name:"BooleanLiteral",properties:[{name:"true",defaultValue:!1}]};case"Conjunction":return{name:"Conjunction",properties:[{name:"left"},{name:"right"}]};case"Disjunction":return{name:"Disjunction",properties:[{name:"left"},{name:"right"}]};case"Grammar":return{name:"Grammar",properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case"GrammarImport":return{name:"GrammarImport",properties:[{name:"path"}]};case"InferredType":return{name:"InferredType",properties:[{name:"name"}]};case"Interface":return{name:"Interface",properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case"NamedArgument":return{name:"NamedArgument",properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case"Negation":return{name:"Negation",properties:[{name:"value"}]};case"NumberLiteral":return{name:"NumberLiteral",properties:[{name:"value"}]};case"Parameter":return{name:"Parameter",properties:[{name:"name"}]};case"ParameterReference":return{name:"ParameterReference",properties:[{name:"parameter"}]};case"ParserRule":return{name:"ParserRule",properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case"ReferenceType":return{name:"ReferenceType",properties:[{name:"referenceType"}]};case"ReturnType":return{name:"ReturnType",properties:[{name:"name"}]};case"SimpleType":return{name:"SimpleType",properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case"StringLiteral":return{name:"StringLiteral",properties:[{name:"value"}]};case"TerminalRule":return{name:"TerminalRule",properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case"Type":return{name:"Type",properties:[{name:"name"},{name:"type"}]};case"TypeAttribute":return{name:"TypeAttribute",properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case"UnionType":return{name:"UnionType",properties:[{name:"types",defaultValue:[]}]};case"Action":return{name:"Action",properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case"Alternatives":return{name:"Alternatives",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"Assignment":return{name:"Assignment",properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case"CharacterRange":return{name:"CharacterRange",properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case"CrossReference":return{name:"CrossReference",properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case"EndOfFile":return{name:"EndOfFile",properties:[{name:"cardinality"},{name:"lookahead"}]};case"Group":return{name:"Group",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case"Keyword":return{name:"Keyword",properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case"NegatedToken":return{name:"NegatedToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case"RegexToken":return{name:"RegexToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case"RuleCall":return{name:"RuleCall",properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case"TerminalAlternatives":return{name:"TerminalAlternatives",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"TerminalGroup":return{name:"TerminalGroup",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"TerminalRuleCall":return{name:"TerminalRuleCall",properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case"UnorderedGroup":return{name:"UnorderedGroup",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"UntilToken":return{name:"UntilToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case"Wildcard":return{name:"Wildcard",properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},nr=new Mg});var sk={};vr(sk,{assignMandatoryProperties:()=>FL,copyAstNode:()=>BL,findLocalReferences:()=>uNe,findRootNode:()=>rie,getContainerOfType:()=>Ud,getDocument:()=>_i,hasContainerOfType:()=>cNe,linkContentToContainer:()=>ak,streamAllContents:()=>_c,streamAst:()=>Vo,streamContents:()=>Ry,streamReferences:()=>Dg});function ak(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{Xn(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):Xn(r)&&(r.$container=t,r.$containerProperty=e))}function Ud(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function cNe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function _i(t){let r=rie(t).$document;if(!r)throw new Error("AST node has no document.");return r}function rie(t){for(;t.$container;)t=t.$container;return t}function Ry(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new to(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexRy(r,e))}function Vo(t,e){if(t){if(e?.range&&!PL(t,e.range))return new Cc(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Cc(t,r=>Ry(r,e),{includeRoot:!0})}function PL(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?M9(n,e):!1}function Dg(t){return new to(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{Dg(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),Xr(r)}function FL(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=nie(i.defaultValue))}function nie(t){return Array.isArray(t)?[...t.map(nie)]:t}function BL(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(Xn(i))r[n]=BL(i,e);else if(pa(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)Xn(s)?a.push(BL(s,e)):pa(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return ak(r),r}var Qa=F(()=>{$o();Ls();El()});function Zt(t){return t.charCodeAt(0)}function ok(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function Og(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function Vd(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function Ny(){throw Error("Internal Error - Should never get here!")}function zL(t){return t.type==="Character"}var $L=F(()=>{});var Iy,My,GL,iie=F(()=>{$L();Iy=[];for(let t=Zt("0");t<=Zt("9");t++)Iy.push(t);My=[Zt("_")].concat(Iy);for(let t=Zt("a");t<=Zt("z");t++)My.push(t);for(let t=Zt("A");t<=Zt("Z");t++)My.push(t);GL=[Zt(" "),Zt("\f"),Zt(` `),Zt("\r"),Zt(" "),Zt("\v"),Zt(" "),Zt("\xA0"),Zt("\u1680"),Zt("\u2000"),Zt("\u2001"),Zt("\u2002"),Zt("\u2003"),Zt("\u2004"),Zt("\u2005"),Zt("\u2006"),Zt("\u2007"),Zt("\u2008"),Zt("\u2009"),Zt("\u200A"),Zt("\u2028"),Zt("\u2029"),Zt("\u202F"),Zt("\u205F"),Zt("\u3000"),Zt("\uFEFF")]});var hNe,lk,fNe,Wd,aie=F(()=>{$L();iie();hNe=/[0-9a-fA-F]/,lk=/[0-9]/,fNe=/[1-9]/,Wd=class{constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":Og(n,"global");break;case"i":Og(n,"ignoreCase");break;case"m":Og(n,"multiLine");break;case"u":Og(n,"unicode");break;case"y":Og(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}Vd(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return Ny()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;Vd(r);break}if(!(e===!0&&r===void 0)&&Vd(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),Vd(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):Ny()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[Zt(` `),Zt("\r"),Zt("\u2028"),Zt("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=Iy;break;case"D":e=Iy,r=!0;break;case"s":e=GL;break;case"S":e=GL,r=!0;break;case"w":e=My;break;case"W":e=My,r=!0;break}return Vd(e)?{type:"Set",value:e,complement:r}:Ny()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=Zt("\f");break;case"n":e=Zt(` `);break;case"r":e=Zt("\r");break;case"t":e=Zt(" ");break;case"v":e=Zt("\v");break}return Vd(e)?{type:"Character",value:e}:Ny()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:Zt("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:Zt(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` `:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:Zt(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(zL(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(zL(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Lc,sie=F(()=>{Lc=class{visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var Dy=F(()=>{aie();sie()});var uk={};vr(uk,{NEWLINE_REGEXP:()=>VL,escapeRegExp:()=>qd,getCaseInsensitivePattern:()=>HL,getTerminalParts:()=>dNe,isMultilineComment:()=>WL,isWhitespace:()=>ck,partialMatches:()=>qL,partialRegExp:()=>lie});function dNe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=oie.pattern(t),r=[];for(let n of e.value.value)Hd.reset(t),Hd.visit(n),r.push({start:Hd.startRegexp,end:Hd.endRegex});return r}catch{return[]}}function WL(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),Hd.reset(t),Hd.visit(oie.pattern(t)),Hd.multiline}catch{return!1}}function ck(t){return(typeof t=="string"?new RegExp(t):t).test(" ")}function qd(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function HL(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:qd(e)).join("")}function qL(t,e){let r=lie(t),n=e.match(r);return!!n&&n[0].length>0}function lie(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function o(u){a+=r.substr(n,u),n+=u}function l(u){a+="(?:"+r.substr(n,u)+"|$)",n+=u}for(;n",n)-n+1);break;default:l(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],l(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":o(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?o(s[0].length):l(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:o(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else o(1),a+=i()+"|$)";break;case")":return++n,a;default:l(1);break}return a}return new RegExp(i(),t.flags)}var VL,oie,UL,Hd,Pg=F(()=>{Dy();VL=/\r?\n/gm,oie=new Wd,UL=class extends Lc{constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` `&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=qd(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` `.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},Hd=new UL});var fk={};vr(fk,{findAssignment:()=>tR,findNameAssignment:()=>hk,findNodeForKeyword:()=>JL,findNodeForProperty:()=>Py,findNodesForKeyword:()=>pNe,findNodesForKeywordInternal:()=>eR,findNodesForProperty:()=>ZL,getActionAtElement:()=>die,getActionType:()=>gie,getAllReachableRules:()=>Oy,getCrossReferenceTerminal:()=>jL,getEntryRule:()=>cie,getExplicitRuleType:()=>rR,getHiddenRules:()=>uie,getRuleType:()=>nR,getTypeName:()=>Yd,isArrayCardinality:()=>mNe,isArrayOperator:()=>vNe,isCommentTerminal:()=>KL,isDataType:()=>yNe,isDataTypeRule:()=>By,isOptionalCardinality:()=>gNe,terminalRegex:()=>Bg});function cie(t){return t.rules.find(e=>Ra(e)&&e.entry)}function uie(t){return t.rules.filter(e=>Go(e)&&e.hidden)}function Oy(t,e){let r=new Set,n=cie(t);if(!n)return new Set(t.rules);let i=[n].concat(uie(t));for(let s of i)hie(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||Go(s)&&s.hidden)&&a.add(s);return a}function hie(t,e,r){e.add(t.name),_c(t).forEach(n=>{if(Cl(n)||r&&nk(n)){let i=n.rule.ref;i&&!e.has(i.name)&&hie(i,e,r)}})}function jL(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=hk(t.type.ref);return e?.terminal}}function KL(t){return t.hidden&&!Bg(t).test(" ")}function ZL(t,e){return!t||!e?[]:QL(t,e,t.astNode,!0)}function Py(t,e,r){if(!t||!e)return;let n=QL(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function QL(t,e,r,n){if(!n){let i=Ud(t.grammarSource,Sl);if(i&&i.feature===e)return[t]}return eo(t)&&t.astNode===r?t.content.flatMap(i=>QL(i,e,r,!1)):[]}function pNe(t,e){return t?eR(t,e,t?.astNode):[]}function JL(t,e,r){if(!t)return;let n=eR(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function eR(t,e,r){if(t.astNode!==r)return[];if(Uo(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Fd(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Uo(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function tR(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=Ud(t.grammarSource,Sl);if(n)return n;t=t.container}}function hk(t){let e=t;return Jw(e)&&(Fu(e.$container)?e=e.$container.$container:Ra(e.$container)?e=e.$container:Jh(e.$container)),fie(t,e,new Map)}function fie(t,e,r){var n;function i(a,s){let o;return Ud(a,Sl)||(o=fie(s,s,r)),r.set(t,o),o}if(r.has(t))return r.get(t);r.set(t,void 0);for(let a of _c(e)){if(Sl(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if(Cl(a)&&Ra(a.rule.ref))return i(a,a.rule.ref);if(tk(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function die(t){let e=t.$container;if(ef(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(Fu(a))return a;{let s=_c(r[i]).find(Fu);if(s)return s}}}if(Ay(e))return die(e)}function gNe(t,e){return t==="?"||t==="*"||ef(e)&&!!e.guardCondition}function mNe(t){return t==="*"||t==="+"}function vNe(t){return t==="+="}function By(t){return pie(t,new Set)}function pie(t,e){if(e.has(t))return!0;e.add(t);for(let r of _c(t))if(Cl(r)){if(!r.rule.ref||Ra(r.rule.ref)&&!pie(r.rule.ref,e))return!1}else{if(Sl(r))return!1;if(Fu(r))return!1}return!!t.definition}function yNe(t){return XL(t.type,new Set)}function XL(t,e){if(e.has(t))return!0;if(e.add(t),$9(t))return!1;if(iL(t))return!1;if(uL(t))return t.types.every(r=>XL(r,e));if(tk(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return _y(r)?XL(r.type,e):!1}else return!1}else return!1}function rR(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Ra(e))return e.name;if(ek(e)||_y(e))return e.name}}}function Yd(t){var e;if(Ra(t))return By(t)?t.name:(e=rR(t))!==null&&e!==void 0?e:t.name;if(ek(t)||_y(t)||aL(t))return t.name;if(Fu(t)){let r=gie(t);if(r)return r}else if(Jw(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function gie(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return Yd(t.type.ref)}function nR(t){var e,r,n;return Go(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":By(t)?t.name:(n=rR(t))!==null&&n!==void 0?n:t.name}function Bg(t){let e={s:!1,i:!1,u:!1},r=Fg(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function Fg(t,e){if(AL(t))return xNe(t);if(LL(t))return bNe(t);if(gL(t))return TNe(t);if(nk(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return zu(Fg(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(kL(t))return kNe(t);if(ML(t))return wNe(t);if(EL(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),zu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(OL(t))return zu(iR,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function xNe(t){return zu(t.elements.map(e=>Fg(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function bNe(t){return zu(t.elements.map(e=>Fg(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function wNe(t){return zu(`${iR}*?${Fg(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function kNe(t){return zu(`(?!${Fg(t.terminal)})${iR}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function TNe(t){return t.right?zu(`[${YL(t.left)}-${YL(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):zu(YL(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function YL(t){return qd(t.value)}function zu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var iR,Al=F(()=>{jw();Ac();$o();Qa();El();Pg();iR=/[\s\S]/.source});function aR(t){let e=[],r=t.Grammar;for(let n of r.rules)Go(n)&&KL(n)&&WL(Bg(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:Yw}}var sR=F(()=>{El();Al();Pg();Ac()});var oR=F(()=>{});function zg(t){console&&console.error&&console.error(`Error: ${t}`)}function Fy(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var mie=F(()=>{});function zy(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var vie=F(()=>{});function $y(t){function e(){}e.prototype=t;let r=new e;function n(){return typeof r.bar}return n(),n(),t;(0,eval)(t)}var yie=F(()=>{});var $g=F(()=>{mie();vie();yie()});function ENe(t){return SNe(t)?t.LABEL:t.name}function SNe(t){return ci(t.LABEL)&&t.LABEL!==""}function dk(t){return je(t,Gg)}function Gg(t){function e(r){return je(r,Gg)}if(t instanceof Kr){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return ci(t.label)&&(r.label=t.label),r}else{if(t instanceof En)return{type:"Alternative",definition:e(t.definition)};if(t instanceof Zr)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Sn)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Cn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Gg(new pr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof pn)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Gg(new pr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof br)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof gn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof pr){let r={type:"Terminal",name:t.terminalType.name,label:ENe(t.terminalType),idx:t.idx};ci(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Io(n)?n.source:n),r}else{if(t instanceof Ja)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var ro,Kr,Ja,En,Zr,Sn,Cn,br,pn,gn,pr,pk=F(()=>{Ot();ro=class{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Te(this.definition,r=>{r.accept(e)})}},Kr=class extends ro{constructor(e){super([]),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},Ja=class extends ro{constructor(e){super(e.definition),this.orgText="",ua(this,Cs(e,r=>r!==void 0))}},En=class extends ro{constructor(e){super(e.definition),this.ignoreAmbiguities=!1,ua(this,Cs(e,r=>r!==void 0))}},Zr=class extends ro{constructor(e){super(e.definition),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}},Sn=class extends ro{constructor(e){super(e.definition),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}},Cn=class extends ro{constructor(e){super(e.definition),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}},br=class extends ro{constructor(e){super(e.definition),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}},pn=class extends ro{constructor(e){super(e.definition),this.idx=1,ua(this,Cs(e,r=>r!==void 0))}},gn=class extends ro{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,ua(this,Cs(e,r=>r!==void 0))}},pr=class{constructor(e){this.idx=1,ua(this,Cs(e,r=>r!==void 0))}accept(e){e.visit(this)}}});var es,xie=F(()=>{pk();es=class{visit(e){let r=e;switch(r.constructor){case Kr:return this.visitNonTerminal(r);case En:return this.visitAlternative(r);case Zr:return this.visitOption(r);case Sn:return this.visitRepetitionMandatory(r);case Cn:return this.visitRepetitionMandatoryWithSeparator(r);case pn:return this.visitRepetitionWithSeparator(r);case br:return this.visitRepetition(r);case gn:return this.visitAlternation(r);case pr:return this.visitTerminal(r);case Ja:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function lR(t){return t instanceof En||t instanceof Zr||t instanceof br||t instanceof Sn||t instanceof Cn||t instanceof pn||t instanceof pr||t instanceof Ja}function Xd(t,e=[]){return t instanceof Zr||t instanceof br||t instanceof pn?!0:t instanceof gn?sy(t.definition,n=>Xd(n,e)):t instanceof Kr&&Bn(e,t)?!1:t instanceof ro?(t instanceof Kr&&e.push(t),_a(t.definition,n=>Xd(n,e))):!1}function cR(t){return t instanceof gn}function Rs(t){if(t instanceof Kr)return"SUBRULE";if(t instanceof Zr)return"OPTION";if(t instanceof gn)return"OR";if(t instanceof Sn)return"AT_LEAST_ONE";if(t instanceof Cn)return"AT_LEAST_ONE_SEP";if(t instanceof pn)return"MANY_SEP";if(t instanceof br)return"MANY";if(t instanceof pr)return"CONSUME";throw Error("non exhaustive match")}var bie=F(()=>{Ot();pk()});var ts=F(()=>{pk();xie();bie()});function wie(t,e,r){return[new Zr({definition:[new pr({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var $u,gk=F(()=>{Ot();ts();$u=class{walk(e,r=[]){Te(e.definition,(n,i)=>{let a=li(e.definition,i+1);if(n instanceof Kr)this.walkProdRef(n,a,r);else if(n instanceof pr)this.walkTerminal(n,a,r);else if(n instanceof En)this.walkFlat(n,a,r);else if(n instanceof Zr)this.walkOption(n,a,r);else if(n instanceof Sn)this.walkAtLeastOne(n,a,r);else if(n instanceof Cn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof pn)this.walkManySep(n,a,r);else if(n instanceof br)this.walkMany(n,a,r);else if(n instanceof gn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new Zr({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=wie(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new Zr({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=wie(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Te(e.definition,a=>{let s=new En({definition:[a]});this.walk(s,i)})}}});function jd(t){if(t instanceof Kr)return jd(t.referencedRule);if(t instanceof pr)return _Ne(t);if(lR(t))return CNe(t);if(cR(t))return ANe(t);throw Error("non exhaustive match")}function CNe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=Xd(a),e=e.concat(jd(a)),n=n+1,i=r.length>n;return bg(e)}function ANe(t){let e=je(t.definition,r=>jd(r));return bg(Br(e))}function _Ne(t){return[t.terminalType]}var uR=F(()=>{Ot();ts()});var mk,hR=F(()=>{mk="_~IN~_"});function kie(t){let e={};return Te(t,r=>{let n=new fR(r).startWalking();ua(e,n)}),e}function LNe(t,e){return t.name+e+mk}var fR,Tie=F(()=>{gk();uR();Ot();hR();ts();fR=class extends $u{constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=LNe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new En({definition:a}),o=jd(s);this.follows[i]=o}}});function Ug(t){let e=t.toString();if(vk.hasOwnProperty(e))return vk[e];{let r=RNe.pattern(e);return vk[e]=r,r}}function Eie(){vk={}}var vk,RNe,yk=F(()=>{Dy();vk={},RNe=new Wd});function Aie(t,e=!1){try{let r=Ug(t);return dR(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===Cie)e&&Fy(`${Gy} Unable to optimize: < ${t.toString()} > Complement Sets cannot be automatically optimized. This will disable the lexer's first char optimizations. See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` This will disable the lexer's first char optimizations. See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),zg(`${Gy} Failed parsing: < ${t.toString()} > Using the @chevrotain/regexp-to-ast library Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function dR(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof l=="number")xk(l,e,r);else{let u=l;if(r===!0)for(let h=u.from;h<=u.to;h++)xk(h,e,r);else{for(let h=u.from;h<=u.to&&h=Vg){let h=u.from>=Vg?u.from:Vg,f=u.to,d=Rc(h),p=Rc(f);for(let g=d;g<=p;g++)e[g]=g}}}});break;case"Group":dR(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let o=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&pR(s)===!1||s.type!=="Group"&&o===!1)break}break;default:throw Error("non exhaustive match!")}return fr(e)}function xk(t,e,r){let n=Rc(t);e[n]=n,r===!0&&NNe(t,e)}function NNe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Rc(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Rc(i.charCodeAt(0));e[a]=a}}}function Sie(t,e){return ja(t.value,r=>{if(typeof r=="number")return Bn(e,r);{let n=r;return ja(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function pR(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Et(t.value)?_a(t.value,pR):pR(t.value):!1}function bk(t,e){if(e instanceof RegExp){let r=Ug(e),n=new gR(t);return n.visit(r),n.found}else return ja(e,r=>Bn(t,r.charCodeAt(0)))!==void 0}var Cie,Gy,gR,_ie=F(()=>{Dy();Ot();$g();yk();mR();Cie="Complement Sets are not supported for first char optimization",Gy=`Unable to use "first char" lexer optimizations: `;gR=class extends Lc{constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){Bn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?Sie(e,this.targetCharCodes)===void 0&&(this.found=!0):Sie(e,this.targetCharCodes)!==void 0&&(this.found=!0)}}});function Nie(t,e){e=Gh(e,{useSticky:yR,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` `],tracer:(b,w)=>w()});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{jNe()});let n;r("Reject Lexer.NA",()=>{n=Vh(t,b=>b[Kd]===ei.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=je(n,b=>{let w=b[Kd];if(Io(w)){let _=w.source;return _.length===1&&_!=="^"&&_!=="$"&&_!=="."&&!w.ignoreCase?_:_.length===2&&_[0]==="\\"&&!Bn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],_[1])?_[1]:e.useSticky?Rie(w):Lie(w)}else{if(gi(w))return i=!0,{exec:w};if(typeof w=="object")return i=!0,w;if(typeof w=="string"){if(w.length===1)return w;{let _=w.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),k=new RegExp(_);return e.useSticky?Rie(k):Lie(k)}}else throw Error("non exhaustive match")}})});let s,o,l,u,h;r("misc mapping",()=>{s=je(n,b=>b.tokenTypeIdx),o=je(n,b=>{let w=b.GROUP;if(w!==ei.SKIPPED){if(ci(w))return w;if(ar(w))return!1;throw Error("non exhaustive match")}}),l=je(n,b=>{let w=b.LONGER_ALT;if(w)return Et(w)?je(w,k=>nw(n,k)):[nw(n,w)]}),u=je(n,b=>b.PUSH_MODE),h=je(n,b=>St(b,"POP_MODE"))});let f;r("Line Terminator Handling",()=>{let b=zie(e.lineTerminatorCharacters);f=je(n,w=>!1),e.positionTracking!=="onlyOffset"&&(f=je(n,w=>St(w,"LINE_BREAKS")?!!w.LINE_BREAKS:Fie(w,b)===!1&&bk(b,w.PATTERN)))});let d,p,g,m;r("Misc Mapping #2",()=>{d=je(n,Pie),p=je(a,YNe),g=zr(n,(b,w)=>{let _=w.GROUP;return ci(_)&&_!==ei.SKIPPED&&(b[_]=[]),b},{}),m=je(a,(b,w)=>({pattern:a[w],longerAlt:l[w],canLineTerminator:f[w],isCustom:d[w],short:p[w],group:o[w],push:u[w],pop:h[w],tokenTypeIdx:s[w],tokenType:n[w]}))});let y=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=zr(n,(b,w,_)=>{if(typeof w.PATTERN=="string"){let k=w.PATTERN.charCodeAt(0),E=Rc(k);vR(b,E,m[_])}else if(Et(w.START_CHARS_HINT)){let k;Te(w.START_CHARS_HINT,E=>{let L=typeof E=="string"?E.charCodeAt(0):E,S=Rc(L);k!==S&&(k=S,vR(b,S,m[_]))})}else if(Io(w.PATTERN))if(w.PATTERN.unicode)y=!1,e.ensureOptimizations&&zg(`${Gy} Unable to analyze < ${w.PATTERN.toString()} > pattern. The regexp unicode flag is not currently supported by the regexp-to-ast library. This will disable the lexer's first char optimizations. For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let k=Aie(w.PATTERN,e.ensureOptimizations);ir(k)&&(y=!1),Te(k,E=>{vR(b,E,m[_])})}else e.ensureOptimizations&&zg(`${Gy} TokenType: <${w.name}> is using a custom token pattern without providing parameter. This will disable the lexer's first char optimizations. For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:m,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:y}}function Iie(t,e){let r=[],n=MNe(t);r=r.concat(n.errors);let i=DNe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(INe(a)),r=r.concat(UNe(a)),r=r.concat(VNe(a,e)),r=r.concat(WNe(a)),r}function INe(t){let e=[],r=Fr(t,n=>Io(n[Kd]));return e=e.concat(PNe(r)),e=e.concat(zNe(r)),e=e.concat($Ne(r)),e=e.concat(GNe(r)),e=e.concat(BNe(r)),e}function MNe(t){let e=Fr(t,i=>!St(i,Kd)),r=je(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Fn.MISSING_PATTERN,tokenTypes:[i]})),n=Uh(t,e);return{errors:r,valid:n}}function DNe(t){let e=Fr(t,i=>{let a=i[Kd];return!Io(a)&&!gi(a)&&!St(a,"exec")&&!ci(a)}),r=je(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Fn.INVALID_PATTERN,tokenTypes:[i]})),n=Uh(t,e);return{errors:r,valid:n}}function PNe(t){class e extends Lc{constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Fr(t,i=>{let a=i.PATTERN;try{let s=Ug(a),o=new e;return o.visit(s),o.found}catch{return ONe.test(a.source)}});return je(r,i=>({message:`Unexpected RegExp Anchor Error: Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Fn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function BNe(t){let e=Fr(t,n=>n.PATTERN.test(""));return je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Fn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function zNe(t){class e extends Lc{constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Fr(t,i=>{let a=i.PATTERN;try{let s=Ug(a),o=new e;return o.visit(s),o.found}catch{return FNe.test(a.source)}});return je(r,i=>({message:`Unexpected RegExp Anchor Error: Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Fn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function $Ne(t){let e=Fr(t,n=>{let i=n[Kd];return i instanceof RegExp&&(i.multiline||i.global)});return je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Fn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function GNe(t){let e=[],r=je(t,a=>zr(t,(s,o)=>(a.PATTERN.source===o.PATTERN.source&&!Bn(e,o)&&o.PATTERN!==ei.NA&&(e.push(o),s.push(o)),s),[]));r=xc(r);let n=Fr(r,a=>a.length>1);return je(n,a=>{let s=je(a,l=>l.name);return{message:`The same RegExp pattern ->${Yi(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:Fn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function UNe(t){let e=Fr(t,n=>{if(!St(n,"GROUP"))return!1;let i=n.GROUP;return i!==ei.SKIPPED&&i!==ei.NA&&!ci(i)});return je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Fn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function VNe(t,e){let r=Fr(t,i=>i.PUSH_MODE!==void 0&&!Bn(e,i.PUSH_MODE));return je(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Fn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function WNe(t){let e=[],r=zr(t,(n,i,a)=>{let s=i.PATTERN;return s===ei.NA||(ci(s)?n.push({str:s,idx:a,tokenType:i}):Io(s)&&qNe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Te(t,(n,i)=>{Te(r,({str:a,idx:s,tokenType:o})=>{if(i${o.name}<- can never be matched. Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:l,type:Fn.UNREACHABLE_PATTERN,tokenTypes:[n,o]})}})}),e}function HNe(t,e){if(Io(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(gi(e))return e(t,0,[],{});if(St(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function qNe(t){return ja([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function Lie(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function Rie(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function Mie(t,e,r){let n=[];return St(t,Wg)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Wg+`> property in its definition `,type:Fn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),St(t,wk)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+wk+`> property in its definition `,type:Fn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),St(t,wk)&&St(t,Wg)&&!St(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${Wg}: <${t.defaultMode}>which does not exist `,type:Fn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),St(t,wk)&&Te(t.modes,(i,a)=>{Te(i,(s,o)=>{if(ar(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${o}> `,type:Fn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(St(s,"LONGER_ALT")){let l=Et(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Te(l,u=>{!ar(u)&&!Bn(i,u)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${u.name}> on token <${s.name}> outside of mode <${a}> `,type:Fn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function Die(t,e,r){let n=[],i=!1,a=xc(Br(fr(t.modes))),s=Vh(a,l=>l[Kd]===ei.NA),o=zie(r);return e&&Te(s,l=>{let u=Fie(l,o);if(u!==!1){let f={message:XNe(l,u),type:u.issue,tokenType:l};n.push(f)}else St(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(i=!0):bk(o,l.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. This Lexer has been defined to track line and column information, But none of the Token Types can be identified as matching a line terminator. See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS for details.`,type:Fn.NO_LINE_BREAKS_FLAGS}),n}function Oie(t){let e={},r=Nr(t);return Te(r,n=>{let i=t[n];if(Et(i))e[n]=[];else throw Error("non exhaustive match")}),e}function Pie(t){let e=t.PATTERN;if(Io(e))return!1;if(gi(e))return!0;if(St(e,"exec"))return!0;if(ci(e))return!1;throw Error("non exhaustive match")}function YNe(t){return ci(t)&&t.length===1?t.charCodeAt(0):!1}function Fie(t,e){if(St(t,"LINE_BREAKS"))return!1;if(Io(t.PATTERN)){try{bk(e,t.PATTERN)}catch(r){return{issue:Fn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(ci(t.PATTERN))return!1;if(Pie(t))return{issue:Fn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function XNe(t,e){if(e.issue===Fn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. The problem is in the <${t.name}> Token Type Root cause: ${e.errMsg}. For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Fn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. The problem is in the <${t.name}> Token Type For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function zie(t){return je(t,r=>ci(r)?r.charCodeAt(0):r)}function vR(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Rc(t){return t255?255+~~(t/255):t}}var Kd,Wg,wk,yR,ONe,FNe,Bie,Vg,kk,mR=F(()=>{Dy();Uy();Ot();$g();_ie();yk();Kd="PATTERN",Wg="defaultMode",wk="modes",yR=typeof new RegExp("(?:)").sticky=="boolean";ONe=/[^\\][$]/;FNe=/[^\\[][\^]|^\^/;Bie={test:function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function KNe(t){let e=jr(t),r=t,n=!0;for(;n;){r=xc(Br(je(r,a=>a.CATEGORIES)));let i=Uh(r,e);e=e.concat(i),ir(i)?n=!1:r=i}return e}function ZNe(t){Te(t,e=>{xR(e)||(Uie[$ie]=e,e.tokenTypeIdx=$ie++),Gie(e)&&!Et(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Gie(e)||(e.CATEGORIES=[]),eIe(e)||(e.categoryMatches=[]),tIe(e)||(e.categoryMatchesMap={})})}function QNe(t){Te(t,e=>{e.categoryMatches=[],Te(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(Uie[n].tokenTypeIdx)})})}function JNe(t){Te(t,e=>{Vie([],e)})}function Vie(t,e){Te(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Te(e.CATEGORIES,r=>{let n=t.concat(e);Bn(n,r)||Vie(n,r)})}function xR(t){return St(t,"tokenTypeIdx")}function Gie(t){return St(t,"CATEGORIES")}function eIe(t){return St(t,"categoryMatches")}function tIe(t){return St(t,"categoryMatchesMap")}function Wie(t){return St(t,"tokenTypeIdx")}var $ie,Uie,Zd=F(()=>{Ot();$ie=1,Uie={}});var bR,wR=F(()=>{bR={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var Fn,Vy,ei,Uy=F(()=>{mR();Ot();$g();Zd();wR();yk();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(Fn||(Fn={}));Vy={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` `,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:bR,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(Vy);ei=class{constructor(e,r=Vy){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:o,value:l}=zy(a),u=o>10?console.warn:console.log;return this.traceInitIndent time: ${o}ms`),this.traceInitIndent--,l}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. a boolean 2nd argument is no longer supported`);this.config=ua({},Vy,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===Vy.lineTerminatorsPattern)this.config.lineTerminatorsPattern=Bie;else if(this.config.lineTerminatorCharacters===Vy.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Et(e)?i={modes:{defaultMode:jr(e)},defaultMode:Wg}:(a=!1,i=jr(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Mie(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(Die(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Te(i.modes,(o,l)=>{i.modes[l]=Vh(o,u=>ar(u))});let s=Nr(i.modes);if(Te(i.modes,(o,l)=>{this.TRACE_INIT(`Mode: <${l}> processing`,()=>{if(this.modes.push(l),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Iie(o,s))}),ir(this.lexerDefinitionErrors)){Uu(o);let u;this.TRACE_INIT("analyzeTokenTypes",()=>{u=Nie(o,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[l]=u.patternIdxToConfig,this.charCodeToPatternIdxToConfig[l]=u.charCodeToPatternIdxToConfig,this.emptyGroups=ua({},this.emptyGroups,u.emptyGroups),this.hasCustom=u.hasCustom||this.hasCustom,this.canModeBeOptimized[l]=u.canBeOptimized}})}),this.defaultMode=i.defaultMode,!ir(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let l=je(this.lexerDefinitionErrors,u=>u.message).join(`----------------------- `);throw new Error(`Errors detected in definition of Lexer: `+l)}Te(this.lexerDefinitionWarning,o=>{Fy(o.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(yR?(this.chopInput=qi,this.match=this.matchWithTest):(this.updateLastIndex=Yn,this.match=this.matchWithExec),a&&(this.handleModes=Yn),this.trackStartLines===!1&&(this.computeNewColumn=qi),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=Yn),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let o=zr(this.canModeBeOptimized,(l,u,h)=>(u===!1&&l.push(h),l),[]);if(r.ensureOptimizations&&!ir(o))throw Error(`Lexer Modes: < ${o.join(", ")} > cannot be optimized. Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{Eie()}),this.TRACE_INIT("toFastProperties",()=>{$y(this)})})}tokenize(e,r=this.defaultMode){if(!ir(this.lexerDefinitionErrors)){let i=je(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- `);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: `+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,o,l,u,h,f,d,p,g,m,y,x,b,w=e,_=w.length,k=0,E=0,L=this.hasCustom?0:Math.floor(e.length/10),S=new Array(L),C=[],M=this.trackStartLines?1:void 0,R=this.trackStartLines?1:void 0,T=Oie(this.emptyGroups),I=this.trackStartLines,A=this.config.lineTerminatorsPattern,D=0,N=[],O=[],B=[],P=[];Object.freeze(P);let $;function z(){return N}function H(ee){let Q=Rc(ee),W=O[Q];return W===void 0?P:W}let J=ee=>{if(B.length===1&&ee.tokenType.PUSH_MODE===void 0){let Q=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(ee);C.push({offset:ee.startOffset,line:ee.startLine,column:ee.startColumn,length:ee.image.length,message:Q})}else{B.pop();let Q=ha(B);N=this.patternIdxToConfig[Q],O=this.charCodeToPatternIdxToConfig[Q],D=N.length;let W=this.canModeBeOptimized[Q]&&this.config.safeMode===!1;O&&W?$=H:$=z}};function X(ee){B.push(ee),O=this.charCodeToPatternIdxToConfig[ee],N=this.patternIdxToConfig[ee],D=N.length,D=N.length;let Q=this.canModeBeOptimized[ee]&&this.config.safeMode===!1;O&&Q?$=H:$=z}X.call(this,r);let oe,K=this.config.recoveryEnabled;for(;k<_;){l=null;let ee=w.charCodeAt(k),Q=$(ee),W=Q.length;for(n=0;nl.length){l=s,u=h,oe=ce;break}}}break}}if(l!==null){if(f=l.length,d=oe.group,d!==void 0&&(p=oe.tokenTypeIdx,g=this.createTokenInstance(l,k,p,oe.tokenType,M,R,f),this.handlePayload(g,u),d===!1?E=this.addToken(S,E,g):T[d].push(g)),e=this.chopInput(e,f),k=k+f,R=this.computeNewColumn(R,f),I===!0&&oe.canLineTerminator===!0){let Y=0,Z,se;A.lastIndex=0;do Z=A.test(l),Z===!0&&(se=A.lastIndex-1,Y++);while(Z===!0);Y!==0&&(M=M+Y,R=f-se,this.updateTokenEndLineColumnLocation(g,d,se,Y,M,R,f))}this.handleModes(oe,J,X,g)}else{let Y=k,Z=M,se=R,ce=K===!1;for(;ce===!1&&k<_;)for(e=this.chopInput(e,1),k++,i=0;i{Ot();Uy();Zd();rIe="parent",Hie="categories",qie="label",Yie="group",Xie="push_mode",jie="pop_mode",Kie="longer_alt",Zie="line_breaks",Qie="start_chars_hint";no=Tk({name:"EOF",pattern:ei.NA});Uu([no])});var Wu,Jie,_l,qg=F(()=>{Jd();Ot();ts();Wu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${kR(t)?`--> ${Vu(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",o=` but found: '`+Yi(e).image+"'";if(n)return a+n+o;{let l=zr(t,(d,p)=>d.concat(p),[]),u=je(l,d=>`[${je(d,p=>Vu(p)).join(", ")}]`),f=`one of these possible Token sequences: ${je(u,(d,p)=>` ${p+1}. ${d}`).join(` `)}`;return a+f+o}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` but found: '`+Yi(e).image+"'";if(r)return i+r+s;{let l=`expecting at least one iteration which starts with one of these possible Token sequences:: <${je(t,u=>`[${je(u,h=>Vu(h)).join(",")}]`).join(" ,")}>`;return i+l+s}}};Object.freeze(Wu);Jie={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- inside top level rule: ->`+t.name+"<-"}},_l={buildDuplicateFoundError(t,e){function r(h){return h instanceof pr?h.terminalType.name:h instanceof Kr?h.nonTerminalName:""}let n=t.name,i=Yi(e),a=i.idx,s=Rs(i),o=r(i),l=a>0,u=`->${s}${l?a:""}<- ${o?`with argument: ->${o}<-`:""} appears more than once (${e.length} times) in the top level rule: ->${n}<-. For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES `;return u=u.replace(/[ \t]+/g," "),u=u.replace(/\s\s+/g,` `),u},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. To resolve this make sure each Terminal and Non-Terminal names are unique This is easy to accomplish by using the convention that Terminal names start with an uppercase letter and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=je(t.prefixPath,i=>Vu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix in inside <${t.topLevelRule.name}> Rule, <${e}> may appears as a prefix path in all these alternatives. See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX For Further details.`},buildAlternationAmbiguityError(t){let e=je(t.prefixPath,i=>Vu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, <${e}> may appears as a prefix path in all these alternatives. `;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES For Further details.`,n},buildEmptyRepetitionError(t){let e=Rs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: inside <${t.topLevelRule.name}> Rule. has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=je(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. rule: <${e}> can be invoked from itself (directly or indirectly) without consuming any Tokens. The grammar path that causes this is: ${n} To fix this refactor your grammar to remove the left recursion. see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof Ja?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function eae(t,e){let r=new TR(t,e);return r.resolveRefs(),r.errors}var TR,tae=F(()=>{Ns();Ot();ts();TR=class extends es{constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Te(fr(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:Li.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function Ak(t,e,r=[]){r=jr(r);let n=[],i=0;function a(o){return o.concat(li(t,i+1))}function s(o){let l=Ak(a(o),e,r);return n.concat(l)}for(;r.length{ir(l.definition)===!1&&(n=s(l.definition))}),n;if(o instanceof pr)r.push(o.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:li(t,i)}),n}function _k(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",o=!1,l=e.length,u=l-n-1,h=[],f=[];for(f.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!ir(f);){let d=f.pop();if(d===s){o&&ha(f).idx<=u&&f.pop();continue}let p=d.def,g=d.idx,m=d.ruleStack,y=d.occurrenceStack;if(ir(p))continue;let x=p[0];if(x===i){let b={idx:g,def:li(p),ruleStack:Lu(m),occurrenceStack:Lu(y)};f.push(b)}else if(x instanceof pr)if(g=0;b--){let w=x.definition[b],_={idx:g,def:w.definition.concat(li(p)),ruleStack:m,occurrenceStack:y};f.push(_),f.push(s)}else if(x instanceof En)f.push({idx:g,def:x.definition.concat(li(p)),ruleStack:m,occurrenceStack:y});else if(x instanceof Ja)f.push(iIe(x,g,m,y));else throw Error("non exhaustive match")}return h}function iIe(t,e,r,n){let i=jr(r);i.push(t.name);let a=jr(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var ER,Ek,Yg,Sk,Hy,Ck,qy,Yy=F(()=>{Ot();uR();gk();ts();ER=class extends $u{constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=jr(this.path.ruleStack).reverse(),this.occurrenceStack=jr(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){ir(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},Ek=class extends ER{constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new En({definition:i});this.possibleTokTypes=jd(a),this.found=!0}}},Yg=class extends $u{constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},Sk=class extends Yg{walkMany(e,r,n){if(e.idx===this.occurrence){let i=Yi(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof pr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},Hy=class extends Yg{walkManySep(e,r,n){if(e.idx===this.occurrence){let i=Yi(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof pr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Ck=class extends Yg{walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=Yi(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof pr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},qy=class extends Yg{walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=Yi(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof pr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}}});function Xy(t){if(t instanceof Zr||t==="Option")return zn.OPTION;if(t instanceof br||t==="Repetition")return zn.REPETITION;if(t instanceof Sn||t==="RepetitionMandatory")return zn.REPETITION_MANDATORY;if(t instanceof Cn||t==="RepetitionMandatoryWithSeparator")return zn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof pn||t==="RepetitionWithSeparator")return zn.REPETITION_WITH_SEPARATOR;if(t instanceof gn||t==="Alternation")return zn.ALTERNATION;throw Error("non exhaustive match")}function Rk(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=Xy(n);return a===zn.ALTERNATION?Xg(e,r,i):jg(e,r,a,i)}function nae(t,e,r,n,i,a){let s=Xg(t,e,r),o=cae(s)?Hg:Gu;return a(s,n,o,i)}function iae(t,e,r,n,i,a){let s=jg(t,e,i,r),o=cae(s)?Hg:Gu;return a(s[0],o,n)}function aae(t,e,r,n){let i=t.length,a=_a(t,s=>_a(s,o=>o.length===1));if(e)return function(s){let o=je(s,l=>l.GATE);for(let l=0;lBr(l)),o=zr(s,(l,u,h)=>(Te(u,f=>{St(l,f.tokenTypeIdx)||(l[f.tokenTypeIdx]=h),Te(f.categoryMatches,d=>{St(l,d)||(l[d]=h)})}),l),{});return function(){let l=this.LA(1);return o[l.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=Br(t);if(a.length===1&&ir(a[0].categoryMatches)){let o=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===o}}else{let s=zr(a,(o,l,u)=>(o[l.tokenTypeIdx]=!0,Te(l.categoryMatches,h=>{o[h]=!0}),o),[]);return function(){let o=this.LA(1);return s[o.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;aAk([s],1)),n=rae(r.length),i=je(r,s=>{let o={};return Te(s,l=>{let u=SR(l.partialPath);Te(u,h=>{o[h]=!0})}),o}),a=r;for(let s=1;s<=e;s++){let o=a;a=rae(o.length);for(let l=0;l{let x=SR(y.partialPath);Te(x,b=>{i[l][b]=!0})})}}}}return n}function Xg(t,e,r,n){let i=new Lk(t,zn.ALTERNATION,n);return e.accept(i),oae(i.result,r)}function jg(t,e,r,n){let i=new Lk(t,r);e.accept(i);let a=i.result,o=new CR(e,t,r).startWalking(),l=new En({definition:a}),u=new En({definition:o});return oae([l,u],n)}function Nk(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function cae(t){return _a(t,e=>_a(e,r=>_a(r,n=>ir(n.categoryMatches))))}var zn,CR,Lk,Kg=F(()=>{Ot();Yy();gk();Zd();ts();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(zn||(zn={}));CR=class extends $u{constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,zn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,zn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,zn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,zn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,zn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},Lk=class extends es{constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,zn.OPTION)}visitRepetition(e){this.checkIsTarget(e,zn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,zn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,zn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,zn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,zn.ALTERNATION)}}});function uae(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return je(e,r=>Object.assign({type:Li.CUSTOM_LOOKAHEAD_VALIDATION},r))}function hae(t,e,r,n){let i=fa(t,l=>sIe(l,r)),a=fIe(t,e,r),s=fa(t,l=>cIe(l,r)),o=fa(t,l=>lIe(l,t,n,r));return i.concat(a,s,o)}function sIe(t,e){let r=new AR;t.accept(r);let n=r.allProductions,i=T_(n,oIe),a=Cs(i,o=>o.length>1);return je(fr(a),o=>{let l=Yi(o),u=e.buildDuplicateFoundError(t,o),h=Rs(l),f={message:u,type:Li.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:h,occurrence:l.idx},d=fae(l);return d&&(f.parameter=d),f})}function oIe(t){return`${Rs(t)}_#_${t.idx}_#_${fae(t)}`}function fae(t){return t instanceof pr?t.terminalType.name:t instanceof Kr?t.nonTerminalName:""}function lIe(t,e,r,n){let i=[];if(zr(e,(s,o)=>o.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:Li.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function dae(t,e,r){let n=[],i;return Bn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:Li.INVALID_RULE_OVERRIDE,ruleName:t})),n}function LR(t,e,r,n=[]){let i=[],a=Ik(e.definition);if(ir(a))return[];{let s=t.name;Bn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Li.LEFT_RECURSION,ruleName:s});let l=Uh(a,n.concat([t])),u=fa(l,h=>{let f=jr(n);return f.push(h),LR(t,h,r,f)});return i.concat(u)}}function Ik(t){let e=[];if(ir(t))return e;let r=Yi(t);if(r instanceof Kr)e.push(r.referencedRule);else if(r instanceof En||r instanceof Zr||r instanceof Sn||r instanceof Cn||r instanceof pn||r instanceof br)e=e.concat(Ik(r.definition));else if(r instanceof gn)e=Br(je(r.definition,a=>Ik(a.definition)));else if(!(r instanceof pr))throw Error("non exhaustive match");let n=Xd(r),i=t.length>1;if(n&&i){let a=li(t);return e.concat(Ik(a))}else return e}function pae(t,e){let r=new jy;t.accept(r);let n=r.alternations;return fa(n,a=>{let s=Lu(a.definition);return fa(s,(o,l)=>{let u=_k([o],[],Gu,1);return ir(u)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:l}),type:Li.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:l+1}]:[]})})}function gae(t,e,r){let n=new jy;t.accept(n);let i=n.alternations;return i=Vh(i,s=>s.ignoreAmbiguities===!0),fa(i,s=>{let o=s.idx,l=s.maxLookahead||e,u=Xg(o,t,l,s),h=uIe(u,s,t,r),f=hIe(u,s,t,r);return h.concat(f)})}function cIe(t,e){let r=new jy;t.accept(r);let n=r.alternations;return fa(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:Li.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function mae(t,e,r){let n=[];return Te(t,i=>{let a=new _R;i.accept(a);let s=a.allProductions;Te(s,o=>{let l=Xy(o),u=o.maxLookahead||e,h=o.idx,d=jg(h,i,l,u)[0];if(ir(Br(d))){let p=r.buildEmptyRepetitionError({topLevelRule:i,repetition:o});n.push({message:p,type:Li.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function uIe(t,e,r,n){let i=[],a=zr(t,(o,l,u)=>(e.definition[u].ignoreAmbiguities===!0||Te(l,h=>{let f=[u];Te(t,(d,p)=>{u!==p&&Nk(d,h)&&e.definition[p].ignoreAmbiguities!==!0&&f.push(p)}),f.length>1&&!Nk(i,h)&&(i.push(h),o.push({alts:f,path:h}))}),o),[]);return je(a,o=>{let l=je(o.alts,h=>h+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:l,prefixPath:o.path}),type:Li.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:o.alts}})}function hIe(t,e,r,n){let i=zr(t,(s,o,l)=>{let u=je(o,h=>({idx:l,path:h}));return s.concat(u)},[]);return xc(fa(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let l=s.idx,u=s.path,h=Fr(i,d=>e.definition[d.idx].ignoreAmbiguities!==!0&&d.idx{let p=[d.idx+1,l+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:p,prefixPath:d.path}),type:Li.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:p}})}))}function fIe(t,e,r){let n=[],i=je(e,a=>a.name);return Te(t,a=>{let s=a.name;if(Bn(i,s)){let o=r.buildNamespaceConflictError(a);n.push({message:o,type:Li.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var AR,jy,_R,Ky=F(()=>{Ot();Ns();ts();Kg();Yy();Zd();AR=class extends es{constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};jy=class extends es{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};_R=class extends es{constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}}});function vae(t){let e=Gh(t,{errMsgProvider:Jie}),r={};return Te(t.rules,n=>{r[n.name]=n}),eae(r,e.errMsgProvider)}function yae(t){return t=Gh(t,{errMsgProvider:_l}),hae(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var xae=F(()=>{Ot();tae();Ky();qg()});function tf(t){return Bn(Eae,t.name)}var bae,wae,kae,Tae,Eae,Zg,e0,Zy,Qy,Jy,Qg=F(()=>{Ot();bae="MismatchedTokenException",wae="NoViableAltException",kae="EarlyExitException",Tae="NotAllInputParsedException",Eae=[bae,wae,kae,Tae];Object.freeze(Eae);Zg=class extends Error{constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},e0=class extends Zg{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=bae}},Zy=class extends Zg{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=wae}},Qy=class extends Zg{constructor(e,r){super(e,r),this.name=Tae}},Jy=class extends Zg{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=kae}}});function dIe(t,e,r,n,i,a,s){let o=this.getKeyForAutomaticLookahead(n,i),l=this.firstAfterRepMap[o];if(l===void 0){let d=this.getCurrRuleFullName(),p=this.getGAstProductions()[d];l=new a(p,i).startWalking(),this.firstAfterRepMap[o]=l}let u=l.token,h=l.occurrence,f=l.isEndOfRule;this.RULE_STACK.length===1&&f&&u===void 0&&(u=no,h=1),!(u===void 0||h===void 0)&&this.shouldInRepetitionRecoveryBeTried(u,h,s)&&this.tryInRepetitionRecovery(t,e,r,u)}var RR,IR,NR,Mk,MR=F(()=>{Jd();Ot();Qg();hR();Ns();RR={},IR="InRuleRecoveryException",NR=class extends Error{constructor(e){super(e),this.name=IR}},Mk=class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=St(e,"recoveryEnabled")?e.recoveryEnabled:rs.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=dIe)}getTokenToInsert(e){let r=Qd(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),o=[],l=!1,u=this.LA(1),h=this.LA(1),f=()=>{let d=this.LA(0),p=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:u,previous:d,ruleName:this.getCurrRuleFullName()}),g=new e0(p,u,this.LA(0));g.resyncedTokens=Lu(o),this.SAVE_ERROR(g)};for(;!l;)if(this.tokenMatcher(h,i)){f();return}else if(n.call(this)){f(),e.apply(this,r);return}else this.tokenMatcher(h,a)?l=!0:(h=this.SKIP_TOKEN(),this.addToResyncTokens(h,o));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new NR("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||ir(r))return!1;let n=this.LA(1);return ja(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Bn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=ja(e,a=>Wy(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return RR;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return je(e,(n,i)=>i===0?RR:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=je(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Br(e)}getFollowSetFromFollowKey(e){if(e===RR)return[no];let r=e.ruleName+e.idxInCallingRule+mk+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,no)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Lu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,o){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=jr(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return je(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}}});function Dk(t,e,r){return r|e|t}var Ok=F(()=>{});var Hu,DR=F(()=>{Ot();qg();Ns();Ky();Kg();Hu=class{constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:rs.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(ir(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return fa(e,r=>LR(r,r,_l))}validateEmptyOrAlternatives(e){return fa(e,r=>pae(r,_l))}validateAmbiguousAlternationAlternatives(e,r){return fa(e,n=>gae(n,r,_l))}validateSomeNonEmptyLookaheadPath(e,r){return mae(e,r,_l)}buildLookaheadForAlternation(e){return nae(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,aae)}buildLookaheadForOptional(e){return iae(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,Xy(e.prodType),sae)}}});function pIe(t){Pk.reset(),t.accept(Pk);let e=Pk.dslMethods;return Pk.reset(),e}var Bk,OR,Pk,Sae=F(()=>{Ot();Ns();Ok();ts();DR();Bk=class{initLooksAhead(e){this.dynamicTokensEnabled=St(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:rs.dynamicTokensEnabled,this.maxLookahead=St(e,"maxLookahead")?e.maxLookahead:rs.maxLookahead,this.lookaheadStrategy=St(e,"lookaheadStrategy")?e.lookaheadStrategy:new Hu({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Te(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:o,repetitionWithSeparator:l}=pIe(r);Te(n,u=>{let h=u.idx===0?"":u.idx;this.TRACE_INIT(`${Rs(u)}${h}`,()=>{let f=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:u.idx,rule:r,maxLookahead:u.maxLookahead||this.maxLookahead,hasPredicates:u.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),d=Dk(this.fullRuleNameToShort[r.name],256,u.idx);this.setLaFuncCache(d,f)})}),Te(i,u=>{this.computeLookaheadFunc(r,u.idx,768,"Repetition",u.maxLookahead,Rs(u))}),Te(a,u=>{this.computeLookaheadFunc(r,u.idx,512,"Option",u.maxLookahead,Rs(u))}),Te(s,u=>{this.computeLookaheadFunc(r,u.idx,1024,"RepetitionMandatory",u.maxLookahead,Rs(u))}),Te(o,u=>{this.computeLookaheadFunc(r,u.idx,1536,"RepetitionMandatoryWithSeparator",u.maxLookahead,Rs(u))}),Te(l,u=>{this.computeLookaheadFunc(r,u.idx,1280,"RepetitionWithSeparator",u.maxLookahead,Rs(u))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let o=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),l=Dk(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(l,o)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return Dk(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},OR=class extends es{constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},Pk=new OR});function FR(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{});function $R(t,e){Object.defineProperty(t,gIe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var gIe,Lae=F(()=>{gIe="name"});function mIe(t,e){let r=Nr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: ${a.join(` `).replace(/\n/g,` `)}`)}}};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function Nae(t,e,r){let n=function(){};$R(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Te(e,a=>{i[a]=mIe}),n.prototype=i,n.prototype.constructor=n,n}function vIe(t,e){return yIe(t,e)}function yIe(t,e){let r=Fr(e,i=>gi(t[i])===!1),n=je(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:GR.MISSING_METHOD,methodName:i}));return xc(n)}var GR,Iae=F(()=>{Ot();Lae();(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(GR||(GR={}))});var Gk,Mae=F(()=>{_ae();Ot();Iae();Ns();Gk=class{initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=St(e,"nodeLocationTracking")?e.nodeLocationTracking:rs.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Yn,this.cstFinallyStateUpdate=Yn,this.cstPostTerminal=Yn,this.cstPostNonTerminal=Yn,this.cstPostRule=Yn;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=zR,this.setNodeLocationFromNode=zR,this.cstPostRule=Yn,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Yn,this.setNodeLocationFromNode=Yn,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=FR,this.setNodeLocationFromNode=FR,this.cstPostRule=Yn,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Yn,this.setNodeLocationFromNode=Yn,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Yn,this.setNodeLocationFromNode=Yn,this.cstPostRule=Yn,this.setInitialNodeLocation=Yn;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];Cae(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];Aae(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(ar(this.baseCstVisitorConstructor)){let e=Rae(this.className,Nr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(ar(this.baseCstVisitorWithDefaultsConstructor)){let e=Nae(this.className,Nr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var Uk,Dae=F(()=>{Ns();Uk=class{initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Jg}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Jg:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var Vk,Oae=F(()=>{Ot();Qg();Ns();qg();Ky();ts();Vk=class{ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=em){if(Bn(this.definedRulesNames,e)){let s={message:_l.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Li.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=em){let i=dae(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(tf(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return dk(fr(this.gastProductionsCache))}}});var Wk,Pae=F(()=>{Ot();Ok();Qg();Kg();Yy();Ns();MR();Jd();Zd();Wk=class{initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Hg,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},St(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 For Further details.`);if(Et(e)){if(ir(e))throw Error(`A Token Vocabulary cannot be empty. Note that the first argument for the parser constructor is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 For Further details.`)}if(Et(e))this.tokensMap=zr(e,(a,s)=>(a[s.name]=s,a),{});else if(St(e,"modes")&&_a(Br(fr(e.modes)),Wie)){let a=Br(fr(e.modes)),s=bg(a);this.tokensMap=zr(s,(o,l)=>(o[l.name]=l,o),{})}else if(dn(e))this.tokensMap=jr(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=no;let n=St(e,"modes")?Br(fr(e.modes)):fr(e),i=_a(n,a=>ir(a.categoryMatches));this.tokenMatcher=i?Hg:Gu,Uu(fr(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=St(n,"resyncEnabled")?n.resyncEnabled:em.resyncEnabled,a=St(n,"recoveryValueFunc")?n.recoveryValueFunc:em.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let o;return this.outputCst===!0?o=function(...h){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,h);let f=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(f),f}catch(f){return this.invokeRuleCatch(f,i,a)}finally{this.ruleFinallyStateUpdate()}}:o=function(...h){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,h)}catch(f){return this.invokeRuleCatch(f,i,a)}finally{this.ruleFinallyStateUpdate()}},Object.assign(o,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(tf(e)){let s=e;if(a){let o=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(o))if(s.resyncedTokens=this.reSyncTo(o),this.outputCst){let l=this.CST_STACK[this.CST_STACK.length-1];return l.recoveredNode=!0,l}else return n(e);else{if(this.outputCst){let l=this.CST_STACK[this.CST_STACK.length-1];l.recoveredNode=!0,s.partialCstResult=l}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let o=i;i=()=>s.call(this)&&o.call(this)}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let o=i;i=()=>s.call(this)&&o.call(this)}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,zn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,Ck)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),a);for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,o,i,qy],o,1536,e,qy)}else throw this.raiseEarlyExitException(e,zn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let o=r.GATE;if(o!==void 0){let l=i;i=()=>o.call(this)&&l.call(this)}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,Sk,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),a);for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,o,i,Hy],o,1280,e,Hy)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Et(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new Qy(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw tf(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new e0(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===IR?n:a}}else throw n}saveRecogState(){let e=this.errors,r=jr(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),no)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var Hk,Bae=F(()=>{Qg();Ot();Kg();Ns();Hk=class{initErrorHandler(e){this._errors=[],this.errorMessageProvider=St(e,"errorMessageProvider")?e.errorMessageProvider:rs.errorMessageProvider}SAVE_ERROR(e){if(tf(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:jr(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return jr(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],o=jg(e,a,r,this.maxLookahead)[0],l=[];for(let h=1;h<=this.maxLookahead;h++)l.push(this.LA(h));let u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:o,actual:l,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new Jy(u,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=Xg(e,i,this.maxLookahead),s=[];for(let u=1;u<=this.maxLookahead;u++)s.push(this.LA(u));let o=this.LA(0),l=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:o,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new Zy(l,this.LA(1),o))}}});var qk,Fae=F(()=>{Yy();Ot();qk=class{initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(ar(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return _k([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=Yi(e.ruleStack),i=this.getGAstProductions()[r];return new Ek(i,e).startWalking()}}});function t2(t,e,r,n=!1){Xk(r);let i=ha(this.recordingProdStack),a=gi(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),St(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),jk}function wIe(t,e){Xk(e);let r=ha(this.recordingProdStack),n=Et(t)===!1,i=n===!1?t:t.DEF,a=new gn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});St(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=sy(i,o=>gi(o.GATE));return a.hasPredicates=s,r.definition.push(a),Te(i,o=>{let l=new En({definition:[]});a.definition.push(l),St(o,"IGNORE_AMBIGUITIES")?l.ignoreAmbiguities=o.IGNORE_AMBIGUITIES:St(o,"GATE")&&(l.ignoreAmbiguities=!0),this.recordingProdStack.push(l),o.ALT.call(this),this.recordingProdStack.pop()}),jk}function Gae(t){return t===0?"":`${t}`}function Xk(t){if(t<0||t>$ae){let e=new Error(`Invalid DSL Method idx value: <${t}> Idx value must be a none negative value smaller than ${$ae+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var jk,zae,$ae,Uae,Vae,bIe,Yk,Wae=F(()=>{Ot();ts();Uy();Zd();Jd();Ns();Ok();jk={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(jk);zae=!0,$ae=Math.pow(2,8)-1,Uae=Tk({name:"RECORDING_PHASE_TOKEN",pattern:ei.NA});Uu([Uae]);Vae=Qd(Uae,`This IToken indicates the Parser is in Recording Phase See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(Vae);bIe={name:`This CSTNode indicates the Parser is in Recording Phase See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Yk=class{initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return Jg}topLevelRuleRecord(e,r){try{let n=new Ja({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` This error was thrown during the "grammar recording phase" For more info see: https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return t2.call(this,Zr,e,r)}atLeastOneInternalRecord(e,r){t2.call(this,Sn,r,e)}atLeastOneSepFirstInternalRecord(e,r){t2.call(this,Cn,r,e,zae)}manyInternalRecord(e,r){t2.call(this,br,r,e)}manySepFirstInternalRecord(e,r){t2.call(this,pn,r,e,zae)}orInternalRecord(e,r){return wIe.call(this,e,r)}subruleInternalRecord(e,r,n){if(Xk(r),!e||St(e,"ruleName")===!1){let o=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> inside top level rule: <${this.recordingProdStack[0].name}>`);throw o.KNOWN_RECORDER_ERROR=!0,o}let i=ha(this.recordingProdStack),a=e.ruleName,s=new Kr({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?bIe:jk}consumeInternalRecord(e,r,n){if(Xk(r),!xR(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ha(this.recordingProdStack),a=new pr({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),Vae}}});var Kk,Hae=F(()=>{Ot();$g();Ns();Kk=class{initPerformanceTracer(e){if(St(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=rs.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=zy(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function qae(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Yae=F(()=>{});function Zk(t=void 0){return function(){return t}}var Jg,rs,em,Li,r2,n2,Ns=F(()=>{Ot();$g();Tie();Jd();qg();xae();MR();Sae();Mae();Dae();Oae();Pae();Bae();Fae();Wae();Hae();Yae();Ky();Jg=Qd(no,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Jg);rs=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Wu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),em=Object.freeze({recoveryValueFunc:()=>{},resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(Li||(Li={}));r2=class t{static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{$y(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Te(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,o;this.TRACE_INIT(`${i} Rule`,()=>{o=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=o})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=vae({rules:fr(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(ir(n)&&this.skipValidations===!1){let i=yae({rules:fr(this.gastProductionsCache),tokenTypes:fr(this.tokensMap),errMsgProvider:_l,grammarName:r}),a=uae({lookaheadStrategy:this.lookaheadStrategy,rules:fr(this.gastProductionsCache),tokenTypes:fr(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),ir(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=kie(fr(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:fr(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(fr(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!ir(this.definitionErrors))throw e=je(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: ${e.join(` ------------------------------- `)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),St(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. Please use the flag on the relevant DSL method instead. See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES For further details.`);this.skipValidations=St(r,"skipValidations")?r.skipValidations:rs.skipValidations}};r2.DEFER_DEFINITION_ERRORS_HANDLING=!1;qae(r2,[Mk,Bk,Gk,Uk,Wk,Vk,Hk,qk,Yk,Kk]);n2=class extends r2{constructor(e,r=rs){let n=jr(r);n.outputCst=!1,super(e,n)}}});var Xae=F(()=>{ts()});var jae=F(()=>{});var Kae=F(()=>{Xae();jae()});var Zae=F(()=>{oR()});var t0=F(()=>{oR();Ns();Uy();Jd();Kg();DR();qg();Qg();wR();ts();ts();Kae();Zae()});function r0(t,e,r){return`${t.name}_${e}_${r}`}function tse(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};_Ie(e,t);let r=t.length;for(let n=0;nrse(t,e,s));return im(t,e,n,r,...i)}function DIe(t,e,r){let n=Xi(t,e,r,{type:rf});nf(t,n);let i=im(t,e,n,r,n0(t,e,r));return OIe(t,e,r,i)}function n0(t,e,r){let n=Fr(je(r.definition,i=>rse(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:BIe(t,n)}function nse(t,e,r,n,i){let a=n.left,s=n.right,o=Xi(t,e,r,{type:AIe});nf(t,o);let l=Xi(t,e,r,{type:ese});return a.loopback=o,l.loopback=o,t.decisionMap[r0(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=o,yi(s,o),i===void 0?(yi(o,a),yi(o,l)):(yi(o,l),yi(o,i.left),yi(i.right,a)),{left:a,right:l}}function ise(t,e,r,n,i){let a=n.left,s=n.right,o=Xi(t,e,r,{type:CIe});nf(t,o);let l=Xi(t,e,r,{type:ese}),u=Xi(t,e,r,{type:SIe});return o.loopback=u,l.loopback=u,yi(o,a),yi(o,l),yi(s,u),i!==void 0?(yi(u,l),yi(u,i.left),yi(i.right,a)):yi(u,o),t.decisionMap[r0(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=o,{left:o,right:l}}function OIe(t,e,r,n){let i=n.left,a=n.right;return yi(i,a),t.decisionMap[r0(e,"Option",r.idx)]=i,n}function nf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function im(t,e,r,n,...i){let a=Xi(t,e,n,{type:EIe,start:r});r.end=a;for(let o of i)o!==void 0?(yi(r,o.left),yi(o.right,a)):yi(r,a);let s={left:r,right:a};return t.decisionMap[r0(e,PIe(n),n.idx)]=r,s}function PIe(t){if(t instanceof gn)return"Alternation";if(t instanceof Zr)return"Option";if(t instanceof br)return"Repetition";if(t instanceof pn)return"RepetitionWithSeparator";if(t instanceof Sn)return"RepetitionMandatory";if(t instanceof Cn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function BIe(t,e){let r=e.length;for(let a=0;a{vg();y_();t0();rf=1,TIe=2,Qae=4,Jae=5,nm=7,EIe=8,SIe=9,CIe=10,AIe=11,ese=12,i2=class{constructor(e){this.target=e}isEpsilon(){return!1}},tm=class extends i2{constructor(e,r){super(e),this.tokenType=r}},a2=class extends i2{constructor(e){super(e)}isEpsilon(){return!0}},rm=class extends i2{constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}}});function HR(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var s2,am,sse=F(()=>{vg();s2={},am=class{constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=HR(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return je(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}}});function GIe(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function lse(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let o of s)if(r.has(o)){if(!i.has(o))return!1}else r.add(o),i.add(o)}}return!0}function UIe(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nVu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${YIe(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, <${e}> may appears as a prefix path in all these alternatives. `;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES For Further details.`,n}function YIe(t){if(t instanceof Kr)return"SUBRULE";if(t instanceof Zr)return"OPTION";if(t instanceof gn)return"OR";if(t instanceof Sn)return"AT_LEAST_ONE";if(t instanceof Cn)return"AT_LEAST_ONE_SEP";if(t instanceof pn)return"MANY_SEP";if(t instanceof br)return"MANY";if(t instanceof pr)return"CONSUME";throw Error("non exhaustive match")}function XIe(t,e,r){let n=fa(e.configs.elements,a=>a.state.transitions),i=Zee(n.filter(a=>a instanceof tm).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function jIe(t,e){return t.edges[e.tokenTypeIdx]}function KIe(t,e,r){let n=new am,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===nm){i.push(s);continue}let o=s.state.transitions.length;for(let l=0;l0&&!tMe(a))for(let s of i)a.add(s);return a}function ZIe(t,e){if(t instanceof tm&&Wy(e,t.tokenType))return t.target}function QIe(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function use(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function cse(t,e,r,n){return n=hse(t,n),e.edges[r.tokenTypeIdx]=n,n}function hse(t,e){if(e===s2)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function JIe(t){let e=new am,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};Jk(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function sMe(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var Qk,ose,o2,fse=F(()=>{t0();ase();sse();C_();b_();Qee();vg();E5();J5();iw();R_();Qk=class{constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=tse(e.rules),this.dfas=UIe(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,o=this.logging,l=r0(n,"Alternation",r),h=this.atn.decisionMap[l].decision,f=je(Rk({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),d=>je(d,p=>p[0]));if(lse(f,!1)&&!a){let d=zr(f,(p,g,m)=>(Te(g,y=>{y&&(p[y.tokenTypeIdx]=m,Te(y.categoryMatches,x=>{p[x]=m}))}),p),{});return i?function(p){var g;let m=this.LA(1),y=d[m.tokenTypeIdx];if(p!==void 0&&y!==void 0){let x=(g=p[y])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return y}:function(){let p=this.LA(1);return d[p.tokenTypeIdx]}}else return i?function(d){let p=new Qk,g=d===void 0?0:d.length;for(let y=0;yje(d,p=>p[0]));if(lse(f)&&f[0][0]&&!a){let d=f[0],p=Br(d);if(p.length===1&&ir(p[0].categoryMatches)){let m=p[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===m}}else{let g=zr(p,(m,y)=>(y!==void 0&&(m[y.tokenTypeIdx]=!0,Te(y.categoryMatches,x=>{m[x]=!0})),m),{});return function(){let m=this.LA(1);return g[m.tokenTypeIdx]===!0}}}return function(){let d=qR.call(this,s,h,ose,o);return typeof d=="object"?!1:d===0}}}});var dse=F(()=>{fse()});var pse,YR,gse,eT,$r,wr,tT,mse,XR,vse,yse,xse,bse,jR,wse,kse,Tse,rT,sm,om,KR,lm,Ese,ZR,QR,JR,eN,tN,Sse,Cse,rN,Ase,nN,l2,_se,Lse,Rse,Nse,Ise,Mse,Dse,Ose,nT,Pse,Bse,Fse,zse,$se,Gse,Use,Vse,Wse,Hse,qse,iT,Yse,Xse,jse,Kse,Zse,Qse,Jse,eoe,toe,roe,noe,ioe,aoe,iN,aN,soe,ooe,loe,coe,uoe,hoe,foe,doe,poe,sN,ze,oN=F(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}t.is=e})(pse||(pse={}));(function(t){function e(r){return typeof r=="string"}t.is=e})(YR||(YR={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(gse||(gse={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(eT||(eT={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=eT.MAX_VALUE),i===Number.MAX_VALUE&&(i=eT.MAX_VALUE),{line:n,character:i}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.uinteger(i.line)&&ze.uinteger(i.character)}t.is=r})($r||($r={}));(function(t){function e(n,i,a,s){if(ze.uinteger(n)&&ze.uinteger(i)&&ze.uinteger(a)&&ze.uinteger(s))return{start:$r.create(n,i),end:$r.create(a,s)};if($r.is(n)&&$r.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&$r.is(i.start)&&$r.is(i.end)}t.is=r})(wr||(wr={}));(function(t){function e(n,i){return{uri:n,range:i}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&wr.is(i.range)&&(ze.string(i.uri)||ze.undefined(i.uri))}t.is=r})(tT||(tT={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&wr.is(i.targetRange)&&ze.string(i.targetUri)&&wr.is(i.targetSelectionRange)&&(wr.is(i.originSelectionRange)||ze.undefined(i.originSelectionRange))}t.is=r})(mse||(mse={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.numberRange(i.red,0,1)&&ze.numberRange(i.green,0,1)&&ze.numberRange(i.blue,0,1)&&ze.numberRange(i.alpha,0,1)}t.is=r})(XR||(XR={}));(function(t){function e(n,i){return{range:n,color:i}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&wr.is(i.range)&&XR.is(i.color)}t.is=r})(vse||(vse={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.string(i.label)&&(ze.undefined(i.textEdit)||om.is(i))&&(ze.undefined(i.additionalTextEdits)||ze.typedArray(i.additionalTextEdits,om.is))}t.is=r})(yse||(yse={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(xse||(xse={}));(function(t){function e(n,i,a,s,o,l){let u={startLine:n,endLine:i};return ze.defined(a)&&(u.startCharacter=a),ze.defined(s)&&(u.endCharacter=s),ze.defined(o)&&(u.kind=o),ze.defined(l)&&(u.collapsedText=l),u}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.uinteger(i.startLine)&&ze.uinteger(i.startLine)&&(ze.undefined(i.startCharacter)||ze.uinteger(i.startCharacter))&&(ze.undefined(i.endCharacter)||ze.uinteger(i.endCharacter))&&(ze.undefined(i.kind)||ze.string(i.kind))}t.is=r})(bse||(bse={}));(function(t){function e(n,i){return{location:n,message:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&tT.is(i.location)&&ze.string(i.message)}t.is=r})(jR||(jR={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(wse||(wse={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(kse||(kse={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&ze.string(n.href)}t.is=e})(Tse||(Tse={}));(function(t){function e(n,i,a,s,o,l){let u={range:n,message:i};return ze.defined(a)&&(u.severity=a),ze.defined(s)&&(u.code=s),ze.defined(o)&&(u.source=o),ze.defined(l)&&(u.relatedInformation=l),u}t.create=e;function r(n){var i;let a=n;return ze.defined(a)&&wr.is(a.range)&&ze.string(a.message)&&(ze.number(a.severity)||ze.undefined(a.severity))&&(ze.integer(a.code)||ze.string(a.code)||ze.undefined(a.code))&&(ze.undefined(a.codeDescription)||ze.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(ze.string(a.source)||ze.undefined(a.source))&&(ze.undefined(a.relatedInformation)||ze.typedArray(a.relatedInformation,jR.is))}t.is=r})(rT||(rT={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return ze.defined(a)&&a.length>0&&(s.arguments=a),s}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.title)&&ze.string(i.command)}t.is=r})(sm||(sm={}));(function(t){function e(a,s){return{range:a,newText:s}}t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}t.insert=r;function n(a){return{range:a,newText:""}}t.del=n;function i(a){let s=a;return ze.objectLiteral(s)&&ze.string(s.newText)&&wr.is(s.range)}t.is=i})(om||(om={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.string(i.label)&&(ze.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(ze.string(i.description)||i.description===void 0)}t.is=r})(KR||(KR={}));(function(t){function e(r){let n=r;return ze.string(n)}t.is=e})(lm||(lm={}));(function(t){function e(a,s,o){return{range:a,newText:s,annotationId:o}}t.replace=e;function r(a,s,o){return{range:{start:a,end:a},newText:s,annotationId:o}}t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}t.del=n;function i(a){let s=a;return om.is(s)&&(KR.is(s.annotationId)||lm.is(s.annotationId))}t.is=i})(Ese||(Ese={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&rN.is(i.textDocument)&&Array.isArray(i.edits)}t.is=r})(ZR||(ZR={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&ze.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||ze.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||ze.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lm.is(i.annotationId))}t.is=r})(QR||(QR={}));(function(t){function e(n,i,a,s){let o={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(o.options=a),s!==void 0&&(o.annotationId=s),o}t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&ze.string(i.oldUri)&&ze.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||ze.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||ze.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lm.is(i.annotationId))}t.is=r})(JR||(JR={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&ze.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||ze.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||ze.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||lm.is(i.annotationId))}t.is=r})(eN||(eN={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>ze.string(i.kind)?QR.is(i)||JR.is(i)||eN.is(i):ZR.is(i)))}t.is=e})(tN||(tN={}));(function(t){function e(n){return{uri:n}}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)}t.is=r})(Sse||(Sse={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&ze.integer(i.version)}t.is=r})(Cse||(Cse={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&(i.version===null||ze.integer(i.version))}t.is=r})(rN||(rN={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&ze.string(i.languageId)&&ze.integer(i.version)&&ze.string(i.text)}t.is=r})(Ase||(Ase={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}t.is=e})(nN||(nN={}));(function(t){function e(r){let n=r;return ze.objectLiteral(r)&&nN.is(n.kind)&&ze.string(n.value)}t.is=e})(l2||(l2={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(_se||(_se={}));(function(t){t.PlainText=1,t.Snippet=2})(Lse||(Lse={}));(function(t){t.Deprecated=1})(Rse||(Rse={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}t.create=e;function r(n){let i=n;return i&&ze.string(i.newText)&&wr.is(i.insert)&&wr.is(i.replace)}t.is=r})(Nse||(Nse={}));(function(t){t.asIs=1,t.adjustIndentation=2})(Ise||(Ise={}));(function(t){function e(r){let n=r;return n&&(ze.string(n.detail)||n.detail===void 0)&&(ze.string(n.description)||n.description===void 0)}t.is=e})(Mse||(Mse={}));(function(t){function e(r){return{label:r}}t.create=e})(Dse||(Dse={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}t.create=e})(Ose||(Ose={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}t.fromPlainText=e;function r(n){let i=n;return ze.string(i)||ze.objectLiteral(i)&&ze.string(i.language)&&ze.string(i.value)}t.is=r})(nT||(nT={}));(function(t){function e(r){let n=r;return!!n&&ze.objectLiteral(n)&&(l2.is(n.contents)||nT.is(n.contents)||ze.typedArray(n.contents,nT.is))&&(r.range===void 0||wr.is(r.range))}t.is=e})(Pse||(Pse={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}t.create=e})(Bse||(Bse={}));(function(t){function e(r,n,...i){let a={label:r};return ze.defined(n)&&(a.documentation=n),ze.defined(i)?a.parameters=i:a.parameters=[],a}t.create=e})(Fse||(Fse={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(zse||(zse={}));(function(t){function e(r,n){let i={range:r};return ze.number(n)&&(i.kind=n),i}t.create=e})($se||($se={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(Gse||(Gse={}));(function(t){t.Deprecated=1})(Use||(Use={}));(function(t){function e(r,n,i,a,s){let o={name:r,kind:n,location:{uri:a,range:i}};return s&&(o.containerName=s),o}t.create=e})(Vse||(Vse={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}t.create=e})(Wse||(Wse={}));(function(t){function e(n,i,a,s,o,l){let u={name:n,detail:i,kind:a,range:s,selectionRange:o};return l!==void 0&&(u.children=l),u}t.create=e;function r(n){let i=n;return i&&ze.string(i.name)&&ze.number(i.kind)&&wr.is(i.range)&&wr.is(i.selectionRange)&&(i.detail===void 0||ze.string(i.detail))&&(i.deprecated===void 0||ze.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}t.is=r})(Hse||(Hse={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(qse||(qse={}));(function(t){t.Invoked=1,t.Automatic=2})(iT||(iT={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.typedArray(i.diagnostics,rT.is)&&(i.only===void 0||ze.typedArray(i.only,ze.string))&&(i.triggerKind===void 0||i.triggerKind===iT.Invoked||i.triggerKind===iT.Automatic)}t.is=r})(Yse||(Yse={}));(function(t){function e(n,i,a){let s={title:n},o=!0;return typeof i=="string"?(o=!1,s.kind=i):sm.is(i)?s.command=i:s.edit=i,o&&a!==void 0&&(s.kind=a),s}t.create=e;function r(n){let i=n;return i&&ze.string(i.title)&&(i.diagnostics===void 0||ze.typedArray(i.diagnostics,rT.is))&&(i.kind===void 0||ze.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||sm.is(i.command))&&(i.isPreferred===void 0||ze.boolean(i.isPreferred))&&(i.edit===void 0||tN.is(i.edit))}t.is=r})(Xse||(Xse={}));(function(t){function e(n,i){let a={range:n};return ze.defined(i)&&(a.data=i),a}t.create=e;function r(n){let i=n;return ze.defined(i)&&wr.is(i.range)&&(ze.undefined(i.command)||sm.is(i.command))}t.is=r})(jse||(jse={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.uinteger(i.tabSize)&&ze.boolean(i.insertSpaces)}t.is=r})(Kse||(Kse={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}t.create=e;function r(n){let i=n;return ze.defined(i)&&wr.is(i.range)&&(ze.undefined(i.target)||ze.string(i.target))}t.is=r})(Zse||(Zse={}));(function(t){function e(n,i){return{range:n,parent:i}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&wr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}t.is=r})(Qse||(Qse={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(Jse||(Jse={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(eoe||(eoe={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}t.is=e})(toe||(toe={}));(function(t){function e(n,i){return{range:n,text:i}}t.create=e;function r(n){let i=n;return i!=null&&wr.is(i.range)&&ze.string(i.text)}t.is=r})(roe||(roe={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}t.create=e;function r(n){let i=n;return i!=null&&wr.is(i.range)&&ze.boolean(i.caseSensitiveLookup)&&(ze.string(i.variableName)||i.variableName===void 0)}t.is=r})(noe||(noe={}));(function(t){function e(n,i){return{range:n,expression:i}}t.create=e;function r(n){let i=n;return i!=null&&wr.is(i.range)&&(ze.string(i.expression)||i.expression===void 0)}t.is=r})(ioe||(ioe={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}t.create=e;function r(n){let i=n;return ze.defined(i)&&wr.is(n.stoppedLocation)}t.is=r})(aoe||(aoe={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}t.is=e})(iN||(iN={}));(function(t){function e(n){return{value:n}}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&(i.tooltip===void 0||ze.string(i.tooltip)||l2.is(i.tooltip))&&(i.location===void 0||tT.is(i.location))&&(i.command===void 0||sm.is(i.command))}t.is=r})(aN||(aN={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&$r.is(i.position)&&(ze.string(i.label)||ze.typedArray(i.label,aN.is))&&(i.kind===void 0||iN.is(i.kind))&&i.textEdits===void 0||ze.typedArray(i.textEdits,om.is)&&(i.tooltip===void 0||ze.string(i.tooltip)||l2.is(i.tooltip))&&(i.paddingLeft===void 0||ze.boolean(i.paddingLeft))&&(i.paddingRight===void 0||ze.boolean(i.paddingRight))}t.is=r})(soe||(soe={}));(function(t){function e(r){return{kind:"snippet",value:r}}t.createSnippet=e})(ooe||(ooe={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}t.create=e})(loe||(loe={}));(function(t){function e(r){return{items:r}}t.create=e})(coe||(coe={}));(function(t){t.Invoked=0,t.Automatic=1})(uoe||(uoe={}));(function(t){function e(r,n){return{range:r,text:n}}t.create=e})(hoe||(hoe={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}t.create=e})(foe||(foe={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&YR.is(n.uri)&&ze.string(n.name)}t.is=e})(doe||(doe={}));(function(t){function e(a,s,o,l){return new sN(a,s,o,l)}t.create=e;function r(a){let s=a;return!!(ze.defined(s)&&ze.string(s.uri)&&(ze.undefined(s.languageId)||ze.string(s.languageId))&&ze.uinteger(s.lineCount)&&ze.func(s.getText)&&ze.func(s.positionAt)&&ze.func(s.offsetAt))}t.is=r;function n(a,s){let o=a.getText(),l=i(s,(h,f)=>{let d=h.range.start.line-f.range.start.line;return d===0?h.range.start.character-f.range.start.character:d}),u=o.length;for(let h=l.length-1;h>=0;h--){let f=l[h],d=a.offsetAt(f.range.start),p=a.offsetAt(f.range.end);if(p<=u)o=o.substring(0,d)+f.newText+o.substring(p,o.length);else throw new Error("Overlapping edit");u=d}return o}t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let o=a.length/2|0,l=a.slice(0,o),u=a.slice(o);i(l,s),i(u,s);let h=0,f=0,d=0;for(;h0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return $r.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return $r.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}t.undefined=n;function i(p){return p===!0||p===!1}t.boolean=i;function a(p){return e.call(p)==="[object String]"}t.string=a;function s(p){return e.call(p)==="[object Number]"}t.number=s;function o(p,g,m){return e.call(p)==="[object Number]"&&g<=p&&p<=m}t.numberRange=o;function l(p){return e.call(p)==="[object Number]"&&-2147483648<=p&&p<=2147483647}t.integer=l;function u(p){return e.call(p)==="[object Number]"&&0<=p&&p<=2147483647}t.uinteger=u;function h(p){return e.call(p)==="[object Function]"}t.func=h;function f(p){return p!==null&&typeof p=="object"}t.objectLiteral=f;function d(p,g){return Array.isArray(p)&&p.every(g)}t.typedArray=d})(ze||(ze={}))});var c2,u2,i0,a0,lN,cm,aT=F(()=>{oN();$o();El();c2=class{constructor(){this.nodeStack=[]}get current(){return this.nodeStack[this.nodeStack.length-1]}buildRootNode(e){return this.rootNode=new cm(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new a0;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new i0(e.startOffset,e.image.length,Ig(e),e.tokenType,!1);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}addHiddenTokens(e){for(let r of e){let n=new i0(r.startOffset,r.image.length,Ig(r),r.tokenType,!0);n.root=this.rootNode,this.addHiddenToken(this.rootNode,n)}}addHiddenToken(e,r){let{offset:n,end:i}=r;for(let a=0;ao&&i=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},lN=class t extends Array{constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},cm=class extends a0{get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function cN(t){return t.$type===sT}var sT,goe,moe,h2,f2,oT,um,d2,oMe,uN,p2=F(()=>{t0();dse();Ac();Al();Qa();aT();sT=Symbol("Datatype");goe="\u200B",moe=t=>t.endsWith(goe)?t:t+goe,h2=class{constructor(e){this._unorderedGroups=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition;this.wrapper=new uN(r,Object.assign(Object.assign({},e.parser.ParserConfig),{errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},f2=class extends h2{get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new c2,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=e.fragment?void 0:By(e)?sT:Yd(e),i=this.wrapper.DEFINE_RULE(moe(e.name),this.startImplementation(n,r).bind(this));return e.entry&&(this.mainRule=i),i}parse(e){this.nodeBuilder.buildRootNode(e);let r=this.lexer.tokenize(e);this.wrapper.input=r.tokens;let n=this.mainRule.call(this.wrapper,{});return this.nodeBuilder.addHiddenTokens(r.hidden),this.unorderedGroups.clear(),{value:n,lexerErrors:r.errors,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{if(!this.isRecording()){let a={$type:e};this.stack.push(a),e===sT&&(a.value="")}let i;try{i=r(n)}catch{i=void 0}return!this.isRecording()&&i===void 0&&(i=this.construct()),i}}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.nodeBuilder.buildLeafNode(i,n),{assignment:s,isCrossRef:o}=this.getAssignment(n),l=this.current;if(s){let u=Uo(n)?i.image:this.converter.convert(i.image,a);this.assign(s.operator,s.feature,u,a,o)}else if(cN(l)){let u=i.image;Uo(n)||(u=this.converter.convert(u,a).toString()),l.value+=u}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i){let a;this.isRecording()||(a=this.nodeBuilder.buildCompositeNode(n));let s=this.wrapper.wrapSubrule(e,r,i);!this.isRecording()&&a&&a.length>0&&this.performSubruleAssignment(s,n,a)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if(cN(s))s.value+=e.toString();else if(typeof e=="object"&&e){let o=e.$type,l=this.assignWithoutOverride(e,s);o&&(l.$type=o);let u=l;this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(!n.$cstNode&&r.feature&&r.operator){n=this.construct(!1);let a=n.$cstNode.feature;this.nodeBuilder.buildCompositeNode(a)}let i={$type:e};this.stack.pop(),this.stack.push(i),r.feature&&r.operator&&this.assign(r.operator,r.feature,n,n.$cstNode,!1)}}construct(e=!0){if(this.isRecording())return;let r=this.current;return ak(r),this.nodeBuilder.construct(r),e&&this.stack.pop(),cN(r)?this.converter.convert(r.value,r.$cstNode):(FL(this.astReflection,r),r)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=Ud(e,Sl);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?Gd(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,o;switch(a&&typeof n=="string"?o=this.linker.buildReference(s,r,i,n):o=n,e){case"=":{s[r]=o;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(o)}}assignWithoutOverride(e,r){for(let[n,i]of Object.entries(r)){let a=e[n];a===void 0?e[n]=i:Array.isArray(a)&&Array.isArray(i)&&(i.push(...a),e[n]=i)}return e}get definitionErrors(){return this.wrapper.definitionErrors}},oT=class{buildMismatchTokenMessage(e){return Wu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Wu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Wu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Wu.buildEarlyExitMessage(e)}},um=class extends oT{buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},d2=class extends h2{constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e);return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(moe(e.name),this.startImplementation(r).bind(this));return e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i){this.before(n),this.wrapper.wrapSubrule(e,r,i),this.after(n)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},oMe={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new um},uN=class extends n2{constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},oMe),{lookaheadStrategy:n?new Hu({maxLookahead:r.maxLookahead}):new o2}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function cT(t,e,r){return lMe({parser:e,tokens:r,rules:new Map,ruleNames:new Map},t),e}function lMe(t,e){let r=Oy(e,!1),n=Xr(e.rules).filter(Ra).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});a.rules.set(i.name,t.parser.rule(i,s0(a,i.definition)))}}function s0(t,e,r=!1){let n;if(Uo(e))n=gMe(t,e);else if(Fu(e))n=cMe(t,e);else if(Sl(e))n=s0(t,e.terminal);else if(Gd(e))n=voe(t,e);else if(Cl(e))n=uMe(t,e);else if(rk(e))n=fMe(t,e);else if(ik(e))n=dMe(t,e);else if(ef(e))n=pMe(t,e);else if(yL(e)){let i=t.consume++;n=()=>t.parser.consume(i,no,e)}else throw new $d(e.$cstNode,`Unexpected element type: ${e.$type}`);return yoe(t,r?void 0:lT(e),n,e.cardinality)}function cMe(t,e){let r=Yd(e);return()=>t.parser.action(r,e)}function uMe(t,e){let r=e.rule.ref;if(Ra(r)){let n=t.subrule++,i=e.arguments.length>0?hMe(r,e.arguments):()=>({});return a=>t.parser.subrule(n,xoe(t,r),e,i(a))}else if(Go(r)){let n=t.consume++,i=hN(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Jh(r);else throw new $d(e.$cstNode,`Undefined rule type: ${e.$type}`)}function hMe(t,e){let r=e.map(n=>qu(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(W9(t)){let e=qu(t.left),r=qu(t.right);return n=>e(n)&&r(n)}else if(Z9(t)){let e=qu(t.value);return r=>!e(r)}else if(tL(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(U9(t)){let e=!!t.true;return()=>e}Jh(t)}function fMe(t,e){if(e.elements.length===1)return s0(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:s0(t,i,!0)},s=lT(i);s&&(a.GATE=qu(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:()=>a.ALT(i)},o=a.GATE;return o&&(s.GATE=()=>o(i)),s}))}}function dMe(t,e){if(e.elements.length===1)return s0(t,e.elements[0]);let r=[];for(let o of e.elements){let l={ALT:s0(t,o,!0)},u=lT(o);u&&(l.GATE=qu(u)),r.push(l)}let n=t.or++,i=(o,l)=>{let u=l.getRuleStack().join("-");return`uGroup_${o}_${u}`},a=o=>t.parser.alternatives(n,r.map((l,u)=>{let h={ALT:()=>!0},f=t.parser;h.ALT=()=>{if(l.ALT(o),!f.isRecording()){let p=i(n,f);f.unorderedGroups.get(p)||f.unorderedGroups.set(p,[]);let g=f.unorderedGroups.get(p);typeof g?.[u]>"u"&&(g[u]=!0)}};let d=l.GATE;return d?h.GATE=()=>d(o):h.GATE=()=>{let p=f.unorderedGroups.get(i(n,f));return!p?.[u]},h})),s=yoe(t,lT(e),a,"*");return o=>{s(o),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function pMe(t,e){let r=e.elements.map(n=>s0(t,n));return n=>r.forEach(i=>i(n))}function lT(t){if(ef(t))return t.guardCondition}function voe(t,e,r=e.terminal){if(r)if(Cl(r)&&Ra(r.rule.ref)){let n=t.subrule++;return i=>t.parser.subrule(n,xoe(t,r.rule.ref),e,i)}else if(Cl(r)&&Go(r.rule.ref)){let n=t.consume++,i=hN(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Uo(r)){let n=t.consume++,i=hN(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=hk(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+Yd(e.type.ref));return voe(t,e,i)}}function gMe(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function yoe(t,e,r,n){let i=e&&qu(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:()=>r(s),GATE:()=>i(s)},{ALT:Zk(),GATE:()=>!i(s)}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:()=>r(s),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return o=>t.parser.alternatives(s,[{ALT:()=>t.parser.atLeastOne(a,{DEF:()=>r(o)}),GATE:()=>i(o)},{ALT:Zk(),GATE:()=>!i(o)}])}else return s=>t.parser.atLeastOne(a,{DEF:()=>r(s)})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:()=>r(s),GATE:i?()=>i(s):void 0})}else Jh(n)}function xoe(t,e){let r=mMe(t,e),n=t.rules.get(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function mMe(t,e){if(Ra(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Ra(n);)(ef(n)||rk(n)||ik(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function hN(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var fN=F(()=>{t0();Ac();jw();Ls();Al()});function dN(t){let e=t.Grammar,r=t.parser.Lexer,n=new d2(t);return cT(e,n,r.definition),n.finalize(),n}var pN=F(()=>{p2();fN()});function gN(t){let e=boe(t);return e.finalize(),e}function boe(t){let e=t.Grammar,r=t.parser.Lexer,n=new f2(t);return cT(e,n,r.definition)}var mN=F(()=>{p2();fN()});var o0,vN=F(()=>{t0();Ac();Qa();Al();Pg();Ls();o0=class{buildTokens(e,r){let n=Xr(Oy(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let o=s.PATTERN;typeof o=="object"&&o&&"test"in o&&ck(o)?a.unshift(s):a.push(s)}),a}buildTerminalTokens(e){return e.filter(Go).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=Bg(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n,LINE_BREAKS:!0};return e.hidden&&(i.GROUP=ck(r)?ei.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Ra).flatMap(i=>_c(i).filter(Uo)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){return{name:e.value,PATTERN:this.buildKeywordPattern(e,n),LONGER_ALT:this.findLongerAlt(e,r)}}buildKeywordPattern(e,r){return r?new RegExp(HL(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&qL("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var l0,Nc,yN=F(()=>{Ac();Al();l0=class{convert(e,r){let n=r.grammarSource;if(Gd(n)&&(n=jL(n)),Cl(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return Nc.convertInt(r);case"STRING":return Nc.convertString(r);case"ID":return Nc.convertID(r)}switch((i=nR(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return Nc.convertNumber(r);case"boolean":return Nc.convertBoolean(r);case"bigint":return Nc.convertBigint(r);case"date":return Nc.convertDate(r);default:return r}}};(function(t){function e(u){let h="";for(let f=1;f{"use strict";Object.defineProperty(wN,"__esModule",{value:!0});var xN;function bN(){if(xN===void 0)throw new Error("No runtime abstraction layer installed");return xN}(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");xN=r}t.install=e})(bN||(bN={}));wN.default=bN});var Toe=di(Na=>{"use strict";Object.defineProperty(Na,"__esModule",{value:!0});Na.stringArray=Na.array=Na.func=Na.error=Na.number=Na.string=Na.boolean=void 0;function vMe(t){return t===!0||t===!1}Na.boolean=vMe;function woe(t){return typeof t=="string"||t instanceof String}Na.string=woe;function yMe(t){return typeof t=="number"||t instanceof Number}Na.number=yMe;function xMe(t){return t instanceof Error}Na.error=xMe;function bMe(t){return typeof t=="function"}Na.func=bMe;function koe(t){return Array.isArray(t)}Na.array=koe;function wMe(t){return koe(t)&&t.every(e=>woe(e))}Na.stringArray=wMe});var EN=di(hm=>{"use strict";Object.defineProperty(hm,"__esModule",{value:!0});hm.Emitter=hm.Event=void 0;var kMe=kN(),Eoe;(function(t){let e={dispose(){}};t.None=function(){return e}})(Eoe||(hm.Event=Eoe={}));var TN=class{add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:()=>this.remove(e,r)})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new TN),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))}};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};hm.Emitter=uT;uT._noop=function(){}});var Soe=di(fm=>{"use strict";Object.defineProperty(fm,"__esModule",{value:!0});fm.CancellationTokenSource=fm.CancellationToken=void 0;var TMe=kN(),EMe=Toe(),SN=EN(),hT;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:SN.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:SN.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||EMe.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}t.is=e})(hT||(fm.CancellationToken=hT={}));var SMe=Object.freeze(function(t,e){let r=(0,TMe.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),fT=class{constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?SMe:(this._emitter||(this._emitter=new SN.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},CN=class{get token(){return this._token||(this._token=new fT),this._token}cancel(){this._token?this._token.cancel():this._token=hT.Cancelled}dispose(){this._token?this._token instanceof fT&&this._token.dispose():this._token=hT.None}};fm.CancellationTokenSource=CN});var mr={};var Wo=F(()=>{gr(mr,Gi(Soe(),1))});function _N(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function Aoe(){return AN=Date.now(),new mr.CancellationTokenSource}function _oe(t){Coe=t}function af(t){return t===Ic}async function Ri(t){if(t===mr.CancellationToken.None)return;let e=Date.now();if(e-AN>=Coe&&(AN=e,await _N()),t.isCancellationRequested)throw Ic}var AN,Coe,Ic,ns,Ho=F(()=>{Wo();AN=0,Coe=10;Ic=Symbol("OperationCancelled");ns=class{constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function LN(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);LN(n,e),LN(i,e);let a=0,s=0,o=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function CMe(t){let e=Noe(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var dT,dm,Ioe=F(()=>{"use strict";dT=class t{constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=Noe(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let o=Math.max(i.start.line,0),l=Math.max(i.end.line,0),u=this._lineOffsets,h=Loe(n.text,!1,a);if(l-o===h.length)for(let d=0,p=h.length;de?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&Roe(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,o){return new dT(i,a,s,o)}t.create=e;function r(i,a,s){if(i instanceof dT)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}t.update=r;function n(i,a){let s=i.getText(),o=LN(a.map(CMe),(h,f)=>{let d=h.range.start.line-f.range.start.line;return d===0?h.range.start.character-f.range.start.character:d}),l=0,u=[];for(let h of o){let f=i.offsetAt(h.range.start);if(fl&&u.push(s.substring(l,f)),h.newText.length&&u.push(h.newText),l=i.offsetAt(h.range.end)}return u.push(s.substr(l)),u.join("")}t.applyEdits=n})(dm||(dm={}))});var Moe,Is,pm,RN=F(()=>{(()=>{"use strict";var t={470:i=>{function a(l){if(typeof l!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(l))}function s(l,u){for(var h,f="",d=0,p=-1,g=0,m=0;m<=l.length;++m){if(m2){var y=f.lastIndexOf("/");if(y!==f.length-1){y===-1?(f="",d=0):d=(f=f.slice(0,y)).length-1-f.lastIndexOf("/"),p=m,g=0;continue}}else if(f.length===2||f.length===1){f="",d=0,p=m,g=0;continue}}u&&(f.length>0?f+="/..":f="..",d=2)}else f.length>0?f+="/"+l.slice(p+1,m):f=l.slice(p+1,m),d=m-p-1;p=m,g=0}else h===46&&g!==-1?++g:g=-1}return f}var o={resolve:function(){for(var l,u="",h=!1,f=arguments.length-1;f>=-1&&!h;f--){var d;f>=0?d=arguments[f]:(l===void 0&&(l=process.cwd()),d=l),a(d),d.length!==0&&(u=d+"/"+u,h=d.charCodeAt(0)===47)}return u=s(u,!h),h?u.length>0?"/"+u:"/":u.length>0?u:"."},normalize:function(l){if(a(l),l.length===0)return".";var u=l.charCodeAt(0)===47,h=l.charCodeAt(l.length-1)===47;return(l=s(l,!u)).length!==0||u||(l="."),l.length>0&&h&&(l+="/"),u?"/"+l:l},isAbsolute:function(l){return a(l),l.length>0&&l.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var l,u=0;u0&&(l===void 0?l=h:l+="/"+h)}return l===void 0?".":o.normalize(l)},relative:function(l,u){if(a(l),a(u),l===u||(l=o.resolve(l))===(u=o.resolve(u)))return"";for(var h=1;hm){if(u.charCodeAt(p+x)===47)return u.slice(p+x+1);if(x===0)return u.slice(p+x)}else d>m&&(l.charCodeAt(h+x)===47?y=x:x===0&&(y=0));break}var b=l.charCodeAt(h+x);if(b!==u.charCodeAt(p+x))break;b===47&&(y=x)}var w="";for(x=h+y+1;x<=f;++x)x!==f&&l.charCodeAt(x)!==47||(w.length===0?w+="..":w+="/..");return w.length>0?w+u.slice(p+y):(p+=y,u.charCodeAt(p)===47&&++p,u.slice(p))},_makeLong:function(l){return l},dirname:function(l){if(a(l),l.length===0)return".";for(var u=l.charCodeAt(0),h=u===47,f=-1,d=!0,p=l.length-1;p>=1;--p)if((u=l.charCodeAt(p))===47){if(!d){f=p;break}}else d=!1;return f===-1?h?"/":".":h&&f===1?"//":l.slice(0,f)},basename:function(l,u){if(u!==void 0&&typeof u!="string")throw new TypeError('"ext" argument must be a string');a(l);var h,f=0,d=-1,p=!0;if(u!==void 0&&u.length>0&&u.length<=l.length){if(u.length===l.length&&u===l)return"";var g=u.length-1,m=-1;for(h=l.length-1;h>=0;--h){var y=l.charCodeAt(h);if(y===47){if(!p){f=h+1;break}}else m===-1&&(p=!1,m=h+1),g>=0&&(y===u.charCodeAt(g)?--g==-1&&(d=h):(g=-1,d=m))}return f===d?d=m:d===-1&&(d=l.length),l.slice(f,d)}for(h=l.length-1;h>=0;--h)if(l.charCodeAt(h)===47){if(!p){f=h+1;break}}else d===-1&&(p=!1,d=h+1);return d===-1?"":l.slice(f,d)},extname:function(l){a(l);for(var u=-1,h=0,f=-1,d=!0,p=0,g=l.length-1;g>=0;--g){var m=l.charCodeAt(g);if(m!==47)f===-1&&(d=!1,f=g+1),m===46?u===-1?u=g:p!==1&&(p=1):u!==-1&&(p=-1);else if(!d){h=g+1;break}}return u===-1||f===-1||p===0||p===1&&u===f-1&&u===h+1?"":l.slice(u,f)},format:function(l){if(l===null||typeof l!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof l);return function(u,h){var f=h.dir||h.root,d=h.base||(h.name||"")+(h.ext||"");return f?f===h.root?f+d:f+"/"+d:d}(0,l)},parse:function(l){a(l);var u={root:"",dir:"",base:"",ext:"",name:""};if(l.length===0)return u;var h,f=l.charCodeAt(0),d=f===47;d?(u.root="/",h=1):h=0;for(var p=-1,g=0,m=-1,y=!0,x=l.length-1,b=0;x>=h;--x)if((f=l.charCodeAt(x))!==47)m===-1&&(y=!1,m=x+1),f===46?p===-1?p=x:b!==1&&(b=1):p!==-1&&(b=-1);else if(!y){g=x+1;break}return p===-1||m===-1||b===0||b===1&&p===m-1&&p===g+1?m!==-1&&(u.base=u.name=g===0&&d?l.slice(1,m):l.slice(g,m)):(g===0&&d?(u.name=l.slice(1,p),u.base=l.slice(1,m)):(u.name=l.slice(g,p),u.base=l.slice(g,m)),u.ext=l.slice(p,m)),g>0?u.dir=l.slice(0,g-1):d&&(u.dir="/"),u},sep:"/",delimiter:":",win32:null,posix:null};o.posix=o,i.exports=o}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:()=>d,Utils:()=>M}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,o=/^\/\//;function l(R,T){if(!R.scheme&&T)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${R.authority}", path: "${R.path}", query: "${R.query}", fragment: "${R.fragment}"}`);if(R.scheme&&!a.test(R.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(R.path){if(R.authority){if(!s.test(R.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(o.test(R.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}let u="",h="/",f=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class d{static isUri(T){return T instanceof d||!!T&&typeof T.authority=="string"&&typeof T.fragment=="string"&&typeof T.path=="string"&&typeof T.query=="string"&&typeof T.scheme=="string"&&typeof T.fsPath=="string"&&typeof T.with=="function"&&typeof T.toString=="function"}scheme;authority;path;query;fragment;constructor(T,I,A,D,N,O=!1){typeof T=="object"?(this.scheme=T.scheme||u,this.authority=T.authority||u,this.path=T.path||u,this.query=T.query||u,this.fragment=T.fragment||u):(this.scheme=function(B,P){return B||P?B:"file"}(T,O),this.authority=I||u,this.path=function(B,P){switch(B){case"https":case"http":case"file":P?P[0]!==h&&(P=h+P):P=h}return P}(this.scheme,A||u),this.query=D||u,this.fragment=N||u,l(this,O))}get fsPath(){return b(this,!1)}with(T){if(!T)return this;let{scheme:I,authority:A,path:D,query:N,fragment:O}=T;return I===void 0?I=this.scheme:I===null&&(I=u),A===void 0?A=this.authority:A===null&&(A=u),D===void 0?D=this.path:D===null&&(D=u),N===void 0?N=this.query:N===null&&(N=u),O===void 0?O=this.fragment:O===null&&(O=u),I===this.scheme&&A===this.authority&&D===this.path&&N===this.query&&O===this.fragment?this:new g(I,A,D,N,O)}static parse(T,I=!1){let A=f.exec(T);return A?new g(A[2]||u,E(A[4]||u),E(A[5]||u),E(A[7]||u),E(A[9]||u),I):new g(u,u,u,u,u)}static file(T){let I=u;if(i&&(T=T.replace(/\\/g,h)),T[0]===h&&T[1]===h){let A=T.indexOf(h,2);A===-1?(I=T.substring(2),T=h):(I=T.substring(2,A),T=T.substring(A)||h)}return new g("file",I,T,u,u)}static from(T){let I=new g(T.scheme,T.authority,T.path,T.query,T.fragment);return l(I,!0),I}toString(T=!1){return w(this,T)}toJSON(){return this}static revive(T){if(T){if(T instanceof d)return T;{let I=new g(T);return I._formatted=T.external,I._fsPath=T._sep===p?T.fsPath:null,I}}return T}}let p=i?1:void 0;class g extends d{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(T=!1){return T?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)}toJSON(){let T={$mid:1};return this._fsPath&&(T.fsPath=this._fsPath,T._sep=p),this._formatted&&(T.external=this._formatted),this.path&&(T.path=this.path),this.scheme&&(T.scheme=this.scheme),this.authority&&(T.authority=this.authority),this.query&&(T.query=this.query),this.fragment&&(T.fragment=this.fragment),T}}let m={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function y(R,T,I){let A,D=-1;for(let N=0;N=97&&O<=122||O>=65&&O<=90||O>=48&&O<=57||O===45||O===46||O===95||O===126||T&&O===47||I&&O===91||I&&O===93||I&&O===58)D!==-1&&(A+=encodeURIComponent(R.substring(D,N)),D=-1),A!==void 0&&(A+=R.charAt(N));else{A===void 0&&(A=R.substr(0,N));let B=m[O];B!==void 0?(D!==-1&&(A+=encodeURIComponent(R.substring(D,N)),D=-1),A+=B):D===-1&&(D=N)}}return D!==-1&&(A+=encodeURIComponent(R.substring(D))),A!==void 0?A:R}function x(R){let T;for(let I=0;I1&&R.scheme==="file"?`//${R.authority}${R.path}`:R.path.charCodeAt(0)===47&&(R.path.charCodeAt(1)>=65&&R.path.charCodeAt(1)<=90||R.path.charCodeAt(1)>=97&&R.path.charCodeAt(1)<=122)&&R.path.charCodeAt(2)===58?T?R.path.substr(1):R.path[1].toLowerCase()+R.path.substr(2):R.path,i&&(I=I.replace(/\//g,"\\")),I}function w(R,T){let I=T?x:y,A="",{scheme:D,authority:N,path:O,query:B,fragment:P}=R;if(D&&(A+=D,A+=":"),(N||D==="file")&&(A+=h,A+=h),N){let $=N.indexOf("@");if($!==-1){let z=N.substr(0,$);N=N.substr($+1),$=z.lastIndexOf(":"),$===-1?A+=I(z,!1,!1):(A+=I(z.substr(0,$),!1,!1),A+=":",A+=I(z.substr($+1),!1,!0)),A+="@"}N=N.toLowerCase(),$=N.lastIndexOf(":"),$===-1?A+=I(N,!1,!0):(A+=I(N.substr(0,$),!1,!0),A+=N.substr($))}if(O){if(O.length>=3&&O.charCodeAt(0)===47&&O.charCodeAt(2)===58){let $=O.charCodeAt(1);$>=65&&$<=90&&(O=`/${String.fromCharCode($+32)}:${O.substr(3)}`)}else if(O.length>=2&&O.charCodeAt(1)===58){let $=O.charCodeAt(0);$>=65&&$<=90&&(O=`${String.fromCharCode($+32)}:${O.substr(2)}`)}A+=I(O,!0,!1)}return B&&(A+="?",A+=I(B,!1,!1)),P&&(A+="#",A+=T?P:y(P,!1,!1)),A}function _(R){try{return decodeURIComponent(R)}catch{return R.length>3?R.substr(0,3)+_(R.substr(3)):R}}let k=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function E(R){return R.match(k)?R.replace(k,T=>_(T)):R}var L=r(470);let S=L.posix||L,C="/";var M;(function(R){R.joinPath=function(T,...I){return T.with({path:S.join(T.path,...I)})},R.resolvePath=function(T,...I){let A=T.path,D=!1;A[0]!==C&&(A=C+A,D=!0);let N=S.resolve(A,...I);return D&&N[0]===C&&!T.authority&&(N=N.substring(1)),T.with({path:N})},R.dirname=function(T){if(T.path.length===0||T.path===C)return T;let I=S.dirname(T.path);return I.length===1&&I.charCodeAt(0)===46&&(I=""),T.with({path:I})},R.basename=function(T){return S.basename(T.path)},R.extname=function(T){return S.extname(T.path)}})(M||(M={}))})(),Moe=n})();({URI:Is,Utils:pm}=Moe)});var is,Mc=F(()=>{RN();(function(t){t.basename=pm.basename,t.dirname=pm.dirname,t.extname=pm.extname,t.joinPath=pm.joinPath,t.resolvePath=pm.resolvePath;function e(n,i){return n?.toString()===i?.toString()}t.equals=e;function r(n,i){let a=typeof n=="string"?n:n.path,s=typeof i=="string"?i:i.path,o=a.split("/").filter(d=>d.length>0),l=s.split("/").filter(d=>d.length>0),u=0;for(;u{Ioe();gm();Wo();Ls();Mc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(mn||(mn={}));g2=class{constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=mr.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??Is.parse(e.uri),n?this.createAsync(r,e,n):this.create(r,e)}fromString(e,r,n){return n?this.createAsync(r,e,n):this.create(r,e)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r){if(typeof r=="string"){let n=this.parse(e,r);return this.createLangiumDocument(n,e,void 0,r)}else if("$model"in r){let n={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(n,e)}else{let n=this.parse(e,r.getText());return this.createLangiumDocument(n,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:mn.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:mn.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),o=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let l=this.createTextDocumentGetter(e.uri,o);Object.defineProperty(e,"textDocument",{get:l})}return a!==o&&(e.parseResult=await this.parseAsync(e.uri,o,r),e.parseResult.value.$document=e),e.state=mn.Parsed,e}parse(e,r){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=dm.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},m2=class{constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory}get all(){return Xr(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=mn.Changed,n.precomputedScopes=void 0,n.references=[],n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=mn.Changed,this.documentMap.delete(r)),n}}});var v2,NN=F(()=>{Wo();$o();Qa();Ho();gm();v2=class{constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=mr.CancellationToken.None){for(let n of Vo(e.parseResult.value))await Ri(r),Dg(n).forEach(i=>this.doLink(i,e))}doLink(e,r){let n=e.reference;if(n._ref===void 0)try{let i=this.getCandidate(e);if(Bd(i))n._ref=i;else if(n._nodeDescription=i,this.langiumDocuments().hasDocument(i.documentUri)){let a=this.loadAstNode(i);n._ref=a??this.createLinkingError(e,i)}}catch(i){n._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${n.$refText}': ${i}`})}r.references.push(n)}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var o;if(Xn(this._ref))return this._ref;if(R9(this._nodeDescription)){let l=a.loadAstNode(this._nodeDescription);this._ref=l??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){let l=a.getLinkedNode({reference:s,container:e,property:r});if(l.error&&_i(e).state{Al();y2=class{getName(e){if(Doe(e))return e.name}getNameNode(e){return Py(e.$cstNode,"name")}}});var x2,MN=F(()=>{Al();$o();Qa();El();Ls();Mc();x2=class{constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=tR(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(pa(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(pa(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||I9(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>is.equals(a.sourceUri,r.documentUri))),n.push(...i),Xr(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=_i(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:zd(r),local:!0}}}}});var Dc,c0,mm=F(()=>{Ls();Dc=class{constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return Ng.sum(Xr(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return Xr(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return Xr(this.map.keys())}values(){return Xr(this.map.values()).flat()}entriesGroupedByKey(){return Xr(this.map.entries())}},c0=class{get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var b2,DN=F(()=>{Wo();Qa();mm();Ho();b2=class{constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=mr.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=Ry,i=mr.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await Ri(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=mr.CancellationToken.None){let n=e.parseResult.value,i=new Dc;for(let a of _c(n))await Ri(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var vm,w2,AMe,ON=F(()=>{Ls();vm=class{constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},w2=class{constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=Xr(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},AMe={getElement(){},getAllElements(){return Ey}}});var ym,k2,u0,pT,xm,gT=F(()=>{ym=class{constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},k2=class extends ym{constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},u0=class extends ym{constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},pT=class extends u0{constructor(e){super(r=>r.toString()),this.onDispose(e.workspace.DocumentBuilder.onUpdate((r,n)=>{let i=r.concat(n);for(let a of i)this.clear(a)}))}},xm=class extends k2{constructor(e){super(),this.onDispose(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var T2,PN=F(()=>{ON();Qa();Ls();gT();T2=class{constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new xm(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=_i(e.container).precomputedScopes;if(i){let s=e.container;do{let o=i.get(s);o.length>0&&r.push(Xr(o).filter(l=>this.reflection.isSubtype(l.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new vm(Xr(e),r,n)}createScopeForNodes(e,r,n){let i=Xr(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new vm(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new w2(this.indexManager.allElements(e)))}}});function BN(t){return typeof t.$comment=="string"}function Ooe(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var E2,mT=F(()=>{RN();$o();Qa();Al();E2=class{constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r={}){let n=r?.replacer,i=(s,o)=>this.replacer(s,o,r),a=n?(s,o)=>n(s,o,i):i;try{return this.currentDocument=_i(e),JSON.stringify(e,a,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r={}){let n=JSON.parse(e);return this.linkNode(n,n,r),n}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:o}){var l,u,h,f;if(!this.ignoreProperties.has(e))if(pa(r)){let d=r.ref,p=n?r.$refText:void 0;if(d){let g=_i(d),m="";this.currentDocument&&this.currentDocument!==g&&(o?m=o(g.uri,r):m=g.uri.toString());let y=this.astNodeLocator.getAstNodePath(d);return{$ref:`${m}#${y}`,$refText:p}}else return{$error:(u=(l=r.error)===null||l===void 0?void 0:l.message)!==null&&u!==void 0?u:"Could not resolve reference",$refText:p}}else if(Xn(r)){let d;if(a&&(d=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&d?.$textRegion&&(d.$textRegion.documentURI=(h=this.currentDocument)===null||h===void 0?void 0:h.uri.toString())),i&&!e&&(d??(d=Object.assign({},r)),d.$sourceText=(f=r.$cstNode)===null||f===void 0?void 0:f.text),s){d??(d=Object.assign({},r));let p=this.commentProvider.getComment(r);p&&(d.$comment=p.replace(/\r/g,""))}return d??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=n=>({offset:n.offset,end:n.end,length:n.length,range:n.range});if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=ZL(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[l,u]of Object.entries(e))if(Array.isArray(u))for(let h=0;h{Mc();S2=class{register(e){if(!this.singleton&&!this.map){this.singleton=e;return}if(!this.map&&(this.map={},this.singleton)){for(let r of this.singleton.LanguageMetaData.fileExtensions)this.map[r]=this.singleton;this.singleton=void 0}for(let r of e.LanguageMetaData.fileExtensions)this.map[r]!==void 0&&this.map[r]!==e&&console.warn(`The file extension ${r} is used by multiple languages. It is now assigned to '${e.LanguageMetaData.languageId}'.`),this.map[r]=e}getServices(e){if(this.singleton!==void 0)return this.singleton;if(this.map===void 0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let r=is.extname(e),n=this.map[r];if(!n)throw new Error(`The service registry contains no services for the extension '${r}'.`);return n}get all(){return this.singleton!==void 0?[this.singleton]:this.map!==void 0?Object.values(this.map):[]}}});function vT(t){return{code:t}}var bm,C2,A2=F(()=>{mm();Ho();Ls();(function(t){t.all=["fast","slow","built-in"]})(bm||(bm={}));C2=class{constructor(e){this.entries=new Dc,this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let o of s){let l={check:this.wrapValidationException(o,r),category:n};this.addEntry(i,l)}else if(typeof s=="function"){let o={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,o)}}}wrapValidationException(e,r){return async(n,i,a)=>{try{await e.call(r,n,i,a)}catch(s){if(af(s))throw s;console.error("An error occurred during validation:",s);let o=s instanceof Error?s.message:String(s);s instanceof Error&&s.stack&&console.error(s.stack),i("error","An error occurred during validation: "+o,{node:n})}}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=Xr(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}}});function Poe(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=Py(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=JL(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function yT(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}var _2,Yu,zN=F(()=>{Wo();Al();Qa();El();Ho();A2();_2=class{constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=mr.CancellationToken.None){let i=e.parseResult,a=[];if(await Ri(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var o;return((o=s.data)===null||o===void 0?void 0:o.code)===Yu.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var o;return((o=s.data)===null||o===void 0?void 0:o.code)===Yu.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var o;return((o=s.data)===null||o===void 0?void 0:o.code)===Yu.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(af(s))throw s;console.error("An error occurred during validation:",s)}return await Ri(n),a}processLexingErrors(e,r,n){for(let i of e.lexerErrors){let a={severity:yT("error"),range:{start:{line:i.line-1,character:i.column-1},end:{line:i.line-1,character:i.column+i.length-1}},message:i.message,data:vT(Yu.LexingError),source:this.getSource()};r.push(a)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let o={line:0,character:0};a={start:o,end:o}}else{let o={line:s.endLine-1,character:s.endColumn};a={start:o,end:o}}}}else a=Ig(i.token);if(a){let s={severity:yT("error"),range:a,message:i.message,data:vT(Yu.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:Yu.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=mr.CancellationToken.None){let i=[],a=(s,o,l)=>{i.push(this.toDiagnostic(s,o,l))};return await Promise.all(Vo(e).map(async s=>{await Ri(n);let o=this.validationRegistry.getChecks(s.$type,r.categories);for(let l of o)await l(s,a,n)})),i}toDiagnostic(e,r,n){return{message:r,range:Poe(n),severity:yT(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};(function(t){t.LexingError="lexing-error",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(Yu||(Yu={}))});var L2,R2,$N=F(()=>{Wo();$o();Qa();El();Ho();Mc();L2=class{constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n=_i(e)){r??(r=this.nameProvider.getName(e));let i=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${i} has no name.`);let a,s=()=>{var o;return a??(a=zd((o=this.nameProvider.getNameNode(e))!==null&&o!==void 0?o:e.$cstNode))};return{node:e,name:r,get nameSegment(){return s()},selectionSegment:zd(e.$cstNode),type:e.$type,documentUri:n.uri,path:i}}},R2=class{constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=mr.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of Vo(i))await Ri(r),Dg(a).filter(s=>!Bd(s)).forEach(s=>{let o=this.createDescription(s);o&&n.push(o)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=_i(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:zd(n),local:is.equals(r.documentUri,i)}}}});var N2,GN=F(()=>{N2=class{constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let o=a.substring(0,s),l=parseInt(a.substring(s+1)),u=i[o];return u?.[l]}return i[a]},e)}}});var I2,UN=F(()=>{Ho();I2=class{constructor(e){this._ready=new ns,this.settings={},this.workspaceConfig=!1,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{this.updateSectionConfiguration(r,e.settings[r])})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}}});var h0,VN=F(()=>{(function(t){function e(r){return{dispose:async()=>await r()}}t.create=e})(h0||(h0={}))});var M2,WN=F(()=>{Wo();VN();mm();Ho();Ls();A2();gm();M2=class{constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Dc,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=mn.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=mr.CancellationToken.None){var i,a;for(let s of e){let o=s.uri.toString();if(s.state===mn.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=mn.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(o);else if(typeof r.validation=="object"){let l=this.buildState.get(o),u=(i=l?.result)===null||i===void 0?void 0:i.validationChecks;if(u){let f=((a=r.validation.categories)!==null&&a!==void 0?a:bm.all).filter(d=>!u.includes(d));f.length>0&&(this.buildState.set(o,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:f})},result:l.result}),s.state=mn.IndexedReferences)}}}else this.buildState.delete(o)}this.currentState=mn.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=mr.CancellationToken.None){this.currentState=mn.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let l=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);l.state=mn.Changed,this.langiumDocuments.addDocument(l)}this.buildState.delete(s.toString())}let i=Xr(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,mn.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await Ri(n);let a=this.langiumDocuments.all.filter(s=>{var o;return s.staten(e,r)))}shouldRelink(e,r){return e.references.some(n=>n.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),h0.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,mn.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,mn.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,mn.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,mn.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,mn.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,mn.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(s=>s.state{this.buildPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=mr.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(Ic):new Promise((a,s)=>{let o=this.onBuildPhase(e,()=>{if(o.dispose(),l.dispose(),i){let u=this.langiumDocuments.getDocument(i);a(u?.uri)}else a(void 0)}),l=n.onCancellationRequested(()=>{o.dispose(),l.dispose(),s(Ic)})})}async notifyBuildPhase(e,r,n){if(e.length===0)return;let i=this.buildPhaseListeners.get(r);for(let a of i)await Ri(n),await a(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,o=typeof s=="object"?s:void 0,l=await a.validateDocument(e,o,r);e.diagnostics?e.diagnostics.push(...l):e.diagnostics=l;let u=this.buildState.get(e.uri.toString());if(u){(n=u.result)!==null&&n!==void 0||(u.result={});let h=(i=o?.categories)!==null&&i!==void 0?i:bm.all;u.result.validationChecks?u.result.validationChecks.push(...h):u.result.validationChecks=[...h]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var D2,HN=F(()=>{Qa();gT();Wo();Ls();Mc();D2=class{constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new u0,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=_i(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{is.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),Xr(i)}allElements(e,r){let n=Xr(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(o=>this.astReflection.isSubtype(o.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=mr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=mr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var O2,qN=F(()=>{Wo();Ho();Mc();O2=class{constructor(e){this.initialBuildOptions={},this._ready=new ns,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=mr.CancellationToken.None){let n=await this.performStartup(e);await Ri(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)};return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return Is.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let o=await this.langiumDocuments.getOrCreateDocument(s.uri);i(o)}}}))}includeEntry(e,r,n){let i=is.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=is.extname(r.uri);return n.includes(a)}return!1}}});function Boe(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function XN(t){return t&&"modes"in t&&"defaultMode"in t}function YN(t){return!Boe(t)&&!XN(t)}var P2,jN=F(()=>{t0();P2=class{constructor(e){let r=e.parser.TokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=YN(r)?Object.values(r):r;this.chevrotainLexer=new ei(n,{positionTracking:"full"})}get definition(){return this.tokenTypes}tokenize(e){var r;let n=this.chevrotainLexer.tokenize(e);return{tokens:n.tokens,errors:n.errors,hidden:(r=n.groups.hidden)!==null&&r!==void 0?r:[]}}toTokenTypeDictionary(e){if(YN(e))return e;let r=XN(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}}});function QN(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=$r.create(0,0));let a=$oe(t),s=eI(n),o=LMe({lines:a,position:i,options:s});return DMe({index:0,tokens:o,position:i})}function JN(t,e){let r=eI(e),n=$oe(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,o=r.end;return!!s?.exec(i)&&!!o?.exec(a)}function $oe(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(VL)}function LMe(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let o=0;o=h.length){if(i.length>0){let p=$r.create(a,s);i.push({type:"break",content:"",range:wr.create(p,p)})}}else{Foe.lastIndex=f;let p=Foe.exec(h);if(p){let g=p[0],m=p[1],y=$r.create(a,s+f),x=$r.create(a,s+f+g.length);i.push({type:"tag",content:m,range:wr.create(y,x)}),f+=g.length,f=ZN(h,f)}if(f0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function RMe(t,e,r,n){let i=[];if(t.length===0){let a=$r.create(r,n),s=$r.create(r,n+e.length);i.push({type:"text",content:e,range:wr.create(a,s)})}else{let a=0;for(let o of t){let l=o.index,u=e.substring(a,l);u.length>0&&i.push({type:"text",content:e.substring(a,l),range:wr.create($r.create(r,a+n),$r.create(r,l+n))});let h=u.length+1,f=o[1];if(i.push({type:"inline-tag",content:f,range:wr.create($r.create(r,a+h+n),$r.create(r,a+h+f.length+n))}),h+=f.length,o.length===4){h+=o[2].length;let d=o[3];i.push({type:"text",content:d,range:wr.create($r.create(r,a+h+n),$r.create(r,a+h+d.length+n))})}else i.push({type:"text",content:"",range:wr.create($r.create(r,a+h+n),$r.create(r,a+h+n))});a=l+o[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:wr.create($r.create(r,a+n),$r.create(r,a+n+s.length))})}return i}function ZN(t,e){let r=t.substring(e).match(NMe);return r?e+r.index:t.length}function MMe(t){let e=t.match(IMe);if(e&&typeof e.index=="number")return e.index}function DMe(t){var e,r,n,i;let a=$r.create(t.position.line,t.position.character);if(t.tokens.length===0)return new xT([],wr.create(a,a));let s=[];for(;t.index0){let l=ZN(e,a);s=e.substring(l),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:zMe(e,s)}}function zMe(t,e){try{return Is.parse(t,!0),`[${e}](${t})`}catch{return t}}function zoe(t){return t.endsWith(` `)?` `:` `}var Foe,_Me,NMe,IMe,xT,B2,F2,bT,tI=F(()=>{oN();Pg();Mc();Foe=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,_Me=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;NMe=/\S/,IMe=/\s*$/;xT=class{constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=zoe(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=zoe(r)+i}return r.trim()}},B2=class{constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} ${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=FMe(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} ${r}`),this.inline?`{${i}}`:i}};F2=class{constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` `)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` `)}return r}},bT=class{constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}}});var z2,rI=F(()=>{Qa();tI();z2=class{constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&JN(r))return QN(r).toMarkdown({renderLink:(i,a)=>this.documentationLinkRenderer(e,i,a),renderTag:i=>this.documentationTagRenderer(e,i)})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,o=a.nameSegment.range.start.character+1,l=a.documentUri.with({fragment:`L${s},${o}`});return`[${n}](${l.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=_i(e).precomputedScopes;if(!i)return;let a=e;do{let o=i.get(a).find(l=>l.name===r);if(o)return o;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var $2,nI=F(()=>{mT();El();$2=class{constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return BN(e)?e.$comment:(r=D9(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var ti={};var iI=F(()=>{gr(ti,Gi(EN(),1))});var G2,aI,sI,oI=F(()=>{Ho();iI();G2=class{constructor(e){this.syncParser=e.parser.LangiumParser}parse(e){return Promise.resolve(this.syncParser.parse(e))}},aI=class{constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new ns,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(o=>{let l=this.hydrator.hydrate(o);i.resolve(l)}).catch(o=>{i.reject(o)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new ns;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Ic)}),this.queue.push(r),r.promise}},sI=class{get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new ti.Emitter,this.deferred=new ns,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(Ic),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new ns,this.sendMessage(e),this.deferred.promise}}});var U2,lI=F(()=>{Wo();Ho();U2=class{constructor(){this.previousTokenSource=new mr.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=new mr.CancellationTokenSource;return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n){let i=new ns,a={action:r,deferred:i,cancellationToken:n??mr.CancellationToken.None};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){af(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var V2,cI=F(()=>{aT();Ac();$o();Qa();mm();El();V2=class{constructor(e){this.grammarElementIdMap=new c0,this.tokenTypeIdMap=new c0,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors.map(r=>Object.assign({},r)),parserErrors:e.parserErrors.map(r=>Object.assign({},r)),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of Vo(e))r.set(i,{});if(e.$cstNode)for(let i of Fd(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let o of a)Xn(o)?s.push(this.dehydrateAstNode(o,r)):pa(o)?s.push(this.dehydrateReference(o,r)):s.push(o)}else Xn(a)?n[i]=this.dehydrateAstNode(a,r):pa(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return Ty(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),eo(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):Qh(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of Vo(e))r.set(a,{});let i;if(e.$cstNode)for(let a of Fd(e.$cstNode)){let s;"fullText"in a?(s=new cm(a.fullText),i=s):"content"in a?s=new a0:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let o of a)Xn(o)?s.push(this.setParent(this.hydrateAstNode(o,r),n)):pa(o)?s.push(this.hydrateReference(o,n,i,r)):s.push(o)}else Xn(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):pa(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),eo(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,o=e.endLine,l=e.endColumn,u=e.hidden;return new i0(n,i,{start:{line:a,character:s},end:{line:o,character:l}},r,u)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap();let r=this.grammarElementIdMap.getKey(e);if(r)return r;throw new Error("Invalid grammar element id: "+e)}createGrammarElementIdMap(){let e=0;for(let r of Vo(this.grammar))Ay(r)&&this.grammarElementIdMap.set(r,e++)}}});function io(t){return{documentation:{CommentProvider:e=>new $2(e),DocumentationProvider:e=>new z2(e)},parser:{AsyncParser:e=>new G2(e),GrammarConfig:e=>aR(e),LangiumParser:e=>gN(e),CompletionParser:e=>dN(e),ValueConverter:()=>new l0,TokenBuilder:()=>new o0,Lexer:e=>new P2(e),ParserErrorMessageProvider:()=>new um},workspace:{AstNodeLocator:()=>new N2,AstNodeDescriptionProvider:e=>new L2(e),ReferenceDescriptionProvider:e=>new R2(e)},references:{Linker:e=>new v2(e),NameProvider:()=>new y2,ScopeProvider:e=>new T2(e),ScopeComputation:e=>new b2(e),References:e=>new x2(e)},serializer:{Hydrator:e=>new V2(e),JsonSerializer:e=>new E2(e)},validation:{DocumentValidator:e=>new _2(e),ValidationRegistry:e=>new C2(e)},shared:()=>t.shared}}function ao(t){return{ServiceRegistry:()=>new S2,workspace:{LangiumDocuments:e=>new m2(e),LangiumDocumentFactory:e=>new g2(e),DocumentBuilder:e=>new M2(e),IndexManager:e=>new D2(e),WorkspaceManager:e=>new O2(e),FileSystemProvider:e=>t.fileSystemProvider(e),WorkspaceLock:()=>new U2,ConfigurationProvider:e=>new I2(e)}}}var uI=F(()=>{sR();pN();mN();vN();yN();NN();IN();MN();DN();PN();mT();FN();zN();A2();$N();GN();UN();WN();gm();HN();qN();jN();rI();nI();p2();oI();lI();cI()});function Ni(t,e,r,n,i,a,s,o,l){let u=[t,e,r,n,i,a,s,o,l].reduce(wT,{});return Yoe(u)}function qoe(t){if(t&&t[fI])for(let e of Object.values(t))qoe(e);return t}function Yoe(t,e){let r=new Proxy({},{deleteProperty:()=>!1,get:(n,i)=>Hoe(n,i,t,e||r),getOwnPropertyDescriptor:(n,i)=>(Hoe(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),has:(n,i)=>i in t,ownKeys:()=>[...Reflect.ownKeys(t),fI]});return r[fI]=!0,r}function Hoe(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===Woe)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. See https://langium.org/docs/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=Woe;try{t[e]=typeof i=="function"?i(n):Yoe(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function wT(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=wT(i,n):t[r]=n}}return t}var hI,fI,Woe,dI=F(()=>{(function(t){t.merge=(e,r)=>wT(wT({},e),r)})(hI||(hI={}));fI=Symbol("isProxy");Woe=Symbol()});var Xoe=F(()=>{});var joe=F(()=>{nI();rI();tI()});var Koe=F(()=>{});var Zoe=F(()=>{sR();Koe()});var Qoe=F(()=>{});var Joe=F(()=>{oI();pN();aT();mN();p2();jN();Qoe();vN();yN()});var ele=F(()=>{NN();IN();MN();ON();DN();PN()});var tle=F(()=>{cI();mT()});var kT,so,pI=F(()=>{kT=class{readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},so={fileSystemProvider:()=>new kT}});function UMe(){let t=Ni(ao(so),GMe),e=Ni(io({shared:t}),$Me);return t.ServiceRegistry.register(e),e}function sf(t){var e;let r=UMe(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,Is.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var $Me,GMe,rle=F(()=>{uI();dI();Ac();pI();Mc();$Me={Grammar:()=>{},LanguageMetaData:()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"})},GMe={AstReflection:()=>new Mg}});var Ir={};vr(Ir,{AstUtils:()=>sk,BiMap:()=>c0,Cancellation:()=>mr,ContextCache:()=>u0,CstUtils:()=>Xw,DONE_RESULT:()=>Za,Deferred:()=>ns,Disposable:()=>h0,DisposableCache:()=>ym,DocumentCache:()=>pT,EMPTY_STREAM:()=>Ey,ErrorWithLocation:()=>$d,GrammarUtils:()=>fk,MultiMap:()=>Dc,OperationCancelled:()=>Ic,Reduction:()=>Ng,RegExpUtils:()=>uk,SimpleCache:()=>k2,StreamImpl:()=>to,TreeStreamImpl:()=>Cc,URI:()=>Is,UriUtils:()=>is,WorkspaceCache:()=>xm,assertUnreachable:()=>Jh,delayNextTick:()=>_N,interruptAndCheck:()=>Ri,isOperationCancelled:()=>af,loadGrammarFromJson:()=>sf,setInterruptionPeriod:()=>_oe,startCancelableOperation:()=>Aoe,stream:()=>Xr});var nle=F(()=>{gT();iI();gr(Ir,ti);mm();VN();jw();rle();Ho();Ls();Mc();Qa();Wo();El();Al();Pg()});var ile=F(()=>{zN();A2()});var ale=F(()=>{$N();GN();UN();WN();gm();pI();HN();lI();qN()});var ga={};vr(ga,{AbstractAstReflection:()=>Pd,AbstractCstNode:()=>u2,AbstractLangiumParser:()=>h2,AbstractParserErrorMessageProvider:()=>oT,AbstractThreadedAsyncParser:()=>aI,AstUtils:()=>sk,BiMap:()=>c0,Cancellation:()=>mr,CompositeCstNodeImpl:()=>a0,ContextCache:()=>u0,CstNodeBuilder:()=>c2,CstUtils:()=>Xw,DONE_RESULT:()=>Za,DatatypeSymbol:()=>sT,DefaultAstNodeDescriptionProvider:()=>L2,DefaultAstNodeLocator:()=>N2,DefaultAsyncParser:()=>G2,DefaultCommentProvider:()=>$2,DefaultConfigurationProvider:()=>I2,DefaultDocumentBuilder:()=>M2,DefaultDocumentValidator:()=>_2,DefaultHydrator:()=>V2,DefaultIndexManager:()=>D2,DefaultJsonSerializer:()=>E2,DefaultLangiumDocumentFactory:()=>g2,DefaultLangiumDocuments:()=>m2,DefaultLexer:()=>P2,DefaultLinker:()=>v2,DefaultNameProvider:()=>y2,DefaultReferenceDescriptionProvider:()=>R2,DefaultReferences:()=>x2,DefaultScopeComputation:()=>b2,DefaultScopeProvider:()=>T2,DefaultServiceRegistry:()=>S2,DefaultTokenBuilder:()=>o0,DefaultValueConverter:()=>l0,DefaultWorkspaceLock:()=>U2,DefaultWorkspaceManager:()=>O2,Deferred:()=>ns,Disposable:()=>h0,DisposableCache:()=>ym,DocumentCache:()=>pT,DocumentState:()=>mn,DocumentValidator:()=>Yu,EMPTY_SCOPE:()=>AMe,EMPTY_STREAM:()=>Ey,EmptyFileSystem:()=>so,EmptyFileSystemProvider:()=>kT,ErrorWithLocation:()=>$d,GrammarAST:()=>Ly,GrammarUtils:()=>fk,JSDocDocumentationProvider:()=>z2,LangiumCompletionParser:()=>d2,LangiumParser:()=>f2,LangiumParserErrorMessageProvider:()=>um,LeafCstNodeImpl:()=>i0,MapScope:()=>w2,Module:()=>hI,MultiMap:()=>Dc,OperationCancelled:()=>Ic,ParserWorker:()=>sI,Reduction:()=>Ng,RegExpUtils:()=>uk,RootCstNodeImpl:()=>cm,SimpleCache:()=>k2,StreamImpl:()=>to,StreamScope:()=>vm,TextDocument:()=>dm,TreeStreamImpl:()=>Cc,URI:()=>Is,UriUtils:()=>is,ValidationCategory:()=>bm,ValidationRegistry:()=>C2,ValueConverter:()=>Nc,WorkspaceCache:()=>xm,assertUnreachable:()=>Jh,createCompletionParser:()=>dN,createDefaultCoreModule:()=>io,createDefaultSharedCoreModule:()=>ao,createGrammarConfig:()=>aR,createLangiumParser:()=>gN,delayNextTick:()=>_N,diagnosticData:()=>vT,eagerLoad:()=>qoe,getDiagnosticRange:()=>Poe,inject:()=>Ni,interruptAndCheck:()=>Ri,isAstNode:()=>Xn,isAstNodeDescription:()=>R9,isAstNodeWithComment:()=>BN,isCompositeCstNode:()=>eo,isIMultiModeLexerDefinition:()=>XN,isJSDoc:()=>JN,isLeafCstNode:()=>Qh,isLinkingError:()=>Bd,isNamed:()=>Doe,isOperationCancelled:()=>af,isReference:()=>pa,isRootCstNode:()=>Ty,isTokenTypeArray:()=>Boe,isTokenTypeDictionary:()=>YN,loadGrammarFromJson:()=>sf,parseJSDoc:()=>QN,prepareLangiumParser:()=>boe,setInterruptionPeriod:()=>_oe,startCancelableOperation:()=>Aoe,stream:()=>Xr,toDiagnosticSeverity:()=>yT});var Oc=F(()=>{uI();dI();FN();Xoe();$o();joe();Zoe();Joe();ele();tle();nle();gr(ga,Ir);ile();ale();Ac()});function dle(t){return Ll.isInstance(t,fle)}function ple(t){return Ll.isInstance(t,gI)}function gle(t){return Ll.isInstance(t,mI)}function mle(t){return Ll.isInstance(t,qMe)}function vle(t){return Ll.isInstance(t,vI)}function xle(t){return Ll.isInstance(t,yle)}function ble(t){return Ll.isInstance(t,yI)}function kle(t){return Ll.isInstance(t,wle)}function Ele(t){return Ll.isInstance(t,Tle)}function Cle(t){return Ll.isInstance(t,Sle)}function _le(t){return Ll.isInstance(t,Ale)}var VMe,Ct,hle,fle,gI,WMe,HMe,mI,qMe,vI,yle,yI,wle,Tle,Sle,Ale,YMe,Lle,Ll,sle,XMe,ole,jMe,lle,KMe,cle,ZMe,ule,QMe,JMe,eDe,tDe,rDe,nDe,Rl,xI,bI,wI,kI,TI,iDe,aDe,sDe,oDe,wm,f0,qo,lDe,Yo=F(()=>{Oc();Oc();Oc();Oc();VMe=Object.defineProperty,Ct=(t,e)=>VMe(t,"name",{value:e,configurable:!0}),hle="Statement",fle="Architecture";Ct(dle,"isArchitecture");gI="Branch";Ct(ple,"isBranch");WMe="Checkout",HMe="CherryPicking",mI="Commit";Ct(gle,"isCommit");qMe="Common";Ct(mle,"isCommon");vI="GitGraph";Ct(vle,"isGitGraph");yle="Info";Ct(xle,"isInfo");yI="Merge";Ct(ble,"isMerge");wle="Packet";Ct(kle,"isPacket");Tle="PacketBlock";Ct(Ele,"isPacketBlock");Sle="Pie";Ct(Cle,"isPie");Ale="PieSection";Ct(_le,"isPieSection");YMe="Direction",Lle=class extends Pd{static{Ct(this,"MermaidAstReflection")}getAllTypes(){return["Architecture","Branch","Checkout","CherryPicking","Commit","Common","Direction","Edge","GitGraph","Group","Info","Junction","Merge","Packet","PacketBlock","Pie","PieSection","Service","Statement"]}computeIsSubtype(t,e){switch(t){case gI:case WMe:case HMe:case mI:case yI:return this.isSubtype(hle,e);case YMe:return this.isSubtype(vI,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case"Architecture":return{name:"Architecture",properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case"Branch":return{name:"Branch",properties:[{name:"name"},{name:"order"}]};case"Checkout":return{name:"Checkout",properties:[{name:"branch"}]};case"CherryPicking":return{name:"CherryPicking",properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case"Commit":return{name:"Commit",properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case"Common":return{name:"Common",properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case"Edge":return{name:"Edge",properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case"GitGraph":return{name:"GitGraph",properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case"Group":return{name:"Group",properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case"Info":return{name:"Info",properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case"Junction":return{name:"Junction",properties:[{name:"id"},{name:"in"}]};case"Merge":return{name:"Merge",properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case"Packet":return{name:"Packet",properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case"PacketBlock":return{name:"PacketBlock",properties:[{name:"end"},{name:"label"},{name:"start"}]};case"Pie":return{name:"Pie",properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case"PieSection":return{name:"PieSection",properties:[{name:"label"},{name:"value"}]};case"Service":return{name:"Service",properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case"Direction":return{name:"Direction",properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};default:return{name:t,properties:[]}}}},Ll=new Lle,XMe=Ct(()=>sle??(sle=sf('{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","name":"Info","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"InfoGrammar"),jMe=Ct(()=>ole??(ole=sf(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","name":"Packet","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"packet-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),KMe=Ct(()=>lle??(lle=sf('{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","name":"Pie","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"PIE_SECTION_LABEL","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]+\\"/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"PIE_SECTION_VALUE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"PieGrammar"),ZMe=Ct(()=>cle??(cle=sf('{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","name":"Architecture","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","fragment":true,"definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LeftPort","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RightPort","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Arrow","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ID","definition":{"$type":"RegexToken","regex":"/[\\\\w]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TEXT_ICON","definition":{"$type":"RegexToken","regex":"/\\\\(\\"[^\\"]+\\"\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"ArchitectureGrammar"),QMe=Ct(()=>ule??(ule=sf(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"rules":[{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"ParserRule","name":"GitGraph","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+(?=\\\\s)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),JMe={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},eDe={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},tDe={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},rDe={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},nDe={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},Rl={AstReflection:Ct(()=>new Lle,"AstReflection")},xI={Grammar:Ct(()=>XMe(),"Grammar"),LanguageMetaData:Ct(()=>JMe,"LanguageMetaData"),parser:{}},bI={Grammar:Ct(()=>jMe(),"Grammar"),LanguageMetaData:Ct(()=>eDe,"LanguageMetaData"),parser:{}},wI={Grammar:Ct(()=>KMe(),"Grammar"),LanguageMetaData:Ct(()=>tDe,"LanguageMetaData"),parser:{}},kI={Grammar:Ct(()=>ZMe(),"Grammar"),LanguageMetaData:Ct(()=>rDe,"LanguageMetaData"),parser:{}},TI={Grammar:Ct(()=>QMe(),"Grammar"),LanguageMetaData:Ct(()=>nDe,"LanguageMetaData"),parser:{}},iDe=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,aDe=/accTitle[\t ]*:([^\n\r]*)/,sDe=/title([\t ][^\n\r]*|)/,oDe={ACC_DESCR:iDe,ACC_TITLE:aDe,TITLE:sDe},wm=class extends l0{static{Ct(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=oDe[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` `)}}},f0=class extends wm{static{Ct(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},qo=class extends o0{static{Ct(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},lDe=class extends qo{static{Ct(this,"CommonTokenBuilder")}}});function ET(t=so){let e=Ni(ao(t),Rl),r=Ni(io({shared:e}),TI,TT);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var cDe,TT,EI=F(()=>{Yo();Oc();cDe=class extends qo{static{Ct(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},TT={parser:{TokenBuilder:Ct(()=>new cDe,"TokenBuilder"),ValueConverter:Ct(()=>new f0,"ValueConverter")}};Ct(ET,"createGitGraphServices")});function CT(t=so){let e=Ni(ao(t),Rl),r=Ni(io({shared:e}),xI,ST);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var uDe,ST,SI=F(()=>{Yo();Oc();uDe=class extends qo{static{Ct(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},ST={parser:{TokenBuilder:Ct(()=>new uDe,"TokenBuilder"),ValueConverter:Ct(()=>new f0,"ValueConverter")}};Ct(CT,"createInfoServices")});function _T(t=so){let e=Ni(ao(t),Rl),r=Ni(io({shared:e}),bI,AT);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var hDe,AT,CI=F(()=>{Yo();Oc();hDe=class extends qo{static{Ct(this,"PacketTokenBuilder")}constructor(){super(["packet-beta"])}},AT={parser:{TokenBuilder:Ct(()=>new hDe,"TokenBuilder"),ValueConverter:Ct(()=>new f0,"ValueConverter")}};Ct(_T,"createPacketServices")});function RT(t=so){let e=Ni(ao(t),Rl),r=Ni(io({shared:e}),wI,LT);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var fDe,dDe,LT,AI=F(()=>{Yo();Oc();fDe=class extends qo{static{Ct(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},dDe=class extends wm{static{Ct(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},LT={parser:{TokenBuilder:Ct(()=>new fDe,"TokenBuilder"),ValueConverter:Ct(()=>new dDe,"ValueConverter")}};Ct(RT,"createPieServices")});function IT(t=so){let e=Ni(ao(t),Rl),r=Ni(io({shared:e}),kI,NT);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var pDe,gDe,NT,_I=F(()=>{Yo();Oc();pDe=class extends qo{static{Ct(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},gDe=class extends wm{static{Ct(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},NT={parser:{TokenBuilder:Ct(()=>new pDe,"TokenBuilder"),ValueConverter:Ct(()=>new gDe,"ValueConverter")}};Ct(IT,"createArchitectureServices")});var Rle={};vr(Rle,{InfoModule:()=>ST,createInfoServices:()=>CT});var Nle=F(()=>{SI();Yo()});var Ile={};vr(Ile,{PacketModule:()=>AT,createPacketServices:()=>_T});var Mle=F(()=>{CI();Yo()});var Dle={};vr(Dle,{PieModule:()=>LT,createPieServices:()=>RT});var Ole=F(()=>{AI();Yo()});var Ple={};vr(Ple,{ArchitectureModule:()=>NT,createArchitectureServices:()=>IT});var Ble=F(()=>{_I();Yo()});var Fle={};vr(Fle,{GitGraphModule:()=>TT,createGitGraphServices:()=>ET});var zle=F(()=>{EI();Yo()});async function Nl(t,e){let r=mDe[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);d0[t]||await r();let i=d0[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new vDe(i);return i.value}var d0,mDe,vDe,km=F(()=>{EI();SI();CI();AI();_I();Yo();d0={},mDe={info:Ct(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(Nle(),Rle)),e=t().Info.parser.LangiumParser;d0.info=e},"info"),packet:Ct(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(Mle(),Ile)),e=t().Packet.parser.LangiumParser;d0.packet=e},"packet"),pie:Ct(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(Ole(),Dle)),e=t().Pie.parser.LangiumParser;d0.pie=e},"pie"),architecture:Ct(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(Ble(),Ple)),e=t().Architecture.parser.LangiumParser;d0.architecture=e},"architecture"),gitGraph:Ct(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(zle(),Fle)),e=t().GitGraph.parser.LangiumParser;d0.gitGraph=e},"gitGraph")};Ct(Nl,"parse");vDe=class extends Error{constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` `),r=t.parserErrors.map(n=>n.message).join(` `);super(`Parsing failed: ${e} ${r}`),this.result=t}static{Ct(this,"MermaidParseError")}}});var Yle={};vr(Yle,{diagram:()=>hOe});function OT(){return lA({length:7})}function Gle(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function LI(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function RI(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in gt.records.branches)gt.records.branches.get(i)===e.id&&n.push(i);if(re.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=gt.records.commits.get(e.parents[0]);LI(t,e,i),e.parents[1]&&t.push(gt.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=gt.records.commits.get(e.parents[0]);LI(t,e,i)}}t=Gle(t,i=>i.id),RI(t)}var nn,yDe,g0,gt,xDe,bDe,wDe,kDe,TDe,EDe,SDe,Ule,CDe,ADe,_De,LDe,RDe,Vle,NDe,IDe,MDe,Wle,DDe,ODe,PDe,BDe,FDe,zDe,$De,GDe,UDe,Xo,lf,cf,Pc,Xu,p0,Ms,Ds,MT,W2,DT,of,kr,VDe,Hle,qle,WDe,HDe,qDe,YDe,XDe,jDe,KDe,ZDe,QDe,JDe,eOe,tOe,$le,rOe,H2,nOe,iOe,aOe,sOe,oOe,lOe,cOe,uOe,hOe,Xle=F(()=>{ky();Hw();kn();or();km();lr();nn={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},yDe=sr.gitGraph,g0=v(()=>ws({...yDe,...Or().gitGraph}),"getConfig"),gt=new Rg(()=>{let t=g0(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});v(OT,"getID");v(Gle,"uniqBy");xDe=v(function(t){gt.records.direction=t},"setDirection"),bDe=v(function(t){re.debug("options str",t),t=t?.trim(),t=t||"{}";try{gt.records.options=JSON.parse(t)}catch(e){re.error("error while parsing gitGraph options",e.message)}},"setOptions"),wDe=v(function(){return gt.records.options},"getOptions"),kDe=v(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;re.info("commit",e,r,n,i),re.debug("Entering commit:",e,r,n,i);let a=g0();r=Xe.sanitizeText(r,a),e=Xe.sanitizeText(e,a),i=i?.map(o=>Xe.sanitizeText(o,a));let s={id:r||gt.records.seq+"-"+OT(),message:e,seq:gt.records.seq++,type:n??nn.NORMAL,tags:i??[],parents:gt.records.head==null?[]:[gt.records.head.id],branch:gt.records.currBranch};gt.records.head=s,re.info("main branch",a.mainBranchName),gt.records.commits.set(s.id,s),gt.records.branches.set(gt.records.currBranch,s.id),re.debug("in pushCommit "+s.id)},"commit"),TDe=v(function(t){let e=t.name,r=t.order;if(e=Xe.sanitizeText(e,g0()),gt.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);gt.records.branches.set(e,gt.records.head!=null?gt.records.head.id:null),gt.records.branchConfig.set(e,{name:e,order:r}),Ule(e),re.debug("in createBranch")},"branch"),EDe=v(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=g0();e=Xe.sanitizeText(e,a),r&&(r=Xe.sanitizeText(r,a));let s=gt.records.branches.get(gt.records.currBranch),o=gt.records.branches.get(e),l=s?gt.records.commits.get(s):void 0,u=o?gt.records.commits.get(o):void 0;if(l&&u&&l.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(gt.records.currBranch===e){let d=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw d.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},d}if(l===void 0||!l){let d=new Error(`Incorrect usage of "merge". Current branch (${gt.records.currBranch})has no commits`);throw d.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},d}if(!gt.records.branches.has(e)){let d=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw d.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},d}if(u===void 0||!u){let d=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw d.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},d}if(l===u){let d=new Error('Incorrect usage of "merge". Both branches have same head');throw d.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},d}if(r&>.records.commits.has(r)){let d=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom Id");throw d.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},d}let h=o||"",f={id:r||`${gt.records.seq}-${OT()}`,message:`merged branch ${e} into ${gt.records.currBranch}`,seq:gt.records.seq++,parents:gt.records.head==null?[]:[gt.records.head.id,h],branch:gt.records.currBranch,type:nn.MERGE,customType:n,customId:!!r,tags:i??[]};gt.records.head=f,gt.records.commits.set(f.id,f),gt.records.branches.set(gt.records.currBranch,f.id),re.debug(gt.records.branches),re.debug("in mergeBranch")},"merge"),SDe=v(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;re.debug("Entering cherryPick:",e,r,n);let a=g0();if(e=Xe.sanitizeText(e,a),r=Xe.sanitizeText(r,a),n=n?.map(l=>Xe.sanitizeText(l,a)),i=Xe.sanitizeText(i,a),!e||!gt.records.commits.has(e)){let l=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw l.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},l}let s=gt.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let o=s.branch;if(s.type===nn.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!gt.records.commits.has(r)){if(o===gt.records.currBranch){let f=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw f.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},f}let l=gt.records.branches.get(gt.records.currBranch);if(l===void 0||!l){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${gt.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},f}let u=gt.records.commits.get(l);if(u===void 0||!u){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${gt.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},f}let h={id:gt.records.seq+"-"+OT(),message:`cherry-picked ${s?.message} into ${gt.records.currBranch}`,seq:gt.records.seq++,parents:gt.records.head==null?[]:[gt.records.head.id,s.id],branch:gt.records.currBranch,type:nn.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===nn.MERGE?`|parent:${i}`:""}`]};gt.records.head=h,gt.records.commits.set(h.id,h),gt.records.branches.set(gt.records.currBranch,h.id),re.debug(gt.records.branches),re.debug("in cherryPick")}},"cherryPick"),Ule=v(function(t){if(t=Xe.sanitizeText(t,g0()),gt.records.branches.has(t)){gt.records.currBranch=t;let e=gt.records.branches.get(gt.records.currBranch);e===void 0||!e?gt.records.head=null:gt.records.head=gt.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");v(LI,"upsert");v(RI,"prettyPrintCommitHistory");CDe=v(function(){re.debug(gt.records.commits);let t=Vle()[0];RI([t])},"prettyPrint"),ADe=v(function(){gt.reset(),xr()},"clear"),_De=v(function(){return[...gt.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),LDe=v(function(){return gt.records.branches},"getBranches"),RDe=v(function(){return gt.records.commits},"getCommits"),Vle=v(function(){let t=[...gt.records.commits.values()];return t.forEach(function(e){re.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),NDe=v(function(){return gt.records.currBranch},"getCurrentBranch"),IDe=v(function(){return gt.records.direction},"getDirection"),MDe=v(function(){return gt.records.head},"getHead"),Wle={commitType:nn,getConfig:g0,setDirection:xDe,setOptions:bDe,getOptions:wDe,commit:kDe,branch:TDe,merge:EDe,cherryPick:SDe,checkout:Ule,prettyPrint:CDe,clear:ADe,getBranchesAsObjArray:_De,getBranches:LDe,getCommits:RDe,getCommitsArray:Vle,getCurrentBranch:NDe,getDirection:IDe,getHead:MDe,setAccTitle:Tr,getAccTitle:_r,getAccDescription:Rr,setAccDescription:Lr,setDiagramTitle:tn,getDiagramTitle:qr},DDe=v((t,e)=>{Pu(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)ODe(r,e)},"populate"),ODe=v((t,e)=>{let n={Commit:v(i=>e.commit(PDe(i)),"Commit"),Branch:v(i=>e.branch(BDe(i)),"Branch"),Merge:v(i=>e.merge(FDe(i)),"Merge"),Checkout:v(i=>e.checkout(zDe(i)),"Checkout"),CherryPicking:v(i=>e.cherryPick($De(i)),"CherryPicking")}[t.$type];n?n(t):re.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),PDe=v(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?nn[t.type]:nn.NORMAL,tags:t.tags??void 0}),"parseCommit"),BDe=v(t=>({name:t.name,order:t.order??0}),"parseBranch"),FDe=v(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?nn[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),zDe=v(t=>t.branch,"parseCheckout"),$De=v(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),GDe={parse:v(async t=>{let e=await Nl("gitGraph",t);re.debug(e),DDe(e,Wle)},"parse")},UDe=pe(),Xo=UDe?.gitGraph,lf=10,cf=40,Pc=4,Xu=2,p0=8,Ms=new Map,Ds=new Map,MT=30,W2=new Map,DT=[],of=0,kr="LR",VDe=v(()=>{Ms.clear(),Ds.clear(),W2.clear(),of=0,DT=[],kr="LR"},"clear"),Hle=v(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),qle=v(t=>{let e,r,n;return kr==="BT"?(r=v((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=v((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=kr==="TB"||kr=="BT"?Ds.get(i)?.y:Ds.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),WDe=v(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Ds.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),HDe=v((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let o=e.get(s);if(!o)throw new Error(`Commit not found for key ${s}`);o.parents.length?(n=YDe(o),i=Math.max(n,i)):a.push(o),XDe(o,n)}),n=i,a.forEach(s=>{jDe(s,n,r)}),t.forEach(s=>{let o=e.get(s);if(o?.parents.length){let l=WDe(o.parents);n=Ds.get(l).y-cf,n<=i&&(i=n);let u=Ms.get(o.branch).pos,h=n-lf;Ds.set(o.id,{x:u,y:h})}})},"setParallelBTPos"),qDe=v(t=>{let e=qle(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Ds.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),YDe=v(t=>qDe(t)+cf,"calculateCommitPosition"),XDe=v((t,e)=>{let r=Ms.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+lf;return Ds.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),jDe=v((t,e,r)=>{let n=Ms.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Ds.set(t.id,{x:a,y:i})},"setRootPosition"),KDe=v((t,e,r,n,i,a)=>{if(a===nn.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%p0} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%p0} ${n}-inner`);else if(a===nn.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===nn.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%p0}`),a===nn.MERGE){let o=t.append("circle");o.attr("cx",r.x),o.attr("cy",r.y),o.attr("r",6),o.attr("class",`commit ${n} ${e.id} commit${i%p0}`)}a===nn.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%p0}`)}},"drawCommitBullet"),ZDe=v((t,e,r,n)=>{if(e.type!==nn.CHERRY_PICK&&(e.customId&&e.type===nn.MERGE||e.type!==nn.MERGE)&&Xo?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),o=s.node()?.getBBox();if(o&&(a.attr("x",r.posWithOffset-o.width/2-Xu).attr("y",r.y+13.5).attr("width",o.width+2*Xu).attr("height",o.height+2*Xu),kr==="TB"||kr==="BT"?(a.attr("x",r.x-(o.width+4*Pc+5)).attr("y",r.y-12),s.attr("x",r.x-(o.width+4*Pc)).attr("y",r.y+o.height-12)):s.attr("x",r.posWithOffset-o.width/2),Xo.rotateCommitLabel))if(kr==="TB"||kr==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let l=-7.5-(o.width+10)/25*9.5,u=10+o.width/25*8.5;i.attr("transform","translate("+l+", "+u+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),QDe=v((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,o=[];for(let l of e.tags.reverse()){let u=t.insert("polygon"),h=t.append("circle"),f=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(l),d=f.node()?.getBBox();if(!d)throw new Error("Tag bbox not found");a=Math.max(a,d.width),s=Math.max(s,d.height),f.attr("x",r.posWithOffset-d.width/2),o.push({tag:f,hole:h,rect:u,yOffset:i}),i+=20}for(let{tag:l,hole:u,rect:h,yOffset:f}of o){let d=s/2,p=r.y-19.2-f;if(h.attr("class","tag-label-bkg").attr("points",` ${n-a/2-Pc/2},${p+Xu} ${n-a/2-Pc/2},${p-Xu} ${r.posWithOffset-a/2-Pc},${p-d-Xu} ${r.posWithOffset+a/2+Pc},${p-d-Xu} ${r.posWithOffset+a/2+Pc},${p+d+Xu} ${r.posWithOffset-a/2-Pc},${p+d+Xu}`),u.attr("cy",p).attr("cx",n-a/2+Pc/2).attr("r",1.5).attr("class","tag-hole"),kr==="TB"||kr==="BT"){let g=n+f;h.attr("class","tag-label-bkg").attr("points",` ${r.x},${g+2} ${r.x},${g-2} ${r.x+lf},${g-d-2} ${r.x+lf+a+4},${g-d-2} ${r.x+lf+a+4},${g+d+2} ${r.x+lf},${g+d+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("cx",r.x+Pc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),l.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),JDe=v(t=>{switch(t.customType??t.type){case nn.NORMAL:return"commit-normal";case nn.REVERSE:return"commit-reverse";case nn.HIGHLIGHT:return"commit-highlight";case nn.MERGE:return"commit-merge";case nn.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),eOe=v((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=qle(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+cf:e==="BT"?(n.get(t.id)??i).y-cf:s.x+cf}}else return e==="TB"?MT:e==="BT"?(n.get(t.id)??i).y-cf:0;return 0},"calculatePosition"),tOe=v((t,e,r)=>{let n=kr==="BT"&&r?e:e+lf,i=kr==="TB"||kr==="BT"?n:Ms.get(t.branch)?.pos,a=kr==="TB"||kr==="BT"?Ms.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),$le=v((t,e,r)=>{if(!Xo)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=kr==="TB"||kr==="BT"?MT:0,s=[...e.keys()],o=Xo?.parallelCommits??!1,l=v((h,f)=>{let d=e.get(h)?.seq,p=e.get(f)?.seq;return d!==void 0&&p!==void 0?d-p:0},"sortKeys"),u=s.sort(l);kr==="BT"&&(o&&HDe(u,e,a),u=u.reverse()),u.forEach(h=>{let f=e.get(h);if(!f)throw new Error(`Commit not found for key ${h}`);o&&(a=eOe(f,kr,a,Ds));let d=tOe(f,a,o);if(r){let p=JDe(f),g=f.customType??f.type,m=Ms.get(f.branch)?.index??0;KDe(n,f,d,p,m,g),ZDe(i,f,d,a),QDe(i,f,d,a)}kr==="TB"||kr==="BT"?Ds.set(f.id,{x:d.x,y:d.posWithOffset}):Ds.set(f.id,{x:d.posWithOffset,y:d.y}),a=kr==="BT"&&o?a+cf:a+cf+lf,a>of&&(of=a)})},"drawCommits"),rOe=v((t,e,r,n,i)=>{let s=(kr==="TB"||kr==="BT"?r.xu.branch===s,"isOnBranchToGetCurve"),l=v(u=>u.seq>t.seq&&u.seql(u)&&o(u))},"shouldRerouteArrow"),H2=v((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(DT.every(s=>Math.abs(s-n)>=10))return DT.push(n),n;let a=Math.abs(t-e);return H2(t,e-a/5,r+1)},"findLane"),nOe=v((t,e,r,n)=>{let i=Ds.get(e.id),a=Ds.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=rOe(e,r,i,a,n),o="",l="",u=0,h=0,f=Ms.get(r.branch)?.index;r.type===nn.MERGE&&e.id!==r.parents[0]&&(f=Ms.get(e.branch)?.index);let d;if(s){o="A 10 10, 0, 0, 0,",l="A 10 10, 0, 0, 1,",u=10,h=10;let p=i.ya.x&&(o="A 20 20, 0, 0, 0,",l="A 20 20, 0, 0, 1,",u=20,h=20,r.type===nn.MERGE&&e.id!==r.parents[0]?d=`M ${i.x} ${i.y} L ${i.x} ${a.y-u} ${l} ${i.x-h} ${a.y} L ${a.x} ${a.y}`:d=`M ${i.x} ${i.y} L ${a.x+u} ${i.y} ${o} ${a.x} ${i.y+h} L ${a.x} ${a.y}`),i.x===a.x&&(d=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):kr==="BT"?(i.xa.x&&(o="A 20 20, 0, 0, 0,",l="A 20 20, 0, 0, 1,",u=20,h=20,r.type===nn.MERGE&&e.id!==r.parents[0]?d=`M ${i.x} ${i.y} L ${i.x} ${a.y+u} ${o} ${i.x-h} ${a.y} L ${a.x} ${a.y}`:d=`M ${i.x} ${i.y} L ${a.x-u} ${i.y} ${o} ${a.x} ${i.y-h} L ${a.x} ${a.y}`),i.x===a.x&&(d=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===nn.MERGE&&e.id!==r.parents[0]?d=`M ${i.x} ${i.y} L ${a.x-u} ${i.y} ${o} ${a.x} ${i.y-h} L ${a.x} ${a.y}`:d=`M ${i.x} ${i.y} L ${i.x} ${a.y+u} ${l} ${i.x+h} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(d=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(d===void 0)throw new Error("Line definition not found");t.append("path").attr("d",d).attr("class","arrow arrow"+f%p0)},"drawArrow"),iOe=v((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{nOe(r,e.get(a),i,e)})})},"drawArrows"),aOe=v((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%p0,s=Ms.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let o=r.append("line");o.attr("x1",0),o.attr("y1",s),o.attr("x2",of),o.attr("y2",s),o.attr("class","branch branch"+a),kr==="TB"?(o.attr("y1",MT),o.attr("x1",s),o.attr("y2",of),o.attr("x2",s)):kr==="BT"&&(o.attr("y1",of),o.attr("x1",s),o.attr("y2",MT),o.attr("x2",s)),DT.push(s);let l=n.name,u=Hle(l),h=r.insert("rect"),d=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);d.node().appendChild(u);let p=u.getBBox();h.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-p.width-4-(Xo?.rotateCommitLabel===!0?30:0)).attr("y",-p.height/2+8).attr("width",p.width+18).attr("height",p.height+4),d.attr("transform","translate("+(-p.width-14-(Xo?.rotateCommitLabel===!0?30:0))+", "+(s-p.height/2-1)+")"),kr==="TB"?(h.attr("x",s-p.width/2-10).attr("y",0),d.attr("transform","translate("+(s-p.width/2-5)+", 0)")):kr==="BT"?(h.attr("x",s-p.width/2-10).attr("y",of),d.attr("transform","translate("+(s-p.width/2-5)+", "+of+")")):h.attr("transform","translate(-19, "+(s-p.height/2)+")")})},"drawBranches"),sOe=v(function(t,e,r,n,i){return Ms.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(kr==="TB"||kr==="BT"?n.width/2:0),e},"setBranchPosition"),oOe=v(function(t,e,r,n){if(VDe(),re.debug("in gitgraph renderer",t+` `,"id:",e,r),!Xo)throw new Error("GitGraph config not found");let i=Xo.rotateCommitLabel??!1,a=n.db;W2=a.getCommits();let s=a.getBranchesAsObjArray();kr=a.getDirection();let o=Ve(`[id="${e}"]`),l=0;s.forEach((u,h)=>{let f=Hle(u.name),d=o.append("g"),p=d.insert("g").attr("class","branchLabel"),g=p.insert("g").attr("class","label branch-label");g.node()?.appendChild(f);let m=f.getBBox();l=sOe(u.name,l,h,m,i),g.remove(),p.remove(),d.remove()}),$le(o,W2,!1),Xo.showBranches&&aOe(o,s),iOe(o,W2),$le(o,W2,!0),Ut.insertTitle(o,"gitTitleText",Xo.titleTopMargin??0,a.getDiagramTitle()),HS(void 0,o,Xo.diagramPadding,Xo.useMaxWidth)},"draw"),lOe={draw:oOe},cOe=v(t=>` .commit-id, .commit-msg, .branch-label { fill: lightgrey; color: lightgrey; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-family: var(--mermaid-font-family); } ${[0,1,2,3,4,5,6,7].map(e=>` .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } .label${e} { fill: ${t["git"+e]}; } .arrow${e} { stroke: ${t["git"+e]}; } `).join(` `)} .branch { stroke-width: 1; stroke: ${t.lineColor}; stroke-dasharray: 2; } .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } .tag-hole { fill: ${t.textColor}; } .commit-merge { stroke: ${t.primaryColor}; fill: ${t.primaryColor}; } .commit-reverse { stroke: ${t.primaryColor}; fill: ${t.primaryColor}; stroke-width: 3; } .commit-highlight-outer { } .commit-highlight-inner { stroke: ${t.primaryColor}; fill: ${t.primaryColor}; } .arrow { stroke-width: 8; stroke-linecap: round; fill: none} .gitTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } `,"getStyles"),uOe=cOe,hOe={parser:GDe,db:Wle,renderer:lOe,styles:uOe}});var jle=di((NI,II)=>{(function(t,e){typeof NI=="object"&&typeof II<"u"?II.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(NI,function(){"use strict";var t="day";return function(e,r,n){var i=function(o){return o.add(4-o.isoWeekday(),t)},a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(o){if(!this.$utils().u(o))return this.add(7*(o-this.isoWeek()),t);var l,u,h,f,d=i(this),p=(l=this.isoWeekYear(),u=this.$u,h=(u?n.utc:n)().year(l).startOf("year"),f=4-h.isoWeekday(),h.isoWeekday()>4&&(f+=7),h.add(f,t));return d.diff(p,"week")+1},a.isoWeekday=function(o){return this.$utils().u(o)?this.day()||7:this.day(this.day()%7?o:o-7)};var s=a.startOf;a.startOf=function(o,l){var u=this.$utils(),h=!!u.u(l)||l;return u.p(o)==="isoweek"?h?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(o,l)}}})});var Kle=di((MI,DI)=>{(function(t,e){typeof MI=="object"&&typeof DI<"u"?DI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(MI,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},o=function(g){return(g=+g)+(g>68?1900:2e3)},l=function(g){return function(m){this[g]=+m}},u=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=function(m){if(!m||m==="Z")return 0;var y=m.match(/([+-]|\d\d)/g),x=60*y[1]+(+y[2]||0);return x===0?0:y[0]==="+"?-x:x}(g)}],h=function(g){var m=s[g];return m&&(m.indexOf?m:m.s.concat(m.f))},f=function(g,m){var y,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,m))>-1){y=b>12;break}}else y=g===(m?"pm":"PM");return y},d={A:[a,function(g){this.afternoon=f(g,!1)}],a:[a,function(g){this.afternoon=f(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,l("seconds")],ss:[i,l("seconds")],m:[i,l("minutes")],mm:[i,l("minutes")],H:[i,l("hours")],h:[i,l("hours")],HH:[i,l("hours")],hh:[i,l("hours")],D:[i,l("day")],DD:[n,l("day")],Do:[a,function(g){var m=s.ordinal,y=g.match(/\d+/);if(this.day=y[0],m)for(var x=1;x<=31;x+=1)m(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,l("week")],ww:[n,l("week")],M:[i,l("month")],MM:[n,l("month")],MMM:[a,function(g){var m=h("months"),y=(h("monthsShort")||m.map(function(x){return x.slice(0,3)})).indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],MMMM:[a,function(g){var m=h("months").indexOf(g)+1;if(m<1)throw new Error;this.month=m%12||m}],Y:[/[+-]?\d+/,l("year")],YY:[n,function(g){this.year=o(g)}],YYYY:[/\d{4}/,l("year")],Z:u,ZZ:u};function p(g){var m,y;m=g,y=s&&s.formats;for(var x=(g=m.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(S,C,M){var R=M&&M.toUpperCase();return C||y[M]||t[M]||y[R].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(T,I,A){return I||A.slice(1)})})).match(e),b=x.length,w=0;w-1)return new Date((N==="X"?1e3:1)*D);var P=p(N)(D),$=P.year,z=P.month,H=P.day,J=P.hours,X=P.minutes,oe=P.seconds,K=P.milliseconds,ee=P.zone,Q=P.week,W=new Date,Y=H||($||z?1:W.getDate()),Z=$||W.getFullYear(),se=0;$&&!z||(se=z>0?z-1:W.getMonth());var ce,ue=J||0,te=X||0,Ne=oe||0,ae=K||0;return ee?new Date(Date.UTC(Z,se,Y,ue,te,Ne,ae+60*ee.offset*1e3)):O?new Date(Date.UTC(Z,se,Y,ue,te,Ne,ae)):(ce=new Date(Z,se,Y,ue,te,Ne,ae),Q&&(ce=B(ce).week(Q).toDate()),ce)}catch{return new Date("")}}(_,L,k,y),this.init(),R&&R!==!0&&(this.$L=this.locale(R).$L),M&&_!=this.format(L)&&(this.$d=new Date("")),s={}}else if(L instanceof Array)for(var T=L.length,I=1;I<=T;I+=1){E[1]=L[I-1];var A=y.apply(this,E);if(A.isValid()){this.$d=A.$d,this.$L=A.$L,this.init();break}I===T&&(this.$d=new Date(""))}else b.call(this,w)}}})});var Zle=di((OI,PI)=>{(function(t,e){typeof OI=="object"&&typeof PI<"u"?PI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(OI,function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var o=this.$utils(),l=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(u){switch(u){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return o.s(a.week(),u==="w"?1:2,"0");case"W":case"WW":return o.s(a.isoWeek(),u==="W"?1:2,"0");case"k":case"kk":return o.s(String(a.$H===0?24:a.$H),u==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return u}});return n.bind(this)(l)}}})});var dce={};vr(dce,{diagram:()=>tPe});function KI(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var tce,oo,rce,nce,ice,FT,BI,fOe,Qle,Bc,GI,UI,VI,q2,Y2,WI,HI,zT,Em,qI,ace,YI,X2,XI,jI,$T,FI,dOe,pOe,gOe,mOe,vOe,yOe,xOe,bOe,wOe,kOe,TOe,EOe,SOe,COe,AOe,_Oe,LOe,ROe,NOe,IOe,MOe,DOe,OOe,sce,POe,BOe,FOe,oce,zOe,zI,lce,cce,PT,Tm,$Oe,GOe,$I,BT,Ii,uce,UOe,m0,VOe,Jle,WOe,hce,HOe,fce,qOe,YOe,XOe,jOe,ece,KOe,ju,ZOe,QOe,JOe,ePe,tPe,pce=F(()=>{kn();or();tce=Gi(hp(),1),oo=Gi(nb(),1),rce=Gi(jle(),1),nce=Gi(Kle(),1),ice=Gi(Zle(),1),FT=Gi(nb(),1);lr();BI=function(){var t=v(function(I,A,D,N){for(D=D||{},N=I.length;N--;D[I[N]]=A);return D},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],o=[1,31],l=[1,32],u=[1,33],h=[1,34],f=[1,9],d=[1,10],p=[1,11],g=[1,12],m=[1,13],y=[1,14],x=[1,15],b=[1,16],w=[1,19],_=[1,20],k=[1,21],E=[1,22],L=[1,23],S=[1,25],C=[1,35],M={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:v(function(A,D,N,O,B,P,$){var z=P.length-1;switch(B){case 1:return P[z-1];case 2:this.$=[];break;case 3:P[z-1].push(P[z]),this.$=P[z-1];break;case 4:case 5:this.$=P[z];break;case 6:case 7:this.$=[];break;case 8:O.setWeekday("monday");break;case 9:O.setWeekday("tuesday");break;case 10:O.setWeekday("wednesday");break;case 11:O.setWeekday("thursday");break;case 12:O.setWeekday("friday");break;case 13:O.setWeekday("saturday");break;case 14:O.setWeekday("sunday");break;case 15:O.setWeekend("friday");break;case 16:O.setWeekend("saturday");break;case 17:O.setDateFormat(P[z].substr(11)),this.$=P[z].substr(11);break;case 18:O.enableInclusiveEndDates(),this.$=P[z].substr(18);break;case 19:O.TopAxis(),this.$=P[z].substr(8);break;case 20:O.setAxisFormat(P[z].substr(11)),this.$=P[z].substr(11);break;case 21:O.setTickInterval(P[z].substr(13)),this.$=P[z].substr(13);break;case 22:O.setExcludes(P[z].substr(9)),this.$=P[z].substr(9);break;case 23:O.setIncludes(P[z].substr(9)),this.$=P[z].substr(9);break;case 24:O.setTodayMarker(P[z].substr(12)),this.$=P[z].substr(12);break;case 27:O.setDiagramTitle(P[z].substr(6)),this.$=P[z].substr(6);break;case 28:this.$=P[z].trim(),O.setAccTitle(this.$);break;case 29:case 30:this.$=P[z].trim(),O.setAccDescription(this.$);break;case 31:O.addSection(P[z].substr(8)),this.$=P[z].substr(8);break;case 33:O.addTask(P[z-1],P[z]),this.$="task";break;case 34:this.$=P[z-1],O.setClickEvent(P[z-1],P[z],null);break;case 35:this.$=P[z-2],O.setClickEvent(P[z-2],P[z-1],P[z]);break;case 36:this.$=P[z-2],O.setClickEvent(P[z-2],P[z-1],null),O.setLink(P[z-2],P[z]);break;case 37:this.$=P[z-3],O.setClickEvent(P[z-3],P[z-2],P[z-1]),O.setLink(P[z-3],P[z]);break;case 38:this.$=P[z-2],O.setClickEvent(P[z-2],P[z],null),O.setLink(P[z-2],P[z-1]);break;case 39:this.$=P[z-3],O.setClickEvent(P[z-3],P[z-1],P[z]),O.setLink(P[z-3],P[z-2]);break;case 40:this.$=P[z-1],O.setLink(P[z-1],P[z]);break;case 41:case 47:this.$=P[z-1]+" "+P[z];break;case 42:case 43:case 45:this.$=P[z-2]+" "+P[z-1]+" "+P[z];break;case 44:case 46:this.$=P[z-3]+" "+P[z-2]+" "+P[z-1]+" "+P[z];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:o,18:l,19:18,20:u,21:h,22:f,23:d,24:p,25:g,26:m,27:y,28:x,29:b,30:w,31:_,33:k,35:E,36:L,37:24,38:S,40:C},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:o,18:l,19:18,20:u,21:h,22:f,23:d,24:p,25:g,26:m,27:y,28:x,29:b,30:w,31:_,33:k,35:E,36:L,37:24,38:S,40:C},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:v(function(A,D){if(D.recoverable)this.trace(A);else{var N=new Error(A);throw N.hash=D,N}},"parseError"),parse:v(function(A){var D=this,N=[0],O=[],B=[null],P=[],$=this.table,z="",H=0,J=0,X=0,oe=2,K=1,ee=P.slice.call(arguments,1),Q=Object.create(this.lexer),W={yy:{}};for(var Y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Y)&&(W.yy[Y]=this.yy[Y]);Q.setInput(A,W.yy),W.yy.lexer=Q,W.yy.parser=this,typeof Q.yylloc>"u"&&(Q.yylloc={});var Z=Q.yylloc;P.push(Z);var se=Q.options&&Q.options.ranges;typeof W.yy.parseError=="function"?this.parseError=W.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ce(q){N.length=N.length-2*q,B.length=B.length-q,P.length=P.length-q}v(ce,"popStack");function ue(){var q;return q=O.pop()||Q.lex()||K,typeof q!="number"&&(q instanceof Array&&(O=q,q=O.pop()),q=D.symbols_[q]||q),q}v(ue,"lex");for(var te,Ne,ae,we,Ie,Ee,Oe={},De,We,Re,Pe;;){if(ae=N[N.length-1],this.defaultActions[ae]?we=this.defaultActions[ae]:((te===null||typeof te>"u")&&(te=ue()),we=$[ae]&&$[ae][te]),typeof we>"u"||!we.length||!we[0]){var xe="";Pe=[];for(De in $[ae])this.terminals_[De]&&De>oe&&Pe.push("'"+this.terminals_[De]+"'");Q.showPosition?xe="Parse error on line "+(H+1)+`: `+Q.showPosition()+` Expecting `+Pe.join(", ")+", got '"+(this.terminals_[te]||te)+"'":xe="Parse error on line "+(H+1)+": Unexpected "+(te==K?"end of input":"'"+(this.terminals_[te]||te)+"'"),this.parseError(xe,{text:Q.match,token:this.terminals_[te]||te,line:Q.yylineno,loc:Z,expected:Pe})}if(we[0]instanceof Array&&we.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ae+", token: "+te);switch(we[0]){case 1:N.push(te),B.push(Q.yytext),P.push(Q.yylloc),N.push(we[1]),te=null,Ne?(te=Ne,Ne=null):(J=Q.yyleng,z=Q.yytext,H=Q.yylineno,Z=Q.yylloc,X>0&&X--);break;case 2:if(We=this.productions_[we[1]][1],Oe.$=B[B.length-We],Oe._$={first_line:P[P.length-(We||1)].first_line,last_line:P[P.length-1].last_line,first_column:P[P.length-(We||1)].first_column,last_column:P[P.length-1].last_column},se&&(Oe._$.range=[P[P.length-(We||1)].range[0],P[P.length-1].range[1]]),Ee=this.performAction.apply(Oe,[z,J,H,W.yy,we[1],B,P].concat(ee)),typeof Ee<"u")return Ee;We&&(N=N.slice(0,-1*We*2),B=B.slice(0,-1*We),P=P.slice(0,-1*We)),N.push(this.productions_[we[1]][0]),B.push(Oe.$),P.push(Oe._$),Re=$[N[N.length-2]][N[N.length-1]],N.push(Re);break;case 3:return!0}}return!0},"parse")},R=function(){var I={EOF:1,parseError:v(function(D,N){if(this.yy.parser)this.yy.parser.parseError(D,N);else throw new Error(D)},"parseError"),setInput:v(function(A,D){return this.yy=D||this.yy||{},this._input=A,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var A=this._input[0];this.yytext+=A,this.yyleng++,this.offset++,this.match+=A,this.matched+=A;var D=A.match(/(?:\r\n?|\n).*/g);return D?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),A},"input"),unput:v(function(A){var D=A.length,N=A.split(/(?:\r\n?|\n)/g);this._input=A+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-D),this.offset-=D;var O=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),N.length-1&&(this.yylineno-=N.length-1);var B=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:N?(N.length===O.length?this.yylloc.first_column:0)+O[O.length-N.length].length-N[0].length:this.yylloc.first_column-D},this.options.ranges&&(this.yylloc.range=[B[0],B[0]+this.yyleng-D]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(A){this.unput(this.match.slice(A))},"less"),pastInput:v(function(){var A=this.matched.substr(0,this.matched.length-this.match.length);return(A.length>20?"...":"")+A.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var A=this.match;return A.length<20&&(A+=this._input.substr(0,20-A.length)),(A.substr(0,20)+(A.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var A=this.pastInput(),D=new Array(A.length+1).join("-");return A+this.upcomingInput()+` `+D+"^"},"showPosition"),test_match:v(function(A,D){var N,O,B;if(this.options.backtrack_lexer&&(B={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(B.yylloc.range=this.yylloc.range.slice(0))),O=A[0].match(/(?:\r\n?|\n).*/g),O&&(this.yylineno+=O.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:O?O[O.length-1].length-O[O.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+A[0].length},this.yytext+=A[0],this.match+=A[0],this.matches=A,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(A[0].length),this.matched+=A[0],N=this.performAction.call(this,this.yy,this,D,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),N)return N;if(this._backtrack){for(var P in B)this[P]=B[P];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var A,D,N,O;this._more||(this.yytext="",this.match="");for(var B=this._currentRules(),P=0;PD[0].length)){if(D=N,O=P,this.options.backtrack_lexer){if(A=this.test_match(N,B[P]),A!==!1)return A;if(this._backtrack){D=!1;continue}else return!1}else if(!this.options.flex)break}return D?(A=this.test_match(D,B[O]),A!==!1?A:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var D=this.next();return D||this.lex()},"lex"),begin:v(function(D){this.conditionStack.push(D)},"begin"),popState:v(function(){var D=this.conditionStack.length-1;return D>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(D){return D=this.conditionStack.length-1-Math.abs(D||0),D>=0?this.conditionStack[D]:"INITIAL"},"topState"),pushState:v(function(D){this.begin(D)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(D,N,O,B){var P=B;switch(O){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return I}();M.lexer=R;function T(){this.yy={}}return v(T,"Parser"),T.prototype=M,M.Parser=T,new T}();BI.parser=BI;fOe=BI;oo.default.extend(rce.default);oo.default.extend(nce.default);oo.default.extend(ice.default);Qle={friday:5,saturday:6},Bc="",GI="",UI=void 0,VI="",q2=[],Y2=[],WI=new Map,HI=[],zT=[],Em="",qI="",ace=["active","done","crit","milestone"],YI=[],X2=!1,XI=!1,jI="sunday",$T="saturday",FI=0,dOe=v(function(){HI=[],zT=[],Em="",YI=[],PT=0,$I=void 0,BT=void 0,Ii=[],Bc="",GI="",qI="",UI=void 0,VI="",q2=[],Y2=[],X2=!1,XI=!1,FI=0,WI=new Map,xr(),jI="sunday",$T="saturday"},"clear"),pOe=v(function(t){GI=t},"setAxisFormat"),gOe=v(function(){return GI},"getAxisFormat"),mOe=v(function(t){UI=t},"setTickInterval"),vOe=v(function(){return UI},"getTickInterval"),yOe=v(function(t){VI=t},"setTodayMarker"),xOe=v(function(){return VI},"getTodayMarker"),bOe=v(function(t){Bc=t},"setDateFormat"),wOe=v(function(){X2=!0},"enableInclusiveEndDates"),kOe=v(function(){return X2},"endDatesAreInclusive"),TOe=v(function(){XI=!0},"enableTopAxis"),EOe=v(function(){return XI},"topAxisEnabled"),SOe=v(function(t){qI=t},"setDisplayMode"),COe=v(function(){return qI},"getDisplayMode"),AOe=v(function(){return Bc},"getDateFormat"),_Oe=v(function(t){q2=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),LOe=v(function(){return q2},"getIncludes"),ROe=v(function(t){Y2=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),NOe=v(function(){return Y2},"getExcludes"),IOe=v(function(){return WI},"getLinks"),MOe=v(function(t){Em=t,HI.push(t)},"addSection"),DOe=v(function(){return HI},"getSections"),OOe=v(function(){let t=Jle(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let l of i.groups.ids.split(" ")){let u=m0(l);u!==void 0&&(!s||u.endTime>s.endTime)&&(s=u)}if(s)return s.endTime;let o=new Date;return o.setHours(0,0,0,0),o}let a=(0,oo.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{re.debug("Invalid date:"+r),re.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),lce=v(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),cce=v(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let h=null;for(let d of a.groups.ids.split(" ")){let p=m0(d);p!==void 0&&(!h||p.startTime{window.open(r,"_self")}),WI.set(n,r))}),hce(t,"clickable")},"setLink"),hce=v(function(t,e){t.split(",").forEach(function(r){let n=m0(r);n!==void 0&&n.classes.push(e)})},"setClass"),HOe=v(function(t,e,r){if(pe().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{Ut.runFunc(e,...n)})},"setClickFun"),fce=v(function(t,e){YI.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),qOe=v(function(t,e,r){t.split(",").forEach(function(n){HOe(n,e,r)}),hce(t,"clickable")},"setClickEvent"),YOe=v(function(t){YI.forEach(function(e){e(t)})},"bindFunctions"),XOe={getConfig:v(()=>pe().gantt,"getConfig"),clear:dOe,setDateFormat:bOe,getDateFormat:AOe,enableInclusiveEndDates:wOe,endDatesAreInclusive:kOe,enableTopAxis:TOe,topAxisEnabled:EOe,setAxisFormat:pOe,getAxisFormat:gOe,setTickInterval:mOe,getTickInterval:vOe,setTodayMarker:yOe,getTodayMarker:xOe,setAccTitle:Tr,getAccTitle:_r,setDiagramTitle:tn,getDiagramTitle:qr,setDisplayMode:SOe,getDisplayMode:COe,setAccDescription:Lr,getAccDescription:Rr,addSection:MOe,getSections:DOe,getTasks:OOe,addTask:UOe,findTaskById:m0,addTaskOrg:VOe,setIncludes:_Oe,getIncludes:LOe,setExcludes:ROe,getExcludes:NOe,setClickEvent:qOe,setLink:WOe,getLinks:IOe,bindFunctions:YOe,parseDuration:lce,isInvalidDate:sce,setWeekday:POe,getWeekday:BOe,setWeekend:FOe};v(KI,"getTaskTags");jOe=v(function(){re.debug("Something is calling, setConf, remove the call")},"setConf"),ece={monday:wh,tuesday:t3,wednesday:r3,thursday:oc,friday:n3,saturday:i3,sunday:fl},KOe=v((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),ZOe=v(function(t,e,r,n){let i=pe().gantt,a=pe().securityLevel,s;a==="sandbox"&&(s=Ve("#i"+e));let o=a==="sandbox"?Ve(s.nodes()[0].contentDocument.body):Ve("body"),l=a==="sandbox"?s.nodes()[0].contentDocument:document,u=l.getElementById(e);ju=u.parentElement.offsetWidth,ju===void 0&&(ju=1200),i.useWidth!==void 0&&(ju=i.useWidth);let h=n.db.getTasks(),f=[];for(let S of h)f.push(S.type);f=L(f);let d={},p=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let S={};for(let M of h)S[M.section]===void 0?S[M.section]=[M]:S[M.section].push(M);let C=0;for(let M of Object.keys(S)){let R=KOe(S[M],C)+1;C+=R,p+=R*(i.barHeight+i.barGap),d[M]=R}}else{p+=h.length*(i.barHeight+i.barGap);for(let S of f)d[S]=h.filter(C=>C.type===S).length}u.setAttribute("viewBox","0 0 "+ju+" "+p);let g=o.select(`[id="${e}"]`),m=o3().domain([d4(h,function(S){return S.startTime}),f4(h,function(S){return S.endTime})]).rangeRound([0,ju-i.leftPadding-i.rightPadding]);function y(S,C){let M=S.startTime,R=C.startTime,T=0;return M>R?T=1:M$.order))].map($=>S.find(z=>z.order===$));g.append("g").selectAll("rect").data(N).enter().append("rect").attr("x",0).attr("y",function($,z){return z=$.order,z*C+M-2}).attr("width",function(){return A-i.rightPadding/2}).attr("height",C).attr("class",function($){for(let[z,H]of f.entries())if($.type===H)return"section section"+z%i.numberSectionStyles;return"section section0"});let O=g.append("g").selectAll("rect").data(S).enter(),B=n.db.getLinks();if(O.append("rect").attr("id",function($){return $.id}).attr("rx",3).attr("ry",3).attr("x",function($){return $.milestone?m($.startTime)+R+.5*(m($.endTime)-m($.startTime))-.5*T:m($.startTime)+R}).attr("y",function($,z){return z=$.order,z*C+M}).attr("width",function($){return $.milestone?T:m($.renderEndTime||$.endTime)-m($.startTime)}).attr("height",T).attr("transform-origin",function($,z){return z=$.order,(m($.startTime)+R+.5*(m($.endTime)-m($.startTime))).toString()+"px "+(z*C+M+.5*T).toString()+"px"}).attr("class",function($){let z="task",H="";$.classes.length>0&&(H=$.classes.join(" "));let J=0;for(let[oe,K]of f.entries())$.type===K&&(J=oe%i.numberSectionStyles);let X="";return $.active?$.crit?X+=" activeCrit":X=" active":$.done?$.crit?X=" doneCrit":X=" done":$.crit&&(X+=" crit"),X.length===0&&(X=" task"),$.milestone&&(X=" milestone "+X),X+=J,X+=" "+H,z+X}),O.append("text").attr("id",function($){return $.id+"-text"}).text(function($){return $.task}).attr("font-size",i.fontSize).attr("x",function($){let z=m($.startTime),H=m($.renderEndTime||$.endTime);$.milestone&&(z+=.5*(m($.endTime)-m($.startTime))-.5*T),$.milestone&&(H=z+T);let J=this.getBBox().width;return J>H-z?H+J+1.5*i.leftPadding>A?z+R-5:H+R+5:(H-z)/2+z+R}).attr("y",function($,z){return z=$.order,z*C+i.barHeight/2+(i.fontSize/2-2)+M}).attr("text-height",T).attr("class",function($){let z=m($.startTime),H=m($.endTime);$.milestone&&(H=z+T);let J=this.getBBox().width,X="";$.classes.length>0&&(X=$.classes.join(" "));let oe=0;for(let[ee,Q]of f.entries())$.type===Q&&(oe=ee%i.numberSectionStyles);let K="";return $.active&&($.crit?K="activeCritText"+oe:K="activeText"+oe),$.done?$.crit?K=K+" doneCritText"+oe:K=K+" doneText"+oe:$.crit&&(K=K+" critText"+oe),$.milestone&&(K+=" milestoneText"),J>H-z?H+J+1.5*i.leftPadding>A?X+" taskTextOutsideLeft taskTextOutside"+oe+" "+K:X+" taskTextOutsideRight taskTextOutside"+oe+" "+K+" width-"+J:X+" taskText taskText"+oe+" "+K+" width-"+J}),pe().securityLevel==="sandbox"){let $;$=Ve("#i"+e);let z=$.nodes()[0].contentDocument;O.filter(function(H){return B.has(H.id)}).each(function(H){var J=z.querySelector("#"+H.id),X=z.querySelector("#"+H.id+"-text");let oe=J.parentNode;var K=z.createElement("a");K.setAttribute("xlink:href",B.get(H.id)),K.setAttribute("target","_top"),oe.appendChild(K),K.appendChild(J),K.appendChild(X)})}}v(b,"drawRects");function w(S,C,M,R,T,I,A,D){if(A.length===0&&D.length===0)return;let N,O;for(let{startTime:J,endTime:X}of I)(N===void 0||JO)&&(O=X);if(!N||!O)return;if((0,FT.default)(O).diff((0,FT.default)(N),"year")>5){re.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let B=n.db.getDateFormat(),P=[],$=null,z=(0,FT.default)(N);for(;z.valueOf()<=O;)n.db.isInvalidDate(z,B,A,D)?$?$.end=z:$={start:z,end:z}:$&&(P.push($),$=null),z=z.add(1,"d");g.append("g").selectAll("rect").data(P).enter().append("rect").attr("id",function(J){return"exclude-"+J.start.format("YYYY-MM-DD")}).attr("x",function(J){return m(J.start)+M}).attr("y",i.gridLineStartPadding).attr("width",function(J){let X=J.end.add(1,"day");return m(X)-m(J.start)}).attr("height",T-C-i.gridLineStartPadding).attr("transform-origin",function(J,X){return(m(J.start)+M+.5*(m(J.end)-m(J.start))).toString()+"px "+(X*S+.5*T).toString()+"px"}).attr("class","exclude-range")}v(w,"drawExcludeDays");function _(S,C,M,R){let T=MC(m).tickSize(-R+C+i.gridLineStartPadding).tickFormat(cd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d")),A=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(A!==null){let D=A[1],N=A[2],O=n.db.getWeekday()||i.weekday;switch(N){case"millisecond":T.ticks(ac.every(D));break;case"second":T.ticks(Ws.every(D));break;case"minute":T.ticks(gu.every(D));break;case"hour":T.ticks(mu.every(D));break;case"day":T.ticks(wo.every(D));break;case"week":T.ticks(ece[O].every(D));break;case"month":T.ticks(vu.every(D));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+S+", "+(R-50)+")").call(T).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let D=IC(m).tickSize(-R+C+i.gridLineStartPadding).tickFormat(cd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d"));if(A!==null){let N=A[1],O=A[2],B=n.db.getWeekday()||i.weekday;switch(O){case"millisecond":D.ticks(ac.every(N));break;case"second":D.ticks(Ws.every(N));break;case"minute":D.ticks(gu.every(N));break;case"hour":D.ticks(mu.every(N));break;case"day":D.ticks(wo.every(N));break;case"week":D.ticks(ece[B].every(N));break;case"month":D.ticks(vu.every(N));break}}g.append("g").attr("class","grid").attr("transform","translate("+S+", "+C+")").call(D).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}v(_,"makeGrid");function k(S,C){let M=0,R=Object.keys(d).map(T=>[T,d[T]]);g.append("g").selectAll("text").data(R).enter().append(function(T){let I=T[0].split(Xe.lineBreakRegex),A=-(I.length-1)/2,D=l.createElementNS("http://www.w3.org/2000/svg","text");D.setAttribute("dy",A+"em");for(let[N,O]of I.entries()){let B=l.createElementNS("http://www.w3.org/2000/svg","tspan");B.setAttribute("alignment-baseline","central"),B.setAttribute("x","10"),N>0&&B.setAttribute("dy","1em"),B.textContent=O,D.appendChild(B)}return D}).attr("x",10).attr("y",function(T,I){if(I>0)for(let A=0;A` .mermaid-main-font { font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); } .exclude-range { fill: ${t.excludeBkgColor}; } .section { stroke: none; opacity: 0.2; } .section0 { fill: ${t.sectionBkgColor}; } .section2 { fill: ${t.sectionBkgColor2}; } .section1, .section3 { fill: ${t.altSectionBkgColor}; opacity: 0.2; } .sectionTitle0 { fill: ${t.titleColor}; } .sectionTitle1 { fill: ${t.titleColor}; } .sectionTitle2 { fill: ${t.titleColor}; } .sectionTitle3 { fill: ${t.titleColor}; } .sectionTitle { text-anchor: start; font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); } /* Grid and axis */ .grid .tick { stroke: ${t.gridColor}; opacity: 0.8; shape-rendering: crispEdges; } .grid .tick text { font-family: ${t.fontFamily}; fill: ${t.textColor}; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: ${t.todayLineColor}; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); } .taskTextOutsideRight { fill: ${t.taskTextDarkColor}; text-anchor: start; font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); } .taskTextOutsideLeft { fill: ${t.taskTextDarkColor}; text-anchor: end; } /* Special case clickable */ .task.clickable { cursor: pointer; } .taskText.clickable { cursor: pointer; fill: ${t.taskTextClickableColor} !important; font-weight: bold; } .taskTextOutsideLeft.clickable { cursor: pointer; fill: ${t.taskTextClickableColor} !important; font-weight: bold; } .taskTextOutsideRight.clickable { cursor: pointer; fill: ${t.taskTextClickableColor} !important; font-weight: bold; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: ${t.taskTextColor}; } .task0, .task1, .task2, .task3 { fill: ${t.taskBkgColor}; stroke: ${t.taskBorderColor}; } .taskTextOutside0, .taskTextOutside2 { fill: ${t.taskTextOutsideColor}; } .taskTextOutside1, .taskTextOutside3 { fill: ${t.taskTextOutsideColor}; } /* Active task */ .active0, .active1, .active2, .active3 { fill: ${t.activeTaskBkgColor}; stroke: ${t.activeTaskBorderColor}; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: ${t.taskTextDarkColor} !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: ${t.doneTaskBorderColor}; fill: ${t.doneTaskBkgColor}; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: ${t.taskTextDarkColor} !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: ${t.critBorderColor}; fill: ${t.critBkgColor}; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: ${t.critBorderColor}; fill: ${t.activeTaskBkgColor}; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: ${t.critBorderColor}; fill: ${t.doneTaskBkgColor}; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .milestone { transform: rotate(45deg) scale(0.8,0.8); } .milestoneText { font-style: italic; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: ${t.taskTextDarkColor} !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: ${t.taskTextDarkColor} !important; } .titleText { text-anchor: middle; font-size: 18px; fill: ${t.titleColor||t.textColor}; font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); } `,"getStyles"),ePe=JOe,tPe={parser:fOe,db:XOe,renderer:QOe,styles:ePe}});var gce={};vr(gce,{diagram:()=>lPe});var rPe,nPe,iPe,aPe,sPe,oPe,lPe,mce=F(()=>{o9();Iu();or();km();rPe={parse:v(async t=>{let e=await Nl("info",t);re.debug(e)},"parse")},nPe={version:dy},iPe=v(()=>nPe.version,"getVersion"),aPe={getVersion:iPe},sPe=v((t,e,r)=>{re.debug(`rendering info diagram `+t);let n=La(e);Hr(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),oPe={draw:sPe},lPe={parser:rPe,db:aPe,renderer:oPe}});var xce={};vr(xce,{diagram:()=>TPe});var vce,ZI,GT,QI,cPe,uPe,hPe,fPe,dPe,pPe,gPe,yce,mPe,vPe,yPe,xPe,bPe,wPe,kPe,TPe,bce=F(()=>{ky();kn();Iu();or();km();lr();vce=sr.pie,ZI={sections:new Map,showData:!1,config:vce},GT=ZI.sections,QI=ZI.showData,cPe=structuredClone(vce),uPe=v(()=>structuredClone(cPe),"getConfig"),hPe=v(()=>{GT=new Map,QI=ZI.showData,xr()},"clear"),fPe=v(({label:t,value:e})=>{GT.has(t)||(GT.set(t,e),re.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),dPe=v(()=>GT,"getSections"),pPe=v(t=>{QI=t},"setShowData"),gPe=v(()=>QI,"getShowData"),yce={getConfig:uPe,clear:hPe,setDiagramTitle:tn,getDiagramTitle:qr,setAccTitle:Tr,getAccTitle:_r,setAccDescription:Lr,getAccDescription:Rr,addSection:fPe,getSections:dPe,setShowData:pPe,getShowData:gPe},mPe=v((t,e)=>{Pu(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),vPe={parse:v(async t=>{let e=await Nl("pie",t);re.debug(e),mPe(e,yce)},"parse")},yPe=v(t=>` .pieCircle{ stroke: ${t.pieStrokeColor}; stroke-width : ${t.pieStrokeWidth}; opacity : ${t.pieOpacity}; } .pieOuterCircle{ stroke: ${t.pieOuterStrokeColor}; stroke-width: ${t.pieOuterStrokeWidth}; fill: none; } .pieTitleText { text-anchor: middle; font-size: ${t.pieTitleTextSize}; fill: ${t.pieTitleTextColor}; font-family: ${t.fontFamily}; } .slice { font-family: ${t.fontFamily}; fill: ${t.pieSectionTextColor}; font-size:${t.pieSectionTextSize}; // fill: white; } .legend text { fill: ${t.pieLegendTextColor}; font-family: ${t.fontFamily}; font-size: ${t.pieLegendTextSize}; } `,"getStyles"),xPe=yPe,bPe=v(t=>{let e=[...t.entries()].map(n=>({label:n[0],value:n[1]})).sort((n,i)=>i.value-n.value);return h8().value(n=>n.value)(e)},"createPieArcs"),wPe=v((t,e,r,n)=>{re.debug(`rendering pie chart `+t);let i=n.db,a=pe(),s=ws(i.getConfig(),a.pie),o=40,l=18,u=4,h=450,f=h,d=La(e),p=d.append("g");p.attr("transform","translate("+f/2+","+h/2+")");let{themeVariables:g}=a,[m]=Ro(g.pieOuterStrokeWidth);m??=2;let y=s.textPosition,x=Math.min(f,h)/2-o,b=lc().innerRadius(0).outerRadius(x),w=lc().innerRadius(x*y).outerRadius(x*y);p.append("circle").attr("cx",0).attr("cy",0).attr("r",x+m/2).attr("class","pieOuterCircle");let _=i.getSections(),k=bPe(_),E=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],L=du(E);p.selectAll("mySlices").data(k).enter().append("path").attr("d",b).attr("fill",T=>L(T.data.label)).attr("class","pieCircle");let S=0;_.forEach(T=>{S+=T}),p.selectAll("mySlices").data(k).enter().append("text").text(T=>(T.data.value/S*100).toFixed(0)+"%").attr("transform",T=>"translate("+w.centroid(T)+")").style("text-anchor","middle").attr("class","slice"),p.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(h-50)/2).attr("class","pieTitleText");let C=p.selectAll(".legend").data(L.domain()).enter().append("g").attr("class","legend").attr("transform",(T,I)=>{let A=l+u,D=A*L.domain().length/2,N=12*l,O=I*A-D;return"translate("+N+","+O+")"});C.append("rect").attr("width",l).attr("height",l).style("fill",L).style("stroke",L),C.data(k).append("text").attr("x",l+u).attr("y",l-u).text(T=>{let{label:I,value:A}=T.data;return i.getShowData()?`${I} [${A}]`:I});let M=Math.max(...C.selectAll("text").nodes().map(T=>T?.getBoundingClientRect().width??0)),R=f+o+l+u+M;d.attr("viewBox",`0 0 ${R} ${h}`),Hr(d,h,R,s.useMaxWidth)},"draw"),kPe={draw:wPe},TPe={parser:vPe,db:yce,renderer:kPe,styles:xPe}});var Pce={};vr(Pce,{diagram:()=>NPe});function eM(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function wce(t){return!/^\d+$/.test(t)}function kce(t){return!/^\d+px$/.test(t)}function Fc(t){return yr(t.trim(),CPe)}function Tce(t){ma.setData({quadrant1Text:Fc(t.text)})}function Ece(t){ma.setData({quadrant2Text:Fc(t.text)})}function Sce(t){ma.setData({quadrant3Text:Fc(t.text)})}function Cce(t){ma.setData({quadrant4Text:Fc(t.text)})}function Ace(t){ma.setData({xAxisLeftText:Fc(t.text)})}function _ce(t){ma.setData({xAxisRightText:Fc(t.text)})}function Lce(t){ma.setData({yAxisTopText:Fc(t.text)})}function Rce(t){ma.setData({yAxisBottomText:Fc(t.text)})}function VT(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(wce(i))throw new UT(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if(eM(i))throw new UT(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if(eM(i))throw new UT(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if(kce(i))throw new UT(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function Nce(t,e,r,n,i){let a=VT(i);ma.addPoints([{x:r,y:n,text:Fc(t.text),className:e,...a}])}function Ice(t,e){ma.addClass(t,VT(e))}function Mce(t){ma.setConfig({chartWidth:t})}function Dce(t){ma.setConfig({chartHeight:t})}function Oce(){let t=pe(),{themeVariables:e,quadrantChart:r}=t;return r&&ma.setConfig(r),ma.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),ma.setData({titleText:qr()}),ma.build()}var JI,EPe,as,SPe,UT,CPe,ma,APe,_Pe,LPe,RPe,NPe,Bce=F(()=>{or();lr();lr();JI=function(){var t=v(function(ke,j,ye,Ae){for(ye=ye||{},Ae=ke.length;Ae--;ye[ke[Ae]]=j);return ye},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],o=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[55,56,57],u=[2,36],h=[1,37],f=[1,36],d=[1,38],p=[1,35],g=[1,43],m=[1,41],y=[1,14],x=[1,23],b=[1,18],w=[1,19],_=[1,20],k=[1,21],E=[1,22],L=[1,24],S=[1,25],C=[1,26],M=[1,27],R=[1,28],T=[1,29],I=[1,32],A=[1,33],D=[1,34],N=[1,39],O=[1,40],B=[1,42],P=[1,44],$=[1,62],z=[1,61],H=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],J=[1,65],X=[1,66],oe=[1,67],K=[1,68],ee=[1,69],Q=[1,70],W=[1,71],Y=[1,72],Z=[1,73],se=[1,74],ce=[1,75],ue=[1,76],te=[4,5,6,7,8,9,10,11,12,13,14,15,18],Ne=[1,90],ae=[1,91],we=[1,92],Ie=[1,99],Ee=[1,93],Oe=[1,96],De=[1,94],We=[1,95],Re=[1,97],Pe=[1,98],xe=[1,102],q=[10,55,56,57],de=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ie={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:v(function(j,ye,Ae,Ge,Fe,ge,$e){var Ce=ge.length-1;switch(Fe){case 23:this.$=ge[Ce];break;case 24:this.$=ge[Ce-1]+""+ge[Ce];break;case 26:this.$=ge[Ce-1]+ge[Ce];break;case 27:this.$=[ge[Ce].trim()];break;case 28:ge[Ce-2].push(ge[Ce].trim()),this.$=ge[Ce-2];break;case 29:this.$=ge[Ce-4],Ge.addClass(ge[Ce-2],ge[Ce]);break;case 37:this.$=[];break;case 42:this.$=ge[Ce].trim(),Ge.setDiagramTitle(this.$);break;case 43:this.$=ge[Ce].trim(),Ge.setAccTitle(this.$);break;case 44:case 45:this.$=ge[Ce].trim(),Ge.setAccDescription(this.$);break;case 46:Ge.addSection(ge[Ce].substr(8)),this.$=ge[Ce].substr(8);break;case 47:Ge.addPoint(ge[Ce-3],"",ge[Ce-1],ge[Ce],[]);break;case 48:Ge.addPoint(ge[Ce-4],ge[Ce-3],ge[Ce-1],ge[Ce],[]);break;case 49:Ge.addPoint(ge[Ce-4],"",ge[Ce-2],ge[Ce-1],ge[Ce]);break;case 50:Ge.addPoint(ge[Ce-5],ge[Ce-4],ge[Ce-2],ge[Ce-1],ge[Ce]);break;case 51:Ge.setXAxisLeftText(ge[Ce-2]),Ge.setXAxisRightText(ge[Ce]);break;case 52:ge[Ce-1].text+=" \u27F6 ",Ge.setXAxisLeftText(ge[Ce-1]);break;case 53:Ge.setXAxisLeftText(ge[Ce]);break;case 54:Ge.setYAxisBottomText(ge[Ce-2]),Ge.setYAxisTopText(ge[Ce]);break;case 55:ge[Ce-1].text+=" \u27F6 ",Ge.setYAxisBottomText(ge[Ce-1]);break;case 56:Ge.setYAxisBottomText(ge[Ce]);break;case 57:Ge.setQuadrant1Text(ge[Ce]);break;case 58:Ge.setQuadrant2Text(ge[Ce]);break;case 59:Ge.setQuadrant3Text(ge[Ce]);break;case 60:Ge.setQuadrant4Text(ge[Ce]);break;case 64:this.$={text:ge[Ce],type:"text"};break;case 65:this.$={text:ge[Ce-1].text+""+ge[Ce],type:ge[Ce-1].type};break;case 66:this.$={text:ge[Ce],type:"text"};break;case 67:this.$={text:ge[Ce],type:"markdown"};break;case 68:this.$=ge[Ce];break;case 69:this.$=ge[Ce-1]+""+ge[Ce];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(o,[2,61]),t(o,[2,62]),t(o,[2,63]),{1:[2,30]},{1:[2,31]},t(l,u,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:h,5:f,10:d,12:p,13:g,14:m,18:y,25:x,35:b,37:w,39:_,41:k,42:E,48:L,50:S,51:C,52:M,53:R,54:T,60:I,61:A,63:D,64:N,65:O,66:B,67:P}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(l,[2,37]),t(l,u,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:h,5:f,10:d,12:p,13:g,14:m,18:y,25:x,35:b,37:w,39:_,41:k,42:E,48:L,50:S,51:C,52:M,53:R,54:T,60:I,61:A,63:D,64:N,65:O,66:B,67:P}),t(l,[2,39]),t(l,[2,40]),t(l,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(l,[2,45]),t(l,[2,46]),{18:[1,50]},{4:h,5:f,10:d,12:p,13:g,14:m,43:51,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,10:d,12:p,13:g,14:m,43:52,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,10:d,12:p,13:g,14:m,43:53,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,10:d,12:p,13:g,14:m,43:54,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,10:d,12:p,13:g,14:m,43:55,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,10:d,12:p,13:g,14:m,43:56,58:31,60:I,61:A,63:D,64:N,65:O,66:B,67:P},{4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,44:[1,57],47:[1,58],58:60,59:59,63:D,64:N,65:O,66:B,67:P},t(H,[2,64]),t(H,[2,66]),t(H,[2,67]),t(H,[2,70]),t(H,[2,71]),t(H,[2,72]),t(H,[2,73]),t(H,[2,74]),t(H,[2,75]),t(H,[2,76]),t(H,[2,77]),t(H,[2,78]),t(H,[2,79]),t(H,[2,80]),t(s,[2,35]),t(l,[2,38]),t(l,[2,42]),t(l,[2,43]),t(l,[2,44]),{3:64,4:J,5:X,6:oe,7:K,8:ee,9:Q,10:W,11:Y,12:Z,13:se,14:ce,15:ue,21:63},t(l,[2,53],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,49:[1,77],63:D,64:N,65:O,66:B,67:P}),t(l,[2,56],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,49:[1,78],63:D,64:N,65:O,66:B,67:P}),t(l,[2,57],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),t(l,[2,58],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),t(l,[2,59],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),t(l,[2,60],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),{45:[1,79]},{44:[1,80]},t(H,[2,65]),t(H,[2,81]),t(H,[2,82]),t(H,[2,83]),{3:82,4:J,5:X,6:oe,7:K,8:ee,9:Q,10:W,11:Y,12:Z,13:se,14:ce,15:ue,18:[1,81]},t(te,[2,23]),t(te,[2,1]),t(te,[2,2]),t(te,[2,3]),t(te,[2,4]),t(te,[2,5]),t(te,[2,6]),t(te,[2,7]),t(te,[2,8]),t(te,[2,9]),t(te,[2,10]),t(te,[2,11]),t(te,[2,12]),t(l,[2,52],{58:31,43:83,4:h,5:f,10:d,12:p,13:g,14:m,60:I,61:A,63:D,64:N,65:O,66:B,67:P}),t(l,[2,55],{58:31,43:84,4:h,5:f,10:d,12:p,13:g,14:m,60:I,61:A,63:D,64:N,65:O,66:B,67:P}),{46:[1,85]},{45:[1,86]},{4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,16:89,17:De,18:We,19:Re,20:Pe,22:88,23:87},t(te,[2,24]),t(l,[2,51],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),t(l,[2,54],{59:59,58:60,4:h,5:f,8:$,10:d,12:p,13:g,14:m,18:z,63:D,64:N,65:O,66:B,67:P}),t(l,[2,47],{22:88,16:89,23:100,4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,17:De,18:We,19:Re,20:Pe}),{46:[1,101]},t(l,[2,29],{10:xe}),t(q,[2,27],{16:103,4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,17:De,18:We,19:Re,20:Pe}),t(de,[2,25]),t(de,[2,13]),t(de,[2,14]),t(de,[2,15]),t(de,[2,16]),t(de,[2,17]),t(de,[2,18]),t(de,[2,19]),t(de,[2,20]),t(de,[2,21]),t(de,[2,22]),t(l,[2,49],{10:xe}),t(l,[2,48],{22:88,16:89,23:104,4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,17:De,18:We,19:Re,20:Pe}),{4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,16:89,17:De,18:We,19:Re,20:Pe,22:105},t(de,[2,26]),t(l,[2,50],{10:xe}),t(q,[2,28],{16:103,4:Ne,5:ae,6:we,8:Ie,11:Ee,13:Oe,17:De,18:We,19:Re,20:Pe})],defaultActions:{8:[2,30],9:[2,31]},parseError:v(function(j,ye){if(ye.recoverable)this.trace(j);else{var Ae=new Error(j);throw Ae.hash=ye,Ae}},"parseError"),parse:v(function(j){var ye=this,Ae=[0],Ge=[],Fe=[null],ge=[],$e=this.table,Ce="",qe=0,lt=0,xt=0,ft=2,Ze=1,st=ge.slice.call(arguments,1),Ue=Object.create(this.lexer),Ke={yy:{}};for(var it in this.yy)Object.prototype.hasOwnProperty.call(this.yy,it)&&(Ke.yy[it]=this.yy[it]);Ue.setInput(j,Ke.yy),Ke.yy.lexer=Ue,Ke.yy.parser=this,typeof Ue.yylloc>"u"&&(Ue.yylloc={});var mt=Ue.yylloc;ge.push(mt);var Ht=Ue.options&&Ue.options.ranges;typeof Ke.yy.parseError=="function"?this.parseError=Ke.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ot(Vr){Ae.length=Ae.length-2*Vr,Fe.length=Fe.length-Vr,ge.length=ge.length-Vr}v(ot,"popStack");function et(){var Vr;return Vr=Ge.pop()||Ue.lex()||Ze,typeof Vr!="number"&&(Vr instanceof Array&&(Ge=Vr,Vr=Ge.pop()),Vr=ye.symbols_[Vr]||Vr),Vr}v(et,"lex");for(var ht,bt,tt,_t,ur,Qt,Jt={},en,Cr,Kn,cn;;){if(tt=Ae[Ae.length-1],this.defaultActions[tt]?_t=this.defaultActions[tt]:((ht===null||typeof ht>"u")&&(ht=et()),_t=$e[tt]&&$e[tt][ht]),typeof _t>"u"||!_t.length||!_t[0]){var Rn="";cn=[];for(en in $e[tt])this.terminals_[en]&&en>ft&&cn.push("'"+this.terminals_[en]+"'");Ue.showPosition?Rn="Parse error on line "+(qe+1)+`: `+Ue.showPosition()+` Expecting `+cn.join(", ")+", got '"+(this.terminals_[ht]||ht)+"'":Rn="Parse error on line "+(qe+1)+": Unexpected "+(ht==Ze?"end of input":"'"+(this.terminals_[ht]||ht)+"'"),this.parseError(Rn,{text:Ue.match,token:this.terminals_[ht]||ht,line:Ue.yylineno,loc:mt,expected:cn})}if(_t[0]instanceof Array&&_t.length>1)throw new Error("Parse Error: multiple actions possible at state: "+tt+", token: "+ht);switch(_t[0]){case 1:Ae.push(ht),Fe.push(Ue.yytext),ge.push(Ue.yylloc),Ae.push(_t[1]),ht=null,bt?(ht=bt,bt=null):(lt=Ue.yyleng,Ce=Ue.yytext,qe=Ue.yylineno,mt=Ue.yylloc,xt>0&&xt--);break;case 2:if(Cr=this.productions_[_t[1]][1],Jt.$=Fe[Fe.length-Cr],Jt._$={first_line:ge[ge.length-(Cr||1)].first_line,last_line:ge[ge.length-1].last_line,first_column:ge[ge.length-(Cr||1)].first_column,last_column:ge[ge.length-1].last_column},Ht&&(Jt._$.range=[ge[ge.length-(Cr||1)].range[0],ge[ge.length-1].range[1]]),Qt=this.performAction.apply(Jt,[Ce,lt,qe,Ke.yy,_t[1],Fe,ge].concat(st)),typeof Qt<"u")return Qt;Cr&&(Ae=Ae.slice(0,-1*Cr*2),Fe=Fe.slice(0,-1*Cr),ge=ge.slice(0,-1*Cr)),Ae.push(this.productions_[_t[1]][0]),Fe.push(Jt.$),ge.push(Jt._$),Kn=$e[Ae[Ae.length-2]][Ae[Ae.length-1]],Ae.push(Kn);break;case 3:return!0}}return!0},"parse")},he=function(){var ke={EOF:1,parseError:v(function(ye,Ae){if(this.yy.parser)this.yy.parser.parseError(ye,Ae);else throw new Error(ye)},"parseError"),setInput:v(function(j,ye){return this.yy=ye||this.yy||{},this._input=j,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var j=this._input[0];this.yytext+=j,this.yyleng++,this.offset++,this.match+=j,this.matched+=j;var ye=j.match(/(?:\r\n?|\n).*/g);return ye?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),j},"input"),unput:v(function(j){var ye=j.length,Ae=j.split(/(?:\r\n?|\n)/g);this._input=j+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ye),this.offset-=ye;var Ge=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ae.length-1&&(this.yylineno-=Ae.length-1);var Fe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ae?(Ae.length===Ge.length?this.yylloc.first_column:0)+Ge[Ge.length-Ae.length].length-Ae[0].length:this.yylloc.first_column-ye},this.options.ranges&&(this.yylloc.range=[Fe[0],Fe[0]+this.yyleng-ye]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(j){this.unput(this.match.slice(j))},"less"),pastInput:v(function(){var j=this.matched.substr(0,this.matched.length-this.match.length);return(j.length>20?"...":"")+j.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var j=this.match;return j.length<20&&(j+=this._input.substr(0,20-j.length)),(j.substr(0,20)+(j.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var j=this.pastInput(),ye=new Array(j.length+1).join("-");return j+this.upcomingInput()+` `+ye+"^"},"showPosition"),test_match:v(function(j,ye){var Ae,Ge,Fe;if(this.options.backtrack_lexer&&(Fe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Fe.yylloc.range=this.yylloc.range.slice(0))),Ge=j[0].match(/(?:\r\n?|\n).*/g),Ge&&(this.yylineno+=Ge.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ge?Ge[Ge.length-1].length-Ge[Ge.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+j[0].length},this.yytext+=j[0],this.match+=j[0],this.matches=j,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(j[0].length),this.matched+=j[0],Ae=this.performAction.call(this,this.yy,this,ye,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ae)return Ae;if(this._backtrack){for(var ge in Fe)this[ge]=Fe[ge];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var j,ye,Ae,Ge;this._more||(this.yytext="",this.match="");for(var Fe=this._currentRules(),ge=0;geye[0].length)){if(ye=Ae,Ge=ge,this.options.backtrack_lexer){if(j=this.test_match(Ae,Fe[ge]),j!==!1)return j;if(this._backtrack){ye=!1;continue}else return!1}else if(!this.options.flex)break}return ye?(j=this.test_match(ye,Fe[Ge]),j!==!1?j:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var ye=this.next();return ye||this.lex()},"lex"),begin:v(function(ye){this.conditionStack.push(ye)},"begin"),popState:v(function(){var ye=this.conditionStack.length-1;return ye>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(ye){return ye=this.conditionStack.length-1-Math.abs(ye||0),ye>=0?this.conditionStack[ye]:"INITIAL"},"topState"),pushState:v(function(ye){this.begin(ye)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(ye,Ae,Ge,Fe){var ge=Fe;switch(Ge){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return ke}();ie.lexer=he;function U(){this.yy={}}return v(U,"Parser"),U.prototype=ie,ie.Parser=U,new U}();JI.parser=JI;EPe=JI,as=z1(),SPe=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{v(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:sr.quadrantChart?.chartWidth||500,chartWidth:sr.quadrantChart?.chartHeight||500,titlePadding:sr.quadrantChart?.titlePadding||10,titleFontSize:sr.quadrantChart?.titleFontSize||20,quadrantPadding:sr.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:sr.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:sr.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:sr.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:sr.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:sr.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:sr.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:sr.quadrantChart?.pointTextPadding||5,pointLabelFontSize:sr.quadrantChart?.pointLabelFontSize||12,pointRadius:sr.quadrantChart?.pointRadius||5,xAxisPosition:sr.quadrantChart?.xAxisPosition||"top",yAxisPosition:sr.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:sr.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:sr.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:as.quadrant1Fill,quadrant2Fill:as.quadrant2Fill,quadrant3Fill:as.quadrant3Fill,quadrant4Fill:as.quadrant4Fill,quadrant1TextFill:as.quadrant1TextFill,quadrant2TextFill:as.quadrant2TextFill,quadrant3TextFill:as.quadrant3TextFill,quadrant4TextFill:as.quadrant4TextFill,quadrantPointFill:as.quadrantPointFill,quadrantPointTextFill:as.quadrantPointTextFill,quadrantXAxisTextFill:as.quadrantXAxisTextFill,quadrantYAxisTextFill:as.quadrantYAxisTextFill,quadrantTitleFill:as.quadrantTitleFill,quadrantInternalBorderStrokeFill:as.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:as.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,re.info("clear called")}setData(t){this.data={...this.data,...t}}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,e){this.classes.set(t,e)}setConfig(t){re.trace("setConfig called with: ",t),this.config={...this.config,...t}}setThemeConfig(t){re.trace("setThemeConfig called with: ",t),this.themeConfig={...this.themeConfig,...t}}calculateSpace(t,e,r,n){let i=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,a={top:t==="top"&&e?i:0,bottom:t==="bottom"&&e?i:0},s=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,o={left:this.config.yAxisPosition==="left"&&r?s:0,right:this.config.yAxisPosition==="right"&&r?s:0},l=this.config.titleFontSize+this.config.titlePadding*2,u={top:n?l:0},h=this.config.quadrantPadding+o.left,f=this.config.quadrantPadding+a.top+u.top,d=this.config.chartWidth-this.config.quadrantPadding*2-o.left-o.right,p=this.config.chartHeight-this.config.quadrantPadding*2-a.top-a.bottom-u.top,g=d/2,m=p/2;return{xAxisSpace:a,yAxisSpace:o,titleSpace:u,quadrantSpace:{quadrantLeft:h,quadrantTop:f,quadrantWidth:d,quadrantHalfWidth:g,quadrantHeight:p,quadrantHalfHeight:m}}}getAxisLabels(t,e,r,n){let{quadrantSpace:i,titleSpace:a}=n,{quadrantHalfHeight:s,quadrantHeight:o,quadrantLeft:l,quadrantHalfWidth:u,quadrantTop:h,quadrantWidth:f}=i,d=!!this.data.xAxisRightText,p=!!this.data.yAxisTopText,g=[];return this.data.xAxisLeftText&&e&&g.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+(d?u/2:0),y:t==="top"?this.config.xAxisLabelPadding+a.top:this.config.xAxisLabelPadding+h+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:d?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&e&&g.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+u+(d?u/2:0),y:t==="top"?this.config.xAxisLabelPadding+a.top:this.config.xAxisLabelPadding+h+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:d?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&r&&g.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+f+this.config.quadrantPadding,y:h+o-(p?s/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:p?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&r&&g.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+f+this.config.quadrantPadding,y:h+s-(p?s/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:p?"center":"left",horizontalPos:"top",rotation:-90}),g}getQuadrants(t){let{quadrantSpace:e}=t,{quadrantHalfHeight:r,quadrantLeft:n,quadrantHalfWidth:i,quadrantTop:a}=e,s=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:n+i,y:a,width:i,height:r,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:n,y:a,width:i,height:r,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:n,y:a+r,width:i,height:r,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:n+i,y:a+r,width:i,height:r,fill:this.themeConfig.quadrant4Fill}];for(let o of s)o.text.x=o.x+o.width/2,this.data.points.length===0?(o.text.y=o.y+o.height/2,o.text.horizontalPos="middle"):(o.text.y=o.y+this.config.quadrantTextTopPadding,o.text.horizontalPos="top");return s}getQuadrantPoints(t){let{quadrantSpace:e}=t,{quadrantHeight:r,quadrantLeft:n,quadrantTop:i,quadrantWidth:a}=e,s=hl().domain([0,1]).range([n,a+n]),o=hl().domain([0,1]).range([r+i,i]);return this.data.points.map(u=>{let h=this.classes.get(u.className);return h&&(u={...h,...u}),{x:s(u.x),y:o(u.y),fill:u.color??this.themeConfig.quadrantPointFill,radius:u.radius??this.config.pointRadius,text:{text:u.text,fill:this.themeConfig.quadrantPointTextFill,x:s(u.x),y:o(u.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:u.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:u.strokeWidth??"0px"}})}getBorders(t){let e=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:r}=t,{quadrantHalfHeight:n,quadrantHeight:i,quadrantLeft:a,quadrantHalfWidth:s,quadrantTop:o,quadrantWidth:l}=r;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:a-e,y1:o,x2:a+l+e,y2:o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:a+l,y1:o+e,x2:a+l,y2:o+i-e},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:a-e,y1:o+i,x2:a+l+e,y2:o+i},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:a,y1:o+e,x2:a,y2:o+i-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:a+s,y1:o+e,x2:a+s,y2:o+i-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:a+e,y1:o+n,x2:a+l-e,y2:o+n}]}getTitle(t){if(t)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let t=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),e=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),r=this.config.showTitle&&!!this.data.titleText,n=this.data.points.length>0?"bottom":this.config.xAxisPosition,i=this.calculateSpace(n,t,e,r);return{points:this.getQuadrantPoints(i),quadrants:this.getQuadrants(i),axisLabels:this.getAxisLabels(n,t,e,i),borderLines:this.getBorders(i),title:this.getTitle(r)}}},UT=class extends Error{static{v(this,"InvalidStyleError")}constructor(t,e,r){super(`value for ${t} ${e} is invalid, please use a valid ${r}`),this.name="InvalidStyleError"}};v(eM,"validateHexCode");v(wce,"validateNumber");v(kce,"validateSizeInPixels");CPe=pe();v(Fc,"textSanitizer");ma=new SPe;v(Tce,"setQuadrant1Text");v(Ece,"setQuadrant2Text");v(Sce,"setQuadrant3Text");v(Cce,"setQuadrant4Text");v(Ace,"setXAxisLeftText");v(_ce,"setXAxisRightText");v(Lce,"setYAxisTopText");v(Rce,"setYAxisBottomText");v(VT,"parseStyles");v(Nce,"addPoint");v(Ice,"addClass");v(Mce,"setWidth");v(Dce,"setHeight");v(Oce,"getQuadrantData");APe=v(function(){ma.clear(),xr()},"clear"),_Pe={setWidth:Mce,setHeight:Dce,setQuadrant1Text:Tce,setQuadrant2Text:Ece,setQuadrant3Text:Sce,setQuadrant4Text:Cce,setXAxisLeftText:Ace,setXAxisRightText:_ce,setYAxisTopText:Lce,setYAxisBottomText:Rce,parseStyles:VT,addPoint:Nce,addClass:Ice,getQuadrantData:Oce,clear:APe,setAccTitle:Tr,getAccTitle:_r,setDiagramTitle:tn,getDiagramTitle:qr,getAccDescription:Rr,setAccDescription:Lr},LPe=v((t,e,r,n)=>{function i(S){return S==="top"?"hanging":"middle"}v(i,"getDominantBaseLine");function a(S){return S==="left"?"start":"middle"}v(a,"getTextAnchor");function s(S){return`translate(${S.x}, ${S.y}) rotate(${S.rotation||0})`}v(s,"getTransformation");let o=pe();re.debug(`Rendering quadrant chart `+t);let l=o.securityLevel,u;l==="sandbox"&&(u=Ve("#i"+e));let f=(l==="sandbox"?Ve(u.nodes()[0].contentDocument.body):Ve("body")).select(`[id="${e}"]`),d=f.append("g").attr("class","main"),p=o.quadrantChart?.chartWidth??500,g=o.quadrantChart?.chartHeight??500;Hr(f,g,p,o.quadrantChart?.useMaxWidth??!0),f.attr("viewBox","0 0 "+p+" "+g),n.db.setHeight(g),n.db.setWidth(p);let m=n.db.getQuadrantData(),y=d.append("g").attr("class","quadrants"),x=d.append("g").attr("class","border"),b=d.append("g").attr("class","data-points"),w=d.append("g").attr("class","labels"),_=d.append("g").attr("class","title");m.title&&_.append("text").attr("x",0).attr("y",0).attr("fill",m.title.fill).attr("font-size",m.title.fontSize).attr("dominant-baseline",i(m.title.horizontalPos)).attr("text-anchor",a(m.title.verticalPos)).attr("transform",s(m.title)).text(m.title.text),m.borderLines&&x.selectAll("line").data(m.borderLines).enter().append("line").attr("x1",S=>S.x1).attr("y1",S=>S.y1).attr("x2",S=>S.x2).attr("y2",S=>S.y2).style("stroke",S=>S.strokeFill).style("stroke-width",S=>S.strokeWidth);let k=y.selectAll("g.quadrant").data(m.quadrants).enter().append("g").attr("class","quadrant");k.append("rect").attr("x",S=>S.x).attr("y",S=>S.y).attr("width",S=>S.width).attr("height",S=>S.height).attr("fill",S=>S.fill),k.append("text").attr("x",0).attr("y",0).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text)).text(S=>S.text.text),w.selectAll("g.label").data(m.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(S=>S.text).attr("fill",S=>S.fill).attr("font-size",S=>S.fontSize).attr("dominant-baseline",S=>i(S.horizontalPos)).attr("text-anchor",S=>a(S.verticalPos)).attr("transform",S=>s(S));let L=b.selectAll("g.data-point").data(m.points).enter().append("g").attr("class","data-point");L.append("circle").attr("cx",S=>S.x).attr("cy",S=>S.y).attr("r",S=>S.radius).attr("fill",S=>S.fill).attr("stroke",S=>S.strokeColor).attr("stroke-width",S=>S.strokeWidth),L.append("text").attr("x",0).attr("y",0).text(S=>S.text.text).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text))},"draw"),RPe={draw:LPe},NPe={parser:EPe,db:_Pe,renderer:RPe,styles:v(()=>"","styles")}});var nue={};vr(nue,{diagram:()=>HPe});function rM(t){return t.type==="bar"}function aM(t){return t.type==="band"}function Sm(t){return t.type==="linear"}function nM(t,e,r,n){let i=new $ce(n);return aM(t)?new MPe(e,r,t.categories,t.title,i):new DPe(e,r,[t.min,t.max],t.title,i)}function Uce(t,e,r,n){let i=new $ce(n);return new OPe(i,t,e,r)}function Vce(t,e,r){return new FPe(t,e,r)}function oM(){let t=z1(),e=Or();return ws(t.xyChart,e.themeVariables.xyChart)}function lM(){let t=Or();return ws(sr.xyChart,t.xyChart)}function cM(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function HT(t){let e=Or();return yr(t.trim(),e)}function Hce(t){Wce=t}function qce(t){t==="horizontal"?K2.chartOrientation="horizontal":K2.chartOrientation="vertical"}function Yce(t){an.xAxis.title=HT(t.text)}function uM(t,e){an.xAxis={type:"linear",title:an.xAxis.title,min:t,max:e},WT=!0}function Xce(t){an.xAxis={type:"band",title:an.xAxis.title,categories:t.map(e=>HT(e.text))},WT=!0}function jce(t){an.yAxis.title=HT(t.text)}function Kce(t,e){an.yAxis={type:"linear",title:an.yAxis.title,min:t,max:e},sM=!0}function Zce(t){let e=Math.min(...t),r=Math.max(...t),n=Sm(an.yAxis)?an.yAxis.min:1/0,i=Sm(an.yAxis)?an.yAxis.max:-1/0;an.yAxis={type:"linear",title:an.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function hM(t){let e=[];if(t.length===0)return e;if(!WT){let r=Sm(an.xAxis)?an.xAxis.min:1/0,n=Sm(an.xAxis)?an.xAxis.max:-1/0;uM(Math.min(r,1),Math.max(n,t.length))}if(sM||Zce(t),aM(an.xAxis)&&(e=an.xAxis.categories.map((r,n)=>[r,t[n]])),Sm(an.xAxis)){let r=an.xAxis.min,n=an.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,o)=>[s,t[o]])}return e}function fM(t){return iM[t===0?0:t%iM.length]}function Qce(t,e){let r=hM(e);an.plots.push({type:"line",strokeFill:fM(j2),strokeWidth:2,data:r}),j2++}function Jce(t,e){let r=hM(e);an.plots.push({type:"bar",fill:fM(j2),data:r}),j2++}function eue(){if(an.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return an.title=qr(),$Pe.build(K2,an,Z2,Wce)}function tue(){return Z2}function rue(){return K2}var tM,IPe,$ce,Fce,zce,Gce,MPe,DPe,OPe,PPe,BPe,FPe,zPe,$Pe,j2,Wce,K2,Z2,an,iM,WT,sM,GPe,UPe,VPe,WPe,HPe,iue=F(()=>{Ya();kn();Iu();or();lr();lr();lr();tM=function(){var t=v(function(D,N,O,B){for(O=O||{},B=D.length;B--;O[D[B]]=N);return O},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],o=[1,5,10,12,14,16,18,19,21,23,34,35,36],l=[1,25],u=[1,26],h=[1,28],f=[1,29],d=[1,30],p=[1,31],g=[1,32],m=[1,33],y=[1,34],x=[1,35],b=[1,36],w=[1,37],_=[1,43],k=[1,42],E=[1,47],L=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],C=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],M=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],R=[1,64],T={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:v(function(N,O,B,P,$,z,H){var J=z.length-1;switch($){case 5:P.setOrientation(z[J]);break;case 9:P.setDiagramTitle(z[J].text.trim());break;case 12:P.setLineData({text:"",type:"text"},z[J]);break;case 13:P.setLineData(z[J-1],z[J]);break;case 14:P.setBarData({text:"",type:"text"},z[J]);break;case 15:P.setBarData(z[J-1],z[J]);break;case 16:this.$=z[J].trim(),P.setAccTitle(this.$);break;case 17:case 18:this.$=z[J].trim(),P.setAccDescription(this.$);break;case 19:this.$=z[J-1];break;case 20:this.$=[Number(z[J-2]),...z[J]];break;case 21:this.$=[Number(z[J])];break;case 22:P.setXAxisTitle(z[J]);break;case 23:P.setXAxisTitle(z[J-1]);break;case 24:P.setXAxisTitle({type:"text",text:""});break;case 25:P.setXAxisBand(z[J]);break;case 26:P.setXAxisRangeData(Number(z[J-2]),Number(z[J]));break;case 27:this.$=z[J-1];break;case 28:this.$=[z[J-2],...z[J]];break;case 29:this.$=[z[J]];break;case 30:P.setYAxisTitle(z[J]);break;case 31:P.setYAxisTitle(z[J-1]);break;case 32:P.setYAxisTitle({type:"text",text:""});break;case 33:P.setYAxisRangeData(Number(z[J-2]),Number(z[J]));break;case 37:this.$={text:z[J],type:"text"};break;case 38:this.$={text:z[J],type:"text"};break;case 39:this.$={text:z[J],type:"markdown"};break;case 40:this.$=z[J];break;case 41:this.$=z[J-1]+""+z[J];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(o,[2,34]),t(o,[2,35]),t(o,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(o,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},{11:39,13:38,24:_,27:k,29:40,30:41,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},{11:45,15:44,27:E,33:46,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},{11:49,17:48,24:L,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},{11:52,17:51,24:L,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},{20:[1,53]},{22:[1,54]},t(S,[2,18]),{1:[2,2]},t(S,[2,8]),t(S,[2,9]),t(C,[2,37],{40:55,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w}),t(C,[2,38]),t(C,[2,39]),t(M,[2,40]),t(M,[2,42]),t(M,[2,43]),t(M,[2,44]),t(M,[2,45]),t(M,[2,46]),t(M,[2,47]),t(M,[2,48]),t(M,[2,49]),t(M,[2,50]),t(M,[2,51]),t(S,[2,10]),t(S,[2,22],{30:41,29:56,24:_,27:k}),t(S,[2,24]),t(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},t(S,[2,11]),t(S,[2,30],{33:60,27:E}),t(S,[2,32]),{31:[1,61]},t(S,[2,12]),{17:62,24:L},{25:63,27:R},t(S,[2,14]),{17:65,24:L},t(S,[2,16]),t(S,[2,17]),t(M,[2,41]),t(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(S,[2,31]),{27:[1,69]},t(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(S,[2,15]),t(S,[2,26]),t(S,[2,27]),{11:59,32:72,37:24,38:l,39:u,40:27,41:h,42:f,43:d,44:p,45:g,46:m,47:y,48:x,49:b,50:w},t(S,[2,33]),t(S,[2,19]),{25:73,27:R},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:v(function(N,O){if(O.recoverable)this.trace(N);else{var B=new Error(N);throw B.hash=O,B}},"parseError"),parse:v(function(N){var O=this,B=[0],P=[],$=[null],z=[],H=this.table,J="",X=0,oe=0,K=0,ee=2,Q=1,W=z.slice.call(arguments,1),Y=Object.create(this.lexer),Z={yy:{}};for(var se in this.yy)Object.prototype.hasOwnProperty.call(this.yy,se)&&(Z.yy[se]=this.yy[se]);Y.setInput(N,Z.yy),Z.yy.lexer=Y,Z.yy.parser=this,typeof Y.yylloc>"u"&&(Y.yylloc={});var ce=Y.yylloc;z.push(ce);var ue=Y.options&&Y.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function te(ie){B.length=B.length-2*ie,$.length=$.length-ie,z.length=z.length-ie}v(te,"popStack");function Ne(){var ie;return ie=P.pop()||Y.lex()||Q,typeof ie!="number"&&(ie instanceof Array&&(P=ie,ie=P.pop()),ie=O.symbols_[ie]||ie),ie}v(Ne,"lex");for(var ae,we,Ie,Ee,Oe,De,We={},Re,Pe,xe,q;;){if(Ie=B[B.length-1],this.defaultActions[Ie]?Ee=this.defaultActions[Ie]:((ae===null||typeof ae>"u")&&(ae=Ne()),Ee=H[Ie]&&H[Ie][ae]),typeof Ee>"u"||!Ee.length||!Ee[0]){var de="";q=[];for(Re in H[Ie])this.terminals_[Re]&&Re>ee&&q.push("'"+this.terminals_[Re]+"'");Y.showPosition?de="Parse error on line "+(X+1)+`: `+Y.showPosition()+` Expecting `+q.join(", ")+", got '"+(this.terminals_[ae]||ae)+"'":de="Parse error on line "+(X+1)+": Unexpected "+(ae==Q?"end of input":"'"+(this.terminals_[ae]||ae)+"'"),this.parseError(de,{text:Y.match,token:this.terminals_[ae]||ae,line:Y.yylineno,loc:ce,expected:q})}if(Ee[0]instanceof Array&&Ee.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ie+", token: "+ae);switch(Ee[0]){case 1:B.push(ae),$.push(Y.yytext),z.push(Y.yylloc),B.push(Ee[1]),ae=null,we?(ae=we,we=null):(oe=Y.yyleng,J=Y.yytext,X=Y.yylineno,ce=Y.yylloc,K>0&&K--);break;case 2:if(Pe=this.productions_[Ee[1]][1],We.$=$[$.length-Pe],We._$={first_line:z[z.length-(Pe||1)].first_line,last_line:z[z.length-1].last_line,first_column:z[z.length-(Pe||1)].first_column,last_column:z[z.length-1].last_column},ue&&(We._$.range=[z[z.length-(Pe||1)].range[0],z[z.length-1].range[1]]),De=this.performAction.apply(We,[J,oe,X,Z.yy,Ee[1],$,z].concat(W)),typeof De<"u")return De;Pe&&(B=B.slice(0,-1*Pe*2),$=$.slice(0,-1*Pe),z=z.slice(0,-1*Pe)),B.push(this.productions_[Ee[1]][0]),$.push(We.$),z.push(We._$),xe=H[B[B.length-2]][B[B.length-1]],B.push(xe);break;case 3:return!0}}return!0},"parse")},I=function(){var D={EOF:1,parseError:v(function(O,B){if(this.yy.parser)this.yy.parser.parseError(O,B);else throw new Error(O)},"parseError"),setInput:v(function(N,O){return this.yy=O||this.yy||{},this._input=N,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var N=this._input[0];this.yytext+=N,this.yyleng++,this.offset++,this.match+=N,this.matched+=N;var O=N.match(/(?:\r\n?|\n).*/g);return O?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),N},"input"),unput:v(function(N){var O=N.length,B=N.split(/(?:\r\n?|\n)/g);this._input=N+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-O),this.offset-=O;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),B.length-1&&(this.yylineno-=B.length-1);var $=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:B?(B.length===P.length?this.yylloc.first_column:0)+P[P.length-B.length].length-B[0].length:this.yylloc.first_column-O},this.options.ranges&&(this.yylloc.range=[$[0],$[0]+this.yyleng-O]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(N){this.unput(this.match.slice(N))},"less"),pastInput:v(function(){var N=this.matched.substr(0,this.matched.length-this.match.length);return(N.length>20?"...":"")+N.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var N=this.match;return N.length<20&&(N+=this._input.substr(0,20-N.length)),(N.substr(0,20)+(N.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var N=this.pastInput(),O=new Array(N.length+1).join("-");return N+this.upcomingInput()+` `+O+"^"},"showPosition"),test_match:v(function(N,O){var B,P,$;if(this.options.backtrack_lexer&&($={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&($.yylloc.range=this.yylloc.range.slice(0))),P=N[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+N[0].length},this.yytext+=N[0],this.match+=N[0],this.matches=N,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(N[0].length),this.matched+=N[0],B=this.performAction.call(this,this.yy,this,O,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),B)return B;if(this._backtrack){for(var z in $)this[z]=$[z];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var N,O,B,P;this._more||(this.yytext="",this.match="");for(var $=this._currentRules(),z=0;z<$.length;z++)if(B=this._input.match(this.rules[$[z]]),B&&(!O||B[0].length>O[0].length)){if(O=B,P=z,this.options.backtrack_lexer){if(N=this.test_match(B,$[z]),N!==!1)return N;if(this._backtrack){O=!1;continue}else return!1}else if(!this.options.flex)break}return O?(N=this.test_match(O,$[P]),N!==!1?N:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var O=this.next();return O||this.lex()},"lex"),begin:v(function(O){this.conditionStack.push(O)},"begin"),popState:v(function(){var O=this.conditionStack.length-1;return O>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(O){return O=this.conditionStack.length-1-Math.abs(O||0),O>=0?this.conditionStack[O]:"INITIAL"},"topState"),pushState:v(function(O){this.begin(O)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(O,B,P,$){var z=$;switch(P){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";break;case 17:return this.pushState("axis_data"),"Y_AXIS";break;case 18:return this.pushState("axis_band_data"),24;break;case 19:return 31;case 20:return this.pushState("data"),16;break;case 21:return this.pushState("data"),18;break;case 22:return this.pushState("data_inner"),24;break;case 23:return 27;case 24:return this.popState(),26;break;case 25:this.popState();break;case 26:this.pushState("string");break;case 27:this.popState();break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 43:break;case 44:return 35;case 45:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}};return D}();T.lexer=I;function A(){this.yy={}}return v(A,"Parser"),A.prototype=T,T.Parser=A,new A}();tM.parser=tM;IPe=tM;v(rM,"isBarPlot");v(aM,"isBandAxisData");v(Sm,"isLinearAxisData");$ce=class{constructor(t){this.parentGroup=t}static{v(this,"TextDimensionCalculatorWithFont")}getMaxDimension(t,e){if(!this.parentGroup)return{width:t.reduce((i,a)=>Math.max(a.length,i),0)*e,height:e};let r={width:0,height:0},n=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",e);for(let i of t){let a=kA(n,1,i),s=a?a.width:i.length*e,o=a?a.height:e;r.width=Math.max(r.width,s),r.height=Math.max(r.height,o)}return n.remove(),r}},Fce=.7,zce=.2,Gce=class{constructor(t,e,r,n){this.axisConfig=t,this.title=e,this.textDimensionCalculator=r,this.axisThemeConfig=n,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{v(this,"BaseAxis")}setRange(t){this.range=t,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=t[1]-t[0]:this.boundingRect.width=t[1]-t[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(t){this.axisPosition=t,this.setRange(this.range)}getTickDistance(){let t=this.getRange();return Math.abs(t[0]-t[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(t=>t.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){Fce*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(Fce*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(t){let e=t.height;if(this.axisConfig.showAxisLine&&e>this.axisConfig.axisLineWidth&&(e-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let r=this.getLabelDimension(),n=zce*t.width;this.outerPadding=Math.min(r.width/2,n);let i=r.height+this.axisConfig.labelPadding*2;this.labelTextHeight=r.height,i<=e&&(e-=i,this.showLabel=!0)}if(this.axisConfig.showTick&&e>=this.axisConfig.tickLength&&(this.showTick=!0,e-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let r=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),n=r.height+this.axisConfig.titlePadding*2;this.titleTextHeight=r.height,n<=e&&(e-=n,this.showTitle=!0)}this.boundingRect.width=t.width,this.boundingRect.height=t.height-e}calculateSpaceIfDrawnVertical(t){let e=t.width;if(this.axisConfig.showAxisLine&&e>this.axisConfig.axisLineWidth&&(e-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let r=this.getLabelDimension(),n=zce*t.height;this.outerPadding=Math.min(r.height/2,n);let i=r.width+this.axisConfig.labelPadding*2;i<=e&&(e-=i,this.showLabel=!0)}if(this.axisConfig.showTick&&e>=this.axisConfig.tickLength&&(this.showTick=!0,e-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let r=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),n=r.height+this.axisConfig.titlePadding*2;this.titleTextHeight=r.height,n<=e&&(e-=n,this.showTitle=!0)}this.boundingRect.width=t.width-e,this.boundingRect.height=t.height}calculateSpace(t){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(t):this.calculateSpaceIfDrawnHorizontally(t),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}getDrawableElementsForLeftAxis(){let t=[];if(this.showAxisLine){let e=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${e},${this.boundingRect.y} L ${e},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(e=>({text:e.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(e),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let e=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(r=>({path:`M ${e},${this.getScaleValue(r)} L ${e-this.axisConfig.tickLength},${this.getScaleValue(r)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForBottomAxis(){let t=[];if(this.showAxisLine){let e=this.boundingRect.y+this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${e} L ${this.boundingRect.x+this.boundingRect.width},${e}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(e=>({text:e.toString(),x:this.getScaleValue(e),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let e=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(r=>({path:`M ${this.getScaleValue(r)},${e} L ${this.getScaleValue(r)},${e+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForTopAxis(){let t=[];if(this.showAxisLine){let e=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${e} L ${this.boundingRect.x+this.boundingRect.width},${e}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(e=>({text:e.toString(),x:this.getScaleValue(e),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let e=this.boundingRect.y;t.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(r=>({path:`M ${this.getScaleValue(r)},${e+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(r)},${e+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}},MPe=class extends Gce{static{v(this,"BandAxis")}constructor(t,e,r,n,i){super(t,n,i,e),this.categories=r,this.scale=Tp().domain(this.categories).range(this.getRange())}setRange(t){super.setRange(t)}recalculateScale(){this.scale=Tp().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),re.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(t){return this.scale(t)??this.getRange()[0]}},DPe=class extends Gce{static{v(this,"LinearAxis")}constructor(t,e,r,n,i){super(t,n,i,e),this.domain=r,this.scale=hl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let t=[...this.domain];this.axisPosition==="left"&&t.reverse(),this.scale=hl().domain(t).range(this.getRange())}getScaleValue(t){return this.scale(t)}};v(nM,"getAxis");OPe=class{constructor(t,e,r,n){this.textDimensionCalculator=t,this.chartConfig=e,this.chartData=r,this.chartThemeConfig=n,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{v(this,"ChartTitle")}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){let e=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),r=Math.max(e.width,t.width),n=e.height+2*this.chartConfig.titlePadding;return e.width<=r&&e.height<=n&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=r,this.boundingRect.height=n,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let t=[];return this.showChartTitle&&t.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),t}};v(Uce,"getChartTitleComponent");PPe=class{constructor(t,e,r,n,i){this.plotData=t,this.xAxis=e,this.yAxis=r,this.orientation=n,this.plotIndex=i}static{v(this,"LinePlot")}getDrawableElement(){let t=this.plotData.data.map(r=>[this.xAxis.getScaleValue(r[0]),this.yAxis.getScaleValue(r[1])]),e;return this.orientation==="horizontal"?e=ms().y(r=>r[0]).x(r=>r[1])(t):e=ms().x(r=>r[0]).y(r=>r[1])(t),e?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:e,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}},BPe=class{constructor(t,e,r,n,i,a){this.barData=t,this.boundingRect=e,this.xAxis=r,this.yAxis=n,this.orientation=i,this.plotIndex=a}static{v(this,"BarPlot")}getDrawableElement(){let t=this.barData.data.map(i=>[this.xAxis.getScaleValue(i[0]),this.yAxis.getScaleValue(i[1])]),r=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),n=r/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(i=>({x:this.boundingRect.x,y:i[0]-n,height:r,width:i[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(i=>({x:i[0]-n,y:i[1],width:r,height:this.boundingRect.y+this.boundingRect.height-i[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}},FPe=class{constructor(t,e,r){this.chartConfig=t,this.chartData=e,this.chartThemeConfig=r,this.boundingRect={x:0,y:0,width:0,height:0}}static{v(this,"BasePlot")}setAxes(t,e){this.xAxis=t,this.yAxis=e}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){return this.boundingRect.width=t.width,this.boundingRect.height=t.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let t=[];for(let[e,r]of this.chartData.plots.entries())switch(r.type){case"line":{let n=new PPe(r,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,e);t.push(...n.getDrawableElement())}break;case"bar":{let n=new BPe(r,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,e);t.push(...n.getDrawableElement())}break}return t}};v(Vce,"getPlotComponent");zPe=class{constructor(t,e,r,n){this.chartConfig=t,this.chartData=e,this.componentStore={title:Uce(t,e,r,n),plot:Vce(t,e,r),xAxis:nM(e.xAxis,t.xAxis,{titleColor:r.xAxisTitleColor,labelColor:r.xAxisLabelColor,tickColor:r.xAxisTickColor,axisLineColor:r.xAxisLineColor},n),yAxis:nM(e.yAxis,t.yAxis,{titleColor:r.yAxisTitleColor,labelColor:r.yAxisLabelColor,tickColor:r.yAxisTickColor,axisLineColor:r.yAxisLineColor},n)}}static{v(this,"Orchestrator")}calculateVerticalSpace(){let t=this.chartConfig.width,e=this.chartConfig.height,r=0,n=0,i=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=this.componentStore.plot.calculateSpace({width:i,height:a});t-=s.width,e-=s.height,s=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:e}),n=s.height,e-=s.height,this.componentStore.xAxis.setAxisPosition("bottom"),s=this.componentStore.xAxis.calculateSpace({width:t,height:e}),e-=s.height,this.componentStore.yAxis.setAxisPosition("left"),s=this.componentStore.yAxis.calculateSpace({width:t,height:e}),r=s.width,t-=s.width,t>0&&(i+=t,t=0),e>0&&(a+=e,e=0),this.componentStore.plot.calculateSpace({width:i,height:a}),this.componentStore.plot.setBoundingBoxXY({x:r,y:n}),this.componentStore.xAxis.setRange([r,r+i]),this.componentStore.xAxis.setBoundingBoxXY({x:r,y:n+a}),this.componentStore.yAxis.setRange([n,n+a]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:n}),this.chartData.plots.some(o=>rM(o))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let t=this.chartConfig.width,e=this.chartConfig.height,r=0,n=0,i=0,a=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),o=this.componentStore.plot.calculateSpace({width:a,height:s});t-=o.width,e-=o.height,o=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:e}),r=o.height,e-=o.height,this.componentStore.xAxis.setAxisPosition("left"),o=this.componentStore.xAxis.calculateSpace({width:t,height:e}),t-=o.width,n=o.width,this.componentStore.yAxis.setAxisPosition("top"),o=this.componentStore.yAxis.calculateSpace({width:t,height:e}),e-=o.height,i=r+o.height,t>0&&(a+=t,t=0),e>0&&(s+=e,e=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.yAxis.setRange([n,n+a]),this.componentStore.yAxis.setBoundingBoxXY({x:n,y:r}),this.componentStore.xAxis.setRange([i,i+s]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(l=>rM(l))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let t=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let e of Object.values(this.componentStore))t.push(...e.getDrawableElements());return t}},$Pe=class{static{v(this,"XYChartBuilder")}static build(t,e,r,n){return new zPe(t,e,r,n).getDrawableElement()}},j2=0,K2=lM(),Z2=oM(),an=cM(),iM=Z2.plotColorPalette.split(",").map(t=>t.trim()),WT=!1,sM=!1;v(oM,"getChartDefaultThemeConfig");v(lM,"getChartDefaultConfig");v(cM,"getChartDefaultData");v(HT,"textSanitizer");v(Hce,"setTmpSVGG");v(qce,"setOrientation");v(Yce,"setXAxisTitle");v(uM,"setXAxisRangeData");v(Xce,"setXAxisBand");v(jce,"setYAxisTitle");v(Kce,"setYAxisRangeData");v(Zce,"setYAxisRangeFromPlotData");v(hM,"transformDataWithoutCategory");v(fM,"getPlotColorFromPalette");v(Qce,"setLineData");v(Jce,"setBarData");v(eue,"getDrawableElem");v(tue,"getChartThemeConfig");v(rue,"getChartConfig");GPe=v(function(){xr(),j2=0,K2=lM(),an=cM(),Z2=oM(),iM=Z2.plotColorPalette.split(",").map(t=>t.trim()),WT=!1,sM=!1},"clear"),UPe={getDrawableElem:eue,clear:GPe,setAccTitle:Tr,getAccTitle:_r,setDiagramTitle:tn,getDiagramTitle:qr,getAccDescription:Rr,setAccDescription:Lr,setOrientation:qce,setXAxisTitle:Yce,setXAxisRangeData:uM,setXAxisBand:Xce,setYAxisTitle:jce,setYAxisRangeData:Kce,setLineData:Qce,setBarData:Jce,setTmpSVGG:Hce,getChartThemeConfig:tue,getChartConfig:rue},VPe=v((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig();function o(y){return y==="top"?"text-before-edge":"middle"}v(o,"getDominantBaseLine");function l(y){return y==="left"?"start":y==="right"?"end":"middle"}v(l,"getTextAnchor");function u(y){return`translate(${y.x}, ${y.y}) rotate(${y.rotation||0})`}v(u,"getTextTransformation"),re.debug(`Rendering xychart chart `+t);let h=La(e),f=h.append("g").attr("class","main"),d=f.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");Hr(h,s.height,s.width,!0),h.attr("viewBox",`0 0 ${s.width} ${s.height}`),d.attr("fill",a.backgroundColor),i.setTmpSVGG(h.append("g").attr("class","mermaid-tmp-group"));let p=i.getDrawableElem(),g={};function m(y){let x=f,b="";for(let[w]of y.entries()){let _=f;w>0&&g[b]&&(_=g[b]),b+=y[w],x=g[b],x||(x=g[b]=_.append("g").attr("class",y[w]))}return x}v(m,"getGroup");for(let y of p){if(y.data.length===0)continue;let x=m(y.groupTexts);switch(y.type){case"rect":x.selectAll("rect").data(y.data).enter().append("rect").attr("x",b=>b.x).attr("y",b=>b.y).attr("width",b=>b.width).attr("height",b=>b.height).attr("fill",b=>b.fill).attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break;case"text":x.selectAll("text").data(y.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",b=>b.fill).attr("font-size",b=>b.fontSize).attr("dominant-baseline",b=>o(b.verticalPos)).attr("text-anchor",b=>l(b.horizontalPos)).attr("transform",b=>u(b)).text(b=>b.text);break;case"path":x.selectAll("path").data(y.data).enter().append("path").attr("d",b=>b.path).attr("fill",b=>b.fill?b.fill:"none").attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break}}},"draw"),WPe={draw:VPe},HPe={parser:IPe,db:UPe,renderer:WPe}});var uue={};vr(uue,{diagram:()=>kBe});var dM,qPe,gM,Os,Q2,uf,J2,YPe,XPe,jPe,KPe,ZPe,QPe,JPe,eBe,tBe,rBe,nBe,iBe,aBe,sBe,oBe,lBe,cBe,uBe,hBe,fBe,pM,dBe,sue,ri,aue,oue,lue,cue,pBe,gBe,mBe,vBe,yBe,xBe,Cm,bBe,wBe,kBe,hue=F(()=>{or();lr();uy();As();dM=function(){var t=v(function(oe,K,ee,Q){for(ee=ee||{},Q=oe.length;Q--;ee[oe[Q]]=K);return ee},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,31,32,33,34,35,36,44,62,63],s=[1,18],o=[2,7],l=[1,22],u=[1,23],h=[1,24],f=[1,25],d=[1,26],p=[1,27],g=[1,20],m=[1,28],y=[1,29],x=[62,63],b=[5,8,9,11,13,31,32,33,34,35,36,44,51,53,62,63],w=[1,47],_=[1,48],k=[1,49],E=[1,50],L=[1,51],S=[1,52],C=[1,53],M=[53,54],R=[1,64],T=[1,60],I=[1,61],A=[1,62],D=[1,63],N=[1,65],O=[1,69],B=[1,70],P=[1,67],$=[1,68],z=[5,8,9,11,13,31,32,33,34,35,36,44,62,63],H={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,requirementType:17,requirementName:18,STRUCT_START:19,requirementBody:20,ID:21,COLONSEP:22,id:23,TEXT:24,text:25,RISK:26,riskLevel:27,VERIFYMTHD:28,verifyType:29,STRUCT_STOP:30,REQUIREMENT:31,FUNCTIONAL_REQUIREMENT:32,INTERFACE_REQUIREMENT:33,PERFORMANCE_REQUIREMENT:34,PHYSICAL_REQUIREMENT:35,DESIGN_CONSTRAINT:36,LOW_RISK:37,MED_RISK:38,HIGH_RISK:39,VERIFY_ANALYSIS:40,VERIFY_DEMONSTRATION:41,VERIFY_INSPECTION:42,VERIFY_TEST:43,ELEMENT:44,elementName:45,elementBody:46,TYPE:47,type:48,DOCREF:49,ref:50,END_ARROW_L:51,relationship:52,LINE:53,END_ARROW_R:54,CONTAINS:55,COPIES:56,DERIVES:57,SATISFIES:58,VERIFIES:59,REFINES:60,TRACES:61,unqString:62,qString:63,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",19:"STRUCT_START",21:"ID",22:"COLONSEP",24:"TEXT",26:"RISK",28:"VERIFYMTHD",30:"STRUCT_STOP",31:"REQUIREMENT",32:"FUNCTIONAL_REQUIREMENT",33:"INTERFACE_REQUIREMENT",34:"PERFORMANCE_REQUIREMENT",35:"PHYSICAL_REQUIREMENT",36:"DESIGN_CONSTRAINT",37:"LOW_RISK",38:"MED_RISK",39:"HIGH_RISK",40:"VERIFY_ANALYSIS",41:"VERIFY_DEMONSTRATION",42:"VERIFY_INSPECTION",43:"VERIFY_TEST",44:"ELEMENT",47:"TYPE",49:"DOCREF",51:"END_ARROW_L",53:"LINE",54:"END_ARROW_R",55:"CONTAINS",56:"COPIES",57:"DERIVES",58:"SATISFIES",59:"VERIFIES",60:"REFINES",61:"TRACES",62:"unqString",63:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[14,5],[20,5],[20,5],[20,5],[20,5],[20,2],[20,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[27,1],[27,1],[27,1],[29,1],[29,1],[29,1],[29,1],[15,5],[46,5],[46,5],[46,2],[46,1],[16,5],[16,5],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[18,1],[18,1],[23,1],[23,1],[25,1],[25,1],[45,1],[45,1],[48,1],[48,1],[50,1],[50,1]],performAction:v(function(K,ee,Q,W,Y,Z,se){var ce=Z.length-1;switch(Y){case 4:this.$=Z[ce].trim(),W.setAccTitle(this.$);break;case 5:case 6:this.$=Z[ce].trim(),W.setAccDescription(this.$);break;case 7:this.$=[];break;case 13:W.addRequirement(Z[ce-3],Z[ce-4]);break;case 14:W.setNewReqId(Z[ce-2]);break;case 15:W.setNewReqText(Z[ce-2]);break;case 16:W.setNewReqRisk(Z[ce-2]);break;case 17:W.setNewReqVerifyMethod(Z[ce-2]);break;case 20:this.$=W.RequirementType.REQUIREMENT;break;case 21:this.$=W.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 22:this.$=W.RequirementType.INTERFACE_REQUIREMENT;break;case 23:this.$=W.RequirementType.PERFORMANCE_REQUIREMENT;break;case 24:this.$=W.RequirementType.PHYSICAL_REQUIREMENT;break;case 25:this.$=W.RequirementType.DESIGN_CONSTRAINT;break;case 26:this.$=W.RiskLevel.LOW_RISK;break;case 27:this.$=W.RiskLevel.MED_RISK;break;case 28:this.$=W.RiskLevel.HIGH_RISK;break;case 29:this.$=W.VerifyType.VERIFY_ANALYSIS;break;case 30:this.$=W.VerifyType.VERIFY_DEMONSTRATION;break;case 31:this.$=W.VerifyType.VERIFY_INSPECTION;break;case 32:this.$=W.VerifyType.VERIFY_TEST;break;case 33:W.addElement(Z[ce-3]);break;case 34:W.setNewElementType(Z[ce-2]);break;case 35:W.setNewElementDocRef(Z[ce-2]);break;case 38:W.addRelationship(Z[ce-2],Z[ce],Z[ce-4]);break;case 39:W.addRelationship(Z[ce-2],Z[ce-4],Z[ce]);break;case 40:this.$=W.Relationships.CONTAINS;break;case 41:this.$=W.Relationships.COPIES;break;case 42:this.$=W.Relationships.DERIVES;break;case 43:this.$=W.Relationships.SATISFIES;break;case 44:this.$=W.Relationships.VERIFIES;break;case 45:this.$=W.Relationships.REFINES;break;case 46:this.$=W.Relationships.TRACES;break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,30]},{4:17,5:s,7:31,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},{4:17,5:s,7:32,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},{4:17,5:s,7:33,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},{4:17,5:s,7:34,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},{4:17,5:s,7:35,8:o,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:l,32:u,33:h,34:f,35:d,36:p,44:g,62:m,63:y},{18:36,62:[1,37],63:[1,38]},{45:39,62:[1,40],63:[1,41]},{51:[1,42],53:[1,43]},t(x,[2,20]),t(x,[2,21]),t(x,[2,22]),t(x,[2,23]),t(x,[2,24]),t(x,[2,25]),t(b,[2,49]),t(b,[2,50]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{19:[1,44]},{19:[2,47]},{19:[2,48]},{19:[1,45]},{19:[2,53]},{19:[2,54]},{52:46,55:w,56:_,57:k,58:E,59:L,60:S,61:C},{52:54,55:w,56:_,57:k,58:E,59:L,60:S,61:C},{5:[1,55]},{5:[1,56]},{53:[1,57]},t(M,[2,40]),t(M,[2,41]),t(M,[2,42]),t(M,[2,43]),t(M,[2,44]),t(M,[2,45]),t(M,[2,46]),{54:[1,58]},{5:R,20:59,21:T,24:I,26:A,28:D,30:N},{5:O,30:B,46:66,47:P,49:$},{23:71,62:m,63:y},{23:72,62:m,63:y},t(z,[2,13]),{22:[1,73]},{22:[1,74]},{22:[1,75]},{22:[1,76]},{5:R,20:77,21:T,24:I,26:A,28:D,30:N},t(z,[2,19]),t(z,[2,33]),{22:[1,78]},{22:[1,79]},{5:O,30:B,46:80,47:P,49:$},t(z,[2,37]),t(z,[2,38]),t(z,[2,39]),{23:81,62:m,63:y},{25:82,62:[1,83],63:[1,84]},{27:85,37:[1,86],38:[1,87],39:[1,88]},{29:89,40:[1,90],41:[1,91],42:[1,92],43:[1,93]},t(z,[2,18]),{48:94,62:[1,95],63:[1,96]},{50:97,62:[1,98],63:[1,99]},t(z,[2,36]),{5:[1,100]},{5:[1,101]},{5:[2,51]},{5:[2,52]},{5:[1,102]},{5:[2,26]},{5:[2,27]},{5:[2,28]},{5:[1,103]},{5:[2,29]},{5:[2,30]},{5:[2,31]},{5:[2,32]},{5:[1,104]},{5:[2,55]},{5:[2,56]},{5:[1,105]},{5:[2,57]},{5:[2,58]},{5:R,20:106,21:T,24:I,26:A,28:D,30:N},{5:R,20:107,21:T,24:I,26:A,28:D,30:N},{5:R,20:108,21:T,24:I,26:A,28:D,30:N},{5:R,20:109,21:T,24:I,26:A,28:D,30:N},{5:O,30:B,46:110,47:P,49:$},{5:O,30:B,46:111,47:P,49:$},t(z,[2,14]),t(z,[2,15]),t(z,[2,16]),t(z,[2,17]),t(z,[2,34]),t(z,[2,35])],defaultActions:{8:[2,2],12:[2,1],30:[2,3],31:[2,8],32:[2,9],33:[2,10],34:[2,11],35:[2,12],37:[2,47],38:[2,48],40:[2,53],41:[2,54],83:[2,51],84:[2,52],86:[2,26],87:[2,27],88:[2,28],90:[2,29],91:[2,30],92:[2,31],93:[2,32],95:[2,55],96:[2,56],98:[2,57],99:[2,58]},parseError:v(function(K,ee){if(ee.recoverable)this.trace(K);else{var Q=new Error(K);throw Q.hash=ee,Q}},"parseError"),parse:v(function(K){var ee=this,Q=[0],W=[],Y=[null],Z=[],se=this.table,ce="",ue=0,te=0,Ne=0,ae=2,we=1,Ie=Z.slice.call(arguments,1),Ee=Object.create(this.lexer),Oe={yy:{}};for(var De in this.yy)Object.prototype.hasOwnProperty.call(this.yy,De)&&(Oe.yy[De]=this.yy[De]);Ee.setInput(K,Oe.yy),Oe.yy.lexer=Ee,Oe.yy.parser=this,typeof Ee.yylloc>"u"&&(Ee.yylloc={});var We=Ee.yylloc;Z.push(We);var Re=Ee.options&&Ee.options.ranges;typeof Oe.yy.parseError=="function"?this.parseError=Oe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Pe($e){Q.length=Q.length-2*$e,Y.length=Y.length-$e,Z.length=Z.length-$e}v(Pe,"popStack");function xe(){var $e;return $e=W.pop()||Ee.lex()||we,typeof $e!="number"&&($e instanceof Array&&(W=$e,$e=W.pop()),$e=ee.symbols_[$e]||$e),$e}v(xe,"lex");for(var q,de,ie,he,U,ke,j={},ye,Ae,Ge,Fe;;){if(ie=Q[Q.length-1],this.defaultActions[ie]?he=this.defaultActions[ie]:((q===null||typeof q>"u")&&(q=xe()),he=se[ie]&&se[ie][q]),typeof he>"u"||!he.length||!he[0]){var ge="";Fe=[];for(ye in se[ie])this.terminals_[ye]&&ye>ae&&Fe.push("'"+this.terminals_[ye]+"'");Ee.showPosition?ge="Parse error on line "+(ue+1)+`: `+Ee.showPosition()+` Expecting `+Fe.join(", ")+", got '"+(this.terminals_[q]||q)+"'":ge="Parse error on line "+(ue+1)+": Unexpected "+(q==we?"end of input":"'"+(this.terminals_[q]||q)+"'"),this.parseError(ge,{text:Ee.match,token:this.terminals_[q]||q,line:Ee.yylineno,loc:We,expected:Fe})}if(he[0]instanceof Array&&he.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ie+", token: "+q);switch(he[0]){case 1:Q.push(q),Y.push(Ee.yytext),Z.push(Ee.yylloc),Q.push(he[1]),q=null,de?(q=de,de=null):(te=Ee.yyleng,ce=Ee.yytext,ue=Ee.yylineno,We=Ee.yylloc,Ne>0&&Ne--);break;case 2:if(Ae=this.productions_[he[1]][1],j.$=Y[Y.length-Ae],j._$={first_line:Z[Z.length-(Ae||1)].first_line,last_line:Z[Z.length-1].last_line,first_column:Z[Z.length-(Ae||1)].first_column,last_column:Z[Z.length-1].last_column},Re&&(j._$.range=[Z[Z.length-(Ae||1)].range[0],Z[Z.length-1].range[1]]),ke=this.performAction.apply(j,[ce,te,ue,Oe.yy,he[1],Y,Z].concat(Ie)),typeof ke<"u")return ke;Ae&&(Q=Q.slice(0,-1*Ae*2),Y=Y.slice(0,-1*Ae),Z=Z.slice(0,-1*Ae)),Q.push(this.productions_[he[1]][0]),Y.push(j.$),Z.push(j._$),Ge=se[Q[Q.length-2]][Q[Q.length-1]],Q.push(Ge);break;case 3:return!0}}return!0},"parse")},J=function(){var oe={EOF:1,parseError:v(function(ee,Q){if(this.yy.parser)this.yy.parser.parseError(ee,Q);else throw new Error(ee)},"parseError"),setInput:v(function(K,ee){return this.yy=ee||this.yy||{},this._input=K,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var K=this._input[0];this.yytext+=K,this.yyleng++,this.offset++,this.match+=K,this.matched+=K;var ee=K.match(/(?:\r\n?|\n).*/g);return ee?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),K},"input"),unput:v(function(K){var ee=K.length,Q=K.split(/(?:\r\n?|\n)/g);this._input=K+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ee),this.offset-=ee;var W=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Q.length-1&&(this.yylineno-=Q.length-1);var Y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Q?(Q.length===W.length?this.yylloc.first_column:0)+W[W.length-Q.length].length-Q[0].length:this.yylloc.first_column-ee},this.options.ranges&&(this.yylloc.range=[Y[0],Y[0]+this.yyleng-ee]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(K){this.unput(this.match.slice(K))},"less"),pastInput:v(function(){var K=this.matched.substr(0,this.matched.length-this.match.length);return(K.length>20?"...":"")+K.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var K=this.match;return K.length<20&&(K+=this._input.substr(0,20-K.length)),(K.substr(0,20)+(K.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var K=this.pastInput(),ee=new Array(K.length+1).join("-");return K+this.upcomingInput()+` `+ee+"^"},"showPosition"),test_match:v(function(K,ee){var Q,W,Y;if(this.options.backtrack_lexer&&(Y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Y.yylloc.range=this.yylloc.range.slice(0))),W=K[0].match(/(?:\r\n?|\n).*/g),W&&(this.yylineno+=W.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:W?W[W.length-1].length-W[W.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+K[0].length},this.yytext+=K[0],this.match+=K[0],this.matches=K,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(K[0].length),this.matched+=K[0],Q=this.performAction.call(this,this.yy,this,ee,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Q)return Q;if(this._backtrack){for(var Z in Y)this[Z]=Y[Z];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var K,ee,Q,W;this._more||(this.yytext="",this.match="");for(var Y=this._currentRules(),Z=0;Zee[0].length)){if(ee=Q,W=Z,this.options.backtrack_lexer){if(K=this.test_match(Q,Y[Z]),K!==!1)return K;if(this._backtrack){ee=!1;continue}else return!1}else if(!this.options.flex)break}return ee?(K=this.test_match(ee,Y[W]),K!==!1?K:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var ee=this.next();return ee||this.lex()},"lex"),begin:v(function(ee){this.conditionStack.push(ee)},"begin"),popState:v(function(){var ee=this.conditionStack.length-1;return ee>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(ee){return ee=this.conditionStack.length-1-Math.abs(ee||0),ee>=0?this.conditionStack[ee]:"INITIAL"},"topState"),pushState:v(function(ee){this.begin(ee)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(ee,Q,W,Y){var Z=Y;switch(W){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 5;case 9:break;case 10:break;case 11:break;case 12:return 8;case 13:return 6;case 14:return 19;case 15:return 30;case 16:return 22;case 17:return 21;case 18:return 24;case 19:return 26;case 20:return 28;case 21:return 31;case 22:return 32;case 23:return 33;case 24:return 34;case 25:return 35;case 26:return 36;case 27:return 37;case 28:return 38;case 29:return 39;case 30:return 40;case 31:return 41;case 32:return 42;case 33:return 43;case 34:return 44;case 35:return 55;case 36:return 56;case 37:return 57;case 38:return 58;case 39:return 59;case 40:return 60;case 41:return 61;case 42:return 47;case 43:return 49;case 44:return 51;case 45:return 54;case 46:return 53;case 47:this.begin("string");break;case 48:this.popState();break;case 49:return"qString";case 50:return Q.yytext=Q.yytext.trim(),62;break}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[48,49],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,50],inclusive:!0}}};return oe}();H.lexer=J;function X(){this.yy={}}return v(X,"Parser"),X.prototype=H,H.Parser=X,new X}();dM.parser=dM;qPe=dM,gM=[],Os={},Q2=new Map,uf={},J2=new Map,YPe={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},XPe={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},jPe={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},KPe={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},ZPe=v((t,e)=>(Q2.has(t)||Q2.set(t,{name:t,type:e,id:Os.id,text:Os.text,risk:Os.risk,verifyMethod:Os.verifyMethod}),Os={},Q2.get(t)),"addRequirement"),QPe=v(()=>Q2,"getRequirements"),JPe=v(t=>{Os!==void 0&&(Os.id=t)},"setNewReqId"),eBe=v(t=>{Os!==void 0&&(Os.text=t)},"setNewReqText"),tBe=v(t=>{Os!==void 0&&(Os.risk=t)},"setNewReqRisk"),rBe=v(t=>{Os!==void 0&&(Os.verifyMethod=t)},"setNewReqVerifyMethod"),nBe=v(t=>(J2.has(t)||(J2.set(t,{name:t,type:uf.type,docRef:uf.docRef}),re.info("Added new requirement: ",t)),uf={},J2.get(t)),"addElement"),iBe=v(()=>J2,"getElements"),aBe=v(t=>{uf!==void 0&&(uf.type=t)},"setNewElementType"),sBe=v(t=>{uf!==void 0&&(uf.docRef=t)},"setNewElementDocRef"),oBe=v((t,e,r)=>{gM.push({type:t,src:e,dst:r})},"addRelationship"),lBe=v(()=>gM,"getRelationships"),cBe=v(()=>{gM=[],Os={},Q2=new Map,uf={},J2=new Map,xr()},"clear"),uBe={RequirementType:YPe,RiskLevel:XPe,VerifyType:jPe,Relationships:KPe,getConfig:v(()=>pe().req,"getConfig"),addRequirement:ZPe,getRequirements:QPe,setNewReqId:JPe,setNewReqText:eBe,setNewReqRisk:tBe,setNewReqVerifyMethod:rBe,setAccTitle:Tr,getAccTitle:_r,setAccDescription:Lr,getAccDescription:Rr,addElement:nBe,getElements:iBe,setNewElementType:aBe,setNewElementDocRef:sBe,addRelationship:oBe,getRelationships:lBe,clear:cBe},hBe=v(t=>` marker { fill: ${t.relationColor}; stroke: ${t.relationColor}; } marker.cross { stroke: ${t.lineColor}; } svg { font-family: ${t.fontFamily}; font-size: ${t.fontSize}; } .reqBox { fill: ${t.requirementBackground}; fill-opacity: 1.0; stroke: ${t.requirementBorderColor}; stroke-width: ${t.requirementBorderSize}; } .reqTitle, .reqLabel{ fill: ${t.requirementTextColor}; } .reqLabelBox { fill: ${t.relationLabelBackground}; fill-opacity: 1.0; } .req-title-line { stroke: ${t.requirementBorderColor}; stroke-width: ${t.requirementBorderSize}; } .relationshipLine { stroke: ${t.relationColor}; stroke-width: 1; } .relationshipLabel { fill: ${t.relationLabelColor}; } `,"getStyles"),fBe=hBe,pM={CONTAINS:"contains",ARROW:"arrow"},dBe=v((t,e)=>{let r=t.append("defs").append("marker").attr("id",pM.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");r.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),r.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),r.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",pM.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0 L${e.line_height},${e.line_height/2} M${e.line_height},${e.line_height/2} L0,${e.line_height}`).attr("stroke-width",1)},"insertLineEndings"),sue={ReqMarkers:pM,insertLineEndings:dBe},ri={},aue=0,oue=v((t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",ri.rect_min_width+"px").attr("height",ri.rect_min_height+"px"),"newRectNode"),lue=v((t,e,r)=>{let n=ri.rect_min_width/2,i=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",n).attr("y",ri.rect_padding).attr("dominant-baseline","hanging"),a=0;r.forEach(u=>{a==0?i.append("tspan").attr("text-anchor","middle").attr("x",ri.rect_min_width/2).attr("dy",0).text(u):i.append("tspan").attr("text-anchor","middle").attr("x",ri.rect_min_width/2).attr("dy",ri.line_height*.75).text(u),a++});let s=1.5*ri.rect_padding,o=a*ri.line_height*.75,l=s+o;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",ri.rect_min_width).attr("y1",l).attr("y2",l),{titleNode:i,y:l}},"newTitleNode"),cue=v((t,e,r,n)=>{let i=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",ri.rect_padding).attr("y",n).attr("dominant-baseline","hanging"),a=0,s=30,o=[];return r.forEach(l=>{let u=l.length;for(;u>s&&a<3;){let h=l.substring(0,s);l=l.substring(s,l.length),u=l.length,o[o.length]=h,a++}if(a==3){let h=o[o.length-1];o[o.length-1]=h.substring(0,h.length-4)+"..."}else o[o.length]=l;a=0}),o.forEach(l=>{i.append("tspan").attr("x",ri.rect_padding).attr("dy",ri.line_height).text(l)}),i},"newBodyNode"),pBe=v((t,e,r,n)=>{let i=e.node().getTotalLength(),a=e.node().getPointAtLength(i*.5),s="rel"+aue;aue++;let l=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(n).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-l.width/2).attr("y",a.y-l.height/2).attr("width",l.width).attr("height",l.height).attr("fill","white").attr("fill-opacity","85%")},"addEdgeLabel"),gBe=v(function(t,e,r,n,i){let a=r.edge(Cm(e.src),Cm(e.dst)),s=ms().x(function(l){return l.x}).y(function(l){return l.y}),o=t.insert("path","#"+n).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==i.db.Relationships.CONTAINS?o.attr("marker-start","url("+Xe.getUrl(ri.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(o.attr("stroke-dasharray","10,7"),o.attr("marker-end","url("+Xe.getUrl(ri.arrowMarkerAbsolute)+"#"+sue.ReqMarkers.ARROW+"_line_ending)")),pBe(t,o,ri,`<<${e.type}>>`)},"drawRelationshipFromLayout"),mBe=v((t,e,r)=>{t.forEach((n,i)=>{i=Cm(i),re.info("Added new requirement: ",i);let a=r.append("g").attr("id",i),s="req-"+i,o=oue(a,s),l=[],u=lue(a,i+"_title",[`<<${n.type}>>`,`${n.name}`]);l.push(u.titleNode);let h=cue(a,i+"_body",[`Id: ${n.id}`,`Text: ${n.text}`,`Risk: ${n.risk}`,`Verification: ${n.verifyMethod}`],u.y);l.push(h);let f=o.node().getBBox();e.setNode(i,{width:f.width,height:f.height,shape:"rect",id:i})})},"drawReqs"),vBe=v((t,e,r)=>{t.forEach((n,i)=>{let a=Cm(i),s=r.append("g").attr("id",a),o="element-"+a,l=oue(s,o),u=[],h=lue(s,o+"_title",["<>",`${i}`]);u.push(h.titleNode);let f=cue(s,o+"_body",[`Type: ${n.type||"Not Specified"}`,`Doc Ref: ${n.docRef||"None"}`],h.y);u.push(f);let d=l.node().getBBox();e.setNode(a,{width:d.width,height:d.height,shape:"rect",id:a})})},"drawElements"),yBe=v((t,e)=>(t.forEach(function(r){let n=Cm(r.src),i=Cm(r.dst);e.setEdge(n,i,{relationship:r})}),t),"addRelationships"),xBe=v(function(t,e){e.nodes().forEach(function(r){r!==void 0&&e.node(r)!==void 0&&(t.select("#"+r),t.select("#"+r).attr("transform","translate("+(e.node(r).x-e.node(r).width/2)+","+(e.node(r).y-e.node(r).height/2)+" )"))})},"adjustEntities"),Cm=v(t=>t.replace(/\s/g,"").replace(/\./g,"_"),"elementString"),bBe=v((t,e,r,n)=>{ri=pe().requirement;let i=ri.securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let o=(i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body")).select(`[id='${e}']`);sue.insertLineEndings(o,ri);let l=new Sr({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:ri.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}}),u=n.db.getRequirements(),h=n.db.getElements(),f=n.db.getRelationships();mBe(u,l,o),vBe(h,l,o),yBe(f,l),Ru(l),xBe(o,l),f.forEach(function(y){gBe(o,y,l,e,n)});let d=ri.rect_padding,p=o.node().getBBox(),g=p.width+d*2,m=p.height+d*2;Hr(o,m,g,ri.useMaxWidth),o.attr("viewBox",`${p.x-d} ${p.y-d} ${g} ${m}`)},"draw"),wBe={draw:bBe},kBe={parser:qPe,db:uBe,renderer:wBe,styles:fBe}});var Due={};vr(Due,{diagram:()=>kFe});function YT(t,e){if(t.links==null)t.links=e;else for(let r in e)t.links[r]=e[r]}function bM(t,e){if(t.properties==null)t.properties=e;else for(let r in e)t.properties[r]=e[r]}function xue(){Dt.records.currentBox=void 0}async function _ue(t,e){Qe.bumpVerticalPos(10);let{startx:r,stopx:n,message:i}=e,a=Xe.splitBreaks(i).length,s=Ei(i),o=s?await ep(i,pe()):Ut.calculateTextDimensions(i,x0(Le));if(!s){let f=o.height/a;e.height+=f,Qe.bumpVerticalPos(f)}let l,u=o.height-10,h=o.width;if(r===n){l=Qe.getVerticalPos()+u,Le.rightAngles||(u+=Le.boxMargin,l=Qe.getVerticalPos()+u),u+=30;let f=Xe.getMax(h/2,Le.width/2);Qe.insert(r-f,Qe.getVerticalPos()-10+u,n+f,Qe.getVerticalPos()+30+u)}else u+=Le.boxMargin,l=Qe.getVerticalPos()+u,Qe.insert(r,l-10,n,l);return Qe.bumpVerticalPos(u),e.height+=u,e.stopy=e.starty+e.height,Qe.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),l}function Il(t,e,r,n,i){Qe.bumpVerticalPos(r);let a=n;if(e.id&&e.message&&t[e.id]){let s=t[e.id].width,o=x0(Le);e.message=Ut.wrapLabel(`[${e.message}]`,s-2*Le.wrapPadding,o),e.width=s,e.wrap=!0;let l=Ut.calculateTextDimensions(e.message,o),u=Xe.getMax(l.height,Le.labelBoxHeight);a=n+u,re.debug(`${u} - ${e.message}`)}i(e),Qe.bumpVerticalPos(a)}function Nue(t,e,r,n,i,a,s){function o(u,h){u.x{let s=x0(Le),o=a.actorKeys.reduce((h,f)=>h+=t.get(f).width+(t.get(f).margin||0),0);o-=2*Le.boxTextMargin,a.wrap&&(a.name=Ut.wrapLabel(a.name,o-2*Le.wrapPadding,s));let l=Ut.calculateTextDimensions(a.name,s);i=Xe.getMax(l.height,i);let u=Xe.getMax(o,l.width+2*Le.wrapPadding);if(a.margin=Le.boxTextMargin,oa.textMaxHeight=i),Xe.getMax(n,Le.height)}var wM,mM,TBe,Dt,EBe,vM,SBe,CBe,ui,ABe,_Be,LBe,RBe,NBe,IBe,MBe,tx,DBe,OBe,PBe,BBe,FBe,gue,y0,zBe,$Be,GBe,ex,UBe,VBe,mue,vue,WBe,yue,bue,HBe,wue,fue,qBe,YBe,v0,kue,Tue,XBe,due,kM,jBe,KBe,qT,_m,Eue,zc,Sue,ZBe,QBe,JBe,eFe,tFe,rFe,nFe,Cue,iFe,aFe,sFe,oFe,lFe,cFe,uFe,Aue,hFe,TM,fFe,hi,Le,Qe,dFe,x0,Am,yM,pFe,gFe,xM,Lue,Rue,XT,pue,mFe,vFe,yFe,xFe,bFe,wFe,kFe,Oue=F(()=>{Rw();Hw();kn();or();lr();wM=Gi(hp(),1),mM=function(){var t=v(function(W,Y,Z,se){for(Z=Z||{},se=W.length;se--;Z[W[se]]=Y);return Z},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],o=[1,13],l=[1,14],u=[1,16],h=[1,17],f=[1,18],d=[1,24],p=[1,25],g=[1,26],m=[1,27],y=[1,28],x=[1,29],b=[1,30],w=[1,31],_=[1,32],k=[1,33],E=[1,34],L=[1,35],S=[1,36],C=[1,37],M=[1,38],R=[1,39],T=[1,41],I=[1,42],A=[1,43],D=[1,44],N=[1,45],O=[1,46],B=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],P=[4,5,16,50,52,53],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],z=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],H=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],J=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],X=[68,69,70],oe=[1,122],K={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:v(function(Y,Z,se,ce,ue,te,Ne){var ae=te.length-1;switch(ue){case 3:return ce.apply(te[ae]),te[ae];break;case 4:case 9:this.$=[];break;case 5:case 10:te[ae-1].push(te[ae]),this.$=te[ae-1];break;case 6:case 7:case 11:case 12:this.$=te[ae];break;case 8:case 13:this.$=[];break;case 15:te[ae].type="createParticipant",this.$=te[ae];break;case 16:te[ae-1].unshift({type:"boxStart",boxData:ce.parseBoxData(te[ae-2])}),te[ae-1].push({type:"boxEnd",boxText:te[ae-2]}),this.$=te[ae-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(te[ae-2]),sequenceIndexStep:Number(te[ae-1]),sequenceVisible:!0,signalType:ce.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(te[ae-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:ce.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:ce.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:ce.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:ce.LINETYPE.ACTIVE_START,actor:te[ae-1].actor};break;case 23:this.$={type:"activeEnd",signalType:ce.LINETYPE.ACTIVE_END,actor:te[ae-1].actor};break;case 29:ce.setDiagramTitle(te[ae].substring(6)),this.$=te[ae].substring(6);break;case 30:ce.setDiagramTitle(te[ae].substring(7)),this.$=te[ae].substring(7);break;case 31:this.$=te[ae].trim(),ce.setAccTitle(this.$);break;case 32:case 33:this.$=te[ae].trim(),ce.setAccDescription(this.$);break;case 34:te[ae-1].unshift({type:"loopStart",loopText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.LOOP_START}),te[ae-1].push({type:"loopEnd",loopText:te[ae-2],signalType:ce.LINETYPE.LOOP_END}),this.$=te[ae-1];break;case 35:te[ae-1].unshift({type:"rectStart",color:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.RECT_START}),te[ae-1].push({type:"rectEnd",color:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.RECT_END}),this.$=te[ae-1];break;case 36:te[ae-1].unshift({type:"optStart",optText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.OPT_START}),te[ae-1].push({type:"optEnd",optText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.OPT_END}),this.$=te[ae-1];break;case 37:te[ae-1].unshift({type:"altStart",altText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.ALT_START}),te[ae-1].push({type:"altEnd",signalType:ce.LINETYPE.ALT_END}),this.$=te[ae-1];break;case 38:te[ae-1].unshift({type:"parStart",parText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.PAR_START}),te[ae-1].push({type:"parEnd",signalType:ce.LINETYPE.PAR_END}),this.$=te[ae-1];break;case 39:te[ae-1].unshift({type:"parStart",parText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.PAR_OVER_START}),te[ae-1].push({type:"parEnd",signalType:ce.LINETYPE.PAR_END}),this.$=te[ae-1];break;case 40:te[ae-1].unshift({type:"criticalStart",criticalText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.CRITICAL_START}),te[ae-1].push({type:"criticalEnd",signalType:ce.LINETYPE.CRITICAL_END}),this.$=te[ae-1];break;case 41:te[ae-1].unshift({type:"breakStart",breakText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.BREAK_START}),te[ae-1].push({type:"breakEnd",optText:ce.parseMessage(te[ae-2]),signalType:ce.LINETYPE.BREAK_END}),this.$=te[ae-1];break;case 43:this.$=te[ae-3].concat([{type:"option",optionText:ce.parseMessage(te[ae-1]),signalType:ce.LINETYPE.CRITICAL_OPTION},te[ae]]);break;case 45:this.$=te[ae-3].concat([{type:"and",parText:ce.parseMessage(te[ae-1]),signalType:ce.LINETYPE.PAR_AND},te[ae]]);break;case 47:this.$=te[ae-3].concat([{type:"else",altText:ce.parseMessage(te[ae-1]),signalType:ce.LINETYPE.ALT_ELSE},te[ae]]);break;case 48:te[ae-3].draw="participant",te[ae-3].type="addParticipant",te[ae-3].description=ce.parseMessage(te[ae-1]),this.$=te[ae-3];break;case 49:te[ae-1].draw="participant",te[ae-1].type="addParticipant",this.$=te[ae-1];break;case 50:te[ae-3].draw="actor",te[ae-3].type="addParticipant",te[ae-3].description=ce.parseMessage(te[ae-1]),this.$=te[ae-3];break;case 51:te[ae-1].draw="actor",te[ae-1].type="addParticipant",this.$=te[ae-1];break;case 52:te[ae-1].type="destroyParticipant",this.$=te[ae-1];break;case 53:this.$=[te[ae-1],{type:"addNote",placement:te[ae-2],actor:te[ae-1].actor,text:te[ae]}];break;case 54:te[ae-2]=[].concat(te[ae-1],te[ae-1]).slice(0,2),te[ae-2][0]=te[ae-2][0].actor,te[ae-2][1]=te[ae-2][1].actor,this.$=[te[ae-1],{type:"addNote",placement:ce.PLACEMENT.OVER,actor:te[ae-2].slice(0,2),text:te[ae]}];break;case 55:this.$=[te[ae-1],{type:"addLinks",actor:te[ae-1].actor,text:te[ae]}];break;case 56:this.$=[te[ae-1],{type:"addALink",actor:te[ae-1].actor,text:te[ae]}];break;case 57:this.$=[te[ae-1],{type:"addProperties",actor:te[ae-1].actor,text:te[ae]}];break;case 58:this.$=[te[ae-1],{type:"addDetails",actor:te[ae-1].actor,text:te[ae]}];break;case 61:this.$=[te[ae-2],te[ae]];break;case 62:this.$=te[ae];break;case 63:this.$=ce.PLACEMENT.LEFTOF;break;case 64:this.$=ce.PLACEMENT.RIGHTOF;break;case 65:this.$=[te[ae-4],te[ae-1],{type:"addMessage",from:te[ae-4].actor,to:te[ae-1].actor,signalType:te[ae-3],msg:te[ae],activate:!0},{type:"activeStart",signalType:ce.LINETYPE.ACTIVE_START,actor:te[ae-1].actor}];break;case 66:this.$=[te[ae-4],te[ae-1],{type:"addMessage",from:te[ae-4].actor,to:te[ae-1].actor,signalType:te[ae-3],msg:te[ae]},{type:"activeEnd",signalType:ce.LINETYPE.ACTIVE_END,actor:te[ae-4].actor}];break;case 67:this.$=[te[ae-3],te[ae-1],{type:"addMessage",from:te[ae-3].actor,to:te[ae-1].actor,signalType:te[ae-2],msg:te[ae]}];break;case 68:this.$={type:"addParticipant",actor:te[ae]};break;case 69:this.$=ce.LINETYPE.SOLID_OPEN;break;case 70:this.$=ce.LINETYPE.DOTTED_OPEN;break;case 71:this.$=ce.LINETYPE.SOLID;break;case 72:this.$=ce.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=ce.LINETYPE.DOTTED;break;case 74:this.$=ce.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=ce.LINETYPE.SOLID_CROSS;break;case 76:this.$=ce.LINETYPE.DOTTED_CROSS;break;case 77:this.$=ce.LINETYPE.SOLID_POINT;break;case 78:this.$=ce.LINETYPE.DOTTED_POINT;break;case 79:this.$=ce.parseMessage(te[ae].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:o,14:l,17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},t(B,[2,5]),{9:47,12:12,13:o,14:l,17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},t(B,[2,7]),t(B,[2,8]),t(B,[2,14]),{12:48,50:C,52:M,53:R},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:O},{22:55,70:O},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(B,[2,29]),t(B,[2,30]),{32:[1,61]},{34:[1,62]},t(B,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:O},{22:72,70:O},{22:73,70:O},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:O},{22:90,70:O},{22:91,70:O},{22:92,70:O},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(B,[2,6]),t(B,[2,15]),t(P,[2,9],{10:93}),t(B,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(B,[2,21]),{5:[1,97]},{5:[1,98]},t(B,[2,24]),t(B,[2,25]),t(B,[2,26]),t(B,[2,27]),t(B,[2,28]),t(B,[2,31]),t(B,[2,32]),t($,i,{7:99}),t($,i,{7:100}),t($,i,{7:101}),t(z,i,{40:102,7:103}),t(H,i,{42:104,7:105}),t(H,i,{7:105,42:106}),t(J,i,{45:107,7:108}),t($,i,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:O},t(X,[2,69]),t(X,[2,70]),t(X,[2,71]),t(X,[2,72]),t(X,[2,73]),t(X,[2,74]),t(X,[2,75]),t(X,[2,76]),t(X,[2,77]),t(X,[2,78]),{22:118,70:O},{22:120,58:119,70:O},{70:[2,63]},{70:[2,64]},{56:121,81:oe},{56:123,81:oe},{56:124,81:oe},{56:125,81:oe},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:C,52:M,53:R},{5:[1,131]},t(B,[2,19]),t(B,[2,20]),t(B,[2,22]),t(B,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[1,132],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[1,133],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[1,134],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{16:[1,135]},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[2,46],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,49:[1,136],50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{16:[1,137]},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[2,44],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,48:[1,138],50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{16:[1,139]},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[2,42],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,47:[1,141],50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{4:a,5:s,8:8,9:10,12:12,13:o,14:l,16:[1,142],17:15,18:u,21:h,22:40,23:f,24:19,25:20,26:21,27:22,28:23,29:d,30:p,31:g,33:m,35:y,36:x,37:b,38:w,39:_,41:k,43:E,44:L,46:S,50:C,52:M,53:R,54:T,59:I,60:A,61:D,62:N,70:O},{15:[1,143]},t(B,[2,49]),{15:[1,144]},t(B,[2,51]),t(B,[2,52]),{22:145,70:O},{22:146,70:O},{56:147,81:oe},{56:148,81:oe},{56:149,81:oe},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(B,[2,16]),t(P,[2,10]),{12:151,50:C,52:M,53:R},t(P,[2,12]),t(P,[2,13]),t(B,[2,18]),t(B,[2,34]),t(B,[2,35]),t(B,[2,36]),t(B,[2,37]),{15:[1,152]},t(B,[2,38]),{15:[1,153]},t(B,[2,39]),t(B,[2,40]),{15:[1,154]},t(B,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:oe},{56:158,81:oe},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:O},t(P,[2,11]),t(z,i,{7:103,40:160}),t(H,i,{7:105,42:161}),t(J,i,{7:108,45:162}),t(B,[2,48]),t(B,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:v(function(Y,Z){if(Z.recoverable)this.trace(Y);else{var se=new Error(Y);throw se.hash=Z,se}},"parseError"),parse:v(function(Y){var Z=this,se=[0],ce=[],ue=[null],te=[],Ne=this.table,ae="",we=0,Ie=0,Ee=0,Oe=2,De=1,We=te.slice.call(arguments,1),Re=Object.create(this.lexer),Pe={yy:{}};for(var xe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xe)&&(Pe.yy[xe]=this.yy[xe]);Re.setInput(Y,Pe.yy),Pe.yy.lexer=Re,Pe.yy.parser=this,typeof Re.yylloc>"u"&&(Re.yylloc={});var q=Re.yylloc;te.push(q);var de=Re.options&&Re.options.ranges;typeof Pe.yy.parseError=="function"?this.parseError=Pe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ie(xt){se.length=se.length-2*xt,ue.length=ue.length-xt,te.length=te.length-xt}v(ie,"popStack");function he(){var xt;return xt=ce.pop()||Re.lex()||De,typeof xt!="number"&&(xt instanceof Array&&(ce=xt,xt=ce.pop()),xt=Z.symbols_[xt]||xt),xt}v(he,"lex");for(var U,ke,j,ye,Ae,Ge,Fe={},ge,$e,Ce,qe;;){if(j=se[se.length-1],this.defaultActions[j]?ye=this.defaultActions[j]:((U===null||typeof U>"u")&&(U=he()),ye=Ne[j]&&Ne[j][U]),typeof ye>"u"||!ye.length||!ye[0]){var lt="";qe=[];for(ge in Ne[j])this.terminals_[ge]&&ge>Oe&&qe.push("'"+this.terminals_[ge]+"'");Re.showPosition?lt="Parse error on line "+(we+1)+`: `+Re.showPosition()+` Expecting `+qe.join(", ")+", got '"+(this.terminals_[U]||U)+"'":lt="Parse error on line "+(we+1)+": Unexpected "+(U==De?"end of input":"'"+(this.terminals_[U]||U)+"'"),this.parseError(lt,{text:Re.match,token:this.terminals_[U]||U,line:Re.yylineno,loc:q,expected:qe})}if(ye[0]instanceof Array&&ye.length>1)throw new Error("Parse Error: multiple actions possible at state: "+j+", token: "+U);switch(ye[0]){case 1:se.push(U),ue.push(Re.yytext),te.push(Re.yylloc),se.push(ye[1]),U=null,ke?(U=ke,ke=null):(Ie=Re.yyleng,ae=Re.yytext,we=Re.yylineno,q=Re.yylloc,Ee>0&&Ee--);break;case 2:if($e=this.productions_[ye[1]][1],Fe.$=ue[ue.length-$e],Fe._$={first_line:te[te.length-($e||1)].first_line,last_line:te[te.length-1].last_line,first_column:te[te.length-($e||1)].first_column,last_column:te[te.length-1].last_column},de&&(Fe._$.range=[te[te.length-($e||1)].range[0],te[te.length-1].range[1]]),Ge=this.performAction.apply(Fe,[ae,Ie,we,Pe.yy,ye[1],ue,te].concat(We)),typeof Ge<"u")return Ge;$e&&(se=se.slice(0,-1*$e*2),ue=ue.slice(0,-1*$e),te=te.slice(0,-1*$e)),se.push(this.productions_[ye[1]][0]),ue.push(Fe.$),te.push(Fe._$),Ce=Ne[se[se.length-2]][se[se.length-1]],se.push(Ce);break;case 3:return!0}}return!0},"parse")},ee=function(){var W={EOF:1,parseError:v(function(Z,se){if(this.yy.parser)this.yy.parser.parseError(Z,se);else throw new Error(Z)},"parseError"),setInput:v(function(Y,Z){return this.yy=Z||this.yy||{},this._input=Y,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var Y=this._input[0];this.yytext+=Y,this.yyleng++,this.offset++,this.match+=Y,this.matched+=Y;var Z=Y.match(/(?:\r\n?|\n).*/g);return Z?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Y},"input"),unput:v(function(Y){var Z=Y.length,se=Y.split(/(?:\r\n?|\n)/g);this._input=Y+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Z),this.offset-=Z;var ce=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),se.length-1&&(this.yylineno-=se.length-1);var ue=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:se?(se.length===ce.length?this.yylloc.first_column:0)+ce[ce.length-se.length].length-se[0].length:this.yylloc.first_column-Z},this.options.ranges&&(this.yylloc.range=[ue[0],ue[0]+this.yyleng-Z]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(Y){this.unput(this.match.slice(Y))},"less"),pastInput:v(function(){var Y=this.matched.substr(0,this.matched.length-this.match.length);return(Y.length>20?"...":"")+Y.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var Y=this.match;return Y.length<20&&(Y+=this._input.substr(0,20-Y.length)),(Y.substr(0,20)+(Y.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var Y=this.pastInput(),Z=new Array(Y.length+1).join("-");return Y+this.upcomingInput()+` `+Z+"^"},"showPosition"),test_match:v(function(Y,Z){var se,ce,ue;if(this.options.backtrack_lexer&&(ue={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ue.yylloc.range=this.yylloc.range.slice(0))),ce=Y[0].match(/(?:\r\n?|\n).*/g),ce&&(this.yylineno+=ce.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ce?ce[ce.length-1].length-ce[ce.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Y[0].length},this.yytext+=Y[0],this.match+=Y[0],this.matches=Y,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Y[0].length),this.matched+=Y[0],se=this.performAction.call(this,this.yy,this,Z,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),se)return se;if(this._backtrack){for(var te in ue)this[te]=ue[te];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Y,Z,se,ce;this._more||(this.yytext="",this.match="");for(var ue=this._currentRules(),te=0;teZ[0].length)){if(Z=se,ce=te,this.options.backtrack_lexer){if(Y=this.test_match(se,ue[te]),Y!==!1)return Y;if(this._backtrack){Z=!1;continue}else return!1}else if(!this.options.flex)break}return Z?(Y=this.test_match(Z,ue[ce]),Y!==!1?Y:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var Z=this.next();return Z||this.lex()},"lex"),begin:v(function(Z){this.conditionStack.push(Z)},"begin"),popState:v(function(){var Z=this.conditionStack.length-1;return Z>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(Z){return Z=this.conditionStack.length-1-Math.abs(Z||0),Z>=0?this.conditionStack[Z]:"INITIAL"},"topState"),pushState:v(function(Z){this.begin(Z)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(Z,se,ce,ue){var te=ue;switch(ce){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;break;case 8:return this.begin("ID"),50;break;case 9:return this.begin("ID"),52;break;case 10:return 13;case 11:return this.begin("ID"),53;break;case 12:return se.yytext=se.yytext.trim(),this.begin("ALIAS"),70;break;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 14:return this.popState(),this.popState(),5;break;case 15:return this.begin("LINE"),36;break;case 16:return this.begin("LINE"),37;break;case 17:return this.begin("LINE"),38;break;case 18:return this.begin("LINE"),39;break;case 19:return this.begin("LINE"),49;break;case 20:return this.begin("LINE"),41;break;case 21:return this.begin("LINE"),43;break;case 22:return this.begin("LINE"),48;break;case 23:return this.begin("LINE"),44;break;case 24:return this.begin("LINE"),47;break;case 25:return this.begin("LINE"),46;break;case 26:return this.popState(),15;break;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;break;case 37:return this.begin("ID"),23;break;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;break;case 41:return this.popState(),"acc_title_value";break;case 42:return this.begin("acc_descr"),33;break;case 43:return this.popState(),"acc_descr_value";break;case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 51:return 5;case 52:return se.yytext=se.yytext.trim(),70;break;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:return 81;case 64:return 68;case 65:return 69;case 66:return 5;case 67:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\<->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\<->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}};return W}();K.lexer=ee;function Q(){this.yy={}}return v(Q,"Parser"),Q.prototype=K,K.Parser=Q,new Q}();mM.parser=mM;TBe=mM,Dt=new Rg(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0})),EBe=v(function(t){Dt.records.boxes.push({name:t.text,wrap:t.wrap??y0(),fill:t.color,actorKeys:[]}),Dt.records.currentBox=Dt.records.boxes.slice(-1)[0]},"addBox"),vM=v(function(t,e,r,n){let i=Dt.records.currentBox,a=Dt.records.actors.get(t);if(a){if(Dt.records.currentBox&&a.box&&Dt.records.currentBox!==a.box)throw new Error(`A same participant should only be defined in one Box: ${a.name} can't be in '${a.box.name}' and in '${Dt.records.currentBox.name}' at the same time.`);if(i=a.box?a.box:Dt.records.currentBox,a.box=i,a&&e===a.name&&r==null)return}if(r?.text==null&&(r={text:e,type:n}),(n==null||r.text==null)&&(r={text:e,type:n}),Dt.records.actors.set(t,{box:i,name:e,description:r.text,wrap:r.wrap??y0(),prevActor:Dt.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:n??"participant"}),Dt.records.prevActor){let s=Dt.records.actors.get(Dt.records.prevActor);s&&(s.nextActor=t)}Dt.records.currentBox&&Dt.records.currentBox.actorKeys.push(t),Dt.records.prevActor=t},"addActor"),SBe=v(t=>{let e,r=0;if(!t)return 0;for(e=0;e>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},s}return Dt.records.messages.push({from:t,to:e,message:r?.text??"",wrap:r?.wrap??y0(),type:n,activate:i}),!0},"addSignal"),ABe=v(function(){return Dt.records.boxes.length>0},"hasAtLeastOneBox"),_Be=v(function(){return Dt.records.boxes.some(t=>t.name)},"hasAtLeastOneBoxWithTitle"),LBe=v(function(){return Dt.records.messages},"getMessages"),RBe=v(function(){return Dt.records.boxes},"getBoxes"),NBe=v(function(){return Dt.records.actors},"getActors"),IBe=v(function(){return Dt.records.createdActors},"getCreatedActors"),MBe=v(function(){return Dt.records.destroyedActors},"getDestroyedActors"),tx=v(function(t){return Dt.records.actors.get(t)},"getActor"),DBe=v(function(){return[...Dt.records.actors.keys()]},"getActorKeys"),OBe=v(function(){Dt.records.sequenceNumbersEnabled=!0},"enableSequenceNumbers"),PBe=v(function(){Dt.records.sequenceNumbersEnabled=!1},"disableSequenceNumbers"),BBe=v(()=>Dt.records.sequenceNumbersEnabled,"showSequenceNumbers"),FBe=v(function(t){Dt.records.wrapEnabled=t},"setWrap"),gue=v(t=>{if(t===void 0)return{};t=t.trim();let e=/^:?wrap:/.exec(t)!==null?!0:/^:?nowrap:/.exec(t)!==null?!1:void 0;return{cleanedText:(e===void 0?t:t.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:e}},"extractWrap"),y0=v(()=>Dt.records.wrapEnabled!==void 0?Dt.records.wrapEnabled:pe().sequence?.wrap??!1,"autoWrap"),zBe=v(function(){Dt.reset(),xr()},"clear"),$Be=v(function(t){let e=t.trim(),{wrap:r,cleanedText:n}=gue(e),i={text:n,wrap:r};return re.debug(`parseMessage: ${JSON.stringify(i)}`),i},"parseMessage"),GBe=v(function(t){let e=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(t),r=e?.[1]?e[1].trim():"transparent",n=e?.[2]?e[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",r)||(r="transparent",n=t.trim());else{let s=new Option().style;s.color=r,s.color!==r&&(r="transparent",n=t.trim())}let{wrap:i,cleanedText:a}=gue(n);return{text:a?yr(a,pe()):void 0,color:r,wrap:i}},"parseBoxData"),ex={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},UBe={FILLED:0,OPEN:1},VBe={LEFTOF:0,RIGHTOF:1,OVER:2},mue=v(function(t,e,r){let n={actor:t,placement:e,message:r.text,wrap:r.wrap??y0()},i=[].concat(t,t);Dt.records.notes.push(n),Dt.records.messages.push({from:i[0],to:i[1],message:r.text,wrap:r.wrap??y0(),type:ex.NOTE,placement:e})},"addNote"),vue=v(function(t,e){let r=tx(t);try{let n=yr(e.text,pe());n=n.replace(/&/g,"&"),n=n.replace(/=/g,"=");let i=JSON.parse(n);YT(r,i)}catch(n){re.error("error while parsing actor link text",n)}},"addLinks"),WBe=v(function(t,e){let r=tx(t);try{let n={},i=yr(e.text,pe()),a=i.indexOf("@");i=i.replace(/&/g,"&"),i=i.replace(/=/g,"=");let s=i.slice(0,a-1).trim(),o=i.slice(a+1).trim();n[s]=o,YT(r,n)}catch(n){re.error("error while parsing actor link text",n)}},"addALink");v(YT,"insertLinks");yue=v(function(t,e){let r=tx(t);try{let n=yr(e.text,pe()),i=JSON.parse(n);bM(r,i)}catch(n){re.error("error while parsing actor properties text",n)}},"addProperties");v(bM,"insertProperties");v(xue,"boxEnd");bue=v(function(t,e){let r=tx(t),n=document.getElementById(e.text);try{let i=n.innerHTML,a=JSON.parse(i);a.properties&&bM(r,a.properties),a.links&&YT(r,a.links)}catch(i){re.error("error while parsing actor details text",i)}},"addDetails"),HBe=v(function(t,e){if(t?.properties!==void 0)return t.properties[e]},"getActorProperty"),wue=v(function(t){if(Array.isArray(t))t.forEach(function(e){wue(e)});else switch(t.type){case"sequenceIndex":Dt.records.messages.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":vM(t.actor,t.actor,t.description,t.draw);break;case"createParticipant":if(Dt.records.actors.has(t.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");Dt.records.lastCreated=t.actor,vM(t.actor,t.actor,t.description,t.draw),Dt.records.createdActors.set(t.actor,Dt.records.messages.length);break;case"destroyParticipant":Dt.records.lastDestroyed=t.actor,Dt.records.destroyedActors.set(t.actor,Dt.records.messages.length);break;case"activeStart":ui(t.actor,void 0,void 0,t.signalType);break;case"activeEnd":ui(t.actor,void 0,void 0,t.signalType);break;case"addNote":mue(t.actor,t.placement,t.text);break;case"addLinks":vue(t.actor,t.text);break;case"addALink":WBe(t.actor,t.text);break;case"addProperties":yue(t.actor,t.text);break;case"addDetails":bue(t.actor,t.text);break;case"addMessage":if(Dt.records.lastCreated){if(t.to!==Dt.records.lastCreated)throw new Error("The created participant "+Dt.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");Dt.records.lastCreated=void 0}else if(Dt.records.lastDestroyed){if(t.to!==Dt.records.lastDestroyed&&t.from!==Dt.records.lastDestroyed)throw new Error("The destroyed participant "+Dt.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");Dt.records.lastDestroyed=void 0}ui(t.from,t.to,t.msg,t.signalType,t.activate);break;case"boxStart":EBe(t.boxData);break;case"boxEnd":xue();break;case"loopStart":ui(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":ui(void 0,void 0,void 0,t.signalType);break;case"rectStart":ui(void 0,void 0,t.color,t.signalType);break;case"rectEnd":ui(void 0,void 0,void 0,t.signalType);break;case"optStart":ui(void 0,void 0,t.optText,t.signalType);break;case"optEnd":ui(void 0,void 0,void 0,t.signalType);break;case"altStart":ui(void 0,void 0,t.altText,t.signalType);break;case"else":ui(void 0,void 0,t.altText,t.signalType);break;case"altEnd":ui(void 0,void 0,void 0,t.signalType);break;case"setAccTitle":Tr(t.text);break;case"parStart":ui(void 0,void 0,t.parText,t.signalType);break;case"and":ui(void 0,void 0,t.parText,t.signalType);break;case"parEnd":ui(void 0,void 0,void 0,t.signalType);break;case"criticalStart":ui(void 0,void 0,t.criticalText,t.signalType);break;case"option":ui(void 0,void 0,t.optionText,t.signalType);break;case"criticalEnd":ui(void 0,void 0,void 0,t.signalType);break;case"breakStart":ui(void 0,void 0,t.breakText,t.signalType);break;case"breakEnd":ui(void 0,void 0,void 0,t.signalType);break}},"apply"),fue={addActor:vM,addMessage:CBe,addSignal:ui,addLinks:vue,addDetails:bue,addProperties:yue,autoWrap:y0,setWrap:FBe,enableSequenceNumbers:OBe,disableSequenceNumbers:PBe,showSequenceNumbers:BBe,getMessages:LBe,getActors:NBe,getCreatedActors:IBe,getDestroyedActors:MBe,getActor:tx,getActorKeys:DBe,getActorProperty:HBe,getAccTitle:_r,getBoxes:RBe,getDiagramTitle:qr,setDiagramTitle:tn,getConfig:v(()=>pe().sequence,"getConfig"),clear:zBe,parseMessage:$Be,parseBoxData:GBe,LINETYPE:ex,ARROWTYPE:UBe,PLACEMENT:VBe,addNote:mue,setAccTitle:Tr,apply:wue,setAccDescription:Lr,getAccDescription:Rr,hasAtLeastOneBox:ABe,hasAtLeastOneBoxWithTitle:_Be},qBe=v(t=>`.actor { stroke: ${t.actorBorder}; fill: ${t.actorBkg}; } text.actor > tspan { fill: ${t.actorTextColor}; stroke: none; } .actor-line { stroke: ${t.actorLineColor}; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: none; stroke: ${t.signalColor}; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: 2, 2; stroke: ${t.signalColor}; } #arrowhead path { fill: ${t.signalColor}; stroke: ${t.signalColor}; } .sequenceNumber { fill: ${t.sequenceNumberColor}; } #sequencenumber { fill: ${t.signalColor}; } #crosshead path { fill: ${t.signalColor}; stroke: ${t.signalColor}; } .messageText { fill: ${t.signalTextColor}; stroke: none; } .labelBox { stroke: ${t.labelBoxBorderColor}; fill: ${t.labelBoxBkgColor}; } .labelText, .labelText > tspan { fill: ${t.labelTextColor}; stroke: none; } .loopText, .loopText > tspan { fill: ${t.loopTextColor}; stroke: none; } .loopLine { stroke-width: 2px; stroke-dasharray: 2, 2; stroke: ${t.labelBoxBorderColor}; fill: ${t.labelBoxBorderColor}; } .note { //stroke: #decc93; stroke: ${t.noteBorderColor}; fill: ${t.noteBkgColor}; } .noteText, .noteText > tspan { fill: ${t.noteTextColor}; stroke: none; } .activation0 { fill: ${t.activationBkgColor}; stroke: ${t.activationBorderColor}; } .activation1 { fill: ${t.activationBkgColor}; stroke: ${t.activationBorderColor}; } .activation2 { fill: ${t.activationBkgColor}; stroke: ${t.activationBorderColor}; } .actorPopupMenu { position: absolute; } .actorPopupMenuPanel { position: absolute; fill: ${t.actorBkg}; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); } .actor-man line { stroke: ${t.actorBorder}; fill: ${t.actorBkg}; } .actor-man circle, line { stroke: ${t.actorBorder}; fill: ${t.actorBkg}; stroke-width: 2px; } `,"getStyles"),YBe=qBe,v0=18*2,kue="actor-top",Tue="actor-bottom",XBe="actor-box",due="actor-man",kM=v(function(t,e){return Dd(t,e)},"drawRect"),jBe=v(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,o=e.rectData;var l="none";i&&(l="block !important");let u=t.append("g");u.attr("id","actor"+s+"_popup"),u.attr("class","actorPopupMenu"),u.attr("display",l);var h="";o.class!==void 0&&(h=" "+o.class);let f=o.width>r?o.width:r,d=u.append("rect");if(d.attr("class","actorPopupMenuPanel"+h),d.attr("x",o.x),d.attr("y",o.height),d.attr("fill",o.fill),d.attr("stroke",o.stroke),d.attr("width",f),d.attr("height",o.height),d.attr("rx",o.rx),d.attr("ry",o.ry),a!=null){var p=20;for(let y in a){var g=u.append("a"),m=(0,wM.sanitizeUrl)(a[y]);g.attr("xlink:href",m),g.attr("target","_blank"),fFe(n)(y,g,o.x+10,o.height+p,f,20,{class:"actor"},n),p+=30}}return d.attr("height",p),{height:o.height+p,width:f}},"drawPopup"),KBe=v(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),qT=v(async function(t,e,r=null){let n=t.append("foreignObject"),i=await fh(e.text,Or()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let o=t.node().firstChild;o.setAttribute("height",s.height+2*e.textMargin);let l=o.getBBox();n.attr("x",Math.round(l.x+l.width/2-s.width/2)).attr("y",Math.round(l.y+l.height/2-s.height/2))}else if(r){let{startx:o,stopx:l,starty:u}=r;if(o>l){let h=o;o=l,l=h}n.attr("x",Math.round(o+Math.abs(o-l)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(u)):n.attr("y",Math.round(u-s.height))}return[n]},"drawKatex"),_m=v(function(t,e){let r=0,n=0,i=e.text.split(Xe.lineBreakRegex),[a,s]=Ro(e.fontSize),o=[],l=0,u=v(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":u=v(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":u=v(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":u=v(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[h,f]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(l=h*a);let d=t.append("text");d.attr("x",e.x),d.attr("y",u()),e.anchor!==void 0&&d.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&d.style("font-family",e.fontFamily),s!==void 0&&d.style("font-size",s),e.fontWeight!==void 0&&d.style("font-weight",e.fontWeight),e.fill!==void 0&&d.attr("fill",e.fill),e.class!==void 0&&d.attr("class",e.class),e.dy!==void 0?d.attr("dy",e.dy):l!==0&&d.attr("dy",l);let p=f||iA;if(e.tspan){let g=d.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(p)}else d.text(p);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(d._groups||d)[0][0].getBBox().height,r=n),o.push(d)}return o},"drawText"),Eue=v(function(t,e){function r(i,a,s,o,l){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+o-l)+" "+(i+s-l*1.2)+","+(a+o)+" "+i+","+(a+o)}v(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,_m(t,e),n},"drawLabel"),zc=-1,Sue=v((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),ZBe=v(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,o=t.append("g").lower();var l=o;n||(zc++,Object.keys(e.links||{}).length&&!r.forceMenus&&l.attr("onclick",KBe(`actor${zc}_popup`)).attr("cursor","pointer"),l.append("line").attr("id","actor"+zc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),l=o.append("g"),e.actorCnt=zc,e.links!=null&&l.attr("id","root-"+zc));let u=Tc();var h="actor";e.properties?.class?h=e.properties.class:u.fill="#eaeaea",n?h+=` ${Tue}`:h+=` ${kue}`,u.x=e.x,u.y=i,u.width=e.width,u.height=e.height,u.class=h,u.rx=3,u.ry=3,u.name=e.name;let f=kM(l,u);if(e.rectData=u,e.properties?.icon){let p=e.properties.icon.trim();p.charAt(0)==="@"?rne(l,u.x+u.width-20,u.y+10,p.substr(1)):tne(l,u.x+u.width-20,u.y+10,p)}TM(r,Ei(e.description))(e.description,l,u.x,u.y,u.width,u.height,{class:`actor ${XBe}`},r);let d=e.height;if(f.node){let p=f.node().getBBox();e.height=p.height,d=p.height}return d},"drawActorTypeParticipant"),QBe=v(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,o=t.append("g").lower();n||(zc++,o.append("line").attr("id","actor"+zc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=zc);let l=t.append("g"),u=due;n?u+=` ${Tue}`:u+=` ${kue}`,l.attr("class",u),l.attr("name",e.name);let h=Tc();h.x=e.x,h.y=i,h.fill="#eaeaea",h.width=e.width,h.height=e.height,h.class="actor",h.rx=3,h.ry=3,l.append("line").attr("id","actor-man-torso"+zc).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),l.append("line").attr("id","actor-man-arms"+zc).attr("x1",a-v0/2).attr("y1",i+33).attr("x2",a+v0/2).attr("y2",i+33),l.append("line").attr("x1",a-v0/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),l.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+v0/2-2).attr("y2",i+60);let f=l.append("circle");f.attr("cx",e.x+e.width/2),f.attr("cy",i+10),f.attr("r",15),f.attr("width",e.width),f.attr("height",e.height);let d=l.node().getBBox();return e.height=d.height,TM(r,Ei(e.description))(e.description,l,h.x,h.y+35,h.width,h.height,{class:`actor ${due}`},r),e.height},"drawActorTypeActor"),JBe=v(async function(t,e,r,n){switch(e.type){case"actor":return await QBe(t,e,r,n);case"participant":return await ZBe(t,e,r,n)}},"drawActor"),eFe=v(function(t,e,r){let i=t.append("g");Cue(i,e),e.name&&TM(r)(e.name,i,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),tFe=v(function(t){return t.append("g")},"anchorElement"),rFe=v(function(t,e,r,n,i){let a=Tc(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,kM(s,a)},"drawActivation"),nFe=v(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:o,messageFontFamily:l,messageFontSize:u,messageFontWeight:h}=n,f=t.append("g"),d=v(function(m,y,x,b){return f.append("line").attr("x1",m).attr("y1",y).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");d(e.startx,e.starty,e.stopx,e.starty),d(e.stopx,e.starty,e.stopx,e.stopy),d(e.startx,e.stopy,e.stopx,e.stopy),d(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(m){d(e.startx,m.y,e.stopx,m.y).style("stroke-dasharray","3, 3")});let p=Lw();p.text=r,p.x=e.startx,p.y=e.starty,p.fontFamily=l,p.fontSize=u,p.fontWeight=h,p.anchor="middle",p.valign="middle",p.tspan=!1,p.width=o||50,p.height=s||20,p.textMargin=a,p.class="labelText",Eue(f,p),p=Aue(),p.text=e.title,p.x=e.startx+o/2+(e.stopx-e.startx)/2,p.y=e.starty+i+a,p.anchor="middle",p.valign="middle",p.textMargin=a,p.class="loopText",p.fontFamily=l,p.fontSize=u,p.fontWeight=h,p.wrap=!0;let g=Ei(p.text)?await qT(f,p,e):_m(f,p);if(e.sectionTitles!==void 0){for(let[m,y]of Object.entries(e.sectionTitles))if(y.message){p.text=y.message,p.x=e.startx+(e.stopx-e.startx)/2,p.y=e.sections[m].y+i+a,p.class="loopText",p.anchor="middle",p.valign="middle",p.tspan=!1,p.fontFamily=l,p.fontSize=u,p.fontWeight=h,p.wrap=e.wrap,Ei(p.text)?(e.starty=e.sections[m].y,await qT(f,p,e)):_m(f,p);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,w)=>b+w));e.sections[m].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),f},"drawLoop"),Cue=v(function(t,e){_w(t,e)},"drawBackgroundRect"),iFe=v(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),aFe=v(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),sFe=v(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),oFe=v(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),lFe=v(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),cFe=v(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),uFe=v(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),Aue=v(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),hFe=v(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),TM=function(){function t(a,s,o,l,u,h,f){let d=s.append("text").attr("x",o+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(a);i(d,f)}v(t,"byText");function e(a,s,o,l,u,h,f,d){let{actorFontSize:p,actorFontFamily:g,actorFontWeight:m}=d,[y,x]=Ro(p),b=a.split(Xe.lineBreakRegex);for(let w=0;wt.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:v(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:v(function(t){this.boxes.push(t)},"addBox"),addActor:v(function(t){this.actors.push(t)},"addActor"),addLoop:v(function(t){this.loops.push(t)},"addLoop"),addMessage:v(function(t){this.messages.push(t)},"addMessage"),addNote:v(function(t){this.notes.push(t)},"addNote"),lastActor:v(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:v(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:v(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:v(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:v(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Rue(pe())},"init"),updateVal:v(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:v(function(t,e,r,n){let i=this,a=0;function s(o){return v(function(u){a++;let h=i.sequenceItems.length-a+1;i.updateVal(u,"starty",e-h*Le.boxMargin,Math.min),i.updateVal(u,"stopy",n+h*Le.boxMargin,Math.max),i.updateVal(Qe.data,"startx",t-h*Le.boxMargin,Math.min),i.updateVal(Qe.data,"stopx",r+h*Le.boxMargin,Math.max),o!=="activation"&&(i.updateVal(u,"startx",t-h*Le.boxMargin,Math.min),i.updateVal(u,"stopx",r+h*Le.boxMargin,Math.max),i.updateVal(Qe.data,"starty",e-h*Le.boxMargin,Math.min),i.updateVal(Qe.data,"stopy",n+h*Le.boxMargin,Math.max))},"updateItemBounds")}v(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:v(function(t,e,r,n){let i=Xe.getMin(t,r),a=Xe.getMax(t,r),s=Xe.getMin(e,n),o=Xe.getMax(e,n);this.updateVal(Qe.data,"startx",i,Math.min),this.updateVal(Qe.data,"starty",s,Math.min),this.updateVal(Qe.data,"stopx",a,Math.max),this.updateVal(Qe.data,"stopy",o,Math.max),this.updateBounds(i,s,a,o)},"insert"),newActivation:v(function(t,e,r){let n=r.get(t.from),i=XT(t.from).length||0,a=n.x+n.width/2+(i-1)*Le.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Le.activationWidth,stopy:void 0,actor:t.from,anchored:hi.anchorElement(e)})},"newActivation"),endActivation:v(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:v(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:v(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:v(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:v(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:v(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:Qe.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:v(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:v(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:v(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=Xe.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:v(function(){return this.verticalPos},"getVerticalPos"),getBounds:v(function(){return{bounds:this.data,models:this.models}},"getBounds")},dFe=v(async function(t,e){Qe.bumpVerticalPos(Le.boxMargin),e.height=Le.boxMargin,e.starty=Qe.getVerticalPos();let r=Tc();r.x=e.startx,r.y=e.starty,r.width=e.width||Le.width,r.class="note";let n=t.append("g"),i=hi.drawRect(n,r),a=Lw();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Le.noteFontFamily,a.fontSize=Le.noteFontSize,a.fontWeight=Le.noteFontWeight,a.anchor=Le.noteAlign,a.textMargin=Le.noteMargin,a.valign="center";let s=Ei(a.text)?await qT(n,a):_m(n,a),o=Math.round(s.map(l=>(l._groups||l)[0][0].getBBox().height).reduce((l,u)=>l+u));i.attr("height",o+2*Le.noteMargin),e.height+=o+2*Le.noteMargin,Qe.bumpVerticalPos(o+2*Le.noteMargin),e.stopy=e.starty+o+2*Le.noteMargin,e.stopx=e.startx+r.width,Qe.insert(e.startx,e.starty,e.stopx,e.stopy),Qe.models.addNote(e)},"drawNote"),x0=v(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),Am=v(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),yM=v(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");v(_ue,"boundMessage");pFe=v(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:o,type:l,sequenceIndex:u,sequenceVisible:h}=e,f=Ut.calculateTextDimensions(o,x0(Le)),d=Lw();d.x=i,d.y=s+10,d.width=a-i,d.class="messageText",d.dy="1em",d.text=o,d.fontFamily=Le.messageFontFamily,d.fontSize=Le.messageFontSize,d.fontWeight=Le.messageFontWeight,d.anchor=Le.messageAlign,d.valign="center",d.textMargin=Le.wrapPadding,d.tspan=!1,Ei(d.text)?await qT(t,d,{startx:i,stopx:a,starty:r}):_m(t,d);let p=f.width,g;i===a?Le.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+Xe.getMax(Le.width/2,p/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),l===n.db.LINETYPE.DOTTED||l===n.db.LINETYPE.DOTTED_CROSS||l===n.db.LINETYPE.DOTTED_POINT||l===n.db.LINETYPE.DOTTED_OPEN||l===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let m="";Le.arrowMarkerAbsolute&&(m=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,m=m.replace(/\(/g,"\\("),m=m.replace(/\)/g,"\\)")),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(l===n.db.LINETYPE.SOLID||l===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("+m+"#arrowhead)"),(l===n.db.LINETYPE.BIDIRECTIONAL_SOLID||l===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("+m+"#arrowhead)"),g.attr("marker-end","url("+m+"#arrowhead)")),(l===n.db.LINETYPE.SOLID_POINT||l===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("+m+"#filled-head)"),(l===n.db.LINETYPE.SOLID_CROSS||l===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("+m+"#crosshead)"),(h||Le.showSequenceNumbers)&&(g.attr("marker-start","url("+m+"#sequencenumber)"),t.append("text").attr("x",i).attr("y",r+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(u))},"drawMessage"),gFe=v(function(t,e,r,n,i,a,s){let o=0,l=0,u,h=0;for(let f of n){let d=e.get(f),p=d.box;u&&u!=p&&(s||Qe.models.addBox(u),l+=Le.boxMargin+u.margin),p&&p!=u&&(s||(p.x=o+l,p.y=i),l+=p.margin),d.width=d.width||Le.width,d.height=Xe.getMax(d.height||Le.height,Le.height),d.margin=d.margin||Le.actorMargin,h=Xe.getMax(h,d.height),r.get(d.name)&&(l+=d.width/2),d.x=o+l,d.starty=Qe.getVerticalPos(),Qe.insert(d.x,i,d.x+d.width,d.height),o+=d.width+l,d.box&&(d.box.width=o+p.margin-d.box.x),l=d.margin,u=d.box,Qe.models.addActor(d)}u&&!s&&Qe.models.addBox(u),Qe.bumpVerticalPos(h)},"addActorRenderingData"),xM=v(async function(t,e,r,n){if(n){let i=0;Qe.bumpVerticalPos(Le.boxMargin*2);for(let a of r){let s=e.get(a);s.stopy||(s.stopy=Qe.getVerticalPos());let o=await hi.drawActor(t,s,Le,!0);i=Xe.getMax(i,o)}Qe.bumpVerticalPos(i+Le.boxMargin)}else for(let i of r){let a=e.get(i);await hi.drawActor(t,a,Le,!1)}},"drawActors"),Lue=v(function(t,e,r,n){let i=0,a=0;for(let s of r){let o=e.get(s),l=vFe(o),u=hi.drawPopup(t,o,l,Le,Le.forceMenus,n);u.height>i&&(i=u.height),u.width+o.x>a&&(a=u.width+o.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),Rue=v(function(t){Hn(Le,t),t.fontFamily&&(Le.actorFontFamily=Le.noteFontFamily=Le.messageFontFamily=t.fontFamily),t.fontSize&&(Le.actorFontSize=Le.noteFontSize=Le.messageFontSize=t.fontSize),t.fontWeight&&(Le.actorFontWeight=Le.noteFontWeight=Le.messageFontWeight=t.fontWeight)},"setConf"),XT=v(function(t){return Qe.activations.filter(function(e){return e.actor===t})},"actorActivations"),pue=v(function(t,e){let r=e.get(t),n=XT(t),i=n.reduce(function(s,o){return Xe.getMin(s,o.startx)},r.x+r.width/2-1),a=n.reduce(function(s,o){return Xe.getMax(s,o.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");v(Il,"adjustLoopHeightForWrap");v(Nue,"adjustCreatedDestroyedData");mFe=v(async function(t,e,r,n){let{securityLevel:i,sequence:a}=pe();Le=a;let s;i==="sandbox"&&(s=Ve("#i"+e));let o=i==="sandbox"?Ve(s.nodes()[0].contentDocument.body):Ve("body"),l=i==="sandbox"?s.nodes()[0].contentDocument:document;Qe.init(),re.debug(n.db);let u=i==="sandbox"?o.select(`[id="${e}"]`):Ve(`[id="${e}"]`),h=n.db.getActors(),f=n.db.getCreatedActors(),d=n.db.getDestroyedActors(),p=n.db.getBoxes(),g=n.db.getActorKeys(),m=n.db.getMessages(),y=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),w=await Iue(h,m,n);if(Le.height=await Mue(h,w,p),hi.insertComputerIcon(u),hi.insertDatabaseIcon(u),hi.insertClockIcon(u),x&&(Qe.bumpVerticalPos(Le.boxMargin),b&&Qe.bumpVerticalPos(p[0].textMaxHeight)),Le.hideUnusedParticipants===!0){let B=new Set;m.forEach(P=>{B.add(P.from),B.add(P.to)}),g=g.filter(P=>B.has(P))}gFe(u,h,f,g,0,m,!1);let _=await bFe(m,h,w,n);hi.insertArrowHead(u),hi.insertArrowCrossHead(u),hi.insertArrowFilledHead(u),hi.insertSequenceNumber(u);function k(B,P){let $=Qe.endActivation(B);$.starty+18>P&&($.starty=P-6,P+=12),hi.drawActivation(u,$,P,Le,XT(B.from).length),Qe.insert($.startx,P-10,$.stopx,P)}v(k,"activeEnd");let E=1,L=1,S=[],C=[],M=0;for(let B of m){let P,$,z;switch(B.type){case n.db.LINETYPE.NOTE:Qe.resetVerticalPos(),$=B.noteModel,await dFe(u,$);break;case n.db.LINETYPE.ACTIVE_START:Qe.newActivation(B,u,h);break;case n.db.LINETYPE.ACTIVE_END:k(B,Qe.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H));break;case n.db.LINETYPE.LOOP_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"loop",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;case n.db.LINETYPE.RECT_START:Il(_,B,Le.boxMargin,Le.boxMargin,H=>Qe.newLoop(void 0,H.message));break;case n.db.LINETYPE.RECT_END:P=Qe.endLoop(),C.push(P),Qe.models.addLoop(P),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos());break;case n.db.LINETYPE.OPT_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H));break;case n.db.LINETYPE.OPT_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"opt",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;case n.db.LINETYPE.ALT_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H));break;case n.db.LINETYPE.ALT_ELSE:Il(_,B,Le.boxMargin+Le.boxTextMargin,Le.boxMargin,H=>Qe.addSectionToLoop(H));break;case n.db.LINETYPE.ALT_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"alt",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H)),Qe.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:Il(_,B,Le.boxMargin+Le.boxTextMargin,Le.boxMargin,H=>Qe.addSectionToLoop(H));break;case n.db.LINETYPE.PAR_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"par",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;case n.db.LINETYPE.AUTONUMBER:E=B.message.start||E,L=B.message.step||L,B.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H));break;case n.db.LINETYPE.CRITICAL_OPTION:Il(_,B,Le.boxMargin+Le.boxTextMargin,Le.boxMargin,H=>Qe.addSectionToLoop(H));break;case n.db.LINETYPE.CRITICAL_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"critical",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;case n.db.LINETYPE.BREAK_START:Il(_,B,Le.boxMargin,Le.boxMargin+Le.boxTextMargin,H=>Qe.newLoop(H));break;case n.db.LINETYPE.BREAK_END:P=Qe.endLoop(),await hi.drawLoop(u,P,"break",Le),Qe.bumpVerticalPos(P.stopy-Qe.getVerticalPos()),Qe.models.addLoop(P);break;default:try{z=B.msgModel,z.starty=Qe.getVerticalPos(),z.sequenceIndex=E,z.sequenceVisible=n.db.showSequenceNumbers();let H=await _ue(u,z);Nue(B,z,H,M,h,f,d),S.push({messageModel:z,lineStartY:H}),Qe.models.addMessage(z)}catch(H){re.error("error while drawing message",H)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(B.type)&&(E=E+L),M++}re.debug("createdActors",f),re.debug("destroyedActors",d),await xM(u,h,g,!1);for(let B of S)await pFe(u,B.messageModel,B.lineStartY,n);Le.mirrorActors&&await xM(u,h,g,!0),C.forEach(B=>hi.drawBackgroundRect(u,B)),Sue(u,h,g,Le);for(let B of Qe.models.boxes)B.height=Qe.getVerticalPos()-B.y,Qe.insert(B.x,B.y,B.x+B.width,B.height),B.startx=B.x,B.starty=B.y,B.stopx=B.startx+B.width,B.stopy=B.starty+B.height,B.stroke="rgb(0,0,0, 0.5)",hi.drawBox(u,B,Le);x&&Qe.bumpVerticalPos(Le.boxMargin);let R=Lue(u,h,g,l),{bounds:T}=Qe.getBounds();T.startx===void 0&&(T.startx=0),T.starty===void 0&&(T.starty=0),T.stopx===void 0&&(T.stopx=0),T.stopy===void 0&&(T.stopy=0);let I=T.stopy-T.starty;I2,f=v(m=>o?-m:m,"adjustValue");t.from===t.to?u=l:(t.activate&&!h&&(u+=f(Le.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(u+=f(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(l-=f(3)));let d=[n,i,a,s],p=Math.abs(l-u);t.wrap&&t.message&&(t.message=Ut.wrapLabel(t.message,Xe.getMax(p+2*Le.wrapPadding,Le.width),x0(Le)));let g=Ut.calculateTextDimensions(t.message,x0(Le));return{width:Xe.getMax(t.wrap?0:g.width+2*Le.wrapPadding,p+2*Le.wrapPadding,Le.width),height:0,startx:l,stopx:u,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,d),toBounds:Math.max.apply(null,d)}},"buildMessageModel"),bFe=v(async function(t,e,r,n){let i={},a=[],s,o,l;for(let u of t){switch(u.id=Ut.random({length:10}),u.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:u.id,msg:u.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:u.message&&(s=a.pop(),i[s.id]=s,i[u.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let f=e.get(u.from?u.from:u.to.actor),d=XT(u.from?u.from:u.to.actor).length,p=f.x+f.width/2+(d-1)*Le.activationWidth/2,g={startx:p,stopx:p+Le.activationWidth,actor:u.from,enabled:!0};Qe.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let f=Qe.activations.map(d=>d.actor).lastIndexOf(u.from);Qe.activations.splice(f,1).splice(0,1)}break}u.placement!==void 0?(o=await yFe(u,e,n),u.noteModel=o,a.forEach(f=>{s=f,s.from=Xe.getMin(s.from,o.startx),s.to=Xe.getMax(s.to,o.startx+o.width),s.width=Xe.getMax(s.width,Math.abs(s.from-s.to))-Le.labelBoxWidth})):(l=xFe(u,e,n),u.msgModel=l,l.startx&&l.stopx&&a.length>0&&a.forEach(f=>{if(s=f,l.startx===l.stopx){let d=e.get(u.from),p=e.get(u.to);s.from=Xe.getMin(d.x-l.width/2,d.x-d.width/2,s.from),s.to=Xe.getMax(p.x+l.width/2,p.x+d.width/2,s.to),s.width=Xe.getMax(s.width,Math.abs(s.to-s.from))-Le.labelBoxWidth}else s.from=Xe.getMin(l.startx,s.from),s.to=Xe.getMax(l.stopx,s.to),s.width=Xe.getMax(s.width,l.width)-Le.labelBoxWidth}))}return Qe.activations=[],re.debug("Loop type widths:",i),i},"calculateLoopBounds"),wFe={bounds:Qe,drawActors:xM,drawActorsPopup:Lue,setConf:Rue,draw:mFe},kFe={parser:TBe,db:fue,renderer:wFe,styles:YBe,init:v(({wrap:t})=>{fue.setWrap(t)},"init")}});function CM(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}var EM,jT,Pue,Bue,KT,ZT,An,Fue,rx,Rm,zue,Ml,SM,nx,b0,w0,TFe,Lm,$ue,Gue,EFe,SFe,CFe,AFe,_Fe,LFe,RFe,Uue,NFe,IFe,MFe,AM,DFe,OFe,PFe,BFe,FFe,zFe,$Fe,GFe,hf,Vue,_M,Wue,UFe,VFe,WFe,HFe,qFe,YFe,XFe,Nm,jFe,QT,KFe,ZFe,QFe,JT,LM=F(()=>{Kh();Nu();kn();or();lr();EM=function(){var t=v(function(Pe,xe,q,de){for(q=q||{},de=Pe.length;de--;q[Pe[de]]=xe);return q},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],o=[1,24],l=[1,25],u=[1,32],h=[1,33],f=[1,34],d=[1,45],p=[1,35],g=[1,36],m=[1,37],y=[1,38],x=[1,27],b=[1,28],w=[1,29],_=[1,30],k=[1,31],E=[1,44],L=[1,46],S=[1,43],C=[1,47],M=[1,9],R=[1,8,9],T=[1,58],I=[1,59],A=[1,60],D=[1,61],N=[1,62],O=[1,63],B=[1,64],P=[1,8,9,41],$=[1,76],z=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],H=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],J=[13,58,84,99,101,102],X=[13,58,71,72,84,99,101,102],oe=[13,58,66,67,68,69,70,84,99,101,102],K=[1,98],ee=[1,115],Q=[1,107],W=[1,113],Y=[1,108],Z=[1,109],se=[1,110],ce=[1,111],ue=[1,112],te=[1,114],Ne=[22,58,59,80,84,85,86,87,88,89],ae=[1,8,9,39,41,44],we=[1,8,9,22],Ie=[1,143],Ee=[1,8,9,59],Oe=[1,8,9,22,58,59,80,84,85,86,87,88,89],De={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,DOT:17,className:18,classLiteralName:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,6],[43,2],[43,3],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:v(function(xe,q,de,ie,he,U,ke){var j=U.length-1;switch(he){case 8:this.$=U[j-1];break;case 9:case 12:case 14:this.$=U[j];break;case 10:case 13:this.$=U[j-2]+"."+U[j];break;case 11:case 15:this.$=U[j-1]+U[j];break;case 16:case 17:this.$=U[j-1]+"~"+U[j]+"~";break;case 18:ie.addRelation(U[j]);break;case 19:U[j-1].title=ie.cleanupLabel(U[j]),ie.addRelation(U[j-1]);break;case 30:this.$=U[j].trim(),ie.setAccTitle(this.$);break;case 31:case 32:this.$=U[j].trim(),ie.setAccDescription(this.$);break;case 33:ie.addClassesToNamespace(U[j-3],U[j-1]);break;case 34:ie.addClassesToNamespace(U[j-4],U[j-1]);break;case 35:this.$=U[j],ie.addNamespace(U[j]);break;case 36:this.$=[U[j]];break;case 37:this.$=[U[j-1]];break;case 38:U[j].unshift(U[j-2]),this.$=U[j];break;case 40:ie.setCssClass(U[j-2],U[j]);break;case 41:ie.addMembers(U[j-3],U[j-1]);break;case 42:ie.setCssClass(U[j-5],U[j-3]),ie.addMembers(U[j-5],U[j-1]);break;case 43:this.$=U[j],ie.addClass(U[j]);break;case 44:this.$=U[j-1],ie.addClass(U[j-1]),ie.setClassLabel(U[j-1],U[j]);break;case 45:ie.addAnnotation(U[j],U[j-2]);break;case 46:case 59:this.$=[U[j]];break;case 47:U[j].push(U[j-1]),this.$=U[j];break;case 48:break;case 49:ie.addMember(U[j-1],ie.cleanupLabel(U[j]));break;case 50:break;case 51:break;case 52:this.$={id1:U[j-2],id2:U[j],relation:U[j-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:U[j-3],id2:U[j],relation:U[j-1],relationTitle1:U[j-2],relationTitle2:"none"};break;case 54:this.$={id1:U[j-3],id2:U[j],relation:U[j-2],relationTitle1:"none",relationTitle2:U[j-1]};break;case 55:this.$={id1:U[j-4],id2:U[j],relation:U[j-2],relationTitle1:U[j-3],relationTitle2:U[j-1]};break;case 56:ie.addNote(U[j],U[j-1]);break;case 57:ie.addNote(U[j]);break;case 58:this.$=U[j-2],ie.defineClass(U[j-1],U[j]);break;case 60:this.$=U[j-2].concat([U[j]]);break;case 61:ie.setDirection("TB");break;case 62:ie.setDirection("BT");break;case 63:ie.setDirection("RL");break;case 64:ie.setDirection("LR");break;case 65:this.$={type1:U[j-2],type2:U[j],lineType:U[j-1]};break;case 66:this.$={type1:"none",type2:U[j],lineType:U[j-1]};break;case 67:this.$={type1:U[j-1],type2:"none",lineType:U[j]};break;case 68:this.$={type1:"none",type2:"none",lineType:U[j]};break;case 69:this.$=ie.relationType.AGGREGATION;break;case 70:this.$=ie.relationType.EXTENSION;break;case 71:this.$=ie.relationType.COMPOSITION;break;case 72:this.$=ie.relationType.DEPENDENCY;break;case 73:this.$=ie.relationType.LOLLIPOP;break;case 74:this.$=ie.lineType.LINE;break;case 75:this.$=ie.lineType.DOTTED_LINE;break;case 76:case 82:this.$=U[j-2],ie.setClickEvent(U[j-1],U[j]);break;case 77:case 83:this.$=U[j-3],ie.setClickEvent(U[j-2],U[j-1]),ie.setTooltip(U[j-2],U[j]);break;case 78:this.$=U[j-2],ie.setLink(U[j-1],U[j]);break;case 79:this.$=U[j-3],ie.setLink(U[j-2],U[j-1],U[j]);break;case 80:this.$=U[j-3],ie.setLink(U[j-2],U[j-1]),ie.setTooltip(U[j-2],U[j]);break;case 81:this.$=U[j-4],ie.setLink(U[j-3],U[j-2],U[j]),ie.setTooltip(U[j-3],U[j-1]);break;case 84:this.$=U[j-3],ie.setClickEvent(U[j-2],U[j-1],U[j]);break;case 85:this.$=U[j-4],ie.setClickEvent(U[j-3],U[j-2],U[j-1]),ie.setTooltip(U[j-3],U[j]);break;case 86:this.$=U[j-3],ie.setLink(U[j-2],U[j]);break;case 87:this.$=U[j-4],ie.setLink(U[j-3],U[j-1],U[j]);break;case 88:this.$=U[j-4],ie.setLink(U[j-3],U[j-1]),ie.setTooltip(U[j-3],U[j]);break;case 89:this.$=U[j-5],ie.setLink(U[j-4],U[j-2],U[j]),ie.setTooltip(U[j-4],U[j-1]);break;case 90:this.$=U[j-2],ie.setCssStyle(U[j-1],U[j]);break;case 91:ie.setCssClass(U[j-1],U[j]);break;case 92:this.$=[U[j]];break;case 93:U[j-2].push(U[j]),this.$=U[j-2];break;case 95:this.$=U[j-1]+U[j];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:o,50:l,52:u,54:h,55:f,58:d,60:p,61:g,62:m,63:y,73:x,74:b,76:w,80:_,81:k,84:E,99:L,101:S,102:C},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(M,[2,5],{8:[1,48]}),{8:[1,49]},t(R,[2,18],{22:[1,50]}),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(R,[2,23]),t(R,[2,24]),t(R,[2,25]),t(R,[2,26]),t(R,[2,27]),t(R,[2,28]),t(R,[2,29]),{34:[1,51]},{36:[1,52]},t(R,[2,32]),t(R,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:T,67:I,68:A,69:D,70:N,71:O,72:B}),{39:[1,65]},t(P,[2,39],{39:[1,67],44:[1,66]}),t(R,[2,50]),t(R,[2,51]),{16:68,58:d,84:E,99:L,101:S},{16:39,18:69,19:40,58:d,84:E,99:L,101:S,102:C},{16:39,18:70,19:40,58:d,84:E,99:L,101:S,102:C},{16:39,18:71,19:40,58:d,84:E,99:L,101:S,102:C},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:d,84:E,99:L,101:S,102:C},{13:$,53:75},{56:77,58:[1,78]},t(R,[2,61]),t(R,[2,62]),t(R,[2,63]),t(R,[2,64]),t(z,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:d,84:E,99:L,101:S,102:C}),t(z,[2,14],{20:[1,82]}),{15:83,16:84,58:d,84:E,99:L,101:S},{16:39,18:85,19:40,58:d,84:E,99:L,101:S,102:C},t(H,[2,118]),t(H,[2,119]),t(H,[2,120]),t(H,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(M,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:r,37:n,42:i,46:a,47:s,49:o,50:l,52:u,54:h,55:f,58:d,60:p,61:g,62:m,63:y,73:x,74:b,76:w,80:_,81:k,84:E,99:L,101:S,102:C}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:o,50:l,52:u,54:h,55:f,58:d,60:p,61:g,62:m,63:y,73:x,74:b,76:w,80:_,81:k,84:E,99:L,101:S,102:C},t(R,[2,19]),t(R,[2,30]),t(R,[2,31]),{13:[1,89],16:39,18:88,19:40,58:d,84:E,99:L,101:S,102:C},{51:90,64:56,65:57,66:T,67:I,68:A,69:D,70:N,71:O,72:B},t(R,[2,49]),{65:91,71:O,72:B},t(J,[2,68],{64:92,66:T,67:I,68:A,69:D,70:N}),t(X,[2,69]),t(X,[2,70]),t(X,[2,71]),t(X,[2,72]),t(X,[2,73]),t(oe,[2,74]),t(oe,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:d,84:E,99:L,101:S},{45:97,49:K},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:ee,57:104,58:Q,80:W,82:105,83:106,84:Y,85:Z,86:se,87:ce,88:ue,89:te},{58:[1,116]},{13:$,53:117},t(R,[2,57]),t(R,[2,123]),{22:ee,57:118,58:Q,59:[1,119],80:W,82:105,83:106,84:Y,85:Z,86:se,87:ce,88:ue,89:te},t(Ne,[2,59]),{16:39,18:120,19:40,58:d,84:E,99:L,101:S,102:C},t(z,[2,15]),t(z,[2,16]),t(z,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:d,84:E,99:L,101:S},t(ae,[2,43],{11:123,12:[1,124]}),t(M,[2,7]),{9:[1,125]},t(we,[2,52]),{16:39,18:126,19:40,58:d,84:E,99:L,101:S,102:C},{13:[1,128],16:39,18:127,19:40,58:d,84:E,99:L,101:S,102:C},t(J,[2,67],{64:129,66:T,67:I,68:A,69:D,70:N}),t(J,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(P,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:K},{16:39,18:136,19:40,58:d,84:E,99:L,101:S,102:C},t(R,[2,76],{13:[1,137]}),t(R,[2,78],{13:[1,139],75:[1,138]}),t(R,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(R,[2,90],{59:Ie}),t(Ee,[2,92],{83:144,22:ee,58:Q,80:W,84:Y,85:Z,86:se,87:ce,88:ue,89:te}),t(Oe,[2,94]),t(Oe,[2,96]),t(Oe,[2,97]),t(Oe,[2,98]),t(Oe,[2,99]),t(Oe,[2,100]),t(Oe,[2,101]),t(Oe,[2,102]),t(Oe,[2,103]),t(Oe,[2,104]),t(R,[2,91]),t(R,[2,56]),t(R,[2,58],{59:Ie}),{58:[1,145]},t(z,[2,13]),{15:146,16:84,58:d,84:E,99:L,101:S},{39:[2,11]},t(ae,[2,44]),{13:[1,147]},{1:[2,4]},t(we,[2,54]),t(we,[2,53]),{16:39,18:148,19:40,58:d,84:E,99:L,101:S,102:C},t(J,[2,65]),t(R,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:K},t(P,[2,41]),{41:[2,47]},t(R,[2,45]),t(R,[2,77]),t(R,[2,79]),t(R,[2,80],{75:[1,152]}),t(R,[2,83]),t(R,[2,84],{13:[1,153]}),t(R,[2,86],{13:[1,155],75:[1,154]}),{22:ee,58:Q,80:W,82:156,83:106,84:Y,85:Z,86:se,87:ce,88:ue,89:te},t(Oe,[2,95]),t(Ne,[2,60]),{39:[2,10]},{14:[1,157]},t(we,[2,55]),t(R,[2,34]),{41:[2,38]},{41:[1,158]},t(R,[2,81]),t(R,[2,85]),t(R,[2,87]),t(R,[2,88],{75:[1,159]}),t(Ee,[2,93],{83:144,22:ee,58:Q,80:W,84:Y,85:Z,86:se,87:ce,88:ue,89:te}),t(ae,[2,8]),t(P,[2,42]),t(R,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:v(function(xe,q){if(q.recoverable)this.trace(xe);else{var de=new Error(xe);throw de.hash=q,de}},"parseError"),parse:v(function(xe){var q=this,de=[0],ie=[],he=[null],U=[],ke=this.table,j="",ye=0,Ae=0,Ge=0,Fe=2,ge=1,$e=U.slice.call(arguments,1),Ce=Object.create(this.lexer),qe={yy:{}};for(var lt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,lt)&&(qe.yy[lt]=this.yy[lt]);Ce.setInput(xe,qe.yy),qe.yy.lexer=Ce,qe.yy.parser=this,typeof Ce.yylloc>"u"&&(Ce.yylloc={});var xt=Ce.yylloc;U.push(xt);var ft=Ce.options&&Ce.options.ranges;typeof qe.yy.parseError=="function"?this.parseError=qe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ze(Qt){de.length=de.length-2*Qt,he.length=he.length-Qt,U.length=U.length-Qt}v(Ze,"popStack");function st(){var Qt;return Qt=ie.pop()||Ce.lex()||ge,typeof Qt!="number"&&(Qt instanceof Array&&(ie=Qt,Qt=ie.pop()),Qt=q.symbols_[Qt]||Qt),Qt}v(st,"lex");for(var Ue,Ke,it,mt,Ht,ot,et={},ht,bt,tt,_t;;){if(it=de[de.length-1],this.defaultActions[it]?mt=this.defaultActions[it]:((Ue===null||typeof Ue>"u")&&(Ue=st()),mt=ke[it]&&ke[it][Ue]),typeof mt>"u"||!mt.length||!mt[0]){var ur="";_t=[];for(ht in ke[it])this.terminals_[ht]&&ht>Fe&&_t.push("'"+this.terminals_[ht]+"'");Ce.showPosition?ur="Parse error on line "+(ye+1)+`: `+Ce.showPosition()+` Expecting `+_t.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":ur="Parse error on line "+(ye+1)+": Unexpected "+(Ue==ge?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(ur,{text:Ce.match,token:this.terminals_[Ue]||Ue,line:Ce.yylineno,loc:xt,expected:_t})}if(mt[0]instanceof Array&&mt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+it+", token: "+Ue);switch(mt[0]){case 1:de.push(Ue),he.push(Ce.yytext),U.push(Ce.yylloc),de.push(mt[1]),Ue=null,Ke?(Ue=Ke,Ke=null):(Ae=Ce.yyleng,j=Ce.yytext,ye=Ce.yylineno,xt=Ce.yylloc,Ge>0&&Ge--);break;case 2:if(bt=this.productions_[mt[1]][1],et.$=he[he.length-bt],et._$={first_line:U[U.length-(bt||1)].first_line,last_line:U[U.length-1].last_line,first_column:U[U.length-(bt||1)].first_column,last_column:U[U.length-1].last_column},ft&&(et._$.range=[U[U.length-(bt||1)].range[0],U[U.length-1].range[1]]),ot=this.performAction.apply(et,[j,Ae,ye,qe.yy,mt[1],he,U].concat($e)),typeof ot<"u")return ot;bt&&(de=de.slice(0,-1*bt*2),he=he.slice(0,-1*bt),U=U.slice(0,-1*bt)),de.push(this.productions_[mt[1]][0]),he.push(et.$),U.push(et._$),tt=ke[de[de.length-2]][de[de.length-1]],de.push(tt);break;case 3:return!0}}return!0},"parse")},We=function(){var Pe={EOF:1,parseError:v(function(q,de){if(this.yy.parser)this.yy.parser.parseError(q,de);else throw new Error(q)},"parseError"),setInput:v(function(xe,q){return this.yy=q||this.yy||{},this._input=xe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var xe=this._input[0];this.yytext+=xe,this.yyleng++,this.offset++,this.match+=xe,this.matched+=xe;var q=xe.match(/(?:\r\n?|\n).*/g);return q?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),xe},"input"),unput:v(function(xe){var q=xe.length,de=xe.split(/(?:\r\n?|\n)/g);this._input=xe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-q),this.offset-=q;var ie=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),de.length-1&&(this.yylineno-=de.length-1);var he=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:de?(de.length===ie.length?this.yylloc.first_column:0)+ie[ie.length-de.length].length-de[0].length:this.yylloc.first_column-q},this.options.ranges&&(this.yylloc.range=[he[0],he[0]+this.yyleng-q]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(xe){this.unput(this.match.slice(xe))},"less"),pastInput:v(function(){var xe=this.matched.substr(0,this.matched.length-this.match.length);return(xe.length>20?"...":"")+xe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var xe=this.match;return xe.length<20&&(xe+=this._input.substr(0,20-xe.length)),(xe.substr(0,20)+(xe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var xe=this.pastInput(),q=new Array(xe.length+1).join("-");return xe+this.upcomingInput()+` `+q+"^"},"showPosition"),test_match:v(function(xe,q){var de,ie,he;if(this.options.backtrack_lexer&&(he={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(he.yylloc.range=this.yylloc.range.slice(0))),ie=xe[0].match(/(?:\r\n?|\n).*/g),ie&&(this.yylineno+=ie.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ie?ie[ie.length-1].length-ie[ie.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+xe[0].length},this.yytext+=xe[0],this.match+=xe[0],this.matches=xe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(xe[0].length),this.matched+=xe[0],de=this.performAction.call(this,this.yy,this,q,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),de)return de;if(this._backtrack){for(var U in he)this[U]=he[U];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var xe,q,de,ie;this._more||(this.yytext="",this.match="");for(var he=this._currentRules(),U=0;Uq[0].length)){if(q=de,ie=U,this.options.backtrack_lexer){if(xe=this.test_match(de,he[U]),xe!==!1)return xe;if(this._backtrack){q=!1;continue}else return!1}else if(!this.options.flex)break}return q?(xe=this.test_match(q,he[ie]),xe!==!1?xe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var q=this.next();return q||this.lex()},"lex"),begin:v(function(q){this.conditionStack.push(q)},"begin"),popState:v(function(){var q=this.conditionStack.length-1;return q>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(q){return q=this.conditionStack.length-1-Math.abs(q||0),q>=0?this.conditionStack[q]:"INITIAL"},"topState"),pushState:v(function(q){this.begin(q)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:v(function(q,de,ie,he){var U=he;switch(ie){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 22:this.popState();break;case 23:return 78;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 75;case 65:return 75;case 66:return 75;case 67:return 75;case 68:return 67;case 69:return 67;case 70:return 69;case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:return 88;case 85:return 88;case 86:return 89;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:return 87;case 96:return 87;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Pe}();De.lexer=We;function Re(){this.yy={}}return v(Re,"Parser"),Re.prototype=De,De.Parser=Re,new Re}();EM.parser=EM;jT=EM,Pue=["#","+","~","-",""],Bue=class{static{v(this,"ClassMember")}constructor(t,e){this.memberType=e,this.visibility="",this.classifier="",this.text="";let r=yr(t,pe());this.parseMember(r)}getDisplayDetails(){let t=this.visibility+iu(this.id);this.memberType==="method"&&(t+=`(${iu(this.parameters.trim())})`,this.returnType&&(t+=" : "+iu(this.returnType))),t=t.trim();let e=this.parseClassifier();return{displayText:t,cssStyle:e}}parseMember(t){let e="";if(this.memberType==="method"){let i=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(t);if(i){let a=i[1]?i[1].trim():"";if(Pue.includes(a)&&(this.visibility=a),this.id=i[2],this.parameters=i[3]?i[3].trim():"",e=i[4]?i[4].trim():"",this.returnType=i[5]?i[5].trim():"",e===""){let s=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(s)&&(e=s,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let n=t.length,i=t.substring(0,1),a=t.substring(n-1);Pue.includes(i)&&(this.visibility=i),/[$*]/.exec(a)&&(e=a),this.id=t.substring(this.visibility===""?0:1,e===""?n:n-1)}this.classifier=e,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let r=`${this.visibility?"\\"+this.visibility:""}${iu(this.id)}${this.memberType==="method"?`(${iu(this.parameters)})${this.returnType?" : "+iu(this.returnType):""}`:""}`;this.text=r.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}},KT="classId-",ZT=[],An=new Map,Fue=new Map,rx=[],Rm=[],zue=0,Ml=new Map,SM=0,nx=[],b0=v(t=>Xe.sanitizeText(t,pe()),"sanitizeText"),w0=v(function(t){let e=Xe.sanitizeText(t,pe()),r="",n=e;if(e.indexOf("~")>0){let i=e.split("~");n=b0(i[0]),r=b0(i[1])}return{className:n,type:r}},"splitClassNameAndType"),TFe=v(function(t,e){let r=Xe.sanitizeText(t,pe());e&&(e=b0(e));let{className:n}=w0(r);An.get(n).label=e,An.get(n).text=`${e}${An.get(n).type?`<${An.get(n).type}>`:""}`},"setClassLabel"),Lm=v(function(t){let e=Xe.sanitizeText(t,pe()),{className:r,type:n}=w0(e);if(An.has(r))return;let i=Xe.sanitizeText(r,pe());An.set(i,{id:i,type:n,label:i,text:`${i}${n?`<${n}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:KT+i+"-"+zue}),zue++},"addClass"),$ue=v(function(t,e){let r={id:`interface${Rm.length}`,label:t,classId:e};Rm.push(r)},"addInterface"),Gue=v(function(t){let e=Xe.sanitizeText(t,pe());if(An.has(e))return An.get(e).domId;throw new Error("Class not found: "+e)},"lookUpDomId"),EFe=v(function(){ZT=[],An=new Map,rx=[],Rm=[],nx=[],nx.push(Vue),Ml=new Map,SM=0,_M="TB",xr()},"clear"),SFe=v(function(t){return An.get(t)},"getClass"),CFe=v(function(){return An},"getClasses"),AFe=v(function(){return ZT},"getRelations"),_Fe=v(function(){return rx},"getNotes"),LFe=v(function(t){re.debug("Adding relation: "+JSON.stringify(t));let e=[hf.LOLLIPOP,hf.AGGREGATION,hf.COMPOSITION,hf.DEPENDENCY,hf.EXTENSION];t.relation.type1===hf.LOLLIPOP&&!e.includes(t.relation.type2)?(Lm(t.id2),$ue(t.id1,t.id2),t.id1=`interface${Rm.length-1}`):t.relation.type2===hf.LOLLIPOP&&!e.includes(t.relation.type1)?(Lm(t.id1),$ue(t.id2,t.id1),t.id2=`interface${Rm.length-1}`):(Lm(t.id1),Lm(t.id2)),t.id1=w0(t.id1).className,t.id2=w0(t.id2).className,t.relationTitle1=Xe.sanitizeText(t.relationTitle1.trim(),pe()),t.relationTitle2=Xe.sanitizeText(t.relationTitle2.trim(),pe()),ZT.push(t)},"addRelation"),RFe=v(function(t,e){let r=w0(t).className;An.get(r).annotations.push(e)},"addAnnotation"),Uue=v(function(t,e){Lm(t);let r=w0(t).className,n=An.get(r);if(typeof e=="string"){let i=e.trim();i.startsWith("<<")&&i.endsWith(">>")?n.annotations.push(b0(i.substring(2,i.length-2))):i.indexOf(")")>0?n.methods.push(new Bue(i,"method")):i&&n.members.push(new Bue(i,"attribute"))}},"addMember"),NFe=v(function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach(r=>Uue(t,r)))},"addMembers"),IFe=v(function(t,e){let r={id:`note${rx.length}`,class:e,text:t};rx.push(r)},"addNote"),MFe=v(function(t){return t.startsWith(":")&&(t=t.substring(1)),b0(t.trim())},"cleanupLabel"),AM=v(function(t,e){t.split(",").forEach(function(r){let n=r;/\d/.exec(r[0])&&(n=KT+n);let i=An.get(n);i&&(i.cssClasses+=" "+e)})},"setCssClass"),DFe=v(function(t,e){for(let r of t){let n=Fue.get(r);n===void 0&&(n={id:r,styles:[],textStyles:[]},Fue.set(r,n)),e&&e.forEach(function(i){if(/color/.exec(i)){let a=i.replace("fill","bgFill");n.textStyles.push(a)}n.styles.push(i)}),An.forEach(i=>{i.cssClasses.includes(r)&&i.styles.push(...e.flatMap(a=>a.split(",")))})}},"defineClass"),OFe=v(function(t,e){t.split(",").forEach(function(r){e!==void 0&&(An.get(r).tooltip=b0(e))})},"setTooltip"),PFe=v(function(t,e){return e&&Ml.has(e)?Ml.get(e).classes.get(t).tooltip:An.get(t).tooltip},"getTooltip"),BFe=v(function(t,e,r){let n=pe();t.split(",").forEach(function(i){let a=i;/\d/.exec(i[0])&&(a=KT+a);let s=An.get(a);s&&(s.link=Ut.formatUrl(e,n),n.securityLevel==="sandbox"?s.linkTarget="_top":typeof r=="string"?s.linkTarget=b0(r):s.linkTarget="_blank")}),AM(t,"clickable")},"setLink"),FFe=v(function(t,e,r){t.split(",").forEach(function(n){zFe(n,e,r),An.get(n).haveCallback=!0}),AM(t,"clickable")},"setClickEvent"),zFe=v(function(t,e,r){let n=Xe.sanitizeText(t,pe());if(pe().securityLevel!=="loose"||e===void 0)return;let a=n;if(An.has(a)){let s=Gue(a),o=[];if(typeof r=="string"){o=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l")),i.classed("hover",!0)}).on("mouseout",function(){e.transition().duration(500).style("opacity",0),Ve(this).classed("hover",!1)})},"setupToolTips");nx.push(Vue);_M="TB",Wue=v(()=>_M,"getDirection"),UFe=v(t=>{_M=t},"setDirection"),VFe=v(function(t){Ml.has(t)||(Ml.set(t,{id:t,classes:new Map,children:{},domId:KT+t+"-"+SM}),SM++)},"addNamespace"),WFe=v(function(t){return Ml.get(t)},"getNamespace"),HFe=v(function(){return Ml},"getNamespaces"),qFe=v(function(t,e){if(Ml.has(t))for(let r of e){let{className:n}=w0(r);An.get(n).parent=t,Ml.get(t).classes.set(n,An.get(n))}},"addClassesToNamespace"),YFe=v(function(t,e){let r=An.get(t);if(!(!e||!r))for(let n of e)n.includes(",")?r.styles.push(...n.split(",")):r.styles.push(n)},"setCssStyle");v(CM,"getArrowMarker");XFe=v(()=>{let t=[],e=[],r=pe();for(let i of Ml.keys()){let a=Ml.get(i);if(a){let s={id:a.id,label:a.id,isGroup:!0,padding:r.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:r.look};t.push(s)}}for(let i of An.keys()){let a=An.get(i);if(a){let s=a;s.parentId=a.parent,s.look=r.look,t.push(s)}}let n=0;for(let i of rx){n++;let a={id:i.id,label:i.text,isGroup:!1,shape:"note",padding:r.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${r.themeVariables.noteBkgColor}`,`stroke: ${r.themeVariables.noteBorderColor}`],look:r.look};t.push(a);let s=An.get(i.class)?.id??"";if(s){let o={id:`edgeNote${n}`,start:i.id,end:s,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:r.look};e.push(o)}}for(let i of Rm){let a={id:i.id,label:i.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:r.look};t.push(a)}n=0;for(let i of ZT){n++;let a={id:V3(i.id1,i.id2,{prefix:"id",counter:n}),start:i.id1,end:i.id2,type:"normal",label:i.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:CM(i.relation.type1),arrowTypeEnd:CM(i.relation.type2),startLabelRight:i.relationTitle1==="none"?"":i.relationTitle1,endLabelLeft:i.relationTitle2==="none"?"":i.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:i.style||"",pattern:i.relation.lineType==1?"dashed":"solid",look:r.look};e.push(a)}return{nodes:t,edges:e,other:{},config:r,direction:Wue()}},"getData"),Nm={setAccTitle:Tr,getAccTitle:_r,getAccDescription:Rr,setAccDescription:Lr,getConfig:v(()=>pe().class,"getConfig"),addClass:Lm,bindFunctions:$Fe,clear:EFe,getClass:SFe,getClasses:CFe,getNotes:_Fe,addAnnotation:RFe,addNote:IFe,getRelations:AFe,addRelation:LFe,getDirection:Wue,setDirection:UFe,addMember:Uue,addMembers:NFe,cleanupLabel:MFe,lineType:GFe,relationType:hf,setClickEvent:FFe,setCssClass:AM,defineClass:DFe,setLink:BFe,getTooltip:PFe,setTooltip:OFe,lookUpDomId:Gue,setDiagramTitle:tn,getDiagramTitle:qr,setClassLabel:TFe,addNamespace:VFe,addClassesToNamespace:qFe,getNamespace:WFe,getNamespaces:HFe,setCssStyle:YFe,getData:XFe},jFe=v(t=>`g.classGroup text { fill: ${t.nodeBorder||t.classText}; stroke: none; font-family: ${t.fontFamily}; font-size: 10px; .title { font-weight: bolder; } } .nodeLabel, .edgeLabel { color: ${t.classText}; } .edgeLabel .label rect { fill: ${t.mainBkg}; } .label text { fill: ${t.classText}; } .labelBkg { background: ${t.mainBkg}; } .edgeLabel .label span { background: ${t.mainBkg}; } .classTitle { font-weight: bolder; } .node rect, .node circle, .node ellipse, .node polygon, .node path { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; stroke-width: 1px; } .divider { stroke: ${t.nodeBorder}; stroke-width: 1; } g.clickable { cursor: pointer; } g.classGroup rect { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; } g.classGroup line { stroke: ${t.nodeBorder}; stroke-width: 1; } .classLabel .box { stroke: none; stroke-width: 0; fill: ${t.mainBkg}; opacity: 0.5; } .classLabel .label { fill: ${t.nodeBorder}; font-size: 10px; } .relation { stroke: ${t.lineColor}; stroke-width: 1; fill: none; } .dashed-line{ stroke-dasharray: 3; } .dotted-line{ stroke-dasharray: 1 2; } #compositionStart, .composition { fill: ${t.lineColor} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #compositionEnd, .composition { fill: ${t.lineColor} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #dependencyStart, .dependency { fill: ${t.lineColor} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #dependencyStart, .dependency { fill: ${t.lineColor} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #extensionStart, .extension { fill: transparent !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #extensionEnd, .extension { fill: transparent !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #aggregationStart, .aggregation { fill: transparent !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #aggregationEnd, .aggregation { fill: transparent !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #lollipopStart, .lollipop { fill: ${t.mainBkg} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } #lollipopEnd, .lollipop { fill: ${t.mainBkg} !important; stroke: ${t.lineColor} !important; stroke-width: 1; } .edgeTerminals { font-size: 11px; line-height: initial; } .classTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } `,"getStyles"),QT=jFe,KFe=v((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),ZFe=v(function(t,e){return e.db.getClasses()},"getClasses"),QFe=v(async function(t,e,r,n){re.info("REF0:"),re.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=pe(),o=n.db.getData(),l=Ag(e,i);o.type=n.type,o.layoutAlgorithm=vw(s),o.nodeSpacing=a?.nodeSpacing||50,o.rankSpacing=a?.rankSpacing||50,o.markers=["aggregation","extension","composition","dependency","lollipop"],o.diagramId=e,await kg(o,l);let u=8;Ut.insertTitle(l,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),_g(l,u,"classDiagram",a?.useMaxWidth??!0)},"draw"),JT={getClasses:ZFe,draw:QFe,getDir:KFe}});var Hue={};vr(Hue,{diagram:()=>JFe});var JFe,que=F(()=>{LM();Kh();Nu();_u();yl();sl();pc();bo();Ya();kn();or();JFe={parser:jT,db:Nm,renderer:JT,styles:QT,init:v(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Nm.clear()},"init")}});var Yue={};vr(Yue,{diagram:()=>eze});var eze,Xue=F(()=>{LM();Kh();Nu();_u();yl();sl();pc();bo();Ya();kn();or();eze={parser:jT,db:Nm,renderer:JT,styles:QT,init:v(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Nm.clear()},"init")}});function r6(t="",e=0,r="",n=OM){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${xze}-${t}${i}-${e}`}function ix(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{if(r.get(i)){let a=r.get(i);e.cssCompiledStyles=[...e.cssCompiledStyles,...a.styles]}}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function phe(t){return t?.classes?.join(" ")??""}function ghe(t){return t?.styles??[]}function BM(){return new Map}function l6(t=""){let e=t;return t===PM&&(sx++,e=`${mhe}${sx}`),e}function c6(t="",e=ox){return t===PM?mhe:e}function The(t=""){let e=t;return t===vhe&&(sx++,e=`${yhe}${sx}`),e}function Ehe(t="",e=ox){return t===vhe?yhe:e}function She(t,e,r){let n=l6(t.id.trim()),i=c6(t.id.trim(),t.type),a=l6(e.id.trim()),s=c6(e.id.trim(),e.type);df(n,i,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),df(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),Ps.relations.push({id1:n,id2:a,relationTitle:Xe.sanitizeText(r,pe())})}var IM,u6,tze,rhe,i6,DM,rze,nze,ize,ox,nhe,ihe,ahe,she,ohe,lhe,RM,NM,aze,sze,jue,Kue,oze,lze,lx,cze,uze,che,hze,fze,dze,pze,gze,mze,vze,yze,uhe,hhe,xze,OM,bze,Zue,fhe,wze,kze,dhe,t6,ff,Tze,Que,ax,Eze,PM,mhe,vhe,yhe,Jue,ehe,Sze,Cze,a6,FM,xhe,s6,Im,bhe,o6,Ps,sx,the,Aze,_ze,e6,Lze,Rze,n6,zM,Nze,df,whe,k0,khe,Ize,Mze,Che,MM,Dze,Oze,Ahe,Pze,$M,Bze,Fze,zze,$ze,Gze,Uze,Dl,Vze,h6,GM=F(()=>{Kh();Nu();kn();or();IM=function(){var t=v(function(B,P,$,z){for($=$||{},z=B.length;z--;$[B[z]]=P);return $},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],o=[1,16],l=[1,17],u=[1,18],h=[1,19],f=[1,32],d=[1,20],p=[1,21],g=[1,22],m=[1,23],y=[1,24],x=[1,26],b=[1,27],w=[1,28],_=[1,29],k=[1,30],E=[1,31],L=[1,34],S=[1,35],C=[1,36],M=[1,37],R=[1,33],T=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],I=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],A=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],D={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,style:42,STYLE_IDS:43,STYLEDEF_STYLEOPTS:44,class:45,CLASSENTITY_IDS:46,STYLECLASS:47,direction_tb:48,direction_bt:49,direction_rl:50,direction_lr:51,eol:52,";":53,EDGE_STATE:54,STYLE_SEPARATOR:55,left_of:56,right_of:57,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"style",43:"STYLE_IDS",44:"STYLEDEF_STYLEOPTS",45:"class",46:"CLASSENTITY_IDS",47:"STYLECLASS",48:"direction_tb",49:"direction_bt",50:"direction_rl",51:"direction_lr",53:";",54:"EDGE_STATE",55:"STYLE_SEPARATOR",56:"left_of",57:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[52,1],[52,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:v(function(P,$,z,H,J,X,oe){var K=X.length-1;switch(J){case 3:return H.setRootDoc(X[K]),X[K];break;case 4:this.$=[];break;case 5:X[K]!="nl"&&(X[K-1].push(X[K]),this.$=X[K-1]);break;case 6:case 7:this.$=X[K];break;case 8:this.$="nl";break;case 12:this.$=X[K];break;case 13:let Y=X[K-1];Y.description=H.trimColon(X[K]),this.$=Y;break;case 14:this.$={stmt:"relation",state1:X[K-2],state2:X[K]};break;case 15:let Z=H.trimColon(X[K]);this.$={stmt:"relation",state1:X[K-3],state2:X[K-1],description:Z};break;case 19:this.$={stmt:"state",id:X[K-3],type:"default",description:"",doc:X[K-1]};break;case 20:var ee=X[K],Q=X[K-2].trim();if(X[K].match(":")){var W=X[K].split(":");ee=W[0],Q=[Q,W[1]]}this.$={stmt:"state",id:ee,type:"default",description:Q};break;case 21:this.$={stmt:"state",id:X[K-3],type:"default",description:X[K-5],doc:X[K-1]};break;case 22:this.$={stmt:"state",id:X[K],type:"fork"};break;case 23:this.$={stmt:"state",id:X[K],type:"join"};break;case 24:this.$={stmt:"state",id:X[K],type:"choice"};break;case 25:this.$={stmt:"state",id:H.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:X[K-1].trim(),note:{position:X[K-2].trim(),text:X[K].trim()}};break;case 29:this.$=X[K].trim(),H.setAccTitle(this.$);break;case 30:case 31:this.$=X[K].trim(),H.setAccDescription(this.$);break;case 32:case 33:this.$={stmt:"classDef",id:X[K-1].trim(),classes:X[K].trim()};break;case 34:this.$={stmt:"style",id:X[K-1].trim(),styleClass:X[K].trim()};break;case 35:this.$={stmt:"applyClass",id:X[K-1].trim(),styleClass:X[K].trim()};break;case 36:H.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 37:H.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 38:H.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 39:H.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 42:case 43:this.$={stmt:"state",id:X[K].trim(),type:"default",description:""};break;case 44:this.$={stmt:"state",id:X[K-2].trim(),classes:[X[K].trim()],type:"default",description:""};break;case 45:this.$={stmt:"state",id:X[K-2].trim(),classes:[X[K].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:o,17:l,19:u,22:h,24:f,25:d,26:p,27:g,28:m,29:y,32:25,33:x,35:b,37:w,38:_,42:k,45:E,48:L,49:S,50:C,51:M,54:R},t(T,[2,5]),{9:38,10:12,11:13,12:14,13:15,16:o,17:l,19:u,22:h,24:f,25:d,26:p,27:g,28:m,29:y,32:25,33:x,35:b,37:w,38:_,42:k,45:E,48:L,49:S,50:C,51:M,54:R},t(T,[2,7]),t(T,[2,8]),t(T,[2,9]),t(T,[2,10]),t(T,[2,11]),t(T,[2,12],{14:[1,39],15:[1,40]}),t(T,[2,16]),{18:[1,41]},t(T,[2,18],{20:[1,42]}),{23:[1,43]},t(T,[2,22]),t(T,[2,23]),t(T,[2,24]),t(T,[2,25]),{30:44,31:[1,45],56:[1,46],57:[1,47]},t(T,[2,28]),{34:[1,48]},{36:[1,49]},t(T,[2,31]),{39:[1,50],41:[1,51]},{43:[1,52]},{46:[1,53]},t(I,[2,42],{55:[1,54]}),t(I,[2,43],{55:[1,55]}),t(T,[2,36]),t(T,[2,37]),t(T,[2,38]),t(T,[2,39]),t(T,[2,6]),t(T,[2,13]),{13:56,24:f,54:R},t(T,[2,17]),t(A,i,{7:57}),{24:[1,58]},{24:[1,59]},{23:[1,60]},{24:[2,46]},{24:[2,47]},t(T,[2,29]),t(T,[2,30]),{40:[1,61]},{40:[1,62]},{44:[1,63]},{47:[1,64]},{24:[1,65]},{24:[1,66]},t(T,[2,14],{14:[1,67]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:o,17:l,19:u,21:[1,68],22:h,24:f,25:d,26:p,27:g,28:m,29:y,32:25,33:x,35:b,37:w,38:_,42:k,45:E,48:L,49:S,50:C,51:M,54:R},t(T,[2,20],{20:[1,69]}),{31:[1,70]},{24:[1,71]},t(T,[2,32]),t(T,[2,33]),t(T,[2,34]),t(T,[2,35]),t(I,[2,44]),t(I,[2,45]),t(T,[2,15]),t(T,[2,19]),t(A,i,{7:72}),t(T,[2,26]),t(T,[2,27]),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:o,17:l,19:u,21:[1,73],22:h,24:f,25:d,26:p,27:g,28:m,29:y,32:25,33:x,35:b,37:w,38:_,42:k,45:E,48:L,49:S,50:C,51:M,54:R},t(T,[2,21])],defaultActions:{5:[2,1],6:[2,2],46:[2,46],47:[2,47]},parseError:v(function(P,$){if($.recoverable)this.trace(P);else{var z=new Error(P);throw z.hash=$,z}},"parseError"),parse:v(function(P){var $=this,z=[0],H=[],J=[null],X=[],oe=this.table,K="",ee=0,Q=0,W=0,Y=2,Z=1,se=X.slice.call(arguments,1),ce=Object.create(this.lexer),ue={yy:{}};for(var te in this.yy)Object.prototype.hasOwnProperty.call(this.yy,te)&&(ue.yy[te]=this.yy[te]);ce.setInput(P,ue.yy),ue.yy.lexer=ce,ue.yy.parser=this,typeof ce.yylloc>"u"&&(ce.yylloc={});var Ne=ce.yylloc;X.push(Ne);var ae=ce.options&&ce.options.ranges;typeof ue.yy.parseError=="function"?this.parseError=ue.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function we(ke){z.length=z.length-2*ke,J.length=J.length-ke,X.length=X.length-ke}v(we,"popStack");function Ie(){var ke;return ke=H.pop()||ce.lex()||Z,typeof ke!="number"&&(ke instanceof Array&&(H=ke,ke=H.pop()),ke=$.symbols_[ke]||ke),ke}v(Ie,"lex");for(var Ee,Oe,De,We,Re,Pe,xe={},q,de,ie,he;;){if(De=z[z.length-1],this.defaultActions[De]?We=this.defaultActions[De]:((Ee===null||typeof Ee>"u")&&(Ee=Ie()),We=oe[De]&&oe[De][Ee]),typeof We>"u"||!We.length||!We[0]){var U="";he=[];for(q in oe[De])this.terminals_[q]&&q>Y&&he.push("'"+this.terminals_[q]+"'");ce.showPosition?U="Parse error on line "+(ee+1)+`: `+ce.showPosition()+` Expecting `+he.join(", ")+", got '"+(this.terminals_[Ee]||Ee)+"'":U="Parse error on line "+(ee+1)+": Unexpected "+(Ee==Z?"end of input":"'"+(this.terminals_[Ee]||Ee)+"'"),this.parseError(U,{text:ce.match,token:this.terminals_[Ee]||Ee,line:ce.yylineno,loc:Ne,expected:he})}if(We[0]instanceof Array&&We.length>1)throw new Error("Parse Error: multiple actions possible at state: "+De+", token: "+Ee);switch(We[0]){case 1:z.push(Ee),J.push(ce.yytext),X.push(ce.yylloc),z.push(We[1]),Ee=null,Oe?(Ee=Oe,Oe=null):(Q=ce.yyleng,K=ce.yytext,ee=ce.yylineno,Ne=ce.yylloc,W>0&&W--);break;case 2:if(de=this.productions_[We[1]][1],xe.$=J[J.length-de],xe._$={first_line:X[X.length-(de||1)].first_line,last_line:X[X.length-1].last_line,first_column:X[X.length-(de||1)].first_column,last_column:X[X.length-1].last_column},ae&&(xe._$.range=[X[X.length-(de||1)].range[0],X[X.length-1].range[1]]),Pe=this.performAction.apply(xe,[K,Q,ee,ue.yy,We[1],J,X].concat(se)),typeof Pe<"u")return Pe;de&&(z=z.slice(0,-1*de*2),J=J.slice(0,-1*de),X=X.slice(0,-1*de)),z.push(this.productions_[We[1]][0]),J.push(xe.$),X.push(xe._$),ie=oe[z[z.length-2]][z[z.length-1]],z.push(ie);break;case 3:return!0}}return!0},"parse")},N=function(){var B={EOF:1,parseError:v(function($,z){if(this.yy.parser)this.yy.parser.parseError($,z);else throw new Error($)},"parseError"),setInput:v(function(P,$){return this.yy=$||this.yy||{},this._input=P,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var P=this._input[0];this.yytext+=P,this.yyleng++,this.offset++,this.match+=P,this.matched+=P;var $=P.match(/(?:\r\n?|\n).*/g);return $?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),P},"input"),unput:v(function(P){var $=P.length,z=P.split(/(?:\r\n?|\n)/g);this._input=P+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-$),this.offset-=$;var H=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),z.length-1&&(this.yylineno-=z.length-1);var J=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:z?(z.length===H.length?this.yylloc.first_column:0)+H[H.length-z.length].length-z[0].length:this.yylloc.first_column-$},this.options.ranges&&(this.yylloc.range=[J[0],J[0]+this.yyleng-$]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(P){this.unput(this.match.slice(P))},"less"),pastInput:v(function(){var P=this.matched.substr(0,this.matched.length-this.match.length);return(P.length>20?"...":"")+P.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var P=this.match;return P.length<20&&(P+=this._input.substr(0,20-P.length)),(P.substr(0,20)+(P.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var P=this.pastInput(),$=new Array(P.length+1).join("-");return P+this.upcomingInput()+` `+$+"^"},"showPosition"),test_match:v(function(P,$){var z,H,J;if(this.options.backtrack_lexer&&(J={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(J.yylloc.range=this.yylloc.range.slice(0))),H=P[0].match(/(?:\r\n?|\n).*/g),H&&(this.yylineno+=H.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:H?H[H.length-1].length-H[H.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+P[0].length},this.yytext+=P[0],this.match+=P[0],this.matches=P,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(P[0].length),this.matched+=P[0],z=this.performAction.call(this,this.yy,this,$,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),z)return z;if(this._backtrack){for(var X in J)this[X]=J[X];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var P,$,z,H;this._more||(this.yytext="",this.match="");for(var J=this._currentRules(),X=0;X$[0].length)){if($=z,H=X,this.options.backtrack_lexer){if(P=this.test_match(z,J[X]),P!==!1)return P;if(this._backtrack){$=!1;continue}else return!1}else if(!this.options.flex)break}return $?(P=this.test_match($,J[H]),P!==!1?P:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var $=this.next();return $||this.lex()},"lex"),begin:v(function($){this.conditionStack.push($)},"begin"),popState:v(function(){var $=this.conditionStack.length-1;return $>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function($){return $=this.conditionStack.length-1-Math.abs($||0),$>=0?this.conditionStack[$]:"INITIAL"},"topState"),pushState:v(function($){this.begin($)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function($,z,H,J){var X=J;switch(H){case 0:return 41;case 1:return 48;case 2:return 49;case 3:return 50;case 4:return 51;case 5:break;case 6:break;case 7:return 5;case 8:break;case 9:break;case 10:break;case 11:break;case 12:return this.pushState("SCALE"),17;break;case 13:return 18;case 14:this.popState();break;case 15:return this.begin("acc_title"),33;break;case 16:return this.popState(),"acc_title_value";break;case 17:return this.begin("acc_descr"),35;break;case 18:return this.popState(),"acc_descr_value";break;case 19:this.begin("acc_descr_multiline");break;case 20:this.popState();break;case 21:return"acc_descr_multiline_value";case 22:return this.pushState("CLASSDEF"),38;break;case 23:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 24:return this.popState(),this.pushState("CLASSDEFID"),39;break;case 25:return this.popState(),40;break;case 26:return this.pushState("CLASS"),45;break;case 27:return this.popState(),this.pushState("CLASS_STYLE"),46;break;case 28:return this.popState(),47;break;case 29:return this.pushState("STYLE"),42;break;case 30:return this.popState(),this.pushState("STYLEDEF_STYLES"),43;break;case 31:return this.popState(),44;break;case 32:return this.pushState("SCALE"),17;break;case 33:return 18;case 34:this.popState();break;case 35:this.pushState("STATE");break;case 36:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),25;break;case 37:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),26;break;case 38:return this.popState(),z.yytext=z.yytext.slice(0,-10).trim(),27;break;case 39:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),z.yytext=z.yytext.slice(0,-10).trim(),27;break;case 42:return 48;case 43:return 49;case 44:return 50;case 45:return 51;case 46:this.pushState("STATE_STRING");break;case 47:return this.pushState("STATE_ID"),"AS";break;case 48:return this.popState(),"ID";break;case 49:this.popState();break;case 50:return"STATE_DESCR";case 51:return 19;case 52:this.popState();break;case 53:return this.popState(),this.pushState("struct"),20;break;case 54:break;case 55:return this.popState(),21;break;case 56:break;case 57:return this.begin("NOTE"),29;break;case 58:return this.popState(),this.pushState("NOTE_ID"),56;break;case 59:return this.popState(),this.pushState("NOTE_ID"),57;break;case 60:this.popState(),this.pushState("FLOATING_NOTE");break;case 61:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 62:break;case 63:return"NOTE_TEXT";case 64:return this.popState(),"ID";break;case 65:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 66:return this.popState(),z.yytext=z.yytext.substr(2).trim(),31;break;case 67:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),31;break;case 68:return 6;case 69:return 6;case 70:return 16;case 71:return 54;case 72:return 24;case 73:return z.yytext=z.yytext.trim(),14;break;case 74:return 15;case 75:return 28;case 76:return 55;case 77:return 5;case 78:return"INVALID"}},"anonymous"),rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[9,10],inclusive:!1},struct:{rules:[9,10,22,26,29,35,42,43,44,45,54,55,56,57,71,72,73,74,75],inclusive:!1},FLOATING_NOTE_ID:{rules:[64],inclusive:!1},FLOATING_NOTE:{rules:[61,62,63],inclusive:!1},NOTE_TEXT:{rules:[66,67],inclusive:!1},NOTE_ID:{rules:[65],inclusive:!1},NOTE:{rules:[58,59,60],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[31],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[30],inclusive:!1},CLASS_STYLE:{rules:[28],inclusive:!1},CLASS:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[25],inclusive:!1},CLASSDEF:{rules:[23,24],inclusive:!1},acc_descr_multiline:{rules:[20,21],inclusive:!1},acc_descr:{rules:[18],inclusive:!1},acc_title:{rules:[16],inclusive:!1},SCALE:{rules:[13,14,33,34],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[48],inclusive:!1},STATE_STRING:{rules:[49,50],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,36,37,38,39,40,41,46,47,51,52,53],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,10,11,12,15,17,19,22,26,29,32,35,53,57,68,69,70,71,72,73,74,76,77,78],inclusive:!0}}};return B}();D.lexer=N;function O(){this.yy={}}return v(O,"Parser"),O.prototype=D,D.Parser=O,new O}();IM.parser=IM;u6=IM,tze="LR",rhe="TB",i6="state",DM="relation",rze="classDef",nze="style",ize="applyClass",ox="default",nhe="divider",ihe="fill:none",ahe="fill: #333",she="c",ohe="text",lhe="normal",RM="rect",NM="rectWithTitle",aze="stateStart",sze="stateEnd",jue="divider",Kue="roundedWithTitle",oze="note",lze="noteGroup",lx="statediagram",cze="state",uze=`${lx}-${cze}`,che="transition",hze="note",fze="note-edge",dze=`${che} ${fze}`,pze=`${lx}-${hze}`,gze="cluster",mze=`${lx}-${gze}`,vze="cluster-alt",yze=`${lx}-${vze}`,uhe="parent",hhe="note",xze="state",OM="----",bze=`${OM}${hhe}`,Zue=`${OM}${uhe}`,fhe=v((t,e=rhe)=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),wze=v(function(t,e){return e.db.extract(e.db.getRootDocV2()),e.db.getClasses()},"getClasses"),kze=v(async function(t,e,r,n){re.info("REF0:"),re.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=pe();n.db.extract(n.db.getRootDocV2());let o=n.db.getData(),l=Ag(e,i);o.type=n.type,o.layoutAlgorithm=s,o.nodeSpacing=a?.nodeSpacing||50,o.rankSpacing=a?.rankSpacing||50,o.markers=["barb"],o.diagramId=e,await kg(o,l);let u=8;Ut.insertTitle(l,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),_g(l,u,lx,a?.useMaxWidth??!0)},"draw"),dhe={getClasses:wze,draw:kze,getDir:fhe},t6=new Map,ff=0;v(r6,"stateDomId");Tze=v((t,e,r,n,i,a,s,o)=>{re.trace("items",e),e.forEach(l=>{switch(l.stmt){case i6:ax(t,l,r,n,i,a,s,o);break;case ox:ax(t,l,r,n,i,a,s,o);break;case DM:{ax(t,l.state1,r,n,i,a,s,o),ax(t,l.state2,r,n,i,a,s,o);let u={id:"edge"+ff,start:l.state1.id,end:l.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:ihe,labelStyle:"",label:Xe.sanitizeText(l.description,pe()),arrowheadStyle:ahe,labelpos:she,labelType:ohe,thickness:lhe,classes:che,look:s};i.push(u),ff++}break}})},"setupDoc"),Que=v((t,e=rhe)=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");v(ix,"insertOrUpdateNode");v(phe,"getClassesFromDbInfo");v(ghe,"getStylesFromDbInfo");ax=v((t,e,r,n,i,a,s,o)=>{let l=e.id,u=r.get(l),h=phe(u),f=ghe(u);if(re.info("dataFetcher parsedItem",e,u,f),l!=="root"){let d=RM;e.start===!0?d=aze:e.start===!1&&(d=sze),e.type!==ox&&(d=e.type),t6.get(l)||t6.set(l,{id:l,shape:d,description:Xe.sanitizeText(l,pe()),cssClasses:`${h} ${uze}`,cssStyles:f});let p=t6.get(l);e.description&&(Array.isArray(p.description)?(p.shape=NM,p.description.push(e.description)):p.description?.length>0?(p.shape=NM,p.description===l?p.description=[e.description]:p.description=[p.description,e.description]):(p.shape=RM,p.description=e.description),p.description=Xe.sanitizeTextOrArray(p.description,pe())),p.description?.length===1&&p.shape===NM&&(p.type==="group"?p.shape=Kue:p.shape=RM),!p.type&&e.doc&&(re.info("Setting cluster for XCX",l,Que(e)),p.type="group",p.isGroup=!0,p.dir=Que(e),p.shape=e.type===nhe?jue:Kue,p.cssClasses=`${p.cssClasses} ${mze} ${a?yze:""}`);let g={labelStyle:"",shape:p.shape,label:p.description,cssClasses:p.cssClasses,cssCompiledStyles:[],cssStyles:p.cssStyles,id:l,dir:p.dir,domId:r6(l,ff),type:p.type,isGroup:p.type==="group",padding:8,rx:10,ry:10,look:s};if(g.shape===jue&&(g.label=""),t&&t.id!=="root"&&(re.trace("Setting node ",l," to be child of its parent ",t.id),g.parentId=t.id),g.centerLabel=!0,e.note){let m={labelStyle:"",shape:oze,label:e.note.text,cssClasses:pze,cssStyles:[],cssCompilesStyles:[],id:l+bze+"-"+ff,domId:r6(l,ff,hhe),type:p.type,isGroup:p.type==="group",padding:pe().flowchart.padding,look:s,position:e.note.position},y=l+Zue,x={labelStyle:"",shape:lze,label:e.note.text,cssClasses:p.cssClasses,cssStyles:[],id:l+Zue,domId:r6(l,ff,uhe),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};ff++,x.id=y,m.parentId=y,ix(n,x,o),ix(n,m,o),ix(n,g,o);let b=l,w=m.id;e.note.position==="left of"&&(b=m.id,w=l),i.push({id:b+"-"+w,start:b,end:w,arrowhead:"none",arrowTypeEnd:"",style:ihe,labelStyle:"",classes:dze,arrowheadStyle:ahe,labelpos:she,labelType:ohe,thickness:lhe,look:s})}else ix(n,g,o)}e.doc&&(re.trace("Adding nodes children "),Tze(e,e.doc,r,n,i,!a,s,o))},"dataFetcher"),Eze=v(()=>{t6.clear(),ff=0},"reset"),PM="[*]",mhe="start",vhe=PM,yhe="end",Jue="color",ehe="fill",Sze="bgFill",Cze=",";v(BM,"newClassesList");a6=[],FM=[],xhe=tze,s6=[],Im=BM(),bhe=v(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),o6={root:bhe()},Ps=o6.root,sx=0,the=0,Aze={LINE:0,DOTTED_LINE:1},_ze={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},e6=v(t=>JSON.parse(JSON.stringify(t)),"clone"),Lze=v(t=>{re.info("Setting root doc",t),s6=t},"setRootDoc"),Rze=v(()=>s6,"getRootDoc"),n6=v((t,e,r)=>{if(e.stmt===DM)n6(t,e.state1,!0),n6(t,e.state2,!1);else if(e.stmt===i6&&(e.id==="[*]"?(e.id=r?t.id+"_start":t.id+"_end",e.start=r):e.id=e.id.trim()),e.doc){let n=[],i=[],a;for(a=0;a0&&i.length>0){let s={stmt:i6,id:oA(),type:"divider",doc:e6(i)};n.push(e6(s)),e.doc=n}e.doc.forEach(s=>n6(e,s,!0))}},"docTranslator"),zM=v(()=>(n6({id:"root"},{id:"root",doc:s6},!0),{id:"root",doc:s6}),"getRootDocV2"),Nze=v(t=>{let e;t.doc?e=t.doc:e=t,re.info(e),whe(!0),re.info("Extract initial document:",e),e.forEach(a=>{switch(re.warn("Statement",a.stmt),a.stmt){case i6:df(a.id.trim(),a.type,a.doc,a.description,a.note,a.classes,a.styles,a.textStyles);break;case DM:Che(a.state1,a.state2,a.description);break;case rze:Ahe(a.id.trim(),a.classes);break;case nze:{let s=a.id.trim().split(","),o=a.styleClass.split(",");s.forEach(l=>{let u=k0(l);if(u===void 0){let h=l.trim();df(h),u=k0(h)}u.styles=o.map(h=>h.replace(/;/g,"")?.trim())})}break;case ize:$M(a.id.trim(),a.styleClass);break}});let r=khe(),i=pe().look;Eze(),ax(void 0,zM(),r,a6,FM,!0,i,Im),a6.forEach(a=>{if(Array.isArray(a.label)){if(a.description=a.label.slice(1),a.isGroup&&a.description.length>0)throw new Error("Group nodes can only have label. Remove the additional description for node ["+a.id+"]");a.label=a.label[0]}})},"extract"),df=v(function(t,e=ox,r=null,n=null,i=null,a=null,s=null,o=null){let l=t?.trim();if(Ps.states.has(l)?(Ps.states.get(l).doc||(Ps.states.get(l).doc=r),Ps.states.get(l).type||(Ps.states.get(l).type=e)):(re.info("Adding state ",l,n),Ps.states.set(l,{id:l,descriptions:[],type:e,doc:r,note:i,classes:[],styles:[],textStyles:[]})),n&&(re.info("Setting state description",l,n),typeof n=="string"&&MM(l,n.trim()),typeof n=="object"&&n.forEach(u=>MM(l,u.trim()))),i){let u=Ps.states.get(l);u.note=i,u.note.text=Xe.sanitizeText(u.note.text,pe())}a&&(re.info("Setting state classes",l,a),(typeof a=="string"?[a]:a).forEach(h=>$M(l,h.trim()))),s&&(re.info("Setting state styles",l,s),(typeof s=="string"?[s]:s).forEach(h=>Bze(l,h.trim()))),o&&(re.info("Setting state styles",l,s),(typeof o=="string"?[o]:o).forEach(h=>Fze(l,h.trim())))},"addState"),whe=v(function(t){a6=[],FM=[],o6={root:bhe()},Ps=o6.root,sx=0,Im=BM(),t||xr()},"clear"),k0=v(function(t){return Ps.states.get(t)},"getState"),khe=v(function(){return Ps.states},"getStates"),Ize=v(function(){re.info("Documents = ",o6)},"logDocuments"),Mze=v(function(){return Ps.relations},"getRelations");v(l6,"startIdIfNeeded");v(c6,"startTypeIfNeeded");v(The,"endIdIfNeeded");v(Ehe,"endTypeIfNeeded");v(She,"addRelationObjs");Che=v(function(t,e,r){if(typeof t=="object")She(t,e,r);else{let n=l6(t.trim()),i=c6(t),a=The(e.trim()),s=Ehe(e);df(n,i),df(a,s),Ps.relations.push({id1:n,id2:a,title:Xe.sanitizeText(r,pe())})}},"addRelation"),MM=v(function(t,e){let r=Ps.states.get(t),n=e.startsWith(":")?e.replace(":","").trim():e;r.descriptions.push(Xe.sanitizeText(n,pe()))},"addDescription"),Dze=v(function(t){return t.substring(0,1)===":"?t.substr(2).trim():t.trim()},"cleanupLabel"),Oze=v(()=>(the++,"divider-id-"+the),"getDividerId"),Ahe=v(function(t,e=""){Im.has(t)||Im.set(t,{id:t,styles:[],textStyles:[]});let r=Im.get(t);e?.split(Cze).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(Jue).exec(n)){let s=i.replace(ehe,Sze).replace(Jue,ehe);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),Pze=v(function(){return Im},"getClasses"),$M=v(function(t,e){t.split(",").forEach(function(r){let n=k0(r);if(n===void 0){let i=r.trim();df(i),n=k0(i)}n.classes.push(e)})},"setCssClass"),Bze=v(function(t,e){let r=k0(t);r!==void 0&&r.styles.push(e)},"setStyle"),Fze=v(function(t,e){let r=k0(t);r!==void 0&&r.textStyles.push(e)},"setTextStyle"),zze=v(()=>xhe,"getDirection"),$ze=v(t=>{xhe=t},"setDirection"),Gze=v(t=>t&&t[0]===":"?t.substr(1).trim():t.trim(),"trimColon"),Uze=v(()=>{let t=pe();return{nodes:a6,edges:FM,other:{},config:t,direction:fhe(zM())}},"getData"),Dl={getConfig:v(()=>pe().state,"getConfig"),getData:Uze,addState:df,clear:whe,getState:k0,getStates:khe,getRelations:Mze,getClasses:Pze,getDirection:zze,addRelation:Che,getDividerId:Oze,setDirection:$ze,cleanupLabel:Dze,lineType:Aze,relationType:_ze,logDocuments:Ize,getRootDoc:Rze,setRootDoc:Lze,getRootDocV2:zM,extract:Nze,trimColon:Gze,getAccTitle:_r,setAccTitle:Tr,getAccDescription:Rr,setAccDescription:Lr,addStyleClass:Ahe,setCssClass:$M,addDescription:MM,setDiagramTitle:tn,getDiagramTitle:qr},Vze=v(t=>` defs #statediagram-barbEnd { fill: ${t.transitionColor}; stroke: ${t.transitionColor}; } g.stateGroup text { fill: ${t.nodeBorder}; stroke: none; font-size: 10px; } g.stateGroup text { fill: ${t.textColor}; stroke: none; font-size: 10px; } g.stateGroup .state-title { font-weight: bolder; fill: ${t.stateLabelColor}; } g.stateGroup rect { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; } g.stateGroup line { stroke: ${t.lineColor}; stroke-width: 1; } .transition { stroke: ${t.transitionColor}; stroke-width: 1; fill: none; } .stateGroup .composit { fill: ${t.background}; border-bottom: 1px } .stateGroup .alt-composit { fill: #e0e0e0; border-bottom: 1px } .state-note { stroke: ${t.noteBorderColor}; fill: ${t.noteBkgColor}; text { fill: ${t.noteTextColor}; stroke: none; font-size: 10px; } } .stateLabel .box { stroke: none; stroke-width: 0; fill: ${t.mainBkg}; opacity: 0.5; } .edgeLabel .label rect { fill: ${t.labelBackgroundColor}; opacity: 0.5; } .edgeLabel { background-color: ${t.edgeLabelBackground}; p { background-color: ${t.edgeLabelBackground}; } rect { opacity: 0.5; background-color: ${t.edgeLabelBackground}; fill: ${t.edgeLabelBackground}; } text-align: center; } .edgeLabel .label text { fill: ${t.transitionLabelColor||t.tertiaryTextColor}; } .label div .edgeLabel { color: ${t.transitionLabelColor||t.tertiaryTextColor}; } .stateLabel text { fill: ${t.stateLabelColor}; font-size: 10px; font-weight: bold; } .node circle.state-start { fill: ${t.specialStateColor}; stroke: ${t.specialStateColor}; } .node .fork-join { fill: ${t.specialStateColor}; stroke: ${t.specialStateColor}; } .node circle.state-end { fill: ${t.innerEndBackground}; stroke: ${t.background}; stroke-width: 1.5 } .end-state-inner { fill: ${t.compositeBackground||t.background}; // stroke: ${t.background}; stroke-width: 1.5 } .node rect { fill: ${t.stateBkg||t.mainBkg}; stroke: ${t.stateBorder||t.nodeBorder}; stroke-width: 1px; } .node polygon { fill: ${t.mainBkg}; stroke: ${t.stateBorder||t.nodeBorder};; stroke-width: 1px; } #statediagram-barbEnd { fill: ${t.lineColor}; } .statediagram-cluster rect { fill: ${t.compositeTitleBackground}; stroke: ${t.stateBorder||t.nodeBorder}; stroke-width: 1px; } .cluster-label, .nodeLabel { color: ${t.stateLabelColor}; // line-height: 1; } .statediagram-cluster rect.outer { rx: 5px; ry: 5px; } .statediagram-state .divider { stroke: ${t.stateBorder||t.nodeBorder}; } .statediagram-state .title-state { rx: 5px; ry: 5px; } .statediagram-cluster.statediagram-cluster .inner { fill: ${t.compositeBackground||t.background}; } .statediagram-cluster.statediagram-cluster-alt .inner { fill: ${t.altBackground?t.altBackground:"#efefef"}; } .statediagram-cluster .inner { rx:0; ry:0; } .statediagram-state rect.basic { rx: 5px; ry: 5px; } .statediagram-state rect.divider { stroke-dasharray: 10,10; fill: ${t.altBackground?t.altBackground:"#efefef"}; } .note-edge { stroke-dasharray: 5; } .statediagram-note rect { fill: ${t.noteBkgColor}; stroke: ${t.noteBorderColor}; stroke-width: 1px; rx: 0; ry: 0; } .statediagram-note rect { fill: ${t.noteBkgColor}; stroke: ${t.noteBorderColor}; stroke-width: 1px; rx: 0; ry: 0; } .statediagram-note text { fill: ${t.noteTextColor}; } .statediagram-note .nodeLabel { color: ${t.noteTextColor}; } .statediagram .edgeLabel { color: red; // ${t.noteTextColor}; } #dependencyStart, #dependencyEnd { fill: ${t.lineColor}; stroke: ${t.lineColor}; stroke-width: 1; } .statediagramTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } `,"getStyles"),h6=Vze});var Ihe={};vr(Ihe,{diagram:()=>c$e});var VM,Wze,Hze,Rhe,qze,Yze,Xze,jze,Kze,Zze,Qze,Jze,e$e,t$e,r$e,_he,Lhe,n$e,lo,UM,i$e,a$e,s$e,o$e,Nhe,l$e,c$e,Mhe=F(()=>{GM();Kh();Nu();_u();yl();sl();pc();bo();Ya();kn();or();lr();uy();As();lr();VM={},Wze=v((t,e)=>{VM[t]=e},"set"),Hze=v(t=>VM[t],"get"),Rhe=v(()=>Object.keys(VM),"keys"),qze=v(()=>Rhe().length,"size"),Yze={get:Hze,set:Wze,keys:Rhe,size:qze},Xze=v(t=>t.append("circle").attr("class","start-state").attr("r",pe().state.sizeUnit).attr("cx",pe().state.padding+pe().state.sizeUnit).attr("cy",pe().state.padding+pe().state.sizeUnit),"drawStartState"),jze=v(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",pe().state.textHeight).attr("class","divider").attr("x2",pe().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),Kze=v((t,e)=>{let r=t.append("text").attr("x",2*pe().state.padding).attr("y",pe().state.textHeight+2*pe().state.padding).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",pe().state.padding).attr("y",pe().state.padding).attr("width",n.width+2*pe().state.padding).attr("height",n.height+2*pe().state.padding).attr("rx",pe().state.radius),r},"drawSimpleState"),Zze=v((t,e)=>{let r=v(function(d,p,g){let m=d.append("tspan").attr("x",2*pe().state.padding).text(p);g||m.attr("dy",pe().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*pe().state.padding).attr("y",pe().state.textHeight+1.3*pe().state.padding).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",pe().state.padding).attr("y",a+pe().state.padding*.4+pe().state.dividerMargin+pe().state.textHeight).attr("class","state-description"),o=!0,l=!0;e.descriptions.forEach(function(d){o||(r(s,d,l),l=!1),o=!1});let u=t.append("line").attr("x1",pe().state.padding).attr("y1",pe().state.padding+a+pe().state.dividerMargin/2).attr("y2",pe().state.padding+a+pe().state.dividerMargin/2).attr("class","descr-divider"),h=s.node().getBBox(),f=Math.max(h.width,i.width);return u.attr("x2",f+3*pe().state.padding),t.insert("rect",":first-child").attr("x",pe().state.padding).attr("y",pe().state.padding).attr("width",f+2*pe().state.padding).attr("height",h.height+a+2*pe().state.padding).attr("rx",pe().state.radius),t},"drawDescrState"),Qze=v((t,e,r)=>{let n=pe().state.padding,i=2*pe().state.padding,a=t.node().getBBox(),s=a.width,o=a.x,l=t.append("text").attr("x",0).attr("y",pe().state.titleShift).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.id),h=l.node().getBBox().width+i,f=Math.max(h,s);f===s&&(f=f+i);let d,p=t.node().getBBox();e.doc,d=o-n,h>s&&(d=(s-f)/2+n),Math.abs(o-p.x)s&&(d=o-(h-s)/2);let g=1-pe().state.textHeight;return t.insert("rect",":first-child").attr("x",d).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",f).attr("height",p.height+pe().state.textHeight+pe().state.titleShift+1).attr("rx","0"),l.attr("x",d+n),h<=s&&l.attr("x",o+(f-i)/2-h/2+n),t.insert("rect",":first-child").attr("x",d).attr("y",pe().state.titleShift-pe().state.textHeight-pe().state.padding).attr("width",f).attr("height",pe().state.textHeight*3).attr("rx",pe().state.radius),t.insert("rect",":first-child").attr("x",d).attr("y",pe().state.titleShift-pe().state.textHeight-pe().state.padding).attr("width",f).attr("height",p.height+3+2*pe().state.textHeight).attr("rx",pe().state.radius),t},"addTitleAndBox"),Jze=v(t=>(t.append("circle").attr("class","end-state-outer").attr("r",pe().state.sizeUnit+pe().state.miniPadding).attr("cx",pe().state.padding+pe().state.sizeUnit+pe().state.miniPadding).attr("cy",pe().state.padding+pe().state.sizeUnit+pe().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",pe().state.sizeUnit).attr("cx",pe().state.padding+pe().state.sizeUnit+2).attr("cy",pe().state.padding+pe().state.sizeUnit+2)),"drawEndState"),e$e=v((t,e)=>{let r=pe().state.forkWidth,n=pe().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",pe().state.padding).attr("y",pe().state.padding)},"drawForkJoinState"),t$e=v((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let o=s.split(Xe.lineBreakRegex),l=1.25*pe().state.noteMargin;for(let u of o){let h=u.trim();if(h.length>0){let f=a.append("tspan");if(f.text(h),l===0){let d=f.node().getBBox();l+=d.height}i+=l,f.attr("x",e+pe().state.noteMargin),f.attr("y",r+i+1.25*pe().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),r$e=v((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",pe().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=t$e(t,0,0,n);return r.attr("height",a+2*pe().state.noteMargin),r.attr("width",i+pe().state.noteMargin*2),r},"drawNote"),_he=v(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&Xze(i),e.type==="end"&&Jze(i),(e.type==="fork"||e.type==="join")&&e$e(i,e),e.type==="note"&&r$e(e.note.text,i),e.type==="divider"&&jze(i),e.type==="default"&&e.descriptions.length===0&&Kze(i,e),e.type==="default"&&e.descriptions.length>0&&Zze(i,e);let a=i.node().getBBox();return n.width=a.width+2*pe().state.padding,n.height=a.height+2*pe().state.padding,Yze.set(r,n),n},"drawState"),Lhe=0,n$e=v(function(t,e,r){let n=v(function(l){switch(l){case Dl.relationType.AGGREGATION:return"aggregation";case Dl.relationType.EXTENSION:return"extension";case Dl.relationType.COMPOSITION:return"composition";case Dl.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(l=>!Number.isNaN(l.y));let i=e.points,a=ms().x(function(l){return l.x}).y(function(l){return l.y}).curve(gl),s=t.append("path").attr("d",a(i)).attr("id","edge"+Lhe).attr("class","transition"),o="";if(pe().state.arrowMarkerAbsolute&&(o=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,o=o.replace(/\(/g,"\\("),o=o.replace(/\)/g,"\\)")),s.attr("marker-end","url("+o+"#"+n(Dl.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let l=t.append("g").attr("class","stateLabel"),{x:u,y:h}=Ut.calcLabelPosition(e.points),f=Xe.getRows(r.title),d=0,p=[],g=0,m=0;for(let b=0;b<=f.length;b++){let w=l.append("text").attr("text-anchor","middle").text(f[b]).attr("x",u).attr("y",h+d),_=w.node().getBBox();g=Math.max(g,_.width),m=Math.min(m,_.x),re.info(_.x,u,h+d),d===0&&(d=w.node().getBBox().height,re.info("Title height",d,h)),p.push(w)}let y=d*f.length;if(f.length>1){let b=(f.length-1)*d*.5;p.forEach((w,_)=>w.attr("y",h+_*d-b)),y=d*f.length}let x=l.node().getBBox();l.insert("rect",":first-child").attr("class","box").attr("x",u-g/2-pe().state.padding/2).attr("y",h-y/2-pe().state.padding/2-3.5).attr("width",g+pe().state.padding).attr("height",y+pe().state.padding),re.info(x)}Lhe++},"drawEdge"),UM={},i$e=v(function(){},"setConf"),a$e=v(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),s$e=v(function(t,e,r,n){lo=pe().state;let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let s=i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body"),o=i==="sandbox"?a.nodes()[0].contentDocument:document;re.debug("Rendering diagram "+t);let l=s.select(`[id='${e}']`);a$e(l);let u=n.db.getRootDoc();Nhe(u,l,void 0,!1,s,o,n);let h=lo.padding,f=l.node().getBBox(),d=f.width+h*2,p=f.height+h*2,g=d*1.75;Hr(l,p,g,lo.useMaxWidth),l.attr("viewBox",`${f.x-lo.padding} ${f.y-lo.padding} `+d+" "+p)},"draw"),o$e=v(t=>t?t.length*lo.fontSizeFactor:1,"getLabelWidth"),Nhe=v((t,e,r,n,i,a,s)=>{let o=new Sr({compound:!0,multigraph:!0}),l,u=!0;for(l=0;l{let k=_.parentElement,E=0,L=0;k&&(k.parentElement&&(E=k.parentElement.getBBox().width),L=parseInt(k.getAttribute("data-x-shift"),10),Number.isNaN(L)&&(L=0)),_.setAttribute("x1",0-L+8),_.setAttribute("x2",E-L-8)})):re.debug("No Node "+b+": "+JSON.stringify(o.node(b)))});let y=m.getBBox();o.edges().forEach(function(b){b!==void 0&&o.edge(b)!==void 0&&(re.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(o.edge(b))),n$e(e,o.edge(b),o.edge(b).relation))}),y=m.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=y.width+2*lo.padding,x.height=y.height+2*lo.padding,re.debug("Doc rendered",x,o),x},"renderDoc"),l$e={setConf:i$e,draw:s$e},c$e={parser:u6,db:Dl,renderer:l$e,styles:h6,init:v(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Dl.clear()},"init")}});var Dhe={};vr(Dhe,{diagram:()=>u$e});var u$e,Ohe=F(()=>{GM();Kh();Nu();_u();yl();sl();pc();bo();Ya();kn();or();u$e={parser:u6,db:Dl,renderer:dhe,styles:h6,init:v(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Dl.clear()},"init")}});var Hhe={};vr(Hhe,{diagram:()=>N$e});function Whe(t){let e=pe().journey,r=60;Object.keys(Ku).forEach(n=>{let i=Ku[n].color,a={cx:20,cy:r,r:7,fill:i,stroke:"#000",pos:Ku[n].position};hx.drawCircle(t,a);let s={x:40,y:r+7,fill:"#666",text:n,textMargin:e.boxTextMargin|5};hx.drawText(t,s),r+=20})}var HM,h$e,Mm,qM,cx,ux,f$e,d$e,p$e,g$e,m$e,v$e,y$e,Phe,x$e,Bhe,b$e,w$e,YM,k$e,Ghe,Uhe,T$e,E$e,Fhe,S$e,C$e,Vhe,A$e,hx,_$e,Ku,f6,T0,L$e,jo,WM,zhe,R$e,$he,N$e,qhe=F(()=>{Rw();or();lr();lr();HM=function(){var t=v(function(f,d,p,g){for(p=p||{},g=f.length;g--;p[f[g]]=d);return p},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],o=[1,14],l={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:v(function(d,p,g,m,y,x,b){var w=x.length-1;switch(y){case 1:return x[w-1];case 2:this.$=[];break;case 3:x[w-1].push(x[w]),this.$=x[w-1];break;case 4:case 5:this.$=x[w];break;case 6:case 7:this.$=[];break;case 8:m.setDiagramTitle(x[w].substr(6)),this.$=x[w].substr(6);break;case 9:this.$=x[w].trim(),m.setAccTitle(this.$);break;case 10:case 11:this.$=x[w].trim(),m.setAccDescription(this.$);break;case 12:m.addSection(x[w].substr(8)),this.$=x[w].substr(8);break;case 13:m.addTask(x[w-1],x[w]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:o},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:o},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:v(function(d,p){if(p.recoverable)this.trace(d);else{var g=new Error(d);throw g.hash=p,g}},"parseError"),parse:v(function(d){var p=this,g=[0],m=[],y=[null],x=[],b=this.table,w="",_=0,k=0,E=0,L=2,S=1,C=x.slice.call(arguments,1),M=Object.create(this.lexer),R={yy:{}};for(var T in this.yy)Object.prototype.hasOwnProperty.call(this.yy,T)&&(R.yy[T]=this.yy[T]);M.setInput(d,R.yy),R.yy.lexer=M,R.yy.parser=this,typeof M.yylloc>"u"&&(M.yylloc={});var I=M.yylloc;x.push(I);var A=M.options&&M.options.ranges;typeof R.yy.parseError=="function"?this.parseError=R.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function D(W){g.length=g.length-2*W,y.length=y.length-W,x.length=x.length-W}v(D,"popStack");function N(){var W;return W=m.pop()||M.lex()||S,typeof W!="number"&&(W instanceof Array&&(m=W,W=m.pop()),W=p.symbols_[W]||W),W}v(N,"lex");for(var O,B,P,$,z,H,J={},X,oe,K,ee;;){if(P=g[g.length-1],this.defaultActions[P]?$=this.defaultActions[P]:((O===null||typeof O>"u")&&(O=N()),$=b[P]&&b[P][O]),typeof $>"u"||!$.length||!$[0]){var Q="";ee=[];for(X in b[P])this.terminals_[X]&&X>L&&ee.push("'"+this.terminals_[X]+"'");M.showPosition?Q="Parse error on line "+(_+1)+`: `+M.showPosition()+` Expecting `+ee.join(", ")+", got '"+(this.terminals_[O]||O)+"'":Q="Parse error on line "+(_+1)+": Unexpected "+(O==S?"end of input":"'"+(this.terminals_[O]||O)+"'"),this.parseError(Q,{text:M.match,token:this.terminals_[O]||O,line:M.yylineno,loc:I,expected:ee})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+P+", token: "+O);switch($[0]){case 1:g.push(O),y.push(M.yytext),x.push(M.yylloc),g.push($[1]),O=null,B?(O=B,B=null):(k=M.yyleng,w=M.yytext,_=M.yylineno,I=M.yylloc,E>0&&E--);break;case 2:if(oe=this.productions_[$[1]][1],J.$=y[y.length-oe],J._$={first_line:x[x.length-(oe||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(oe||1)].first_column,last_column:x[x.length-1].last_column},A&&(J._$.range=[x[x.length-(oe||1)].range[0],x[x.length-1].range[1]]),H=this.performAction.apply(J,[w,k,_,R.yy,$[1],y,x].concat(C)),typeof H<"u")return H;oe&&(g=g.slice(0,-1*oe*2),y=y.slice(0,-1*oe),x=x.slice(0,-1*oe)),g.push(this.productions_[$[1]][0]),y.push(J.$),x.push(J._$),K=b[g[g.length-2]][g[g.length-1]],g.push(K);break;case 3:return!0}}return!0},"parse")},u=function(){var f={EOF:1,parseError:v(function(p,g){if(this.yy.parser)this.yy.parser.parseError(p,g);else throw new Error(p)},"parseError"),setInput:v(function(d,p){return this.yy=p||this.yy||{},this._input=d,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var d=this._input[0];this.yytext+=d,this.yyleng++,this.offset++,this.match+=d,this.matched+=d;var p=d.match(/(?:\r\n?|\n).*/g);return p?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),d},"input"),unput:v(function(d){var p=d.length,g=d.split(/(?:\r\n?|\n)/g);this._input=d+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-p),this.offset-=p;var m=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===m.length?this.yylloc.first_column:0)+m[m.length-g.length].length-g[0].length:this.yylloc.first_column-p},this.options.ranges&&(this.yylloc.range=[y[0],y[0]+this.yyleng-p]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(d){this.unput(this.match.slice(d))},"less"),pastInput:v(function(){var d=this.matched.substr(0,this.matched.length-this.match.length);return(d.length>20?"...":"")+d.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var d=this.match;return d.length<20&&(d+=this._input.substr(0,20-d.length)),(d.substr(0,20)+(d.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var d=this.pastInput(),p=new Array(d.length+1).join("-");return d+this.upcomingInput()+` `+p+"^"},"showPosition"),test_match:v(function(d,p){var g,m,y;if(this.options.backtrack_lexer&&(y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(y.yylloc.range=this.yylloc.range.slice(0))),m=d[0].match(/(?:\r\n?|\n).*/g),m&&(this.yylineno+=m.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:m?m[m.length-1].length-m[m.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+d[0].length},this.yytext+=d[0],this.match+=d[0],this.matches=d,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(d[0].length),this.matched+=d[0],g=this.performAction.call(this,this.yy,this,p,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in y)this[x]=y[x];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var d,p,g,m;this._more||(this.yytext="",this.match="");for(var y=this._currentRules(),x=0;xp[0].length)){if(p=g,m=x,this.options.backtrack_lexer){if(d=this.test_match(g,y[x]),d!==!1)return d;if(this._backtrack){p=!1;continue}else return!1}else if(!this.options.flex)break}return p?(d=this.test_match(p,y[m]),d!==!1?d:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var p=this.next();return p||this.lex()},"lex"),begin:v(function(p){this.conditionStack.push(p)},"begin"),popState:v(function(){var p=this.conditionStack.length-1;return p>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(p){return p=this.conditionStack.length-1-Math.abs(p||0),p>=0?this.conditionStack[p]:"INITIAL"},"topState"),pushState:v(function(p){this.begin(p)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(p,g,m,y){var x=y;switch(m){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return f}();l.lexer=u;function h(){this.yy={}}return v(h,"Parser"),h.prototype=l,l.Parser=h,new h}();HM.parser=HM;h$e=HM,Mm="",qM=[],cx=[],ux=[],f$e=v(function(){qM.length=0,cx.length=0,Mm="",ux.length=0,xr()},"clear"),d$e=v(function(t){Mm=t,qM.push(t)},"addSection"),p$e=v(function(){return qM},"getSections"),g$e=v(function(){let t=Phe(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),v$e=v(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(o=>o.trim()),s={section:Mm,type:Mm,people:a,task:t,score:n};ux.push(s)},"addTask"),y$e=v(function(t){let e={section:Mm,type:Mm,description:t,task:t,classes:[]};cx.push(e)},"addTaskOrg"),Phe=v(function(){let t=v(function(r){return ux[r].processed},"compileTask"),e=!0;for(let[r,n]of ux.entries())t(r),e=e&&n.processed;return e},"compileTasks"),x$e=v(function(){return m$e()},"getActors"),Bhe={getConfig:v(()=>pe().journey,"getConfig"),clear:f$e,setDiagramTitle:tn,getDiagramTitle:qr,setAccTitle:Tr,getAccTitle:_r,setAccDescription:Lr,getAccDescription:Rr,addSection:d$e,getSections:p$e,getTasks:g$e,addTask:v$e,addTaskOrg:y$e,getActors:x$e},b$e=v(t=>`.label { font-family: 'trebuchet ms', verdana, arial, sans-serif; font-family: var(--mermaid-font-family); color: ${t.textColor}; } .mouth { stroke: #666; } line { stroke: ${t.textColor} } .legend { fill: ${t.textColor}; } .label text { fill: #333; } .label { color: ${t.textColor} } .face { ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; stroke: #999; } .node rect, .node circle, .node ellipse, .node polygon, .node path { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; stroke-width: 1px; } .node .label { text-align: center; } .node.clickable { cursor: pointer; } .arrowheadPath { fill: ${t.arrowheadColor}; } .edgePath .path { stroke: ${t.lineColor}; stroke-width: 1.5px; } .flowchart-link { stroke: ${t.lineColor}; fill: none; } .edgeLabel { background-color: ${t.edgeLabelBackground}; rect { opacity: 0.5; } text-align: center; } .cluster rect { } .cluster text { fill: ${t.titleColor}; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-family: var(--mermaid-font-family); font-size: 12px; background: ${t.tertiaryColor}; border: 1px solid ${t.border2}; border-radius: 2px; pointer-events: none; z-index: 100; } .task-type-0, .section-type-0 { ${t.fillType0?`fill: ${t.fillType0}`:""}; } .task-type-1, .section-type-1 { ${t.fillType0?`fill: ${t.fillType1}`:""}; } .task-type-2, .section-type-2 { ${t.fillType0?`fill: ${t.fillType2}`:""}; } .task-type-3, .section-type-3 { ${t.fillType0?`fill: ${t.fillType3}`:""}; } .task-type-4, .section-type-4 { ${t.fillType0?`fill: ${t.fillType4}`:""}; } .task-type-5, .section-type-5 { ${t.fillType0?`fill: ${t.fillType5}`:""}; } .task-type-6, .section-type-6 { ${t.fillType0?`fill: ${t.fillType6}`:""}; } .task-type-7, .section-type-7 { ${t.fillType0?`fill: ${t.fillType7}`:""}; } .actor-0 { ${t.actor0?`fill: ${t.actor0}`:""}; } .actor-1 { ${t.actor1?`fill: ${t.actor1}`:""}; } .actor-2 { ${t.actor2?`fill: ${t.actor2}`:""}; } .actor-3 { ${t.actor3?`fill: ${t.actor3}`:""}; } .actor-4 { ${t.actor4?`fill: ${t.actor4}`:""}; } .actor-5 { ${t.actor5?`fill: ${t.actor5}`:""}; } `,"getStyles"),w$e=b$e,YM=v(function(t,e){return Dd(t,e)},"drawRect"),k$e=v(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(l){let u=lc().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);l.append("path").attr("class","mouth").attr("d",u).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}v(a,"smile");function s(l){let u=lc().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);l.append("path").attr("class","mouth").attr("d",u).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}v(s,"sad");function o(l){l.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return v(o,"ambivalent"),e.score>3?a(i):e.score<3?s(i):o(i),n},"drawFace"),Ghe=v(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),Uhe=v(function(t,e){return ene(t,e)},"drawText"),T$e=v(function(t,e){function r(i,a,s,o,l){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+o-l)+" "+(i+s-l*1.2)+","+(a+o)+" "+i+","+(a+o)}v(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,Uhe(t,e)},"drawLabel"),E$e=v(function(t,e,r){let n=t.append("g"),i=Tc();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,YM(n,i),Vhe(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Fhe=-1,S$e=v(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Fhe++;let a=300+5*30;i.append("line").attr("id","task"+Fhe).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),k$e(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=Tc();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,YM(i,s);let o=e.x+14;e.people.forEach(l=>{let u=e.actors[l].color,h={cx:o,cy:e.y,r:7,fill:u,stroke:"#000",title:l,pos:e.actors[l].position};Ghe(i,h),o+=10}),Vhe(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),C$e=v(function(t,e){_w(t,e)},"drawBackgroundRect"),Vhe=function(){function t(i,a,s,o,l,u,h,f){let d=a.append("text").attr("x",s+l/2).attr("y",o+u/2+5).style("font-color",f).style("text-anchor","middle").text(i);n(d,h)}v(t,"byText");function e(i,a,s,o,l,u,h,f,d){let{taskFontSize:p,taskFontFamily:g}=f,m=i.split(//gi);for(let y=0;y{Ku[x]={color:i.actorColours[d%i.actorColours.length],position:d},d++}),Whe(l),jo.insert(0,0,T0,Object.keys(Ku).length*50),R$e(l,u,0);let p=jo.getBounds();h&&l.append("text").text(h).attr("x",T0).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);let g=p.stopy-p.starty+2*i.diagramMarginY,m=T0+p.stopx+2*i.diagramMarginX;Hr(l,g,m,i.useMaxWidth),l.append("line").attr("x1",T0).attr("y1",i.height*4).attr("x2",m-T0-4).attr("y2",i.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let y=h?70:0;l.attr("viewBox",`${p.startx} -25 ${m} ${g+y}`),l.attr("preserveAspectRatio","xMinYMin meet"),l.attr("height",g+y+25)},"draw"),jo={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:v(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:v(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:v(function(t,e,r,n){let i=pe().journey,a=this,s=0;function o(l){return v(function(h){s++;let f=a.sequenceItems.length-s+1;a.updateVal(h,"starty",e-f*i.boxMargin,Math.min),a.updateVal(h,"stopy",n+f*i.boxMargin,Math.max),a.updateVal(jo.data,"startx",t-f*i.boxMargin,Math.min),a.updateVal(jo.data,"stopx",r+f*i.boxMargin,Math.max),l!=="activation"&&(a.updateVal(h,"startx",t-f*i.boxMargin,Math.min),a.updateVal(h,"stopx",r+f*i.boxMargin,Math.max),a.updateVal(jo.data,"starty",e-f*i.boxMargin,Math.min),a.updateVal(jo.data,"stopy",n+f*i.boxMargin,Math.max))},"updateItemBounds")}v(o,"updateFn"),this.sequenceItems.forEach(o())},"updateBounds"),insert:v(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),o=Math.max(e,n);this.updateVal(jo.data,"startx",i,Math.min),this.updateVal(jo.data,"starty",s,Math.min),this.updateVal(jo.data,"stopx",a,Math.max),this.updateVal(jo.data,"stopy",o,Math.max),this.updateBounds(i,s,a,o)},"insert"),bumpVerticalPos:v(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:v(function(){return this.verticalPos},"getVerticalPos"),getBounds:v(function(){return this.data},"getBounds")},WM=f6.sectionFills,zhe=f6.sectionColours,R$e=v(function(t,e,r){let n=pe().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,o=0,l="#CCC",u="black",h=0;for(let[f,d]of e.entries()){if(i!==d.section){l=WM[o%WM.length],h=o%WM.length,u=zhe[o%zhe.length];let g=0,m=d.section;for(let x=f;x(Ku[m]&&(g[m]=Ku[m]),g),{});d.x=f*n.taskMargin+f*n.width+T0,d.y=s,d.width=n.diagramMarginX,d.height=n.diagramMarginY,d.colour=u,d.fill=l,d.num=h,d.actors=p,hx.drawTask(t,d,n),jo.insert(d.x,d.y,d.x+d.width+n.taskMargin,300+5*30)}},"drawTasks"),$he={setConf:_$e,draw:L$e},N$e={parser:h$e,db:Bhe,renderer:$he,styles:w$e,init:v(t=>{$he.setConf(t.journey),Bhe.clear()},"init")}});var lfe={};vr(lfe,{diagram:()=>Q$e});function ZM(t,e){t.each(function(){var r=Ve(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,o=r.attr("y"),l=parseFloat(r.attr("dy")),u=r.text(null).append("tspan").attr("x",0).attr("y",o).attr("dy",l+"em");for(let h=0;he||i==="
    ")&&(a.pop(),u.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],u=r.append("tspan").attr("x",0).attr("y",o).attr("dy",s+"em").text(i))})}var XM,I$e,Khe,Dm,Zhe,jM,d6,Om,Qhe,Jhe,efe,tfe,rfe,nfe,ife,afe,Yhe,M$e,D$e,p6,O$e,P$e,sfe,B$e,F$e,Xhe,z$e,$$e,G$e,KM,ofe,U$e,V$e,W$e,H$e,E0,q$e,jhe,Y$e,X$e,j$e,K$e,Z$e,Q$e,cfe=F(()=>{or();lr();lr();go();XM=function(){var t=v(function(d,p,g,m){for(g=g||{},m=d.length;m--;g[d[m]]=p);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],o=[1,16],l=[1,17],u={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:v(function(p,g,m,y,x,b,w){var _=b.length-1;switch(x){case 1:return b[_-1];case 2:this.$=[];break;case 3:b[_-1].push(b[_]),this.$=b[_-1];break;case 4:case 5:this.$=b[_];break;case 6:case 7:this.$=[];break;case 8:y.getCommonDb().setDiagramTitle(b[_].substr(6)),this.$=b[_].substr(6);break;case 9:this.$=b[_].trim(),y.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[_].trim(),y.getCommonDb().setAccDescription(this.$);break;case 12:y.addSection(b[_].substr(8)),this.$=b[_].substr(8);break;case 15:y.addTask(b[_],0,""),this.$=b[_];break;case 16:y.addEvent(b[_].substr(2)),this.$=b[_];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:o,21:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:o,21:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:v(function(p,g){if(g.recoverable)this.trace(p);else{var m=new Error(p);throw m.hash=g,m}},"parseError"),parse:v(function(p){var g=this,m=[0],y=[],x=[null],b=[],w=this.table,_="",k=0,E=0,L=0,S=2,C=1,M=b.slice.call(arguments,1),R=Object.create(this.lexer),T={yy:{}};for(var I in this.yy)Object.prototype.hasOwnProperty.call(this.yy,I)&&(T.yy[I]=this.yy[I]);R.setInput(p,T.yy),T.yy.lexer=R,T.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var A=R.yylloc;b.push(A);var D=R.options&&R.options.ranges;typeof T.yy.parseError=="function"?this.parseError=T.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function N(Y){m.length=m.length-2*Y,x.length=x.length-Y,b.length=b.length-Y}v(N,"popStack");function O(){var Y;return Y=y.pop()||R.lex()||C,typeof Y!="number"&&(Y instanceof Array&&(y=Y,Y=y.pop()),Y=g.symbols_[Y]||Y),Y}v(O,"lex");for(var B,P,$,z,H,J,X={},oe,K,ee,Q;;){if($=m[m.length-1],this.defaultActions[$]?z=this.defaultActions[$]:((B===null||typeof B>"u")&&(B=O()),z=w[$]&&w[$][B]),typeof z>"u"||!z.length||!z[0]){var W="";Q=[];for(oe in w[$])this.terminals_[oe]&&oe>S&&Q.push("'"+this.terminals_[oe]+"'");R.showPosition?W="Parse error on line "+(k+1)+`: `+R.showPosition()+` Expecting `+Q.join(", ")+", got '"+(this.terminals_[B]||B)+"'":W="Parse error on line "+(k+1)+": Unexpected "+(B==C?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(W,{text:R.match,token:this.terminals_[B]||B,line:R.yylineno,loc:A,expected:Q})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+$+", token: "+B);switch(z[0]){case 1:m.push(B),x.push(R.yytext),b.push(R.yylloc),m.push(z[1]),B=null,P?(B=P,P=null):(E=R.yyleng,_=R.yytext,k=R.yylineno,A=R.yylloc,L>0&&L--);break;case 2:if(K=this.productions_[z[1]][1],X.$=x[x.length-K],X._$={first_line:b[b.length-(K||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(K||1)].first_column,last_column:b[b.length-1].last_column},D&&(X._$.range=[b[b.length-(K||1)].range[0],b[b.length-1].range[1]]),J=this.performAction.apply(X,[_,E,k,T.yy,z[1],x,b].concat(M)),typeof J<"u")return J;K&&(m=m.slice(0,-1*K*2),x=x.slice(0,-1*K),b=b.slice(0,-1*K)),m.push(this.productions_[z[1]][0]),x.push(X.$),b.push(X._$),ee=w[m[m.length-2]][m[m.length-1]],m.push(ee);break;case 3:return!0}}return!0},"parse")},h=function(){var d={EOF:1,parseError:v(function(g,m){if(this.yy.parser)this.yy.parser.parseError(g,m);else throw new Error(g)},"parseError"),setInput:v(function(p,g){return this.yy=g||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var g=p.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:v(function(p){var g=p.length,m=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),m.length-1&&(this.yylineno-=m.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:m?(m.length===y.length?this.yylloc.first_column:0)+y[y.length-m.length].length-m[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(p){this.unput(this.match.slice(p))},"less"),pastInput:v(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var p=this.pastInput(),g=new Array(p.length+1).join("-");return p+this.upcomingInput()+` `+g+"^"},"showPosition"),test_match:v(function(p,g){var m,y,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],m=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),m)return m;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,g,m,y;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=m,y=b,this.options.backtrack_lexer){if(p=this.test_match(m,x[b]),p!==!1)return p;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(p=this.test_match(g,x[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var g=this.next();return g||this.lex()},"lex"),begin:v(function(g){this.conditionStack.push(g)},"begin"),popState:v(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:v(function(g){this.begin(g)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(g,m,y,x){var b=x;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s[^:\n]+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return d}();u.lexer=h;function f(){this.yy={}}return v(f,"Parser"),f.prototype=u,u.Parser=f,new f}();XM.parser=XM;I$e=XM,Khe={};MS(Khe,{addEvent:()=>ife,addSection:()=>efe,addTask:()=>nfe,addTaskOrg:()=>afe,clear:()=>Jhe,default:()=>M$e,getCommonDb:()=>Qhe,getSections:()=>tfe,getTasks:()=>rfe});Dm="",Zhe=0,jM=[],d6=[],Om=[],Qhe=v(()=>Ub,"getCommonDb"),Jhe=v(function(){jM.length=0,d6.length=0,Dm="",Om.length=0,xr()},"clear"),efe=v(function(t){Dm=t,jM.push(t)},"addSection"),tfe=v(function(){return jM},"getSections"),rfe=v(function(){let t=Yhe(),e=100,r=0;for(;!t&&rr.id===Zhe-1).events.push(t)},"addEvent"),afe=v(function(t){let e={section:Dm,type:Dm,description:t,task:t,classes:[]};d6.push(e)},"addTaskOrg"),Yhe=v(function(){let t=v(function(r){return Om[r].processed},"compileTask"),e=!0;for(let[r,n]of Om.entries())t(r),e=e&&n.processed;return e},"compileTasks"),M$e={clear:Jhe,getCommonDb:Qhe,addSection:efe,getSections:tfe,getTasks:rfe,addTask:nfe,addTaskOrg:afe,addEvent:ife},D$e=12,p6=v(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),O$e=v(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(l){let u=lc().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);l.append("path").attr("class","mouth").attr("d",u).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}v(a,"smile");function s(l){let u=lc().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);l.append("path").attr("class","mouth").attr("d",u).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}v(s,"sad");function o(l){l.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return v(o,"ambivalent"),e.score>3?a(i):e.score<3?s(i):o(i),n},"drawFace"),P$e=v(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),sfe=v(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),B$e=v(function(t,e){function r(i,a,s,o,l){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+o-l)+" "+(i+s-l*1.2)+","+(a+o)+" "+i+","+(a+o)}v(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,sfe(t,e)},"drawLabel"),F$e=v(function(t,e,r){let n=t.append("g"),i=KM();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,p6(n,i),ofe(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Xhe=-1,z$e=v(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Xhe++;let a=300+5*30;i.append("line").attr("id","task"+Xhe).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),O$e(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=KM();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,p6(i,s),ofe(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),$$e=v(function(t,e){p6(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),G$e=v(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),KM=v(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),ofe=function(){function t(i,a,s,o,l,u,h,f){let d=a.append("text").attr("x",s+l/2).attr("y",o+u/2+5).style("font-color",f).style("text-anchor","middle").text(i);n(d,h)}v(t,"byText");function e(i,a,s,o,l,u,h,f,d){let{taskFontSize:p,taskFontFamily:g}=f,m=i.split(//gi);for(let y=0;y0?d.forEach(C=>{let M=h.filter(A=>A.section===C),R={number:w,descr:C,section:w,width:200*Math.max(M.length,1)-50,padding:20,maxHeight:p};re.debug("sectionNode",R);let T=u.append("g"),I=E0.drawNode(T,R,w,i);re.debug("sectionNode output",I),T.attr("transform",`translate(${x}, ${y})`),b+=p+50,M.length>0&&jhe(u,M,w,x,b,g,i,k,E,p,!1),x+=200*Math.max(M.length,1),b=y,w++}):(_=!1,jhe(u,h,w,x,b,g,i,k,E,p,!0));let L=u.node().getBBox();re.debug("bounds",L),f&&u.append("text").text(f).attr("x",L.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),m=_?p+g+150:g+100,u.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",m).attr("x2",L.width+3*a).attr("y2",m).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),il(void 0,u,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),jhe=v(function(t,e,r,n,i,a,s,o,l,u,h){for(let f of e){let d={descr:f.task,section:r,number:r,width:150,padding:20,maxHeight:a};re.debug("taskNode",d);let p=t.append("g").attr("class","taskWrapper"),m=E0.drawNode(p,d,r,s).height;if(re.debug("taskHeight after draw",m),p.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,m),f.events){let y=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+Y$e(t,f.events,r,n,i,s),i-=100,y.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+(h?a:u)+l+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,h&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),Y$e=v(function(t,e,r,n,i,a){let s=0,o=i;i=i+100;for(let l of e){let u={descr:l,section:r,number:r,width:150,padding:20,maxHeight:50};re.debug("eventNode",u);let h=t.append("g").attr("class","eventWrapper"),d=E0.drawNode(h,u,r,a).height;s=s+d,h.attr("transform",`translate(${n}, ${i})`),i=i+10+d}return i=o,s},"drawEvents"),X$e={setConf:v(()=>{},"setConf"),draw:q$e},j$e=v(t=>{let e="";for(let r=0;r` .edge { stroke-width: 3; } ${j$e(t)} .section-root rect, .section-root path, .section-root circle { fill: ${t.git0}; } .section-root text { fill: ${t.gitBranchLabel0}; } .icon-container { height:100%; display: flex; justify-content: center; align-items: center; } .edge { fill: none; } .eventWrapper { filter: brightness(120%); } `,"getStyles"),Z$e=K$e,Q$e={db:Khe,renderer:X$e,parser:I$e,styles:Z$e}});function Oi(t){"@babel/helpers - typeof";return Oi=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oi(t)}function AD(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function ufe(t,e){for(var r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,s=!1,o;return{s:function(){r=r.call(t)},n:function(){var l=r.next();return a=l.done,l},e:function(l){s=!0,o=l},f:function(){try{!a&&r.return!=null&&r.return()}finally{if(s)throw o}}}}function SGe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}function CGe(t,e){return e={exports:{}},t(e,e.exports),e.exports}function MGe(t){for(var e=t.length;e--&&IGe.test(t.charAt(e)););return e}function PGe(t){return t&&t.slice(0,DGe(t)+1).replace(OGe,"")}function GGe(t){var e=zGe.call(t,fx),r=t[fx];try{t[fx]=void 0;var n=!0}catch{}var i=$Ge.call(t);return n&&(e?t[fx]=r:delete t[fx]),i}function HGe(t){return WGe.call(t)}function jGe(t){return t==null?t===void 0?XGe:YGe:pfe&&pfe in Object(t)?UGe(t):qGe(t)}function KGe(t){return t!=null&&typeof t=="object"}function JGe(t){return typeof t=="symbol"||ZGe(t)&&Pde(t)==QGe}function iUe(t){if(typeof t=="number")return t;if(Bx(t))return gfe;if(I0(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=I0(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=BGe(t);var r=tUe.test(t);return r||rUe.test(t)?nUe(t.slice(2),r?2:8):eUe.test(t)?gfe:+t}function lUe(t,e,r){var n,i,a,s,o,l,u=0,h=!1,f=!1,d=!0;if(typeof t!="function")throw new TypeError(aUe);e=mfe(e)||0,I0(r)&&(h=!!r.leading,f="maxWait"in r,a=f?sUe(mfe(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d);function p(E){var L=n,S=i;return n=i=void 0,u=E,s=t.apply(S,L),s}function g(E){return u=E,o=setTimeout(x,e),h?p(E):s}function m(E){var L=E-l,S=E-u,C=e-L;return f?oUe(C,a-S):C}function y(E){var L=E-l,S=E-u;return l===void 0||L>=e||L<0||f&&S>=a}function x(){var E=QM();if(y(E))return b(E);o=setTimeout(x,m(E))}function b(E){return o=void 0,d&&n?p(E):(n=i=void 0,s)}function w(){o!==void 0&&clearTimeout(o),u=0,n=l=i=o=void 0}function _(){return o===void 0?s:b(QM())}function k(){var E=QM(),L=y(E);if(n=arguments,i=this,l=E,L){if(o===void 0)return g(l);if(f)return clearTimeout(o),o=setTimeout(x,e),p(l)}return o===void 0&&(o=setTimeout(x,e)),s}return k.cancel=w,k.flush=_,k}function Q6(t,e,r,n,i,a){var s;return jn(t)?s=t:s=Km[t]||Km.euclidean,e===0&&jn(t)?s(i,a):s(e,r,n,i,a)}function eWe(t,e){if(J6(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Bx(t)?!0:JVe.test(t)||!QVe.test(t)||e!=null&&t in Object(e)}function sWe(t){if(!I0(t))return!1;var e=Pde(t);return e==nWe||e==iWe||e==rWe||e==aWe}function cWe(t){return!!Pfe&&Pfe in t}function dWe(t){if(t!=null){try{return fWe.call(t)}catch{}try{return t+""}catch{}}return""}function kWe(t){if(!I0(t)||uWe(t))return!1;var e=oWe(t)?wWe:mWe;return e.test(pWe(t))}function EWe(t,e){return t?.[e]}function CWe(t,e){var r=SWe(t,e);return TWe(r)?r:void 0}function _We(){this.__data__=Rx?Rx(null):{},this.size=0}function RWe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function OWe(t){var e=this.__data__;if(Rx){var r=e[t];return r===IWe?void 0:r}return DWe.call(e,t)?e[t]:void 0}function zWe(t){var e=this.__data__;return Rx?e[t]!==void 0:FWe.call(e,t)}function UWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Rx&&e===void 0?GWe:e,this}function e1(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1}function rHe(t,e){var r=this.__data__,n=eE(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}function t1(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1&&t%1==0&&t0;){var h=i.shift();e(h),a.add(h.id()),o&&n(i,a,h)}return t}function g0e(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:$qe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?T=A:R=A;while(Math.abs(I)>s&&++D=a?b(M,D):N===0?D:_(M,R,R+u)}var E=!1;function L(){E=!0,(t!==e||r!==n)&&w()}var S=function(R){return E||L(),t===e&&r===n?R:R===0?0:R===1?1:y(k(R),e,n)};S.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var C="generateBezier("+[t,e,r,n]+")";return S.toString=function(){return C},S}function tde(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function rde(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function Fm(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=rde(t,i),o=rde(e,i);if(dt(s)&&dt(o))return tde(a,s,o,r,n);if(vn(s)&&vn(o)){for(var l=[],u=0;u0?(p==="spring"&&g.push(s.duration),s.easingImpl=N6[p].apply(null,g)):s.easingImpl=N6[p]}var m=s.easingImpl,y;if(s.duration===0?y=1:y=(r-l)/s.duration,s.applying&&(y=s.progress),y<0?y=0:y>1&&(y=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var w={};mx(x.x,b.x)&&(w.x=Fm(x.x,b.x,y,m)),mx(x.y,b.y)&&(w.y=Fm(x.y,b.y,y,m)),t.position(w)}var _=s.startPan,k=s.pan,E=a.pan,L=k!=null&&n;L&&(mx(_.x,k.x)&&(E.x=Fm(_.x,k.x,y,m)),mx(_.y,k.y)&&(E.y=Fm(_.y,k.y,y,m)),t.emit("pan"));var S=s.startZoom,C=s.zoom,M=C!=null&&n;M&&(mx(S,C)&&(a.zoom=_x(a.minZoom,Fm(S,C,y,m),a.maxZoom)),t.emit("zoom")),(L||M)&&t.emit("viewport");var R=s.style;if(R&&R.length>0&&i){for(var T=0;T=0;L--){var S=E[L];S()}E.splice(0,E.length)},b=p.length-1;b>=0;b--){var w=p[b],_=w._private;if(_.stopped){p.splice(b,1),_.hooked=!1,_.playing=!1,_.started=!1,x(_.frames);continue}!_.playing&&!_.applying||(_.playing&&_.applying&&(_.applying=!1),_.started||eYe(h,w,t),Jqe(h,w,t,f),_.applying&&(_.applying=!1),x(_.frames),_.step!=null&&_.step(t),w.completed()&&(p.splice(b,1),_.hooked=!1,_.playing=!1,_.started=!1,x(_.completes)),m=!0)}return!f&&p.length===0&&g.length===0&&n.push(h),m}for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function I0e(t){this.options=Kt({},lYe,cYe,t)}function M0e(t){this.options=Kt({},uYe,t)}function D0e(t){this.options=Kt({},hYe,t)}function lE(t){this.options=Kt({},fYe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),o=e.some(function(u){return u.data("id")===a}),l=e.some(function(u){return u.data("id")===s});return!o||!l});this.options.eles=this.options.eles.not(n)}function P0e(t){this.options=Kt({},LYe,t)}function qD(t){this.options=Kt({},RYe,t)}function B0e(t){this.options=Kt({},NYe,t)}function F0e(t){this.options=Kt({},IYe,t)}function z0e(t){this.options=t,this.notifications=0}function U0e(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function XD(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(OYe(t,e,r,n,i),{cx:xD,cy:bD,radius:L0,startX:$0e,startY:G0e,stopX:wD,stopY:kD,startAngle:Gc.ang+Math.PI/2*R0,endAngle:Ko.ang-Math.PI/2*R0,counterClockwise:D6})}function V0e(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=arguments.length>6?arguments[6]:void 0;t.beginPath(),t.moveTo(e+a,r),t.lineTo(e+n-a,r),t.quadraticCurveTo(e+n,r,e+n,r+a),t.lineTo(e+n,r+i-a),t.quadraticCurveTo(e+n,r+i,e+n-a,r+i),t.lineTo(e+a,r+i),t.quadraticCurveTo(e,r+i,e,r+i-a),t.lineTo(e,r+a),t.quadraticCurveTo(e,r,e+a,r),t.closePath(),s?t.stroke():t.fill()}function TXe(t,e){for(var r=atob(t),n=new ArrayBuffer(r.length),i=new Uint8Array(n),a=0;a{Mi=typeof window>"u"?null:window,ffe=Mi?Mi.navigator:null;Mi&&Mi.document;rGe=Oi(""),_de=Oi({}),nGe=Oi(function(){}),iGe=typeof HTMLElement>"u"?"undefined":Oi(HTMLElement),Ox=function(e){return e&&e.instanceString&&jn(e.instanceString)?e.instanceString():null},Wt=function(e){return e!=null&&Oi(e)==rGe},jn=function(e){return e!=null&&Oi(e)===nGe},vn=function(e){return!co(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},Dr=function(e){return e!=null&&Oi(e)===_de&&!vn(e)&&e.constructor===Object},aGe=function(e){return e!=null&&Oi(e)===_de},dt=function(e){return e!=null&&Oi(e)===Oi(1)&&!isNaN(e)},sGe=function(e){return dt(e)&&Math.floor(e)===e},P6=function(e){if(iGe!=="undefined")return e!=null&&e instanceof HTMLElement},co=function(e){return Px(e)||Lde(e)},Px=function(e){return Ox(e)==="collection"&&e._private.single},Lde=function(e){return Ox(e)==="collection"&&!e._private.single},LD=function(e){return Ox(e)==="core"},Rde=function(e){return Ox(e)==="stylesheet"},oGe=function(e){return Ox(e)==="event"},bf=function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},lGe=function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},cGe=function(e){return Dr(e)&&dt(e.x1)&&dt(e.x2)&&dt(e.y1)&&dt(e.y2)},uGe=function(e){return aGe(e)&&jn(e.then)},hGe=function(){return ffe&&ffe.userAgent.match(/msie|trident|edge/i)},Ex=function(e,r){r||(r=function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},yGe=function(e,r){return-1*Ide(e,r)},Kt=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(y-=1),y<1/6?g+(m-g)*6*y:y<1/2?m:y<2/3?g+(m-g)*(2/3-y)*6:g}var f=new RegExp("^"+pGe+"$").exec(e);if(f){if(n=parseInt(f[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(f[2]),i<0||i>100||(i=i/100,a=parseFloat(f[3]),a<0||a>100)||(a=a/100,s=f[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)o=l=u=Math.round(a*255);else{var d=a<.5?a*(1+i):a+i-a*i,p=2*a-d;o=Math.round(255*h(p,d,n+1/3)),l=Math.round(255*h(p,d,n)),u=Math.round(255*h(p,d,n-1/3))}r=[o,l,u,s]}return r},wGe=function(e){var r,n=new RegExp("^"+fGe+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var o=i[1]||i[2]||i[3],l=i[1]&&i[2]&&i[3];if(o&&!l)return;var u=n[4];if(u!==void 0){if(u=parseFloat(u),u<0||u>1)return;r.push(u)}}return r},kGe=function(e){return EGe[e.toLowerCase()]},TGe=function(e){return(vn(e)?e:null)||kGe(e)||xGe(e)||wGe(e)||bGe(e)},EGe={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Mde=function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:Gm,n=r,i;i=e.next(),!i.done;)n=n*Fde+i.value|0;return n},Sx=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Gm;return r*Fde+e|0},Cx=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:yx;return(r<<5)+r+e|0},uUe=function(e,r){return e*2097152+r},pf=function(e){return e[0]*2097152+e[1]},g6=function(e,r){return[Sx(e[0],r[0]),Cx(e[1],r[1])]},hUe=function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:function(){return i=0&&!(e[i]===r&&(e.splice(i,1),n));i--);},MD=function(e){e.splice(0,e.length)},yUe=function(e,r){for(var n=0;n"u"?"undefined":Oi(Set))!==bUe?Set:wUe,K6=function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!LD(e)){ni("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){ni("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new Qm,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,o=e.pan(),l=e.zoom();a.position={x:(s.x-o.x)/l,y:(s.y-o.y)/l}}var u=[];vn(r.classes)?u=r.classes:Wt(r.classes)&&(u=r.classes.split(/\s+/));for(var h=0,f=u.length;hb?1:0},h=function(x,b,w,_,k){var E;if(w==null&&(w=0),k==null&&(k=n),w<0)throw new Error("lo must be non-negative");for(_==null&&(_=x.length);w<_;)E=i((w+_)/2),k(b,x[E])<0?_=E:w=E+1;return[].splice.apply(x,[w,w-w].concat(b)),b},o=function(x,b,w){return w==null&&(w=n),x.push(b),m(x,0,x.length-1,w)},s=function(x,b){var w,_;return b==null&&(b=n),w=x.pop(),x.length?(_=x[0],x[0]=w,y(x,0,b)):_=w,_},u=function(x,b,w){var _;return w==null&&(w=n),_=x[0],x[0]=b,y(x,0,w),_},l=function(x,b,w){var _;return w==null&&(w=n),x.length&&w(x[0],b)<0&&(_=[x[0],b],b=_[0],x[0]=_[1],y(x,0,w)),b},a=function(x,b){var w,_,k,E,L,S;for(b==null&&(b=n),E=function(){S=[];for(var C=0,M=i(x.length/2);0<=M?CM;0<=M?C++:C--)S.push(C);return S}.apply(this).reverse(),L=[],_=0,k=E.length;_R;0<=R?++S:--S)T.push(s(x,w));return T},m=function(x,b,w,_){var k,E,L;for(_==null&&(_=n),k=x[w];w>b;){if(L=w-1>>1,E=x[L],_(k,E)<0){x[w]=E,w=L;continue}break}return x[w]=k},y=function(x,b,w){var _,k,E,L,S;for(w==null&&(w=n),k=x.length,S=b,E=x[b],_=2*b+1;_0;){var E=b.pop(),L=y(E),S=E.id();if(d[S]=L,L!==1/0)for(var C=E.neighborhood().intersect(g),M=0;M0)for(B.unshift(O);f[$];){var z=f[$];B.unshift(z.edge),B.unshift(z.node),P=z.node,$=P.id()}return o.spawn(B)}}}},SUe={kruskal:function(e){e=e||function(w){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),o=n,l=function(_){for(var k=0;k0;){if(k(),L++,_===h){for(var S=[],C=a,M=h,R=x[M];S.unshift(C),R!=null&&S.unshift(R),C=y[M],C!=null;)M=C.id(),R=x[M];return{found:!0,distance:f[_],path:this.spawn(S),steps:L}}p[_]=!0;for(var T=w._private.edges,I=0;IR&&(g[M]=R,b[M]=C,w[M]=k),!a){var T=C*h+S;!a&&g[T]>R&&(g[T]=R,b[T]=S,w[T]=k)}}}for(var I=0;I1&&arguments[1]!==void 0?arguments[1]:s,Ee=w(we),Oe=[],De=Ee;;){if(De==null)return r.spawn();var We=b(De),Re=We.edge,Pe=We.pred;if(Oe.unshift(De[0]),De.same(Ie)&&Oe.length>0)break;Re!=null&&Oe.unshift(Re),De=Pe}return l.spawn(Oe)},E=0;E=0;h--){var f=u[h],d=f[1],p=f[2];(r[d]===o&&r[p]===l||r[d]===l&&r[p]===o)&&u.splice(h,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=MUe(a,e,r),n--}return r},DUe={kargerStein:function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(B){return B.isLoop()});var a=n.length,s=i.length,o=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),l=Math.floor(a/IUe);if(a<2){ni("At least 2 nodes are required for Karger-Stein algorithm");return}for(var u=[],h=0;h1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var o=0,l=e.length-1;l>=0;l--){var u=e[l];s?isFinite(u)||(e[l]=-1/0,o++):e.splice(l,1)}a&&e.sort(function(d,p){return d-p});var h=e.length,f=Math.floor(h/2);return h%2!==0?e[f+1+o]:(e[f-1+o]+e[f+o])/2},$Ue=function(e){return Math.PI*e/180},m6=function(e,r){return Math.atan2(r,e)-Math.PI/2},DD=Math.log2||function(t){return Math.log(t)/Math.log(2)},qde=function(e){return e>0?1:e<0?-1:0},D0=function(e,r){return Math.sqrt(A0(e,r))},A0=function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},GUe=function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},VUe=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},WUe=function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},HUe=function(e,r,n){return{x1:e.x1+r,x2:e.x2+r,y1:e.y1+n,y2:e.y2+n,w:e.w,h:e.h}},Yde=function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},qUe=function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},A6=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},_6=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var o=Ol(r,4);n=o[0],i=o[1],a=o[2],s=o[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},bfe=function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},OD=function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},jm=function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},YUe=function(e,r){return jm(e,r.x,r.y)},Xde=function(e,r){return jm(e,r.x1,r.y1)&&jm(e,r.x2,r.y2)},jde=function(e,r,n,i,a,s,o){var l=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",u=l==="auto"?O0(a,s):l,h=a/2,f=s/2;u=Math.min(u,h,f);var d=u!==h,p=u!==f,g;if(d){var m=n-h+u-o,y=i-f-o,x=n+h-u+o,b=y;if(g=vf(e,r,n,i,m,y,x,b,!1),g.length>0)return g}if(p){var w=n+h+o,_=i-f+u-o,k=w,E=i+f-u+o;if(g=vf(e,r,n,i,w,_,k,E,!1),g.length>0)return g}if(d){var L=n-h+u-o,S=i+f+o,C=n+h-u+o,M=S;if(g=vf(e,r,n,i,L,S,C,M,!1),g.length>0)return g}if(p){var R=n-h-o,T=i-f+u-o,I=R,A=i+f-u+o;if(g=vf(e,r,n,i,R,T,I,A,!1),g.length>0)return g}var D;{var N=n-h+u,O=i-f+u;if(D=xx(e,r,n,i,N,O,u+o),D.length>0&&D[0]<=N&&D[1]<=O)return[D[0],D[1]]}{var B=n+h-u,P=i-f+u;if(D=xx(e,r,n,i,B,P,u+o),D.length>0&&D[0]>=B&&D[1]<=P)return[D[0],D[1]]}{var $=n+h-u,z=i+f-u;if(D=xx(e,r,n,i,$,z,u+o),D.length>0&&D[0]>=$&&D[1]>=z)return[D[0],D[1]]}{var H=n-h+u,J=i+f-u;if(D=xx(e,r,n,i,H,J,u+o),D.length>0&&D[0]<=H&&D[1]>=J)return[D[0],D[1]]}return[]},XUe=function(e,r,n,i,a,s,o){var l=o,u=Math.min(n,a),h=Math.max(n,a),f=Math.min(i,s),d=Math.max(i,s);return u-l<=e&&e<=h+l&&f-l<=r&&r<=d+l},jUe=function(e,r,n,i,a,s,o,l,u){var h={x1:Math.min(n,o,a)-u,x2:Math.max(n,o,a)+u,y1:Math.min(i,l,s)-u,y2:Math.max(i,l,s)+u};return!(eh.x2||rh.y2)},KUe=function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),o=2*e,l=(-r+s)/o,u=(-r-s)/o;return[l,u]},ZUe=function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var o,l,u,h,f,d,p,g;if(l=(3*n-r*r)/9,u=-(27*i)+r*(9*n-2*(r*r)),u/=54,o=l*l*l+u*u,a[1]=0,p=r/3,o>0){f=u+Math.sqrt(o),f=f<0?-Math.pow(-f,1/3):Math.pow(f,1/3),d=u-Math.sqrt(o),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),a[0]=-p+f+d,p+=(f+d)/2,a[4]=a[2]=-p,p=Math.sqrt(3)*(-d+f)/2,a[3]=p,a[5]=-p;return}if(a[5]=a[3]=0,o===0){g=u<0?-Math.pow(-u,1/3):Math.pow(u,1/3),a[0]=-p+2*g,a[4]=a[2]=-(g+p);return}l=-l,h=l*l*l,h=Math.acos(u/Math.sqrt(h)),g=2*Math.sqrt(l),a[0]=-p+g*Math.cos(h/3),a[2]=-p+g*Math.cos((h+2*Math.PI)/3),a[4]=-p+g*Math.cos((h+4*Math.PI)/3)},QUe=function(e,r,n,i,a,s,o,l){var u=1*n*n-4*n*a+2*n*o+4*a*a-4*a*o+o*o+i*i-4*i*s+2*i*l+4*s*s-4*s*l+l*l,h=1*9*n*a-3*n*n-3*n*o-6*a*a+3*a*o+9*i*s-3*i*i-3*i*l-6*s*s+3*s*l,f=1*3*n*n-6*n*a+n*o-n*e+2*a*a+2*a*e-o*e+3*i*i-6*i*s+i*l-i*r+2*s*s+2*s*r-l*r,d=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,p=[];ZUe(u,h,f,d,p);for(var g=1e-7,m=[],y=0;y<6;y+=2)Math.abs(p[y+1])=0&&p[y]<=1&&m.push(p[y]);m.push(1),m.push(0);for(var x=-1,b,w,_,k=0;k=0?_u?(e-a)*(e-a)+(r-s)*(r-s):h-d},Bs=function(e,r,n){for(var i,a,s,o,l,u=0,h=0;h=e&&e>=s||i<=e&&e<=s)l=(e-i)/(s-i)*(o-a)+a,l>r&&u++;else continue;return u%2!==0},Ju=function(e,r,n,i,a,s,o,l,u){var h=new Array(n.length),f;l[0]!=null?(f=Math.atan(l[1]/l[0]),l[0]<0?f=f+Math.PI/2:f=-f-Math.PI/2):f=l;for(var d=Math.cos(-f),p=Math.sin(-f),g=0;g0){var y=$6(h,-u);m=z6(y)}else m=h;return Bs(e,r,m)},eVe=function(e,r,n,i,a,s,o,l){for(var u=new Array(n.length*2),h=0;h=0&&y<=1&&b.push(y),x>=0&&x<=1&&b.push(x),b.length===0)return[];var w=b[0]*l[0]+e,_=b[0]*l[1]+r;if(b.length>1){if(b[0]==b[1])return[w,_];var k=b[1]*l[0]+e,E=b[1]*l[1]+r;return[w,_,k,E]}else return[w,_]},tD=function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},vf=function(e,r,n,i,a,s,o,l,u){var h=e-a,f=n-e,d=o-a,p=r-s,g=i-r,m=l-s,y=d*p-m*h,x=f*p-g*h,b=m*f-d*g;if(b!==0){var w=y/b,_=x/b,k=.001,E=0-k,L=1+k;return E<=w&&w<=L&&E<=_&&_<=L?[e+w*f,r+w*g]:u?[e+w*f,r+w*g]:[]}else return y===0||x===0?tD(e,n,o)===o?[o,l]:tD(e,n,a)===a?[a,s]:tD(a,o,n)===n?[n,i]:[]:[]},Lx=function(e,r,n,i,a,s,o,l){var u=[],h,f=new Array(n.length),d=!0;s==null&&(d=!1);var p;if(d){for(var g=0;g0){var m=$6(f,-l);p=z6(m)}else p=f}else p=n;for(var y,x,b,w,_=0;_2){for(var g=[h[0],h[1]],m=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),y=1;yh&&(h=_)},get:function(w){return u[w]}},d=0;d0?N=D.edgesTo(A)[0]:N=A.edgesTo(D)[0];var O=i(N);A=A.id(),S[A]>S[T]+O&&(S[A]=S[T]+O,C.nodes.indexOf(A)<0?C.push(A):C.updateItem(A),L[A]=0,E[A]=[]),S[A]==S[T]+O&&(L[A]=L[A]+L[T],E[A].push(T))}else for(var B=0;B0;){for(var H=k.pop(),J=0;J0&&o.push(n[l]);o.length!==0&&a.push(i.collection(o))}return a},mVe=function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:xVe,o=i,l,u,h=0;h=2?dx(e,r,n,0,Sfe,bVe):dx(e,r,n,0,Efe)},squaredEuclidean:function(e,r,n){return dx(e,r,n,0,Sfe)},manhattan:function(e,r,n){return dx(e,r,n,0,Efe)},max:function(e,r,n){return dx(e,r,n,-1/0,wVe)}};Km["squared-euclidean"]=Km.squaredEuclidean;Km.squaredeuclidean=Km.squaredEuclidean;kVe=ba({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),BD=function(e){return kVe(e)},G6=function(e,r,n,i,a){var s=a!=="kMedoids",o=s?function(f){return n[f]}:function(f){return i[f](n)},l=function(d){return i[d](r)},u=n,h=r;return Q6(e,i.length,o,l,u,h)},rD=function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),o=new Array(r),l=null,u=0;un)return!1}return!0},SVe=function(e,r,n){for(var i=0;io&&(o=r[u][h],l=h);a[l].push(e[u])}for(var f=0;f=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],m=r[i[s]],y;a.mode==="dendrogram"?y={left:g,right:m,key:g.key}:y={value:g.value.concat(m.value),key:g.key},e[g.index]=y,e.splice(m.index,1),r[g.key]=y;for(var x=0;xn[m.key][b.key]&&(l=n[m.key][b.key])):a.linkage==="max"?(l=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},Nfe=function(e,r,n){for(var i=[],a=0;ao&&(s=u,o=r[a*e+u])}s>0&&i.push(s)}for(var h=0;hu&&(l=h,u=f)}n[a]=s[l]}return i=Nfe(e,r,n),i},Ife=function(e){for(var r=this.cy(),n=this.nodes(),i=zVe(e),a={},s=0;s=R?(T=R,R=A,I=D):A>T&&(T=A);for(var N=0;N0?1:0;L[C%i.minIterations*o+H]=J,z+=J}if(z>0&&(C>=i.minIterations-1||C==i.maxIterations-1)){for(var X=0,oe=0;oe1||E>1)&&(o=!0),f[w]=[],b.outgoers().forEach(function(S){S.isEdge()&&f[w].push(S.id())})}else d[w]=[void 0,b.target().id()]}):s.forEach(function(b){var w=b.id();if(b.isNode()){var _=b.degree(!0);_%2&&(l?u?o=!0:u=w:l=w),f[w]=[],b.connectedEdges().forEach(function(k){return f[w].push(k.id())})}else d[w]=[b.source().id(),b.target().id()]});var p={found:!1,trail:void 0};if(o)return p;if(u&&l)if(a){if(h&&u!=h)return p;h=u}else{if(h&&u!=h&&l!=h)return p;h||(h=u)}else h||(h=s[0].id());var g=function(w){for(var _=w,k=[w],E,L,S;f[_].length;)E=f[_].shift(),L=d[E][0],S=d[E][1],_!=S?(f[S]=f[S].filter(function(C){return C!=E}),_=S):!a&&_!=L&&(f[L]=f[L].filter(function(C){return C!=E}),_=L),k.unshift(E),k.unshift(_);return k},m=[],y=[];for(y=g(h);y.length!=1;)f[y[0]].length==0?(m.unshift(s.getElementById(y.shift())),m.unshift(s.getElementById(y.shift()))):y=g(y.shift()).concat(y);m.unshift(s.getElementById(y.shift()));for(var x in f)if(f[x].length)return p;return p.found=!0,p.trail=this.spawn(m,!0),p}},x6=function(){var e=this,r={},n=0,i=0,a=[],s=[],o={},l=function(d,p){for(var g=s.length-1,m=[],y=e.spawn();s[g].x!=d||s[g].y!=p;)m.push(s.pop().edge),g--;m.push(s.pop().edge),m.forEach(function(x){var b=x.connectedNodes().intersection(e);y.merge(x),b.forEach(function(w){var _=w.id(),k=w.connectedEdges().intersection(e);y.merge(w),r[_].cutVertex?y.merge(k.filter(function(E){return E.isLoop()})):y.merge(k)})}),a.push(y)},u=function f(d,p,g){d===g&&(i+=1),r[p]={id:n,low:n++,cutVertex:!1};var m=e.getElementById(p).connectedEdges().intersection(e);if(m.size()===0)a.push(e.spawn(e.getElementById(p)));else{var y,x,b,w;m.forEach(function(_){y=_.source().id(),x=_.target().id(),b=y===p?x:y,b!==g&&(w=_.id(),o[w]||(o[w]=!0,s.push({x:p,y:b,edge:_})),b in r?r[p].low=Math.min(r[p].low,r[b].id):(f(d,b,p),r[p].low=Math.min(r[p].low,r[b].low),r[p].id<=r[b].low&&(r[p].cutVertex=!0,l(p,b))))})}};e.forEach(function(f){if(f.isNode()){var d=f.id();d in r||(i=0,u(d,d),r[d].cutVertex=i>1)}});var h=Object.keys(r).filter(function(f){return r[f].cutVertex}).map(function(f){return e.getElementById(f)});return{cut:e.spawn(h),components:a}},YVe={hopcroftTarjanBiconnected:x6,htbc:x6,htb:x6,hopcroftTarjanBiconnectedComponents:x6},b6=function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),o=function l(u){a.push(u),r[u]={index:n,low:n++,explored:!1};var h=e.getElementById(u).connectedEdges().intersection(e);if(h.forEach(function(m){var y=m.target().id();y!==u&&(y in r||l(y),r[y].explored||(r[u].low=Math.min(r[u].low,r[y].low)))}),r[u].index===r[u].low){for(var f=e.spawn();;){var d=a.pop();if(f.merge(e.getElementById(d)),r[d].low=r[u].index,r[d].explored=!0,d===u)break}var p=f.edgesWith(f),g=f.merge(p);i.push(g),s=s.difference(g)}};return e.forEach(function(l){if(l.isNode()){var u=l.id();u in r||o(u)}}),{cut:s,components:i}},XVe={tarjanStronglyConnected:b6,tsc:b6,tscc:b6,tarjanStronglyConnectedComponents:b6},r0e={};[Ax,EUe,SUe,AUe,LUe,NUe,DUe,aVe,Hm,qm,dD,yVe,NVe,BVe,WVe,qVe,YVe,XVe].forEach(function(t){Kt(r0e,t)});n0e=0,i0e=1,a0e=2,eh=function t(e){if(!(this instanceof t))return new t(e);this.id="Thenable/1.0.7",this.state=n0e,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};eh.prototype={fulfill:function(e){return Mfe(this,i0e,"fulfillValue",e)},reject:function(e){return Mfe(this,a0e,"rejectReason",e)},then:function(e,r){var n=this,i=new eh;return n.onFulfilled.push(Ofe(e,i,"fulfill")),n.onRejected.push(Ofe(r,i,"reject")),s0e(n),i.proxy}};Mfe=function(e,r,n,i){return e.state===n0e&&(e.state=r,e[n]=i,s0e(e)),e},s0e=function(e){e.state===i0e?Dfe(e,"onFulfilled",e.fulfillValue):e.state===a0e&&Dfe(e,"onRejected",e.rejectReason)},Dfe=function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=function(){for(var o=0;o0}},clearQueue:function(){return function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},toggleClass:function(e,r){vn(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,o=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n}};L6.className=L6.classNames=L6.classes;Mr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Di,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Mr.variable="(?:[\\w-.]|(?:\\\\"+Mr.metaChar+"))+";Mr.className="(?:[\\w-]|(?:\\\\"+Mr.metaChar+"))+";Mr.value=Mr.string+"|"+Mr.number;Mr.id=Mr.variable;(function(){var t,e,r;for(t=Mr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Mr.comparatorOp+="|\\!"+e)})();ln=function(){return{checks:[]}},At={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},gD=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort(function(t,e){return yGe(t.selector,e.selector)}),oqe=function(){for(var t={},e,r=0;r0&&h.edgeCount>0)return Jr("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(h.edgeCount>1)return Jr("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;h.edgeCount===1&&Jr("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},dqe=function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=function(h){return h??""},r=function(h){return Wt(h)?'"'+h+'"':e(h)},n=function(h){return" "+h+" "},i=function(h,f){var d=h.type,p=h.value;switch(d){case At.GROUP:{var g=e(p);return g.substring(0,g.length-1)}case At.DATA_COMPARE:{var m=h.field,y=h.operator;return"["+m+n(e(y))+r(p)+"]"}case At.DATA_BOOL:{var x=h.operator,b=h.field;return"["+e(x)+b+"]"}case At.DATA_EXIST:{var w=h.field;return"["+w+"]"}case At.META_COMPARE:{var _=h.operator,k=h.field;return"[["+k+n(e(_))+r(p)+"]]"}case At.STATE:return p;case At.ID:return"#"+p;case At.CLASS:return"."+p;case At.PARENT:case At.CHILD:return a(h.parent,f)+n(">")+a(h.child,f);case At.ANCESTOR:case At.DESCENDANT:return a(h.ancestor,f)+" "+a(h.descendant,f);case At.COMPOUND_SPLIT:{var E=a(h.left,f),L=a(h.subject,f),S=a(h.right,f);return E+(E.length>0?" ":"")+L+S}case At.TRUE:return""}},a=function(h,f){return h.checks.reduce(function(d,p,g){return d+(f===h&&g===0?"$":"")+i(p,f)},"")},s="",o=0;o1&&o=0&&(r=r.replace("!",""),f=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),h=!0),(a||o||h)&&(l=!a&&!s?"":""+e,u=""+n),h&&(e=l=l.toLowerCase(),n=u=u.toLowerCase()),r){case"*=":i=l.indexOf(u)>=0;break;case"$=":i=l.indexOf(u,l.length-u.length)>=0;break;case"^=":i=l.indexOf(u)===0;break;case"=":i=e===n;break;case">":d=!0,i=e>n;break;case">=":d=!0,i=e>=n;break;case"<":d=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return UD(this,t,e,g0e)};Zm.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return UD(this,t,e,m0e)};Zm.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return UD(this,t,e,wqe)};Zm.ancestors=Zm.parents;Nx=v0e={data:Qr.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Qr.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Qr.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Qr.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Qr.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Qr.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}};Nx.attr=Nx.data;Nx.removeAttr=Nx.removeData;kqe=v0e,rE={};Kt(rE,{degree:iD(function(t,e){return e.source().same(e.target())?2:1}),indegree:iD(function(t,e){return e.target().same(t)?1:0}),outdegree:iD(function(t,e){return e.source().same(t)?1:0})});Kt(rE,{minDegree:Bm("degree",function(t,e){return te}),minIndegree:Bm("indegree",function(t,e){return te}),minOutdegree:Bm("outdegree",function(t,e){return te})});Kt(rE,{totalDegree:function(e){for(var r=0,n=this.nodes(),i=0;i0,d=f;f&&(h=h[0]);var p=d?h.position():{x:0,y:0};r!==void 0?u.position(e,r+p[e]):a!==void 0&&u.position({x:a.x+p.x,y:a.y+p.y})}else{var g=n.position(),m=o?n.parent():null,y=m&&m.length>0,x=y;y&&(m=m[0]);var b=x?m.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this}};Fl.modelPosition=Fl.point=Fl.position;Fl.modelPositions=Fl.points=Fl.positions;Fl.renderedPoint=Fl.renderedPosition;Fl.relativePoint=Fl.relativePosition;Tqe=y0e;Ym=Sf={};Sf.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,o=e.y1*n+i.y,l=e.y2*n+i.y;return{x1:a,x2:s,y1:o,y2:l,w:s-a,h:l-o}};Sf.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Sf.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var o=s._private,l=s.children(),u=s.pstyle("compound-sizing-wrt-labels").value==="include",h={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},f=l.boundingBox({includeLabels:u,includeOverlays:!1,useCache:!1}),d=o.position;(f.w===0||f.h===0)&&(f={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},f.x1=d.x-f.w/2,f.x2=d.x+f.w/2,f.y1=d.y-f.h/2,f.y2=d.y+f.h/2);function p(C,M,R){var T=0,I=0,A=M+R;return C>0&&A>0&&(T=M/A*C,I=R/A*C),{biasDiff:T,biasComplementDiff:I}}function g(C,M,R,T){if(R.units==="%")switch(T){case"width":return C>0?R.pfValue*C:0;case"height":return M>0?R.pfValue*M:0;case"average":return C>0&&M>0?R.pfValue*(C+M)/2:0;case"min":return C>0&&M>0?C>M?R.pfValue*M:R.pfValue*C:0;case"max":return C>0&&M>0?C>M?R.pfValue*C:R.pfValue*M:0;default:return 0}else return R.units==="px"?R.pfValue:0}var m=h.width.left.value;h.width.left.units==="px"&&h.width.val>0&&(m=m*100/h.width.val);var y=h.width.right.value;h.width.right.units==="px"&&h.width.val>0&&(y=y*100/h.width.val);var x=h.height.top.value;h.height.top.units==="px"&&h.height.val>0&&(x=x*100/h.height.val);var b=h.height.bottom.value;h.height.bottom.units==="px"&&h.height.val>0&&(b=b*100/h.height.val);var w=p(h.width.val-f.w,m,y),_=w.biasDiff,k=w.biasComplementDiff,E=p(h.height.val-f.h,x,b),L=E.biasDiff,S=E.biasComplementDiff;o.autoPadding=g(f.w,f.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),o.autoWidth=Math.max(f.w,h.width.val),d.x=(-_+f.x1+f.x2+k)/2,o.autoHeight=Math.max(f.h,h.height.val),d.y=(-L+f.y1+f.y2+S)/2}for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},_0=function(e,r){return r==null?e:Pl(e,r.x1,r.y1,r.x2,r.y2)},px=function(e,r,n){return Bl(e,r,n)},w6=function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,o=r.pstyle(n+"-arrow-shape").value,l,u;if(o!=="none"){n==="source"?(l=a.srcX,u=a.srcY):n==="target"?(l=a.tgtX,u=a.tgtY):(l=a.midX,u=a.midY);var h=i.arrowBounds=i.arrowBounds||{},f=h[n]=h[n]||{};f.x1=l-s,f.y1=u-s,f.x2=l+s,f.y2=u+s,f.w=f.x2-f.x1,f.h=f.y2-f.y1,A6(f,1),Pl(e,f.x1,f.y1,f.x2,f.y2)}}},aD=function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,o=r.pstyle(i+"label").strValue;if(o){var l=r.pstyle("text-halign"),u=r.pstyle("text-valign"),h=px(s,"labelWidth",n),f=px(s,"labelHeight",n),d=px(s,"labelX",n),p=px(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,m=r.pstyle(i+"text-margin-y").pfValue,y=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,w=r.pstyle("text-border-width").pfValue,_=w/2,k=r.pstyle("text-background-padding").pfValue,E=2,L=f,S=h,C=S/2,M=L/2,R,T,I,A;if(y)R=d-C,T=d+C,I=p-M,A=p+M;else{switch(l.value){case"left":R=d-S,T=d;break;case"center":R=d-C,T=d+C;break;case"right":R=d,T=d+S;break}switch(u.value){case"top":I=p-L,A=p;break;case"center":I=p-M,A=p+M;break;case"bottom":I=p,A=p+L;break}}var D=g-Math.max(b,_)-k-E,N=g+Math.max(b,_)+k+E,O=m-Math.max(b,_)-k-E,B=m+Math.max(b,_)+k+E;R+=D,T+=N,I+=O,A+=B;var P=n||"main",$=a.labelBounds,z=$[P]=$[P]||{};z.x1=R,z.y1=I,z.x2=T,z.y2=A,z.w=T-R,z.h=A-I,z.leftPad=D,z.rightPad=N,z.topPad=O,z.botPad=B;var H=y&&x.strValue==="autorotate",J=x.pfValue!=null&&x.pfValue!==0;if(H||J){var X=H?px(a.rstyle,"labelAngle",n):x.pfValue,oe=Math.cos(X),K=Math.sin(X),ee=(R+T)/2,Q=(I+A)/2;if(!y){switch(l.value){case"left":ee=T;break;case"right":ee=R;break}switch(u.value){case"top":Q=A;break;case"bottom":Q=I;break}}var W=function(ae,we){return ae=ae-ee,we=we-Q,{x:ae*oe-we*K+ee,y:ae*K+we*oe+Q}},Y=W(R,I),Z=W(R,A),se=W(T,I),ce=W(T,A);R=Math.min(Y.x,Z.x,se.x,ce.x),T=Math.max(Y.x,Z.x,se.x,ce.x),I=Math.min(Y.y,Z.y,se.y,ce.y),A=Math.max(Y.y,Z.y,se.y,ce.y)}var ue=P+"Rot",te=$[ue]=$[ue]||{};te.x1=R,te.y1=I,te.x2=T,te.y2=A,te.w=T-R,te.h=A-I,Pl(e,R,I,T,A),Pl(a.labelBounds.all,R,I,T,A)}return e}},Eqe=function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value;if(n>0&&i>0){var a=r.pstyle("outline-offset").value,s=r.pstyle("shape").value,o=i+a,l=(e.w+o*2)/e.w,u=(e.h+o*2)/e.h,h=0,f=0;["diamond","pentagon","round-triangle"].includes(s)?(l=(e.w+o*2.4)/e.w,f=-o/3.6):["concave-hexagon","rhomboid","right-rhomboid"].includes(s)?l=(e.w+o*2.4)/e.w:s==="star"?(l=(e.w+o*2.8)/e.w,u=(e.h+o*2.6)/e.h,f=-o/3.8):s==="triangle"?(l=(e.w+o*2.8)/e.w,u=(e.h+o*2.4)/e.h,f=-o/1.4):s==="vee"&&(l=(e.w+o*4.4)/e.w,u=(e.h+o*3.8)/e.h,f=-o*.5);var d=e.h*u-e.h,p=e.w*l-e.w;if(_6(e,[Math.ceil(d/2),Math.ceil(p/2)]),h!=0||f!==0){var g=HUe(e,h,f);Yde(e,g)}}}},Sqe=function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=Fs(),o=e._private,l=e.isNode(),u=e.isEdge(),h,f,d,p,g,m,y=o.rstyle,x=l&&i?e.pstyle("bounds-expansion").pfValue:[0],b=function(Ne){return Ne.pstyle("display").value!=="none"},w=!i||b(e)&&(!u||b(e.source())&&b(e.target()));if(w){var _=0,k=0;i&&r.includeOverlays&&(_=e.pstyle("overlay-opacity").value,_!==0&&(k=e.pstyle("overlay-padding").value));var E=0,L=0;i&&r.includeUnderlays&&(E=e.pstyle("underlay-opacity").value,E!==0&&(L=e.pstyle("underlay-padding").value));var S=Math.max(k,L),C=0,M=0;if(i&&(C=e.pstyle("width").pfValue,M=C/2),l&&r.includeNodes){var R=e.position();g=R.x,m=R.y;var T=e.outerWidth(),I=T/2,A=e.outerHeight(),D=A/2;h=g-I,f=g+I,d=m-D,p=m+D,Pl(s,h,d,f,p),i&&r.includeOutlines&&Eqe(s,e)}else if(u&&r.includeEdges)if(i&&!a){var N=e.pstyle("curve-style").strValue;if(h=Math.min(y.srcX,y.midX,y.tgtX),f=Math.max(y.srcX,y.midX,y.tgtX),d=Math.min(y.srcY,y.midY,y.tgtY),p=Math.max(y.srcY,y.midY,y.tgtY),h-=M,f+=M,d-=M,p+=M,Pl(s,h,d,f,p),N==="haystack"){var O=y.haystackPts;if(O&&O.length===2){if(h=O[0].x,d=O[0].y,f=O[1].x,p=O[1].y,h>f){var B=h;h=f,f=B}if(d>p){var P=d;d=p,p=P}Pl(s,h-M,d-M,f+M,p+M)}}else if(N==="bezier"||N==="unbundled-bezier"||N.endsWith("segments")||N.endsWith("taxi")){var $;switch(N){case"bezier":case"unbundled-bezier":$=y.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":$=y.linePts;break}if($!=null)for(var z=0;z<$.length;z++){var H=$[z];h=H.x-M,f=H.x+M,d=H.y-M,p=H.y+M,Pl(s,h,d,f,p)}}}else{var J=e.source(),X=J.position(),oe=e.target(),K=oe.position();if(h=X.x,f=K.x,d=X.y,p=K.y,h>f){var ee=h;h=f,f=ee}if(d>p){var Q=d;d=p,p=Q}h-=M,f+=M,d-=M,p+=M,Pl(s,h,d,f,p)}if(i&&r.includeEdges&&u&&(w6(s,e,"mid-source"),w6(s,e,"mid-target"),w6(s,e,"source"),w6(s,e,"target")),i){var W=e.pstyle("ghost").value==="yes";if(W){var Y=e.pstyle("ghost-offset-x").pfValue,Z=e.pstyle("ghost-offset-y").pfValue;Pl(s,s.x1+Y,s.y1+Z,s.x2+Y,s.y2+Z)}}var se=o.bodyBounds=o.bodyBounds||{};bfe(se,s),_6(se,x),A6(se,1),i&&(h=s.x1,f=s.x2,d=s.y1,p=s.y2,Pl(s,h-S,d-S,f+S,p+S));var ce=o.overlayBounds=o.overlayBounds||{};bfe(ce,s),_6(ce,x),A6(ce,1);var ue=o.labelBounds=o.labelBounds||{};ue.all!=null?WUe(ue.all):ue.all=Fs(),i&&r.includeLabels&&(r.includeMainLabels&&aD(s,e,null),u&&(r.includeSourceLabels&&aD(s,e,"source"),r.includeTargetLabels&&aD(s,e,"target")))}return s.x1=Zo(s.x1),s.y1=Zo(s.y1),s.x2=Zo(s.x2),s.y2=Zo(s.y2),s.w=Zo(s.x2-s.x1),s.h=Zo(s.y2-s.y1),s.w>0&&s.h>0&&w&&(_6(s,x),A6(s,1)),s},b0e=function(e){var r=0,n=function(s){return(s?1:0)<=0;o--)s(o);return this};Ef.removeAllListeners=function(){return this.removeListener("*")};Ef.emit=Ef.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,vn(e)||(e=[e]),Gqe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var o=function(h){var f=n[h];if(f.type===s.type&&(!f.namespace||f.namespace===s.namespace||f.namespace===zqe)&&a.eventMatches(a.context,f,s)){var d=[s];e!=null&&yUe(d,e),a.beforeEmit(a.context,f,s),f.conf&&f.conf.one&&(a.listeners=a.listeners.filter(function(m){return m!==f}));var p=a.callbackContext(a.context,f,s),g=f.callback.apply(p,d);a.afterEmit(a.context,f,s),g===!1&&(s.stopPropagation(),s.preventDefault())}},l=0;l1&&!s){var o=this.length-1,l=this[o],u=l._private.data.id;this[o]=void 0,this[e]=l,a.set(u,{ele:l,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},unmerge:function(e){var r=this._private.cy;if(!e)return this;if(e&&Wt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},map:function(e,r){for(var n=[],i=this,a=0;an&&(n=l,i=o)}return{value:n,ele:i}},min:function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":Oi(Symbol))!=e&&Oi(Symbol.iterator)!=e;r&&(U6[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return Sde({next:function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){this.cleanStyle();var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},numericStyle:function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},numericStyleUnits:function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},renderedStyle:function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},style:function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Dr(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Wt(e))if(r===void 0){var o=this[0];return o?a.getStylePropertyValue(o,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var l=this[0];return l?a.getRawStyle(l):void 0}return this},removeStyle:function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(h[0]),e.push(o[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}});Ma.neighbourhood=Ma.neighborhood;Ma.closedNeighbourhood=Ma.closedNeighborhood;Ma.openNeighbourhood=Ma.openNeighborhood;Kt(Ma,{source:Qo(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"source"),target:Qo(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"target"),sources:Qfe({attr:"source"}),targets:Qfe({attr:"target"})});Kt(Ma,{edgesWith:Qo(Jfe(),"edgesWith"),edgesTo:Qo(Jfe({thisIsSrc:!0}),"edgesTo")});Kt(Ma,{connectedEdges:Qo(function(t){for(var e=[],r=this,n=0;n0);return s},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}});Ma.componentsOf=Ma.components;xa=function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){ni("A collection must have a reference to the core");return}var a=new Vc,s=!1;if(!r)r=[];else if(r.length>0&&Dr(r[0])&&!Px(r[0])){s=!0;for(var o=[],l=new Qm,u=0,h=r.length;u0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],o,l=0,u=r.length;l0){for(var P=o.length===r.length?r:new xa(n,o),$=0;$0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(A){for(var D=A._private.edges,N=0;N0&&(t?R.emitAndNotify("remove"):e&&R.emit("remove"));for(var T=0;Th&&Math.abs(g.v)>h;);return d?function(m){return l[m*(l.length-1)|0]}:u}}(),_n=function(e,r,n,i){var a=Zqe(e,r,n,i);return function(s,o,l){return s+(o-s)*a(l)}},N6={linear:function(e,r,n){return e+(r-e)*n},ease:_n(.25,.1,.25,1),"ease-in":_n(.42,0,1,1),"ease-out":_n(0,0,.58,1),"ease-in-out":_n(.42,0,.58,1),"ease-in-sine":_n(.47,0,.745,.715),"ease-out-sine":_n(.39,.575,.565,1),"ease-in-out-sine":_n(.445,.05,.55,.95),"ease-in-quad":_n(.55,.085,.68,.53),"ease-out-quad":_n(.25,.46,.45,.94),"ease-in-out-quad":_n(.455,.03,.515,.955),"ease-in-cubic":_n(.55,.055,.675,.19),"ease-out-cubic":_n(.215,.61,.355,1),"ease-in-out-cubic":_n(.645,.045,.355,1),"ease-in-quart":_n(.895,.03,.685,.22),"ease-out-quart":_n(.165,.84,.44,1),"ease-in-out-quart":_n(.77,0,.175,1),"ease-in-quint":_n(.755,.05,.855,.06),"ease-out-quint":_n(.23,1,.32,1),"ease-in-out-quint":_n(.86,0,.07,1),"ease-in-expo":_n(.95,.05,.795,.035),"ease-out-expo":_n(.19,1,.22,1),"ease-in-out-expo":_n(1,0,0,1),"ease-in-circ":_n(.6,.04,.98,.335),"ease-out-circ":_n(.075,.82,.165,1),"ease-in-out-circ":_n(.785,.135,.15,.86),spring:function(e,r,n){if(n===0)return N6.linear;var i=Qqe(e,r,n);return function(a,s,o){return a+(s-a)*i(o)}},"cubic-bezier":_n};tYe={animate:Qr.animate(),animation:Qr.animation(),animated:Qr.animated(),clearQueue:Qr.clearQueue(),delay:Qr.delay(),delayAnimation:Qr.delayAnimation(),stop:Qr.stop(),addToAnimationPool:function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&B6(function(a){nde(a,e),r()})}var n=e.renderer();n&&n.beforeRender?n.beforeRender(function(a,s){nde(s,e)},n.beforeRenderPriorities.animations):r()}},rYe={qualifierCompare:function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},eventMatches:function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&Px(n.target)&&i.matches(n.target):!0},addEventFields:function(e,r){r.cy=e,r.target=e},callbackContext:function(e,r,n){return r.qualifier!=null?n.target:e}},E6=function(e){return Wt(e)?new kf(e):e},N0e={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new nE(rYe,this)),this},emitter:function(){return this._private.emitter},on:function(e,r,n){return this.emitter().on(e,E6(r),n),this},removeListener:function(e,r,n){return this.emitter().removeListener(e,E6(r),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,r,n){return this.emitter().one(e,E6(r),n),this},once:function(e,r,n){return this.emitter().one(e,E6(r),n),this},emit:function(e,r){return this.emitter().emit(e,r),this},emitAndNotify:function(e,r){return this.emit(e),this.notify(e,r),this}};Qr.eventAliasesOn(N0e);vD={png:function(e){var r=this._private.renderer;return e=e||{},r.png(e)},jpg:function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)}};vD.jpeg=vD.jpg;I6={layout:function(e){var r=this;if(e==null){ni("Layout options must be specified to make a layout");return}if(e.name==null){ni("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){ni("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Wt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(Kt({},e,{cy:r,eles:a}));return s}};I6.createLayout=I6.makeLayout=I6.layout;nYe={notify:function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},notifications:function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};yD.invalidateDimensions=yD.resize;M6={collection:function(e,r){return Wt(e)?this.$(e):co(e)?e.collection():vn(e)?(r||(r={}),new xa(this,e,r.unique,r.removed)):new xa(this)},nodes:function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},edges:function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},$:function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},mutableElements:function(){return this._private.elements}};M6.elements=M6.filter=M6.$;Oa={},kx="t",aYe="f";Oa.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(d||f&&p){var g=void 0;d&&p||d?g=u.properties:p&&(g=u.mappedProperties);for(var m=0;m1&&(_=1),o.color){var E=n.valueMin[0],L=n.valueMax[0],S=n.valueMin[1],C=n.valueMax[1],M=n.valueMin[2],R=n.valueMax[2],T=n.valueMin[3]==null?1:n.valueMin[3],I=n.valueMax[3]==null?1:n.valueMax[3],A=[Math.round(E+(L-E)*_),Math.round(S+(C-S)*_),Math.round(M+(R-M)*_),Math.round(T+(I-T)*_)];a={bypass:n.bypass,name:n.name,value:A,strValue:"rgb("+A[0]+", "+A[1]+", "+A[2]+")"}}else if(o.number){var D=n.valueMin+(n.valueMax-n.valueMin)*_;a=this.parse(n.name,D,n.bypass,d)}else return!1;if(!a)return m(),!1;a.mapping=n,n=a;break}case s.data:{for(var N=n.field.split("."),O=f.data,B=0;B0&&a>0){for(var o={},l=!1,u=0;u0?t.delayAnimation(s).play().promise().then(w):w()}).then(function(){return t.animation({style:o,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};Oa.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],o=i(s);o!=null&&o(r,n)&&a(s)};Oa.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};Oa.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache(),i.triggersBoundsOfParallelBeziers&&e==="curve-style"&&(r==="bezier"||n==="bezier")&&t.parallelEdges().forEach(function(a){a.isBundledBezier()&&a.dirtyBoundingBoxCache()}),i.triggersBoundsOfConnectedEdges&&e==="display"&&(r==="none"||n==="none")&&t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};Oa.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n)};$x={};$x.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var o=0;oi.length?n=n.substr(i.length):n=""}function l(){a.length>s.length?a=a.substr(s.length):a=""}for(;;){var u=n.match(/^\s*$/);if(u)break;var h=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!h){Jr("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=h[0];var f=h[1];if(f!=="core"){var d=new kf(f);if(d.invalid){Jr("Skipping parsing of block: Invalid selector found in string stylesheet: "+f),o();continue}}var p=h[2],g=!1;a=p;for(var m=[];;){var y=a.match(/^\s*$/);if(y)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){Jr("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+p),g=!0;break}s=x[0];var b=x[1],w=x[2],_=e.properties[b];if(!_){Jr("Skipping property: Invalid property name in: "+s),l();continue}var k=r.parse(b,w);if(!k){Jr("Skipping property: Invalid property definition in: "+s),l();continue}m.push({name:b,val:w}),l()}if(g){o();break}r.selector(f);for(var E=0;E=7&&e[0]==="d"&&(h=new RegExp(o.data.regex).exec(e))){if(r)return!1;var d=o.data;return{name:t,value:h,strValue:""+e,mapped:d,field:h[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(f=new RegExp(o.mapData.regex).exec(e))){if(r||u.multiple)return!1;var p=o.mapData;if(!(u.color||u.number))return!1;var g=this.parse(t,f[4]);if(!g||g.mapped)return!1;var m=this.parse(t,f[5]);if(!m||m.mapped)return!1;if(g.pfValue===m.pfValue||g.strValue===m.strValue)return Jr("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(u.color){var y=g.value,x=m.value,b=y[0]===x[0]&&y[1]===x[1]&&y[2]===x[2]&&(y[3]===x[3]||(y[3]==null||y[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],fieldMin:parseFloat(f[2]),fieldMax:parseFloat(f[3]),valueMin:g.value,valueMax:m.value,bypass:r}}}if(u.multiple&&n!=="multiple"){var w;if(l?w=e.split(/\s+/):vn(e)?w=e:w=[e],u.evenMultiple&&w.length%2!==0)return null;for(var _=[],k=[],E=[],L="",S=!1,C=0;C0?" ":"")+M.strValue}return u.validate&&!u.validate(_,k)?null:u.singleEnum&&S?_.length===1&&Wt(_[0])?{name:t,value:_[0],strValue:_[0],bypass:r}:null:{name:t,value:_,pfValue:E,strValue:L,bypass:r,units:k}}var R=function(){for(var W=0;Wu.max||u.strictMax&&e===u.max))return null;var N={name:t,value:e,strValue:""+e+(T||""),units:T,bypass:r};return u.unitless||T!=="px"&&T!=="em"?N.pfValue=e:N.pfValue=T==="px"||!T?e:this.getEmSizeInPixels()*e,(T==="ms"||T==="s")&&(N.pfValue=T==="ms"?e:1e3*e),(T==="deg"||T==="rad")&&(N.pfValue=T==="rad"?e:$Ue(e)),T==="%"&&(N.pfValue=e/100),N}else if(u.propList){var O=[],B=""+e;if(B!=="none"){for(var P=B.split(/\s*,\s*|\s+/),$=0;$0&&o>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){l=Math.min((s-2*r)/n.w,(o-2*r)/n.h),l=l>this._private.maxZoom?this._private.maxZoom:l,l=l=n.minZoom&&(n.maxZoom=r),this},minZoom:function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,o=!1;if(r.zoomingEnabled||(o=!0),dt(e)?s=e:Dr(e)&&(s=e.level,e.position!=null?a=Z6(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(o=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=l,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var u=e.pan;dt(u.x)&&(r.pan.x=u.x,o=!1),dt(u.y)&&(r.pan.y=u.y,o=!1),o||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},center:function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,r){if(this._private.panningEnabled){if(Wt(e)){var n=e;e=this.mutableElements().filter(n)}else co(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var o={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return o}}},reset:function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?function(){var i=n.window().getComputedStyle(r),a=function(o){return parseFloat(i.getPropertyValue(o))};return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}}():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},renderedExtent:function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},multiClickDebounceTime:function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this}};B0.centre=B0.center;B0.autolockNodes=B0.autolock;B0.autoungrabifyNodes=B0.autoungrabify;Mx={data:Qr.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Qr.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Qr.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Qr.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Mx.attr=Mx.data;Mx.removeAttr=Mx.removeData;Dx=function(e){var r=this;e=Kt({},e);var n=e.container;n&&!P6(n)&&P6(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Mi!==void 0&&n!==void 0&&!e.headless,o=e;o.layout=Kt({name:s?"grid":"null"},o.layout),o.renderer=Kt({name:s?"canvas":"null"},o.renderer);var l=function(g,m,y){return m!==void 0?m:y!==void 0?y:g},u=this._private={container:n,ready:!1,options:o,elements:new xa(this),listeners:[],aniEles:new xa(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:l(!0,o.zoomingEnabled),userZoomingEnabled:l(!0,o.userZoomingEnabled),panningEnabled:l(!0,o.panningEnabled),userPanningEnabled:l(!0,o.userPanningEnabled),boxSelectionEnabled:l(!0,o.boxSelectionEnabled),autolock:l(!1,o.autolock,o.autolockNodes),autoungrabify:l(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:l(!1,o.autounselectify),styleEnabled:o.styleEnabled===void 0?s:o.styleEnabled,zoom:dt(o.zoom)?o.zoom:1,pan:{x:Dr(o.pan)&&dt(o.pan.x)?o.pan.x:0,y:Dr(o.pan)&&dt(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:l(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var h=function(g,m){var y=g.some(uGe);if(y)return Jm.all(g).then(m);m(g)};u.styleEnabled&&r.setStyle([]);var f=Kt({},o,o.renderer);r.initRenderer(f);var d=function(g,m,y){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Dr(g)||vn(g))&&r.add(g),r.one("layoutready",function(w){r.notifications(!0),r.emit(w),r.one("load",m),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",y),r.emit("done")});var b=Kt({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()};h([o.style,o.elements],function(p){var g=p[0],m=p[1];u.styleEnabled&&r.style().append(g),d(m,function(){r.startAnimationLoop(),u.ready=!0,jn(o.ready)&&r.on("ready",o.ready);for(var y=0;y0,l=Fs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),u;if(co(e.roots))u=e.roots;else if(vn(e.roots)){for(var h=[],f=0;f0;){var D=A(),N=M(D,T);if(N)D.outgoers().filter(function(ue){return ue.isNode()&&n.has(ue)}).forEach(I);else if(N===null){Jr("Detected double maximal shift for node `"+D.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}C();var O=0;if(e.avoidOverlap)for(var B=0;B0&&x[0].length<=3?De/2:0),Pe=2*Math.PI/x[ae].length*we;return ae===0&&x[0].length===1&&(Re=1),{x:Z.x+Re*Math.cos(Pe),y:Z.y+Re*Math.sin(Pe)}}else{var We={x:Z.x+(we+1-(Ie+1)/2)*Ee,y:(ae+1)*Oe};return We}};return n.nodes().layoutPositions(this,e,ce),this};uYe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,r){return!0},ready:void 0,stop:void 0,transform:function(e,r){return r}};M0e.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=Fs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,u=l/Math.max(1,a.length-1),h,f=0,d=0;d1&&e.avoidOverlap){f*=1.75;var x=Math.cos(u)-Math.cos(0),b=Math.sin(u)-Math.sin(0),w=Math.sqrt(f*f/(x*x+b*b));h=Math.max(w,h)}var _=function(E,L){var S=e.startAngle+L*u*(i?1:-1),C=h*Math.cos(S),M=h*Math.sin(S),R={x:o.x+C,y:o.y+M};return R};return n.nodes().layoutPositions(this,e,_),this};hYe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,r){return!0},ready:void 0,stop:void 0,transform:function(e,r){return r}};D0e.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=Fs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=[],u=0,h=0;h0){var k=Math.abs(b[0].value-_.value);k>=y&&(b=[],x.push(b))}b.push(_)}var E=u+e.minNodeSpacing;if(!e.avoidOverlap){var L=x.length>0&&x[0].length>1,S=Math.min(s.w,s.h)/2-E,C=S/(x.length+L?1:0);E=Math.min(E,C)}for(var M=0,R=0;R1&&e.avoidOverlap){var D=Math.cos(A)-Math.cos(0),N=Math.sin(A)-Math.sin(0),O=Math.sqrt(E*E/(D*D+N*N));M=Math.max(O,M)}T.r=M,M+=E}if(e.equidistant){for(var B=0,P=0,$=0;$=t.numIter||(xYe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),B6(f)}};h()}else{for(;u;)u=s(l),l++;sde(n,t),o()}return this};lE.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};lE.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};dYe=function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=Fs(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},l=n.eles.components(),u={},h=0;h0){o.graphSet.push(S);for(var h=0;hi.count?0:i.graph},gYe=function t(e,r,n,i){var a=i.graphSet[n];if(-10)var f=i.nodeOverlap*h,d=Math.sqrt(o*o+l*l),p=f*o/d,g=f*l/d;else var m=W6(e,o,l),y=W6(r,-1*o,-1*l),x=y.x-m.x,b=y.y-m.y,w=x*x+b*b,d=Math.sqrt(w),f=(e.nodeRepulsion+r.nodeRepulsion)/w,p=f*x/d,g=f*b/d;e.isLocked||(e.offsetX-=p,e.offsetY-=g),r.isLocked||(r.offsetX+=p,r.offsetY+=g)}},kYe=function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},W6=function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,o=e.width||1,l=n/r,u=s/o,h={};return r===0&&0n?(h.x=i,h.y=a+s/2,h):0r&&-1*u<=l&&l<=u?(h.x=i-o/2,h.y=a-o*n/2/r,h):0=u)?(h.x=i+s*r/2/n,h.y=a+s/2,h):(0>n&&(l<=-1*u||l>=u)&&(h.x=i-s*r/2/n,h.y=a-s/2),h)},TYe=function(e,r){for(var n=0;nn){var y=r.gravity*p/m,x=r.gravity*g/m;d.offsetX+=y,d.offsetY+=x}}}}},SYe=function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],o=e.idToIndex[s],l=e.layoutNodes[o],u=l.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},_Ye=function t(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=y+r.componentSpacing,p=0,m=0,y=0)}}},LYe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,r){return!0},ready:void 0,stop:void 0,transform:function(e,r){return r}};P0e.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=Fs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(J){return{x:a.x1,y:a.y1}});else{var s=i.size(),o=Math.sqrt(s*a.h/a.w),l=Math.round(o),u=Math.round(a.w/a.h*o),h=function(X){if(X==null)return Math.min(l,u);var oe=Math.min(l,u);oe==l?l=X:u=X},f=function(X){if(X==null)return Math.max(l,u);var oe=Math.max(l,u);oe==l?l=X:u=X},d=e.rows,p=e.cols!=null?e.cols:e.columns;if(d!=null&&p!=null)l=d,u=p;else if(d!=null&&p==null)l=d,u=Math.ceil(s/l);else if(d==null&&p!=null)u=p,l=Math.ceil(s/u);else if(u*l>s){var g=h(),m=f();(g-1)*m>=s?h(g-1):(m-1)*g>=s&&f(m-1)}else for(;u*l=s?f(x+1):h(y+1)}var b=a.w/u,w=a.h/l;if(e.condense&&(b=0,w=0),e.avoidOverlap)for(var _=0;_=u&&(D=0,A++)},O={},B=0;B(D=JUe(t,e,N[O],N[O+1],N[O+2],N[O+3])))return y(L,D),!0}else if(C.edgeType==="bezier"||C.edgeType==="multibezier"||C.edgeType==="self"||C.edgeType==="compound"){for(var N=C.allpts,O=0;O+5(D=QUe(t,e,N[O],N[O+1],N[O+2],N[O+3],N[O+4],N[O+5])))return y(L,D),!0}for(var B=B||S.source,P=P||S.target,$=i.getArrowWidth(M,R),z=[{name:"source",x:C.arrowStartX,y:C.arrowStartY,angle:C.srcArrowAngle},{name:"target",x:C.arrowEndX,y:C.arrowEndY,angle:C.tgtArrowAngle},{name:"mid-source",x:C.midX,y:C.midY,angle:C.midsrcArrowAngle},{name:"mid-target",x:C.midX,y:C.midY,angle:C.midtgtArrowAngle}],O=0;O0&&(x(B),x(P))}function w(L,S,C){return Bl(L,S,C)}function _(L,S){var C=L._private,M=d,R;S?R=S+"-":R="",L.boundingBox();var T=C.labelBounds[S||"main"],I=L.pstyle(R+"label").value,A=L.pstyle("text-events").strValue==="yes";if(!(!A||!I)){var D=w(C.rscratch,"labelX",S),N=w(C.rscratch,"labelY",S),O=w(C.rscratch,"labelAngle",S),B=L.pstyle(R+"text-margin-x").pfValue,P=L.pstyle(R+"text-margin-y").pfValue,$=T.x1-M-B,z=T.x2+M-B,H=T.y1-M-P,J=T.y2+M-P;if(O){var X=Math.cos(O),oe=Math.sin(O),K=function(ce,ue){return ce=ce-D,ue=ue-N,{x:ce*X-ue*oe+D,y:ce*oe+ue*X+N}},ee=K($,H),Q=K($,J),W=K(z,H),Y=K(z,J),Z=[ee.x+B,ee.y+P,W.x+B,W.y+P,Y.x+B,Y.y+P,Q.x+B,Q.y+P];if(Bs(t,e,Z))return y(L),!0}else if(jm(T,t,e))return y(L),!0}}for(var k=s.length-1;k>=0;k--){var E=s[k];E.isNode()?x(E)||_(E):b(E)||_(E)||_(E,"source")||_(E,"target")}return o};z0.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=[],s=Math.min(t,r),o=Math.max(t,r),l=Math.min(e,n),u=Math.max(e,n);t=s,r=o,e=l,n=u;for(var h=Fs({x1:t,y1:e,x2:r,y2:n}),f=0;f0?-(Math.PI-e.ang):Math.PI+e.ang},OYe=function(e,r,n,i,a){if(e!==hde?fde(r,e,Gc):DYe(Ko,Gc),fde(r,n,Ko),cde=Gc.nx*Ko.ny-Gc.ny*Ko.nx,ude=Gc.nx*Ko.nx-Gc.ny*-Ko.ny,Zu=Math.asin(Math.max(-1,Math.min(1,cde))),Math.abs(Zu)<1e-6){xD=r.x,bD=r.y,L0=$m=0;return}R0=1,D6=!1,ude<0?Zu<0?Zu=Math.PI+Zu:(Zu=Math.PI-Zu,R0=-1,D6=!0):Zu>0&&(R0=-1,D6=!0),r.radius!==void 0?$m=r.radius:$m=i,S0=Zu/2,S6=Math.min(Gc.len/2,Ko.len/2),a?($c=Math.abs(Math.cos(S0)*$m/Math.sin(S0)),$c>S6?($c=S6,L0=Math.abs($c*Math.sin(S0)/Math.cos(S0))):L0=$m):($c=Math.min(S6,$m),L0=Math.abs($c*Math.sin(S0)/Math.cos(S0))),wD=r.x+Ko.nx*$c,kD=r.y+Ko.ny*$c,xD=wD-Ko.ny*L0*R0,bD=kD+Ko.nx*L0*R0,$0e=r.x+Gc.nx*$c,G0e=r.y+Gc.ny*$c,hde=r};Pa={};Pa.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),o=t.pstyle("target-endpoint"),l=s.units!=null&&o.units!=null,u=function(k,E,L,S){var C=S-E,M=L-k,R=Math.sqrt(M*M+C*C);return{x:-C/R,y:M/R}},h=t.pstyle("edge-distances").value;switch(h){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(l){var f=this.manualEndptToPx(t.source()[0],s),d=Ol(f,2),p=d[0],g=d[1],m=this.manualEndptToPx(t.target()[0],o),y=Ol(m,2),x=y[0],b=y[1],w={x1:p,y1:g,x2:x,y2:b};i=u(p,g,x,b),a=w}else Jr("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};Pa.findHaystackPoints=function(t){for(var e=0;e0?Math.max(j-ye,0):Math.min(j+ye,0)},I=T(M,S),A=T(R,C),D=!1;b===u?x=Math.abs(I)>Math.abs(A)?i:n:b===l||b===o?(x=n,D=!0):(b===a||b===s)&&(x=i,D=!0);var N=x===n,O=N?A:I,B=N?R:M,P=qde(B),$=!1;!(D&&(_||E))&&(b===o&&B<0||b===l&&B>0||b===a&&B>0||b===s&&B<0)&&(P*=-1,O=P*Math.abs(O),$=!0);var z;if(_){var H=k<0?1+k:k;z=H*O}else{var J=k<0?O:0;z=J+k*P}var X=function(j){return Math.abs(j)=Math.abs(O)},oe=X(z),K=X(Math.abs(O)-Math.abs(z)),ee=oe||K;if(ee&&!$)if(N){var Q=Math.abs(B)<=d/2,W=Math.abs(M)<=p/2;if(Q){var Y=(h.x1+h.x2)/2,Z=h.y1,se=h.y2;r.segpts=[Y,Z,Y,se]}else if(W){var ce=(h.y1+h.y2)/2,ue=h.x1,te=h.x2;r.segpts=[ue,ce,te,ce]}else r.segpts=[h.x1,h.y2]}else{var Ne=Math.abs(B)<=f/2,ae=Math.abs(R)<=g/2;if(Ne){var we=(h.y1+h.y2)/2,Ie=h.x1,Ee=h.x2;r.segpts=[Ie,we,Ee,we]}else if(ae){var Oe=(h.x1+h.x2)/2,De=h.y1,We=h.y2;r.segpts=[Oe,De,Oe,We]}else r.segpts=[h.x2,h.y1]}else if(N){var Re=h.y1+z+(y?d/2*P:0),Pe=h.x1,xe=h.x2;r.segpts=[Pe,Re,xe,Re]}else{var q=h.x1+z+(y?f/2*P:0),de=h.y1,ie=h.y2;r.segpts=[q,de,q,ie]}if(r.isRound){var he=t.pstyle("taxi-radius").value,U=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(he),r.isArcRadius=new Array(r.segpts.length/2).fill(U)}};Pa.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,o=e.tgtW,l=e.tgtH,u=e.srcShape,h=e.tgtShape,f=e.srcCornerRadius,d=e.tgtCornerRadius,p=e.srcRs,g=e.tgtRs,m=!dt(r.startX)||!dt(r.startY),y=!dt(r.arrowStartX)||!dt(r.arrowStartY),x=!dt(r.endX)||!dt(r.endY),b=!dt(r.arrowEndX)||!dt(r.arrowEndY),w=3,_=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,k=w*_,E=D0({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),L=EA.poolIndex()){var D=I;I=A,A=D}var N=C.srcPos=I.position(),O=C.tgtPos=A.position(),B=C.srcW=I.outerWidth(),P=C.srcH=I.outerHeight(),$=C.tgtW=A.outerWidth(),z=C.tgtH=A.outerHeight(),H=C.srcShape=r.nodeShapes[e.getNodeShape(I)],J=C.tgtShape=r.nodeShapes[e.getNodeShape(A)],X=C.srcCornerRadius=I.pstyle("corner-radius").value==="auto"?"auto":I.pstyle("corner-radius").pfValue,oe=C.tgtCornerRadius=A.pstyle("corner-radius").value==="auto"?"auto":A.pstyle("corner-radius").pfValue,K=C.tgtRs=A._private.rscratch,ee=C.srcRs=I._private.rscratch;C.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var Q=0;Q0){var se=a,ce=A0(se,Um(r)),ue=A0(se,Um(Z)),te=ce;if(ue2){var Ne=A0(se,{x:Z[2],y:Z[3]});Ne0){var ie=s,he=A0(ie,Um(r)),U=A0(ie,Um(de)),ke=he;if(U2){var j=A0(ie,{x:de[2],y:de[3]});j=g||L){y={cp:_,segment:E};break}}if(y)break}var S=y.cp,C=y.segment,M=(g-x)/C.length,R=C.t1-C.t0,T=p?C.t0+R*M:C.t1-R*M;T=_x(0,T,1),e=Wm(S.p0,S.p1,S.p2,T),d=BYe(S.p0,S.p1,S.p2,T);break}case"straight":case"segments":case"haystack":{for(var I=0,A,D,N,O,B=n.allpts.length,P=0;P+3=g));P+=2);var $=g-D,z=$/A;z=_x(0,z,1),e=UUe(N,O,z),d=H0e(N,O);break}}s("labelX",f,e.x),s("labelY",f,e.y),s("labelAutoAngle",f,d)}};u("source"),u("target"),this.applyLabelDimensions(t)}};Hc.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};Hc.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=this.calculateLabelDimensions(t,n),a=t.pstyle("line-height").pfValue,s=t.pstyle("text-wrap").strValue,o=Bl(r.rscratch,"labelWrapCachedLines",e)||[],l=s!=="wrap"?1:Math.max(o.length,1),u=i.height/l,h=u*a,f=i.width,d=i.height+(l-1)*(a-1)*u;mf(r.rstyle,"labelWidth",e,f),mf(r.rscratch,"labelWidth",e,f),mf(r.rstyle,"labelHeight",e,d),mf(r.rscratch,"labelHeight",e,d),mf(r.rscratch,"labelLineHeight",e,h)};Hc.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=function(J,X){return X?(mf(r.rscratch,J,e,X),X):Bl(r.rscratch,J,e)};if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var o=t.pstyle("text-wrap").value;if(o==="wrap"){var l=s("labelKey");if(l!=null&&s("labelWrapKey")===l)return s("labelWrapCachedText");for(var u="\u200B",h=i.split(` `),f=t.pstyle("text-max-width").pfValue,d=t.pstyle("text-overflow-wrap").value,p=d==="anywhere",g=[],m=/[\s\u200b]+|$/g,y=0;yf){var k=x.matchAll(m),E="",L=0,S=Ade(k),C;try{for(S.s();!(C=S.n()).done;){var M=C.value,R=M[0],T=x.substring(L,M.index);L=M.index+R.length;var I=E.length===0?T:E+T+R,A=this.calculateLabelDimensions(t,I),D=A.width;D<=f?E+=T+R:(E&&g.push(E),E=T+R)}}catch(H){S.e(H)}finally{S.f()}E.match(/^[\s\u200b]+$/)||g.push(E)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` `)),s("labelWrapKey",l)}else if(o==="ellipsis"){var N=t.pstyle("text-max-width").pfValue,O="",B="\u2026",P=!1;if(this.calculateLabelDimensions(t,i).widthN)break;O+=i[$],$===i.length-1&&(P=!0)}return P||(O+=B),O}return i};Hc.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Hc.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=M0(e,t._private.labelDimsKey),s=r.labelDimCache||(r.labelDimCache=[]),o=s[a];if(o!=null)return o;var l=0,u=t.pstyle("font-style").strValue,h=t.pstyle("font-size").pfValue,f=t.pstyle("font-family").strValue,d=t.pstyle("font-weight").strValue,p=this.labelCalcCanvas,g=this.labelCalcCanvasContext;if(!p){p=this.labelCalcCanvas=i.createElement("canvas"),g=this.labelCalcCanvasContext=p.getContext("2d");var m=p.style;m.position="absolute",m.left="-9999px",m.top="-9999px",m.zIndex="-1",m.visibility="hidden",m.pointerEvents="none"}g.font="".concat(u," ").concat(d," ").concat(h,"px ").concat(f);for(var y=0,x=0,b=e.split(` `),w=0;w1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),o)for(var l=0;l=t.desktopTapThreshold2}var Ke=a(q);lt&&(t.hoverData.tapholdCancelled=!0);var it=function(){var Qt=t.hoverData.dragDelta=t.hoverData.dragDelta||[];Qt.length===0?(Qt.push(Ce[0]),Qt.push(Ce[1])):(Qt[0]+=Ce[0],Qt[1]+=Ce[1])};ie=!0,i(Fe,["mousemove","vmousemove","tapdrag"],q,{x:j[0],y:j[1]});var mt=function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||he.emit({originalEvent:q,type:"boxstart",position:{x:j[0],y:j[1]}}),Ge[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()};if(t.hoverData.which===3){if(lt){var Ht={originalEvent:q,type:"cxtdrag",position:{x:j[0],y:j[1]}};$e?$e.emit(Ht):he.emit(Ht),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||Fe!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit({originalEvent:q,type:"cxtdragout",position:{x:j[0],y:j[1]}}),t.hoverData.cxtOver=Fe,Fe&&Fe.emit({originalEvent:q,type:"cxtdragover",position:{x:j[0],y:j[1]}}))}}else if(t.hoverData.dragging){if(ie=!0,he.panningEnabled()&&he.userPanningEnabled()){var ot;if(t.hoverData.justStartedPan){var et=t.hoverData.mdownPos;ot={x:(j[0]-et[0])*U,y:(j[1]-et[1])*U},t.hoverData.justStartedPan=!1}else ot={x:Ce[0]*U,y:Ce[1]*U};he.panBy(ot),he.emit("dragpan"),t.hoverData.dragged=!0}j=t.projectIntoViewport(q.clientX,q.clientY)}else if(Ge[4]==1&&($e==null||$e.pannable())){if(lt){if(!t.hoverData.dragging&&he.boxSelectionEnabled()&&(Ke||!he.panningEnabled()||!he.userPanningEnabled()))mt();else if(!t.hoverData.selecting&&he.panningEnabled()&&he.userPanningEnabled()){var ht=s($e,t.hoverData.downs);ht&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Ge[4]=0,t.data.bgActivePosistion=Um(ye),t.redrawHint("select",!0),t.redraw())}$e&&$e.pannable()&&$e.active()&&$e.unactivate()}}else{if($e&&$e.pannable()&&$e.active()&&$e.unactivate(),(!$e||!$e.grabbed())&&Fe!=ge&&(ge&&i(ge,["mouseout","tapdragout"],q,{x:j[0],y:j[1]}),Fe&&i(Fe,["mouseover","tapdragover"],q,{x:j[0],y:j[1]}),t.hoverData.last=Fe),$e)if(lt){if(he.boxSelectionEnabled()&&Ke)$e&&$e.grabbed()&&(x(qe),$e.emit("freeon"),qe.emit("free"),t.dragData.didDrag&&($e.emit("dragfreeon"),qe.emit("dragfree"))),mt();else if($e&&$e.grabbed()&&t.nodeIsDraggable($e)){var bt=!t.dragData.didDrag;bt&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||m(qe,{inDragLayer:!0});var tt={x:0,y:0};if(dt(Ce[0])&&dt(Ce[1])&&(tt.x+=Ce[0],tt.y+=Ce[1],bt)){var _t=t.hoverData.dragDelta;_t&&dt(_t[0])&&dt(_t[1])&&(tt.x+=_t[0],tt.y+=_t[1])}t.hoverData.draggingEles=!0,qe.silentShift(tt).emit("position drag"),t.redrawHint("drag",!0),t.redraw()}}else it();ie=!0}if(Ge[2]=j[0],Ge[3]=j[1],ie)return q.stopPropagation&&q.stopPropagation(),q.preventDefault&&q.preventDefault(),!1}},!1);var T,I,A;t.registerBinding(e,"mouseup",function(q){if(!(t.hoverData.which===1&&q.which!==1&&t.hoverData.capture)){var de=t.hoverData.capture;if(de){t.hoverData.capture=!1;var ie=t.cy,he=t.projectIntoViewport(q.clientX,q.clientY),U=t.selection,ke=t.findNearestElement(he[0],he[1],!0,!1),j=t.dragData.possibleDragElements,ye=t.hoverData.down,Ae=a(q);if(t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,ye&&ye.unactivate(),t.hoverData.which===3){var Ge={originalEvent:q,type:"cxttapend",position:{x:he[0],y:he[1]}};if(ye?ye.emit(Ge):ie.emit(Ge),!t.hoverData.cxtDragged){var Fe={originalEvent:q,type:"cxttap",position:{x:he[0],y:he[1]}};ye?ye.emit(Fe):ie.emit(Fe)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(ke,["mouseup","tapend","vmouseup"],q,{x:he[0],y:he[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(ye,["click","tap","vclick"],q,{x:he[0],y:he[1]}),I=!1,q.timeStamp-A<=ie.multiClickDebounceTime()?(T&&clearTimeout(T),I=!0,A=null,i(ye,["dblclick","dbltap","vdblclick"],q,{x:he[0],y:he[1]})):(T=setTimeout(function(){I||i(ye,["oneclick","onetap","voneclick"],q,{x:he[0],y:he[1]})},ie.multiClickDebounceTime()),A=q.timeStamp)),ye==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(q)&&(ie.$(r).unselect(["tapunselect"]),j.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=j=ie.collection()),ke==ye&&!t.dragData.didDrag&&!t.hoverData.selecting&&ke!=null&&ke._private.selectable&&(t.hoverData.dragging||(ie.selectionType()==="additive"||Ae?ke.selected()?ke.unselect(["tapunselect"]):ke.select(["tapselect"]):Ae||(ie.$(r).unmerge(ke).unselect(["tapunselect"]),ke.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var ge=ie.collection(t.getAllInBox(U[0],U[1],U[2],U[3]));t.redrawHint("select",!0),ge.length>0&&t.redrawHint("eles",!0),ie.emit({type:"boxend",originalEvent:q,position:{x:he[0],y:he[1]}});var $e=function(lt){return lt.selectable()&&!lt.selected()};ie.selectionType()==="additive"||Ae||ie.$(r).unmerge(ge).unselect(),ge.emit("box").stdFilter($e).select().emit("boxselect"),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!U[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var Ce=ye&&ye.grabbed();x(j),Ce&&(ye.emit("freeon"),j.emit("free"),t.dragData.didDrag&&(ye.emit("dragfreeon"),j.emit("dragfree")))}}U[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},!1);var D=function(q){if(!t.scrollingPage){var de=t.cy,ie=de.zoom(),he=de.pan(),U=t.projectIntoViewport(q.clientX,q.clientY),ke=[U[0]*ie+he.x,U[1]*ie+he.y];if(t.hoverData.draggingEles||t.hoverData.dragging||t.hoverData.cxtStarted||C()){q.preventDefault();return}if(de.panningEnabled()&&de.userPanningEnabled()&&de.zoomingEnabled()&&de.userZoomingEnabled()){q.preventDefault(),t.data.wheelZooming=!0,clearTimeout(t.data.wheelTimeout),t.data.wheelTimeout=setTimeout(function(){t.data.wheelZooming=!1,t.redrawHint("eles",!0),t.redraw()},150);var j;q.deltaY!=null?j=q.deltaY/-250:q.wheelDeltaY!=null?j=q.wheelDeltaY/1e3:j=q.wheelDelta/1e3,j=j*t.wheelSensitivity;var ye=q.deltaMode===1;ye&&(j*=33);var Ae=de.zoom()*Math.pow(10,j);q.type==="gesturechange"&&(Ae=t.gestureStartZoom*q.scale),de.zoom({level:Ae,renderedPosition:{x:ke[0],y:ke[1]}}),de.emit(q.type==="gesturechange"?"pinchzoom":"scrollzoom")}}};t.registerBinding(t.container,"wheel",D,!0),t.registerBinding(e,"scroll",function(q){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},!0),t.registerBinding(t.container,"gesturestart",function(q){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||q.preventDefault()},!0),t.registerBinding(t.container,"gesturechange",function(xe){t.hasTouchStarted||D(xe)},!0),t.registerBinding(t.container,"mouseout",function(q){var de=t.projectIntoViewport(q.clientX,q.clientY);t.cy.emit({originalEvent:q,type:"mouseout",position:{x:de[0],y:de[1]}})},!1),t.registerBinding(t.container,"mouseover",function(q){var de=t.projectIntoViewport(q.clientX,q.clientY);t.cy.emit({originalEvent:q,type:"mouseover",position:{x:de[0],y:de[1]}})},!1);var N,O,B,P,$,z,H,J,X,oe,K,ee,Q,W=function(q,de,ie,he){return Math.sqrt((ie-q)*(ie-q)+(he-de)*(he-de))},Y=function(q,de,ie,he){return(ie-q)*(ie-q)+(he-de)*(he-de)},Z;t.registerBinding(t.container,"touchstart",Z=function(q){if(t.hasTouchStarted=!0,!!M(q)){w(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var de=t.cy,ie=t.touchData.now,he=t.touchData.earlier;if(q.touches[0]){var U=t.projectIntoViewport(q.touches[0].clientX,q.touches[0].clientY);ie[0]=U[0],ie[1]=U[1]}if(q.touches[1]){var U=t.projectIntoViewport(q.touches[1].clientX,q.touches[1].clientY);ie[2]=U[0],ie[3]=U[1]}if(q.touches[2]){var U=t.projectIntoViewport(q.touches[2].clientX,q.touches[2].clientY);ie[4]=U[0],ie[5]=U[1]}if(q.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var ke=t.findContainerClientCoords();X=ke[0],oe=ke[1],K=ke[2],ee=ke[3],N=q.touches[0].clientX-X,O=q.touches[0].clientY-oe,B=q.touches[1].clientX-X,P=q.touches[1].clientY-oe,Q=0<=N&&N<=K&&0<=B&&B<=K&&0<=O&&O<=ee&&0<=P&&P<=ee;var j=de.pan(),ye=de.zoom();$=W(N,O,B,P),z=Y(N,O,B,P),H=[(N+B)/2,(O+P)/2],J=[(H[0]-j.x)/ye,(H[1]-j.y)/ye];var Ae=200,Ge=Ae*Ae;if(z=1){for(var ft=t.touchData.startPosition=[null,null,null,null,null,null],Ze=0;Ze=t.touchTapThreshold2}if(de&&t.touchData.cxt){q.preventDefault();var ft=q.touches[0].clientX-X,Ze=q.touches[0].clientY-oe,st=q.touches[1].clientX-X,Ue=q.touches[1].clientY-oe,Ke=Y(ft,Ze,st,Ue),it=Ke/z,mt=150,Ht=mt*mt,ot=1.5,et=ot*ot;if(it>=et||Ke>=Ht){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var ht={originalEvent:q,type:"cxttapend",position:{x:U[0],y:U[1]}};t.touchData.start?(t.touchData.start.unactivate().emit(ht),t.touchData.start=null):he.emit(ht)}}if(de&&t.touchData.cxt){var ht={originalEvent:q,type:"cxtdrag",position:{x:U[0],y:U[1]}};t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(ht):he.emit(ht),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var bt=t.findNearestElement(U[0],U[1],!0,!0);(!t.touchData.cxtOver||bt!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit({originalEvent:q,type:"cxtdragout",position:{x:U[0],y:U[1]}}),t.touchData.cxtOver=bt,bt&&bt.emit({originalEvent:q,type:"cxtdragover",position:{x:U[0],y:U[1]}}))}else if(de&&q.touches[2]&&he.boxSelectionEnabled())q.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||he.emit({originalEvent:q,type:"boxstart",position:{x:U[0],y:U[1]}}),t.touchData.selecting=!0,t.touchData.didSelect=!0,ie[4]=1,!ie||ie.length===0||ie[0]===void 0?(ie[0]=(U[0]+U[2]+U[4])/3,ie[1]=(U[1]+U[3]+U[5])/3,ie[2]=(U[0]+U[2]+U[4])/3+1,ie[3]=(U[1]+U[3]+U[5])/3+1):(ie[2]=(U[0]+U[2]+U[4])/3,ie[3]=(U[1]+U[3]+U[5])/3),t.redrawHint("select",!0),t.redraw();else if(de&&q.touches[1]&&!t.touchData.didSelect&&he.zoomingEnabled()&&he.panningEnabled()&&he.userZoomingEnabled()&&he.userPanningEnabled()){q.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var tt=t.dragData.touchDragEles;if(tt){t.redrawHint("drag",!0);for(var _t=0;_t0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},!1);var ce;t.registerBinding(e,"touchcancel",ce=function(q){var de=t.touchData.start;t.touchData.capture=!1,de&&de.unactivate()});var ue,te,Ne,ae;if(t.registerBinding(e,"touchend",ue=function(q){var de=t.touchData.start,ie=t.touchData.capture;if(ie)q.touches.length===0&&(t.touchData.capture=!1),q.preventDefault();else return;var he=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var U=t.cy,ke=U.zoom(),j=t.touchData.now,ye=t.touchData.earlier;if(q.touches[0]){var Ae=t.projectIntoViewport(q.touches[0].clientX,q.touches[0].clientY);j[0]=Ae[0],j[1]=Ae[1]}if(q.touches[1]){var Ae=t.projectIntoViewport(q.touches[1].clientX,q.touches[1].clientY);j[2]=Ae[0],j[3]=Ae[1]}if(q.touches[2]){var Ae=t.projectIntoViewport(q.touches[2].clientX,q.touches[2].clientY);j[4]=Ae[0],j[5]=Ae[1]}de&&de.unactivate();var Ge;if(t.touchData.cxt){if(Ge={originalEvent:q,type:"cxttapend",position:{x:j[0],y:j[1]}},de?de.emit(Ge):U.emit(Ge),!t.touchData.cxtDragged){var Fe={originalEvent:q,type:"cxttap",position:{x:j[0],y:j[1]}};de?de.emit(Fe):U.emit(Fe)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!q.touches[2]&&U.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var ge=U.collection(t.getAllInBox(he[0],he[1],he[2],he[3]));he[0]=void 0,he[1]=void 0,he[2]=void 0,he[3]=void 0,he[4]=0,t.redrawHint("select",!0),U.emit({type:"boxend",originalEvent:q,position:{x:j[0],y:j[1]}});var $e=function(Ht){return Ht.selectable()&&!Ht.selected()};ge.emit("box").stdFilter($e).select().emit("boxselect"),ge.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(de?.unactivate(),q.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!q.touches[1]){if(!q.touches[0]){if(!q.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Ce=t.dragData.touchDragEles;if(de!=null){var qe=de._private.grabbed;x(Ce),t.redrawHint("drag",!0),t.redrawHint("eles",!0),qe&&(de.emit("freeon"),Ce.emit("free"),t.dragData.didDrag&&(de.emit("dragfreeon"),Ce.emit("dragfree"))),i(de,["touchend","tapend","vmouseup","tapdragout"],q,{x:j[0],y:j[1]}),de.unactivate(),t.touchData.start=null}else{var lt=t.findNearestElement(j[0],j[1],!0,!0);i(lt,["touchend","tapend","vmouseup","tapdragout"],q,{x:j[0],y:j[1]})}var xt=t.touchData.startPosition[0]-j[0],ft=xt*xt,Ze=t.touchData.startPosition[1]-j[1],st=Ze*Ze,Ue=ft+st,Ke=Ue*ke*ke;t.touchData.singleTouchMoved||(de||U.$(":selected").unselect(["tapunselect"]),i(de,["tap","vclick"],q,{x:j[0],y:j[1]}),te=!1,q.timeStamp-ae<=U.multiClickDebounceTime()?(Ne&&clearTimeout(Ne),te=!0,ae=null,i(de,["dbltap","vdblclick"],q,{x:j[0],y:j[1]})):(Ne=setTimeout(function(){te||i(de,["onetap","voneclick"],q,{x:j[0],y:j[1]})},U.multiClickDebounceTime()),ae=q.timeStamp)),de!=null&&!t.dragData.didDrag&&de._private.selectable&&Ke"u"){var we=[],Ie=function(q){return{clientX:q.clientX,clientY:q.clientY,force:1,identifier:q.pointerId,pageX:q.pageX,pageY:q.pageY,radiusX:q.width/2,radiusY:q.height/2,screenX:q.screenX,screenY:q.screenY,target:q.target}},Ee=function(q){return{event:q,touch:Ie(q)}},Oe=function(q){we.push(Ee(q))},De=function(q){for(var de=0;de0)return H[0]}return null},g=Object.keys(d),m=0;m0?p:jde(a,s,e,r,n,i,o,l)},checkPoint:function(e,r,n,i,a,s,o,l){l=l==="auto"?O0(i,a):l;var u=2*l;if(Ju(e,r,this.points,s,o,i,a-u,[0,-1],n)||Ju(e,r,this.points,s,o,i-u,a,[0,-1],n))return!0;var h=i/2+2*n,f=a/2+2*n,d=[s-h,o-f,s-h,o,s+h,o,s+h,o-f];return!!(Bs(e,r,d)||N0(e,r,u,u,s+i/2-l,o+a/2-l,n)||N0(e,r,u,u,s-i/2+l,o+a/2-l,n))}}};th.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",ss(3,0)),this.generateRoundPolygon("round-triangle",ss(3,0)),this.generatePolygon("rectangle",ss(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",ss(5,0)),this.generateRoundPolygon("round-pentagon",ss(5,0)),this.generatePolygon("hexagon",ss(6,0)),this.generateRoundPolygon("round-hexagon",ss(6,0)),this.generatePolygon("heptagon",ss(7,0)),this.generateRoundPolygon("round-heptagon",ss(7,0)),this.generatePolygon("octagon",ss(8,0)),this.generateRoundPolygon("round-octagon",ss(8,0));var n=new Array(20);{var i=hD(5,0),a=hD(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var o=0;o=e.deqFastCost*_)break}else if(u){if(b>=e.deqCost*p||b>=e.deqAvgCost*d)break}else if(w>=e.deqNoDrawCost*lD)break;var k=e.deq(n,y,m);if(k.length>0)for(var E=0;E0&&(e.onDeqd(n,g),!u&&e.shouldRedraw(n,g,y,m)&&a())},o=e.priority||ID;i.beforeRender(s,o(n))}}}},zYe=function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:F6;AD(this,t),this.idsByKey=new Vc,this.keyForId=new Vc,this.cachesByLvl=new Vc,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return _D(t,[{key:"getIdsFor",value:function(r){r==null&&ni("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new Qm,n.set(r,i)),i}},{key:"addIdForKey",value:function(r,n){r!=null&&this.getIdsFor(r).add(n)}},{key:"deleteIdForKey",value:function(r,n){r!=null&&this.getIdsFor(r).delete(n)}},{key:"getNumberOfIdsForKey",value:function(r){return r==null?0:this.getIdsFor(r).size}},{key:"updateKeyMappingFor",value:function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)}},{key:"deleteKeyMappingFor",value:function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)}},{key:"keyHasChangedFor",value:function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a}},{key:"isInvalid",value:function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)}},{key:"getCachesAt",value:function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new Vc,n.set(r,a),i.push(r)),a}},{key:"getCache",value:function(r,n){return this.getCachesAt(n).get(r)}},{key:"get",value:function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a}},{key:"getForCachedKey",value:function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a}},{key:"hasCache",value:function(r,n){return this.getCachesAt(n).has(r)}},{key:"has",value:function(r,n){var i=this.getKey(r);return this.hasCache(i,n)}},{key:"setCache",value:function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)}},{key:"set",value:function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)}},{key:"deleteCache",value:function(r,n){this.getCachesAt(n).delete(r)}},{key:"delete",value:function(r,n){var i=this.getKey(r);this.deleteCache(i,n)}},{key:"invalidateKey",value:function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})}},{key:"invalidate",value:function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0}}]),t}(),mde=25,C6=50,O6=-4,TD=3,$Ye=7.99,GYe=8,UYe=1024,VYe=1024,WYe=1024,HYe=.2,qYe=.8,YYe=10,XYe=.15,jYe=.1,KYe=.9,ZYe=.9,QYe=100,JYe=1,Vm={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},eXe=ba({getKey:null,doesEleInvalidateKey:F6,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Gde,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),wx=function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=eXe(r);Kt(n,i),n.lookup=new zYe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},Pi=wx.prototype;Pi.reasons=Vm;Pi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};Pi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};Pi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new Fx(function(r,n){return n.reqs-r.reqs});return e};Pi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};Pi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,o=s.cy.zoom(),l=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(DD(o*r))),n=$Ye||n>TD)return null;var u=Math.pow(2,n),h=e.h*u,f=e.w*u,d=s.eleTextBiggerThanMin(t,u);if(!this.isVisible(t,d))return null;var p=l.get(t,n);if(p&&p.invalidated&&(p.invalidated=!1,p.texture.invalidatedWidth-=p.width),p)return p;var g;if(h<=mde?g=mde:h<=C6?g=C6:g=Math.ceil(h/C6)*C6,h>WYe||f>VYe)return null;var m=a.getTextureQueue(g),y=m[m.length-2],x=function(){return a.recycleTexture(g,f)||a.addTexture(g,f)};y||(y=m[m.length-1]),y||(y=x()),y.width-y.usedWidthn;R--)C=a.getElement(t,e,r,R,Vm.downscale);M()}else return a.queueElement(t,E.level-1),E;else{var T;if(!w&&!_&&!k)for(var I=n-1;I>=O6;I--){var A=l.get(t,I);if(A){T=A;break}}if(b(T))return a.queueElement(t,n),T;y.context.translate(y.usedWidth,0),y.context.scale(u,u),this.drawElement(y.context,t,e,d,!1),y.context.scale(1/u,1/u),y.context.translate(-y.usedWidth,0)}return p={x:y.usedWidth,texture:y,level:n,scale:u,width:f,height:h,scaledLabelShown:d},y.usedWidth+=Math.ceil(f+GYe),y.eleCaches.push(p),l.set(t,n,p),a.checkTextureFullness(y),p};Pi.invalidateElements=function(t){for(var e=0;e=HYe*t.width&&this.retireTexture(t)};Pi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>qYe&&t.fullnessChecks>=YYe?wf(r,t):t.fullnessChecks++};Pi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;wf(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,MD(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),wf(i,s),n.push(s),s}};Pi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var o={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(o),i[a]=o}};Pi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var o=r.pop(),l=o.key,u=o.eles[0],h=a.hasCache(u,o.level);if(n[l]=null,h)continue;i.push(o);var f=e.getBoundingBox(u);e.getElement(u,f,t,o.level,Vm.dequeue)}return i};Pi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=ND,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};Pi.onDequeue=function(t){this.onDequeues.push(t)};Pi.offDequeue=function(t){wf(this.onDequeues,t)};Pi.setupDequeueing=K0e.setupDequeueing({deqRedrawThreshold:QYe,deqCost:XYe,deqAvgCost:jYe,deqNoDrawCost:KYe,deqFastCost:ZYe,deq:function(e,r,n){return e.dequeue(r,n)},onDeqd:function(e,r){for(var n=0;n=rXe||r>q6)return null}n.validateLayersElesOrdering(r,t);var l=n.layersByLevel,u=Math.pow(2,r),h=l[r]=l[r]||[],f,d=n.levelIsComplete(r,t),p,g=function(){var M=function(D){if(n.validateLayersElesOrdering(D,t),n.levelIsComplete(D,t))return p=l[D],!0},R=function(D){if(!p)for(var N=r+D;Tx<=N&&N<=q6&&!M(N);N+=D);};R(1),R(-1);for(var T=h.length-1;T>=0;T--){var I=h[T];I.invalid&&wf(h,I)}};if(!d)g();else return h;var m=function(){if(!f){f=Fs();for(var M=0;Myde||I>yde)return null;var A=T*I;if(A>uXe)return null;var D=n.makeLayer(f,r);if(R!=null){var N=h.indexOf(R)+1;h.splice(N,0,D)}else(M.insert===void 0||M.insert)&&h.unshift(D);return D};if(n.skipping&&!o)return null;for(var x=null,b=t.length/tXe,w=!o,_=0;_=b||!Xde(x.bb,k.boundingBox()))&&(x=y({insert:!0,after:x}),!x))return null;p||w?n.queueLayer(x,k):n.drawEleInLayer(x,k,r,e),x.eles.push(k),L[r]=x}return p||(w?null:h)};wa.getEleLevelForLayerLevel=function(t,e){return t};wa.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,o=e.boundingBox();o.w===0||o.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,hXe),a.setImgSmoothing(s,!0))};wa.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};wa.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};wa.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=Qu(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,function(n,i,a){e.invalidateLayer(n)}))};wa.invalidateLayer=function(t){if(this.lastInvalidationTime=Qu(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];wf(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o=e._private.rscratch;if(!(a&&!e.visible())&&!(o.badLine||o.allpts==null||isNaN(o.allpts[0]))){var l;r&&(l=r,t.translate(-l.x1,-l.y1));var u=a?e.pstyle("opacity").value:1,h=a?e.pstyle("line-opacity").value:1,f=e.pstyle("curve-style").value,d=e.pstyle("line-style").value,p=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,m=e.pstyle("line-outline-width").value,y=e.pstyle("line-outline-color").value,x=u*h,b=u*h,w=function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;f==="straight-triangle"?(s.eleStrokeStyle(t,e,D),s.drawEdgeTrianglePath(e,t,o.allpts)):(t.lineWidth=p,t.lineCap=g,s.eleStrokeStyle(t,e,D),s.drawEdgePath(e,t,o.allpts,d),t.lineCap="butt")},_=function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=p+m,t.lineCap=g,m>0)s.colorStrokeStyle(t,y[0],y[1],y[2],D);else{t.lineCap="butt";return}f==="straight-triangle"?s.drawEdgeTrianglePath(e,t,o.allpts):(s.drawEdgePath(e,t,o.allpts,d),t.lineCap="butt")},k=function(){i&&s.drawEdgeOverlay(t,e)},E=function(){i&&s.drawEdgeUnderlay(t,e)},L=function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,D)},S=function(){s.drawElementText(t,e,null,n)};t.lineJoin="round";var C=e.pstyle("ghost").value==="yes";if(C){var M=e.pstyle("ghost-offset-x").pfValue,R=e.pstyle("ghost-offset-y").pfValue,T=e.pstyle("ghost-opacity").value,I=x*T;t.translate(M,R),w(I),L(I),t.translate(-M,-R)}else _();E(),w(),L(),k(),S(),r&&t.translate(l.x1,l.y1)}};J0e=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),o=n._private.rscratch,l=n.pstyle("".concat(e,"-padding")).pfValue,u=2*l,h=n.pstyle("".concat(e,"-color")).value;r.lineWidth=u,o.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,h[0],h[1],h[2],i),a.drawEdgePath(n,r,o.allpts,"solid")}}}};rh.drawEdgeOverlay=J0e("overlay");rh.drawEdgeUnderlay=J0e("underlay");rh.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,o=!1,l=this.usePaths(),u=t.pstyle("line-dash-pattern").pfValue,h=t.pstyle("line-dash-offset").pfValue;if(l){var f=r.join("$"),d=i.pathCacheKey&&i.pathCacheKey===f;d?(s=e=i.pathCache,o=!0):(s=e=new Path2D,i.pathCacheKey=f,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(u),a.lineDashOffset=h;break;case"solid":a.setLineDash([]);break}if(!o&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var p=2;p+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var o=e.pstyle("label");if(!o||!o.value)return;var l=s.getLabelJustification(e);t.textAlign=l,t.textBaseline="bottom"}else{var u=e.element()._private.rscratch.badLine,h=e.pstyle("label"),f=e.pstyle("source-label"),d=e.pstyle("target-label");if(u||(!h||!h.value)&&(!f||!f.value)&&(!d||!d.value))return;t.textAlign="center",t.textBaseline="bottom"}var p=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,p,a),e.isEdge()&&(s.drawText(t,e,"source",p,a),s.drawText(t,e,"target",p,a))):s.drawText(t,e,i,p,a),r&&t.translate(g.x1,g.y1)};$0.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,o=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,l=e.pstyle("text-outline-opacity").value*o,u=e.pstyle("color").value,h=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,u[0],u[1],u[2],o),this.colorStrokeStyle(t,h[0],h[1],h[2],l)};$0.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation"),o=Bl(i,"labelAngle",e);return s.strValue==="autorotate"?r=t.isEdge()?o:0:s.strValue==="none"?r=0:r=s.pfValue,r};$0.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,o=i?e.effectiveOpacity():1;if(!(i&&(o===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var l=Bl(s,"labelX",r),u=Bl(s,"labelY",r),h,f,d=this.getLabelText(e,r);if(d!=null&&d!==""&&!isNaN(l)&&!isNaN(u)){this.setupTextStyle(t,e,i);var p=r?r+"-":"",g=Bl(s,"labelWidth",r),m=Bl(s,"labelHeight",r),y=e.pstyle(p+"text-margin-x").pfValue,x=e.pstyle(p+"text-margin-y").pfValue,b=e.isEdge(),w=e.pstyle("text-halign").value,_=e.pstyle("text-valign").value;b&&(w="center",_="center"),l+=y,u+=x;var k;switch(n?k=this.getTextAngle(e,r):k=0,k!==0&&(h=l,f=u,t.translate(h,f),t.rotate(k),l=0,u=0),_){case"top":break;case"center":u+=m/2;break;case"bottom":u+=m;break}var E=e.pstyle("text-background-opacity").value,L=e.pstyle("text-border-opacity").value,S=e.pstyle("text-border-width").pfValue,C=e.pstyle("text-background-padding").pfValue,M=e.pstyle("text-background-shape").strValue,R=M.indexOf("round")===0,T=2;if(E>0||S>0&&L>0){var I=l-C;switch(w){case"left":I-=g;break;case"center":I-=g/2;break}var A=u-m-C,D=g+2*C,N=m+2*C;if(E>0){var O=t.fillStyle,B=e.pstyle("text-background-color").value;t.fillStyle="rgba("+B[0]+","+B[1]+","+B[2]+","+E*o+")",R?uD(t,I,A,D,N,T):t.fillRect(I,A,D,N),t.fillStyle=O}if(S>0&&L>0){var P=t.strokeStyle,$=t.lineWidth,z=e.pstyle("text-border-color").value,H=e.pstyle("text-border-style").value;if(t.strokeStyle="rgba("+z[0]+","+z[1]+","+z[2]+","+L*o+")",t.lineWidth=S,t.setLineDash)switch(H){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=S/4,t.setLineDash([]);break;case"solid":t.setLineDash([]);break}if(R?uD(t,I,A,D,N,T,"stroke"):t.strokeRect(I,A,D,N),H==="double"){var J=S/2;R?uD(t,I+J,A+J,D-J*2,N-J*2,T,"stroke"):t.strokeRect(I+J,A+J,D-J*2,N-J*2)}t.setLineDash&&t.setLineDash([]),t.lineWidth=$,t.strokeStyle=P}}var X=2*e.pstyle("text-outline-width").pfValue;if(X>0&&(t.lineWidth=X),e.pstyle("text-wrap").value==="wrap"){var oe=Bl(s,"labelWrapCachedLines",r),K=Bl(s,"labelLineHeight",r),ee=g/2,Q=this.getLabelJustification(e);switch(Q==="auto"||(w==="left"?Q==="left"?l+=-g:Q==="center"&&(l+=-ee):w==="center"?Q==="left"?l+=-ee:Q==="right"&&(l+=ee):w==="right"&&(Q==="center"?l+=ee:Q==="right"&&(l+=g))),_){case"top":u-=(oe.length-1)*K;break;case"center":case"bottom":u-=(oe.length-1)*K;break}for(var W=0;W0&&t.strokeText(oe[W],l,u),t.fillText(oe[W],l,u),u+=K}else X>0&&t.strokeText(d,l,u),t.fillText(d,l,u);k!==0&&(t.rotate(-k),t.translate(-h,-f))}}};o1={};o1.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o,l,u=e._private,h=u.rscratch,f=e.position();if(!(!dt(f.x)||!dt(f.y))&&!(a&&!e.visible())){var d=a?e.effectiveOpacity():1,p=s.usePaths(),g,m=!1,y=e.padding();o=e.width()+2*y,l=e.height()+2*y;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),w=b.value,_=new Array(w.length),k=new Array(w.length),E=0,L=0;L0&&arguments[0]!==void 0?arguments[0]:I;s.eleFillStyle(t,e,he)},W=function(){var he=arguments.length>0&&arguments[0]!==void 0?arguments[0]:z;s.colorStrokeStyle(t,A[0],A[1],A[2],he)},Y=function(){var he=arguments.length>0&&arguments[0]!==void 0?arguments[0]:oe;s.colorStrokeStyle(t,J[0],J[1],J[2],he)},Z=function(he,U,ke,j){var ye=s.nodePathCache=s.nodePathCache||[],Ae=$de(ke==="polygon"?ke+","+j.join(","):ke,""+U,""+he,""+ee),Ge=ye[Ae],Fe,ge=!1;return Ge!=null?(Fe=Ge,ge=!0,h.pathCache=Fe):(Fe=new Path2D,ye[Ae]=h.pathCache=Fe),{path:Fe,cacheHit:ge}},se=e.pstyle("shape").strValue,ce=e.pstyle("shape-polygon-points").pfValue;if(p){t.translate(f.x,f.y);var ue=Z(o,l,se,ce);g=ue.path,m=ue.cacheHit}var te=function(){if(!m){var he=f;p&&(he={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,he.x,he.y,o,l,ee,h)}p?t.fill(g):t.fill()},Ne=function(){for(var he=arguments.length>0&&arguments[0]!==void 0?arguments[0]:d,U=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,ke=u.backgrounding,j=0,ye=0;ye0&&arguments[0]!==void 0?arguments[0]:!1,U=arguments.length>1&&arguments[1]!==void 0?arguments[1]:d;s.hasPie(e)&&(s.drawPie(t,e,U),he&&(p||s.nodeShapes[s.getNodeShape(e)].draw(t,f.x,f.y,o,l,ee,h)))},we=function(){var he=arguments.length>0&&arguments[0]!==void 0?arguments[0]:d,U=(R>0?R:-R)*he,ke=R>0?0:255;R!==0&&(s.colorFillStyle(t,ke,ke,ke,U),p?t.fill(g):t.fill())},Ie=function(){if(T>0){if(t.lineWidth=T,t.lineCap=O,t.lineJoin=N,t.setLineDash)switch(D){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(P),t.lineDashOffset=$;break;case"solid":case"double":t.setLineDash([]);break}if(B!=="center"){if(t.save(),t.lineWidth*=2,B==="inside")p?t.clip(g):t.clip();else{var he=new Path2D;he.rect(-o/2-T,-l/2-T,o+2*T,l+2*T),he.addPath(g),t.clip(he,"evenodd")}p?t.stroke(g):t.stroke(),t.restore()}else p?t.stroke(g):t.stroke();if(D==="double"){t.lineWidth=T/3;var U=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",p?t.stroke(g):t.stroke(),t.globalCompositeOperation=U}t.setLineDash&&t.setLineDash([])}},Ee=function(){if(H>0){if(t.lineWidth=H,t.lineCap="butt",t.setLineDash)switch(X){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var he=f;p&&(he={x:0,y:0});var U=s.getNodeShape(e),ke=T;B==="inside"&&(ke=0),B==="outside"&&(ke*=2);var j=(o+ke+(H+K))/o,ye=(l+ke+(H+K))/l,Ae=o*j,Ge=l*ye,Fe=s.nodeShapes[U].points,ge;if(p){var $e=Z(Ae,Ge,U,Fe);ge=$e.path}if(U==="ellipse")s.drawEllipsePath(ge||t,he.x,he.y,Ae,Ge);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(U)){var Ce=0,qe=0,lt=0;U==="round-diamond"?Ce=(ke+K+H)*1.4:U==="round-heptagon"?(Ce=(ke+K+H)*1.075,lt=-(ke/2+K+H)/35):U==="round-hexagon"?Ce=(ke+K+H)*1.12:U==="round-pentagon"?(Ce=(ke+K+H)*1.13,lt=-(ke/2+K+H)/15):U==="round-tag"?(Ce=(ke+K+H)*1.12,qe=(ke/2+H+K)*.07):U==="round-triangle"&&(Ce=(ke+K+H)*(Math.PI/2),lt=-(ke+K/2+H)/Math.PI),Ce!==0&&(j=(o+Ce)/o,Ae=o*j,["round-hexagon","round-tag"].includes(U)||(ye=(l+Ce)/l,Ge=l*ye)),ee=ee==="auto"?Zde(Ae,Ge):ee;for(var xt=Ae/2,ft=Ge/2,Ze=ee+(ke+H+K)/2,st=new Array(Fe.length/2),Ue=new Array(Fe.length/2),Ke=0;Ke0){if(i=i||n.position(),a==null||s==null){var p=n.padding();a=n.width()+2*p,s=n.height()+2*p}o.colorFillStyle(r,h[0],h[1],h[2],u),o.nodeShapes[f].draw(r,i.x,i.y,a+l*2,s+l*2,d),r.fill()}}}};o1.drawNodeOverlay=epe("overlay");o1.drawNodeUnderlay=epe("underlay");o1.hasPie=function(t){return t=t[0],t._private.hasPie};o1.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=n.x,o=n.y,l=e.width(),u=e.height(),h=Math.min(l,u)/2,f=0,d=this.usePaths();d&&(s=0,o=0),a.units==="%"?h=h*a.pfValue:a.pfValue!==void 0&&(h=a.pfValue/2);for(var p=1;p<=i.pieBackgroundN;p++){var g=e.pstyle("pie-"+p+"-background-size").value,m=e.pstyle("pie-"+p+"-background-color").value,y=e.pstyle("pie-"+p+"-background-opacity").value*r,x=g/100;x+f>1&&(x=1-f);var b=1.5*Math.PI+2*Math.PI*f,w=2*Math.PI*x,_=b+w;g===0||f>=1||f+x>1||(t.beginPath(),t.moveTo(s,o),t.arc(s,o,h,b,_),t.closePath(),this.colorFillStyle(t,m[0],m[1],m[2],y),t.fill(),f+=x)}};uo={},kXe=100;uo.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};uo.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;is.minMbLowQualFrames&&(s.motionBlurPxRatio=s.mbPxRBlurry)),s.clearingMotionBlur&&(s.motionBlurPxRatio=1),s.textureDrawLastFrame&&!f&&(h[s.NODE]=!0,h[s.SELECT_BOX]=!0);var b=l.style(),w=l.zoom(),_=i!==void 0?i:w,k=l.pan(),E={x:k.x,y:k.y},L={zoom:w,pan:{x:k.x,y:k.y}},S=s.prevViewport,C=S===void 0||L.zoom!==S.zoom||L.pan.x!==S.pan.x||L.pan.y!==S.pan.y;!C&&!(m&&!g)&&(s.motionBlurPxRatio=1),a&&(E=a),_*=o,E.x*=o,E.y*=o;var M=s.getCachedZSortedEles();function R(ue,te,Ne,ae,we){var Ie=ue.globalCompositeOperation;ue.globalCompositeOperation="destination-out",s.colorFillStyle(ue,255,255,255,s.motionBlurTransparency),ue.fillRect(te,Ne,ae,we),ue.globalCompositeOperation=Ie}function T(ue,te){var Ne,ae,we,Ie;!s.clearingMotionBlur&&(ue===u.bufferContexts[s.MOTIONBLUR_BUFFER_NODE]||ue===u.bufferContexts[s.MOTIONBLUR_BUFFER_DRAG])?(Ne={x:k.x*p,y:k.y*p},ae=w*p,we=s.canvasWidth*p,Ie=s.canvasHeight*p):(Ne=E,ae=_,we=s.canvasWidth,Ie=s.canvasHeight),ue.setTransform(1,0,0,1,0,0),te==="motionBlur"?R(ue,0,0,we,Ie):!e&&(te===void 0||te)&&ue.clearRect(0,0,we,Ie),r||(ue.translate(Ne.x,Ne.y),ue.scale(ae,ae)),a&&ue.translate(a.x,a.y),i&&ue.scale(i,i)}if(f||(s.textureDrawLastFrame=!1),f){if(s.textureDrawLastFrame=!0,!s.textureCache){s.textureCache={},s.textureCache.bb=l.mutableElements().boundingBox(),s.textureCache.texture=s.data.bufferCanvases[s.TEXTURE_BUFFER];var I=s.data.bufferContexts[s.TEXTURE_BUFFER];I.setTransform(1,0,0,1,0,0),I.clearRect(0,0,s.canvasWidth*s.textureMult,s.canvasHeight*s.textureMult),s.render({forcedContext:I,drawOnlyNodeLayer:!0,forcedPxRatio:o*s.textureMult});var L=s.textureCache.viewport={zoom:l.zoom(),pan:l.pan(),width:s.canvasWidth,height:s.canvasHeight};L.mpan={x:(0-L.pan.x)/L.zoom,y:(0-L.pan.y)/L.zoom}}h[s.DRAG]=!1,h[s.NODE]=!1;var A=u.contexts[s.NODE],D=s.textureCache.texture,L=s.textureCache.viewport;A.setTransform(1,0,0,1,0,0),d?R(A,0,0,L.width,L.height):A.clearRect(0,0,L.width,L.height);var N=b.core("outside-texture-bg-color").value,O=b.core("outside-texture-bg-opacity").value;s.colorFillStyle(A,N[0],N[1],N[2],O),A.fillRect(0,0,L.width,L.height);var w=l.zoom();T(A,!1),A.clearRect(L.mpan.x,L.mpan.y,L.width/L.zoom/o,L.height/L.zoom/o),A.drawImage(D,L.mpan.x,L.mpan.y,L.width/L.zoom/o,L.height/L.zoom/o)}else s.textureOnViewport&&!e&&(s.textureCache=null);var B=l.extent(),P=s.pinching||s.hoverData.dragging||s.swipePanning||s.data.wheelZooming||s.hoverData.draggingEles||s.cy.animated(),$=s.hideEdgesOnViewport&&P,z=[];if(z[s.NODE]=!h[s.NODE]&&d&&!s.clearedForMotionBlur[s.NODE]||s.clearingMotionBlur,z[s.NODE]&&(s.clearedForMotionBlur[s.NODE]=!0),z[s.DRAG]=!h[s.DRAG]&&d&&!s.clearedForMotionBlur[s.DRAG]||s.clearingMotionBlur,z[s.DRAG]&&(s.clearedForMotionBlur[s.DRAG]=!0),h[s.NODE]||r||n||z[s.NODE]){var H=d&&!z[s.NODE]&&p!==1,A=e||(H?s.data.bufferContexts[s.MOTIONBLUR_BUFFER_NODE]:u.contexts[s.NODE]),J=d&&!H?"motionBlur":void 0;T(A,J),$?s.drawCachedNodes(A,M.nondrag,o,B):s.drawLayeredElements(A,M.nondrag,o,B),s.debug&&s.drawDebugPoints(A,M.nondrag),!r&&!d&&(h[s.NODE]=!1)}if(!n&&(h[s.DRAG]||r||z[s.DRAG])){var H=d&&!z[s.DRAG]&&p!==1,A=e||(H?s.data.bufferContexts[s.MOTIONBLUR_BUFFER_DRAG]:u.contexts[s.DRAG]);T(A,d&&!H?"motionBlur":void 0),$?s.drawCachedNodes(A,M.drag,o,B):s.drawCachedElements(A,M.drag,o,B),s.debug&&s.drawDebugPoints(A,M.drag),!r&&!d&&(h[s.DRAG]=!1)}if(s.showFps||!n&&h[s.SELECT_BOX]&&!r){var A=e||u.contexts[s.SELECT_BOX];if(T(A),s.selection[4]==1&&(s.hoverData.selecting||s.touchData.selecting)){var w=s.cy.zoom(),X=b.core("selection-box-border-width").value/w;A.lineWidth=X,A.fillStyle="rgba("+b.core("selection-box-color").value[0]+","+b.core("selection-box-color").value[1]+","+b.core("selection-box-color").value[2]+","+b.core("selection-box-opacity").value+")",A.fillRect(s.selection[0],s.selection[1],s.selection[2]-s.selection[0],s.selection[3]-s.selection[1]),X>0&&(A.strokeStyle="rgba("+b.core("selection-box-border-color").value[0]+","+b.core("selection-box-border-color").value[1]+","+b.core("selection-box-border-color").value[2]+","+b.core("selection-box-opacity").value+")",A.strokeRect(s.selection[0],s.selection[1],s.selection[2]-s.selection[0],s.selection[3]-s.selection[1]))}if(u.bgActivePosistion&&!s.hoverData.selecting){var w=s.cy.zoom(),oe=u.bgActivePosistion;A.fillStyle="rgba("+b.core("active-bg-color").value[0]+","+b.core("active-bg-color").value[1]+","+b.core("active-bg-color").value[2]+","+b.core("active-bg-opacity").value+")",A.beginPath(),A.arc(oe.x,oe.y,b.core("active-bg-size").pfValue/w,0,2*Math.PI),A.fill()}var K=s.lastRedrawTime;if(s.showFps&&K){K=Math.round(K);var ee=Math.round(1e3/K);A.setTransform(1,0,0,1,0,0),A.fillStyle="rgba(255, 0, 0, 0.75)",A.strokeStyle="rgba(255, 0, 0, 0.75)",A.lineWidth=1,A.fillText("1 frame = "+K+" ms = "+ee+" fps",0,20);var Q=60;A.strokeRect(0,30,250,20),A.fillRect(0,30,250*Math.min(ee/Q,1),20)}r||(h[s.SELECT_BOX]=!1)}if(d&&p!==1){var W=u.contexts[s.NODE],Y=s.data.bufferCanvases[s.MOTIONBLUR_BUFFER_NODE],Z=u.contexts[s.DRAG],se=s.data.bufferCanvases[s.MOTIONBLUR_BUFFER_DRAG],ce=function(te,Ne,ae){te.setTransform(1,0,0,1,0,0),ae||!x?te.clearRect(0,0,s.canvasWidth,s.canvasHeight):R(te,0,0,s.canvasWidth,s.canvasHeight);var we=p;te.drawImage(Ne,0,0,s.canvasWidth*we,s.canvasHeight*we,0,0,s.canvasWidth,s.canvasHeight)};(h[s.NODE]||z[s.NODE])&&(ce(W,Y,z[s.NODE]),h[s.NODE]=!1),(h[s.DRAG]||z[s.DRAG])&&(ce(Z,se,z[s.DRAG]),h[s.DRAG]=!1)}s.prevViewport=L,s.clearingMotionBlur&&(s.clearingMotionBlur=!1,s.motionBlurCleared=!0,s.motionBlur=!0),d&&(s.motionBlurTimeout=setTimeout(function(){s.motionBlurTimeout=null,s.clearedForMotionBlur[s.NODE]=!1,s.clearedForMotionBlur[s.DRAG]=!1,s.motionBlur=!1,s.clearingMotionBlur=!f,s.mbFrames=0,h[s.NODE]=!0,h[s.DRAG]=!0,s.redraw()},kXe)),e||l.emit("render")};Cf={};Cf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,o=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+o*a[1]);for(var l=1;l0&&s>0){p.clearRect(0,0,a,s),p.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)p.translate(-n.x1*u,-n.y1*u),p.scale(u,u),this.drawElements(p,g),p.scale(1/u,1/u),p.translate(n.x1*u,n.y1*u);else{var m=e.pan(),y={x:m.x*u,y:m.y*u};u*=e.zoom(),p.translate(y.x,y.y),p.scale(u,u),this.drawElements(p,g),p.scale(1/u,1/u),p.translate(-y.x,-y.y)}t.bg&&(p.globalCompositeOperation="destination-over",p.fillStyle=t.bg,p.rect(0,0,a,s),p.fill())}return d};Vx.png=function(t){return rpe(t,this.bufferCanvasImage(t),"image/png")};Vx.jpg=function(t){return rpe(t,this.bufferCanvasImage(t),"image/jpeg")};npe={};npe.nodeShapeImpl=function(t,e,r,n,i,a,s,o){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,o);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,o);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,o);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,o);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};EXe=ipe,Gr=ipe.prototype;Gr.CANVAS_LAYERS=3;Gr.SELECT_BOX=0;Gr.DRAG=1;Gr.NODE=2;Gr.BUFFER_COUNT=3;Gr.TEXTURE_BUFFER=0;Gr.MOTIONBLUR_BUFFER_NODE=1;Gr.MOTIONBLUR_BUFFER_DRAG=2;Gr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Gr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Gr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Gr.SELECT_BOX]=e;break}};SXe=typeof Path2D<"u";Gr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Gr.usePaths=function(){return SXe&&this.pathsEnabled};Gr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Gr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Gr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":Oi(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[Q0e,qc,rh,KD,$0,o1,uo,Cf,Vx,npe].forEach(function(t){Kt(Gr,t)});CXe=[{name:"null",impl:z0e},{name:"base",impl:j0e},{name:"canvas",impl:EXe}],AXe=[{type:"layout",extensions:MYe},{type:"renderer",extensions:CXe}],ape={},spe={};CD=function(){if(arguments.length===2)return lpe.apply(null,arguments);if(arguments.length===3)return ope.apply(null,arguments);if(arguments.length===4)return LXe.apply(null,arguments);if(arguments.length===5)return _Xe.apply(null,arguments);ni("Invalid extension access syntax")};Dx.prototype.extension=CD;AXe.forEach(function(t){t.extensions.forEach(function(e){ope(t.type,e.name,e.impl)})});cpe=function t(){if(!(this instanceof t))return new t;this.length=0},F0=cpe.prototype;F0.instanceString=function(){return"stylesheet"};F0.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};F0.css=function(t,e){var r=this.length-1;if(Wt(t))this[r].properties.push({name:t,value:e});else if(Dr(t))for(var n=t,i=Object.keys(n),a=0;a{(function(e,r){typeof Wx=="object"&&typeof QD=="object"?QD.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Wx=="object"?Wx.layoutBase=r():e.layoutBase=r()})(Wx,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)}([function(t,e,r){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(l,u,h){n.call(this,h),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=h,this.bendpoints=[],this.source=l,this.target=u}s.prototype=Object.create(n.prototype);for(var o in n)s[o]=n[o];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(l){if(this.source===l)return this.target;if(this.target===l)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(l,u){for(var h=this.getOtherEnd(l),f=u.getGraphManager().getRoot();;){if(h.getOwner()==u)return h;if(h.getOwner()==f)break;h=h.getOwner().getParent()}return null},s.prototype.updateLength=function(){var l=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),l),this.isOverlapingSourceAndTarget||(this.lengthX=l[0]-l[2],this.lengthY=l[1]-l[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),o=r(16),l=r(4);function u(f,d,p,g){p==null&&g==null&&(g=d),n.call(this,g),f.graphManager!=null&&(f=f.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=f,p!=null&&d!=null?this.rect=new a(d.x,d.y,p.width,p.height):this.rect=new a}u.prototype=Object.create(n.prototype);for(var h in n)u[h]=n[h];u.prototype.getEdges=function(){return this.edges},u.prototype.getChild=function(){return this.child},u.prototype.getOwner=function(){return this.owner},u.prototype.getWidth=function(){return this.rect.width},u.prototype.setWidth=function(f){this.rect.width=f},u.prototype.getHeight=function(){return this.rect.height},u.prototype.setHeight=function(f){this.rect.height=f},u.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},u.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},u.prototype.getCenter=function(){return new l(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},u.prototype.getLocation=function(){return new l(this.rect.x,this.rect.y)},u.prototype.getRect=function(){return this.rect},u.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},u.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},u.prototype.setRect=function(f,d){this.rect.x=f.x,this.rect.y=f.y,this.rect.width=d.width,this.rect.height=d.height},u.prototype.setCenter=function(f,d){this.rect.x=f-this.rect.width/2,this.rect.y=d-this.rect.height/2},u.prototype.setLocation=function(f,d){this.rect.x=f,this.rect.y=d},u.prototype.moveBy=function(f,d){this.rect.x+=f,this.rect.y+=d},u.prototype.getEdgeListToNode=function(f){var d=[],p,g=this;return g.edges.forEach(function(m){if(m.target==f){if(m.source!=g)throw"Incorrect edge source!";d.push(m)}}),d},u.prototype.getEdgesBetween=function(f){var d=[],p,g=this;return g.edges.forEach(function(m){if(!(m.source==g||m.target==g))throw"Incorrect edge source and/or target";(m.target==f||m.source==f)&&d.push(m)}),d},u.prototype.getNeighborsList=function(){var f=new Set,d=this;return d.edges.forEach(function(p){if(p.source==d)f.add(p.target);else{if(p.target!=d)throw"Incorrect incidency!";f.add(p.source)}}),f},u.prototype.withChildren=function(){var f=new Set,d,p;if(f.add(this),this.child!=null)for(var g=this.child.getNodes(),m=0;md&&(this.rect.x-=(this.labelWidth-d)/2,this.setWidth(this.labelWidth)),this.labelHeight>p&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-p)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-p),this.setHeight(this.labelHeight))}}},u.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},u.prototype.transform=function(f){var d=this.rect.x;d>s.WORLD_BOUNDARY?d=s.WORLD_BOUNDARY:d<-s.WORLD_BOUNDARY&&(d=-s.WORLD_BOUNDARY);var p=this.rect.y;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var g=new l(d,p),m=f.inverseTransformPoint(g);this.setLocation(m.x,m.y)},u.prototype.getLeft=function(){return this.rect.x},u.prototype.getRight=function(){return this.rect.x+this.rect.width},u.prototype.getTop=function(){return this.rect.y},u.prototype.getBottom=function(){return this.rect.y+this.rect.height},u.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=u},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),o=r(3),l=r(1),u=r(13),h=r(12),f=r(11);function d(g,m,y){n.call(this,y),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,m!=null&&m instanceof s?this.graphManager=m:m!=null&&m instanceof Layout&&(this.graphManager=m.graphManager)}d.prototype=Object.create(n.prototype);for(var p in n)d[p]=n[p];d.prototype.getNodes=function(){return this.nodes},d.prototype.getEdges=function(){return this.edges},d.prototype.getGraphManager=function(){return this.graphManager},d.prototype.getParent=function(){return this.parent},d.prototype.getLeft=function(){return this.left},d.prototype.getRight=function(){return this.right},d.prototype.getTop=function(){return this.top},d.prototype.getBottom=function(){return this.bottom},d.prototype.isConnected=function(){return this.isConnected},d.prototype.add=function(g,m,y){if(m==null&&y==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(m)>-1&&this.getNodes().indexOf(y)>-1))throw"Source or target not in graph!";if(!(m.owner==y.owner&&m.owner==this))throw"Both owners must be this graph!";return m.owner!=y.owner?null:(b.source=m,b.target=y,b.isInterGraph=!1,this.getEdges().push(b),m.edges.push(b),y!=m&&y.edges.push(b),b)}},d.prototype.remove=function(g){var m=g;if(g instanceof o){if(m==null)throw"Node is null!";if(!(m.owner!=null&&m.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var y=m.edges.slice(),x,b=y.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(k,1),x.target!=x.source&&x.target.edges.splice(E,1);var _=x.source.owner.getEdges().indexOf(x);if(_==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(_,1)}},d.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,m=i.MAX_VALUE,y,x,b,w=this.getNodes(),_=w.length,k=0;k<_;k++){var E=w[k];y=E.getTop(),x=E.getLeft(),g>y&&(g=y),m>x&&(m=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=m-b,this.top=g-b,new h(this.left,this.top))},d.prototype.updateBounds=function(g){for(var m=i.MAX_VALUE,y=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,_,k,E,L,S=this.nodes,C=S.length,M=0;Mw&&(m=w),y<_&&(y=_),x>k&&(x=k),bw&&(m=w),y<_&&(y=_),x>k&&(x=k),b=this.nodes.length){var C=0;y.forEach(function(M){M.owner==g&&C++}),C==this.nodes.length&&(this.isConnected=!0)}},t.exports=d},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var s=this.layout.newGraph(),o=this.layout.newNode(null),l=this.add(s,o);return this.setRootGraph(l),this.rootGraph},a.prototype.add=function(s,o,l,u,h){if(l==null&&u==null&&h==null){if(s==null)throw"Graph is null!";if(o==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(o.child!=null)throw"Already has a child!";return s.parent=o,o.child=s,s}else{h=l,u=o,l=s;var f=u.getOwner(),d=h.getOwner();if(!(f!=null&&f.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(d!=null&&d.getGraphManager()==this))throw"Target not in this graph mgr!";if(f==d)return l.isInterGraph=!1,f.add(l,u,h);if(l.isInterGraph=!0,l.source=u,l.target=h,this.edges.indexOf(l)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(l),!(l.source!=null&&l.target!=null))throw"Edge source and/or target is null!";if(!(l.source.edges.indexOf(l)==-1&&l.target.edges.indexOf(l)==-1))throw"Edge already in source and/or target incidency list!";return l.source.edges.push(l),l.target.edges.push(l),l}},a.prototype.remove=function(s){if(s instanceof n){var o=s;if(o.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(o==this.rootGraph||o.parent!=null&&o.parent.graphManager==this))throw"Invalid parent node!";var l=[];l=l.concat(o.getEdges());for(var u,h=l.length,f=0;f=s.getRight()?o[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(o[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?o[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(o[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var h=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(h=1);var f=h*o[0],d=o[1]/h;o[0]f)return o[0]=l,o[1]=p,o[2]=h,o[3]=S,!1;if(uh)return o[0]=d,o[1]=u,o[2]=E,o[3]=f,!1;if(lh?(o[0]=m,o[1]=y,T=!0):(o[0]=g,o[1]=p,T=!0):A===N&&(l>h?(o[0]=d,o[1]=p,T=!0):(o[0]=x,o[1]=y,T=!0)),-D===N?h>l?(o[2]=L,o[3]=S,I=!0):(o[2]=E,o[3]=k,I=!0):D===N&&(h>l?(o[2]=_,o[3]=k,I=!0):(o[2]=C,o[3]=S,I=!0)),T&&I)return!1;if(l>h?u>f?(O=this.getCardinalDirection(A,N,4),B=this.getCardinalDirection(D,N,2)):(O=this.getCardinalDirection(-A,N,3),B=this.getCardinalDirection(-D,N,1)):u>f?(O=this.getCardinalDirection(-A,N,1),B=this.getCardinalDirection(-D,N,3)):(O=this.getCardinalDirection(A,N,2),B=this.getCardinalDirection(D,N,4)),!T)switch(O){case 1:$=p,P=l+-w/N,o[0]=P,o[1]=$;break;case 2:P=x,$=u+b*N,o[0]=P,o[1]=$;break;case 3:$=y,P=l+w/N,o[0]=P,o[1]=$;break;case 4:P=m,$=u+-b*N,o[0]=P,o[1]=$;break}if(!I)switch(B){case 1:H=k,z=h+-R/N,o[2]=z,o[3]=H;break;case 2:z=C,H=f+M*N,o[2]=z,o[3]=H;break;case 3:H=S,z=h+R/N,o[2]=z,o[3]=H;break;case 4:z=L,H=f+-M*N,o[2]=z,o[3]=H;break}}return!1},i.getCardinalDirection=function(a,s,o){return a>s?o:1+o%4},i.getIntersection=function(a,s,o,l){if(l==null)return this.getIntersection2(a,s,o);var u=a.x,h=a.y,f=s.x,d=s.y,p=o.x,g=o.y,m=l.x,y=l.y,x=void 0,b=void 0,w=void 0,_=void 0,k=void 0,E=void 0,L=void 0,S=void 0,C=void 0;return w=d-h,k=u-f,L=f*h-u*d,_=y-g,E=p-m,S=m*g-p*y,C=w*E-_*k,C===0?null:(x=(k*S-E*L)/C,b=(_*L-w*S)/C,new n(x,b))},i.angleOfVector=function(a,s,o,l){var u=void 0;return a!==o?(u=Math.atan((l-s)/(o-a)),o0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function u(h,f){for(var d=0;d"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(p){if(Array.isArray(p)){for(var g=0,m=Array(p.length);g0&&g;){for(w.push(k[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var L=E.getEdges(),x=0;x-1&&k.splice(R,1)}b=new Set,_=new Map}}return p},d.prototype.createDummyNodesForBendpoints=function(p){for(var g=[],m=p.source,y=this.graphManager.calcLowestCommonAncestor(p.source,p.target),x=0;x0){for(var y=this.edgeToDummyNodes.get(m),x=0;x=0&&g.splice(S,1);var C=_.getNeighborsList();C.forEach(function(T){if(m.indexOf(T)<0){var I=y.get(T),A=I-1;A==1&&E.push(T),y.set(T,A)}})}m=m.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},d.prototype.setGraphManager=function(p){this.graphManager=p},t.exports=d},function(t,e,r){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,o=this.lworldExtX;return o!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/o),s},i.prototype.transformY=function(a){var s=0,o=this.lworldExtY;return o!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/o),s},i.prototype.inverseTransformX=function(a){var s=0,o=this.ldeviceExtX;return o!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/o),s},i.prototype.inverseTransformY=function(a){var s=0,o=this.ldeviceExtY;return o!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/o),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(f){if(Array.isArray(f)){for(var d=0,p=Array(f.length);da.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(f-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(f>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(f-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},u.prototype.calcSpringForces=function(){for(var f=this.getAllEdges(),d,p=0;p0&&arguments[0]!==void 0?arguments[0]:!0,d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,p,g,m,y,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&f&&this.updateGrid(),b=new Set,p=0;pw||b>w)&&(f.gravitationForceX=-this.gravityConstant*m,f.gravitationForceY=-this.gravityConstant*y)):(w=d.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(f.gravitationForceX=-this.gravityConstant*m*this.compoundGravityConstant,f.gravitationForceY=-this.gravityConstant*y*this.compoundGravityConstant))},u.prototype.isConverged=function(){var f,d=!1;return this.totalIterations>this.maxIterations/3&&(d=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),f=this.totalDisplacement=x.length||w>=x[0].length)){for(var _=0;_u}}]),o}();t.exports=s},function(t,e,r){"use strict";var n=function(){function s(o,l){for(var u=0;u2&&arguments[2]!==void 0?arguments[2]:1,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,f=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=o,this.sequence2=l,this.match_score=u,this.mismatch_penalty=h,this.gap_penalty=f,this.iMax=o.length+1,this.jMax=l.length+1,this.grid=new Array(this.iMax);for(var d=0;d=0;o--){var l=this.listeners[o];l.event===a&&l.callback===s&&this.listeners.splice(o,1)}},i.emit=function(a,s){for(var o=0;o{(function(e,r){typeof Hx=="object"&&typeof eO=="object"?eO.exports=r(JD()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof Hx=="object"?Hx.coseBase=r(JD()):e.coseBase=r(e.layoutBase)})(Hx,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?function(){return i.default}:function(){return i};return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(o,l,u){i.call(this,o,l,u)}a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraph;function a(o,l,u){i.call(this,o,l,u)}a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(o){i.call(this,o)}a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(l,u,h,f){i.call(this,l,u,h,f)}s.prototype=Object.create(i.prototype);for(var o in i)s[o]=i[o];s.prototype.move=function(){var l=this.graphManager.getLayout();this.displacementX=l.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=l.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>l.coolingFactor*l.maxNodeDisplacement&&(this.displacementX=l.coolingFactor*l.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>l.coolingFactor*l.maxNodeDisplacement&&(this.displacementY=l.coolingFactor*l.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),l.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(l,u){for(var h=this.getChild().getNodes(),f,d=0;d0)this.positionNodesRadially(k);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),L=this.nodesWithGravity.filter(function(S){return E.has(S)});this.graphManager.setAllNodesToApplyGravitation(L),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},w.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%h.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),E=this.nodesWithGravity.filter(function(C){return k.has(C)});this.graphManager.setAllNodesToApplyGravitation(E),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=h.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=h.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var L=!this.isTreeGrowing&&!this.isGrowthFinished,S=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(L,S),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},w.prototype.getPositionsData=function(){for(var k=this.graphManager.getAllNodes(),E={},L=0;L1){var T;for(T=0;TS&&(S=Math.floor(R.y)),M=Math.floor(R.x+u.DEFAULT_COMPONENT_SEPERATION)}this.transform(new p(f.WORLD_CENTER_X-R.x/2,f.WORLD_CENTER_Y-R.y/2))},w.radialLayout=function(k,E,L){var S=Math.max(this.maxDiagonalInTree(k),u.DEFAULT_RADIAL_SEPARATION);w.branchRadialLayout(E,null,0,359,0,S);var C=x.calculateBounds(k),M=new b;M.setDeviceOrgX(C.getMinX()),M.setDeviceOrgY(C.getMinY()),M.setWorldOrgX(L.x),M.setWorldOrgY(L.y);for(var R=0;R1;){var J=H[0];H.splice(0,1);var X=O.indexOf(J);X>=0&&O.splice(X,1),$--,B--}E!=null?z=(O.indexOf(H[0])+1)%$:z=0;for(var oe=Math.abs(S-L)/B,K=z;P!=B;K=++K%$){var ee=O[K].getOtherEnd(k);if(ee!=E){var Q=(L+P*oe)%360,W=(Q+oe)%360;w.branchRadialLayout(ee,k,Q,W,C+M,M),P++}}},w.maxDiagonalInTree=function(k){for(var E=m.MIN_VALUE,L=0;LE&&(E=C)}return E},w.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},w.prototype.groupZeroDegreeMembers=function(){var k=this,E={};this.memberGroups={},this.idToDummyNode={};for(var L=[],S=this.graphManager.getAllNodes(),C=0;C"u"&&(E[T]=[]),E[T]=E[T].concat(M)}Object.keys(E).forEach(function(I){if(E[I].length>1){var A="DummyCompound_"+I;k.memberGroups[A]=E[I];var D=E[I][0].getParent(),N=new o(k.graphManager);N.id=A,N.paddingLeft=D.paddingLeft||0,N.paddingRight=D.paddingRight||0,N.paddingBottom=D.paddingBottom||0,N.paddingTop=D.paddingTop||0,k.idToDummyNode[A]=N;var O=k.getGraphManager().add(k.newGraph(),N),B=D.getChild();B.add(N);for(var P=0;P=0;k--){var E=this.compoundOrder[k],L=E.id,S=E.paddingLeft,C=E.paddingTop;this.adjustLocations(this.tiledMemberPack[L],E.rect.x,E.rect.y,S,C)}},w.prototype.repopulateZeroDegreeMembers=function(){var k=this,E=this.tiledZeroDegreePack;Object.keys(E).forEach(function(L){var S=k.idToDummyNode[L],C=S.paddingLeft,M=S.paddingTop;k.adjustLocations(E[L],S.rect.x,S.rect.y,C,M)})},w.prototype.getToBeTiled=function(k){var E=k.id;if(this.toBeTiled[E]!=null)return this.toBeTiled[E];var L=k.getChild();if(L==null)return this.toBeTiled[E]=!1,!1;for(var S=L.getNodes(),C=0;C0)return this.toBeTiled[E]=!1,!1;if(M.getChild()==null){this.toBeTiled[M.id]=!1;continue}if(!this.getToBeTiled(M))return this.toBeTiled[E]=!1,!1}return this.toBeTiled[E]=!0,!0},w.prototype.getNodeDegree=function(k){for(var E=k.id,L=k.getEdges(),S=0,C=0;CI&&(I=D.rect.height)}L+=I+k.verticalPadding}},w.prototype.tileCompoundMembers=function(k,E){var L=this;this.tiledMemberPack=[],Object.keys(k).forEach(function(S){var C=E[S];L.tiledMemberPack[S]=L.tileNodes(k[S],C.paddingLeft+C.paddingRight),C.rect.width=L.tiledMemberPack[S].width,C.rect.height=L.tiledMemberPack[S].height})},w.prototype.tileNodes=function(k,E){var L=u.TILING_PADDING_VERTICAL,S=u.TILING_PADDING_HORIZONTAL,C={rows:[],rowWidth:[],rowHeight:[],width:0,height:E,verticalPadding:L,horizontalPadding:S};k.sort(function(T,I){return T.rect.width*T.rect.height>I.rect.width*I.rect.height?-1:T.rect.width*T.rect.height0&&(R+=k.horizontalPadding),k.rowWidth[L]=R,k.width0&&(T+=k.verticalPadding);var I=0;T>k.rowHeight[L]&&(I=k.rowHeight[L],k.rowHeight[L]=T,I=k.rowHeight[L]-I),k.height+=I,k.rows[L].push(E)},w.prototype.getShortestRowIndex=function(k){for(var E=-1,L=Number.MAX_VALUE,S=0;SL&&(E=S,L=k.rowWidth[S]);return E},w.prototype.canAddHorizontal=function(k,E,L){var S=this.getShortestRowIndex(k);if(S<0)return!0;var C=k.rowWidth[S];if(C+k.horizontalPadding+E<=k.width)return!0;var M=0;k.rowHeight[S]0&&(M=L+k.verticalPadding-k.rowHeight[S]);var R;k.width-C>=E+k.horizontalPadding?R=(k.height+M)/(C+E+k.horizontalPadding):R=(k.height+M)/k.width,M=L+k.verticalPadding;var T;return k.widthM&&E!=L){S.splice(-1,1),k.rows[L].push(C),k.rowWidth[E]=k.rowWidth[E]-M,k.rowWidth[L]=k.rowWidth[L]+M,k.width=k.rowWidth[instance.getLongestRowIndex(k)];for(var R=Number.MIN_VALUE,T=0;TR&&(R=S[T].height);E>0&&(R+=k.verticalPadding);var I=k.rowHeight[E]+k.rowHeight[L];k.rowHeight[E]=R,k.rowHeight[L]0)for(var B=C;B<=M;B++)O[0]+=this.grid[B][R-1].length+this.grid[B][R].length-1;if(M0)for(var B=R;B<=T;B++)O[3]+=this.grid[C-1][B].length+this.grid[C][B].length-1;for(var P=m.MAX_VALUE,$,z,H=0;H{(function(e,r){typeof qx=="object"&&typeof rO=="object"?rO.exports=r(tO()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof qx=="object"?qx.cytoscapeCoseBilkent=r(tO()):e.cytoscapeCoseBilkent=r(e.coseBase)})(qx,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?function(){return i.default}:function(){return i};return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,o=n(0).CoSELayout,l=n(0).CoSENode,u=n(0).layoutBase.PointD,h=n(0).layoutBase.DimensionD,f={ready:function(){},stop:function(){},quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function d(y,x){var b={};for(var w in y)b[w]=y[w];for(var w in x)b[w]=x[w];return b}function p(y){this.options=d(f,y),g(this.options)}var g=function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal};p.prototype.run=function(){var y,x,b=this.options,w=this.idToLNode={},_=this.layout=new o,k=this;k.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var E=_.newGraphManager();this.gm=E;var L=this.options.eles.nodes(),S=this.options.eles.edges();this.root=E.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(L),_);for(var C=0;C0){var T;T=b.getGraphManager().add(b.newGraph(),L),this.processChildrenList(T,E,b)}}},p.prototype.stop=function(){return this.stopped=!0,this};var m=function(x){x("layout","cose-bilkent",p)};typeof cytoscape<"u"&&m(cytoscape),e.exports=m}])})});var vpe={};vr(vpe,{diagram:()=>aje});function dpe(t,e,r,n,i){return t.insert("polygon",":first-child").attr("points",n.map(function(a){return a.x+","+a.y}).join(" ")).attr("transform","translate("+(i.width-e)/2+", "+r+")")}async function aO(t,e,r,n,i){await QXe(t,e,r,n,i),r.children&&await Promise.all(r.children.map((a,s)=>aO(t,e,a,n<0?s:n,i)))}function ppe(t,e){e.edges().map((r,n)=>{let i=r.data();if(r[0]._private.bodyBounds){let a=r[0]._private.rscratch;re.trace("Edge: ",n,i),t.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}})}function sO(t,e,r,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach(i=>{sO(i,e,r,n+1),e.add({group:"edges",data:{id:`${t.id}_${i.id}`,source:t.id,target:i.id,depth:n,section:i.section}})})}function gpe(t,e){return new Promise(r=>{let n=Ve("body").append("div").attr("id","cy").attr("style","display:none"),i=Jo({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),sO(t,i,e,0),i.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}}),i.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),i.ready(a=>{re.info("Ready",a),r(i)})})}function mpe(t,e){e.nodes().map((r,n)=>{let i=r.data();i.x=r.position().x,i.y=r.position().y,JXe(t,i);let a=t.getElementById(i.nodeId);re.info("Id:",n,"Position: (",r.position().x,", ",r.position().y,")",i),a.attr("transform",`translate(${r.position().x-i.width/2}, ${r.position().y-i.height/2})`),a.attr("attr",`apa-${n})`)})}var fpe,nO,NXe,zl,hpe,iO,IXe,MXe,DXe,OXe,Bi,PXe,BXe,FXe,zXe,$Xe,GXe,UXe,VXe,WXe,HXe,qXe,YXe,XXe,jXe,KXe,ZXe,QXe,JXe,eje,tje,rje,nje,ije,aje,ype=F(()=>{Ya();kn();Iu();or();ZD();fpe=Gi(upe(),1);lr();go();nO=function(){var t=v(function(_,k,E,L){for(E=E||{},L=_.length;L--;E[_[L]]=k);return E},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],o=[1,19],l=[6,7,8],u=[1,26],h=[1,24],f=[1,25],d=[6,7,11],p=[1,6,13,15,16,19,22],g=[1,33],m=[1,34],y=[1,6,7,11,13,15,16,19,22],x={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:v(function(k,E,L,S,C,M,R){var T=M.length-1;switch(C){case 6:case 7:return S;case 8:S.getLogger().trace("Stop NL ");break;case 9:S.getLogger().trace("Stop EOF ");break;case 11:S.getLogger().trace("Stop NL2 ");break;case 12:S.getLogger().trace("Stop EOF2 ");break;case 15:S.getLogger().info("Node: ",M[T].id),S.addNode(M[T-1].length,M[T].id,M[T].descr,M[T].type);break;case 16:S.getLogger().trace("Icon: ",M[T]),S.decorateNode({icon:M[T]});break;case 17:case 21:S.decorateNode({class:M[T]});break;case 18:S.getLogger().trace("SPACELIST");break;case 19:S.getLogger().trace("Node: ",M[T].id),S.addNode(0,M[T].id,M[T].descr,M[T].type);break;case 20:S.decorateNode({icon:M[T]});break;case 25:S.getLogger().trace("node found ..",M[T-2]),this.$={id:M[T-1],descr:M[T-1],type:S.getType(M[T-2],M[T])};break;case 26:this.$={id:M[T],descr:M[T],type:S.nodeType.DEFAULT};break;case 27:S.getLogger().trace("node found ..",M[T-3]),this.$={id:M[T-3],descr:M[T-1],type:S.getType(M[T-2],M[T])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:o},t(l,[2,3]),{1:[2,2]},t(l,[2,4]),t(l,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:o},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:o},{6:u,7:h,10:23,11:f},t(d,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:o}),t(d,[2,18]),t(d,[2,19]),t(d,[2,20]),t(d,[2,21]),t(d,[2,23]),t(d,[2,24]),t(d,[2,26],{19:[1,30]}),{20:[1,31]},{6:u,7:h,10:32,11:f},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:o},t(p,[2,14],{7:g,11:m}),t(y,[2,8]),t(y,[2,9]),t(y,[2,10]),t(d,[2,15]),t(d,[2,16]),t(d,[2,17]),{20:[1,35]},{21:[1,36]},t(p,[2,13],{7:g,11:m}),t(y,[2,11]),t(y,[2,12]),{21:[1,37]},t(d,[2,25]),t(d,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:v(function(k,E){if(E.recoverable)this.trace(k);else{var L=new Error(k);throw L.hash=E,L}},"parseError"),parse:v(function(k){var E=this,L=[0],S=[],C=[null],M=[],R=this.table,T="",I=0,A=0,D=0,N=2,O=1,B=M.slice.call(arguments,1),P=Object.create(this.lexer),$={yy:{}};for(var z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,z)&&($.yy[z]=this.yy[z]);P.setInput(k,$.yy),$.yy.lexer=P,$.yy.parser=this,typeof P.yylloc>"u"&&(P.yylloc={});var H=P.yylloc;M.push(H);var J=P.options&&P.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function X(we){L.length=L.length-2*we,C.length=C.length-we,M.length=M.length-we}v(X,"popStack");function oe(){var we;return we=S.pop()||P.lex()||O,typeof we!="number"&&(we instanceof Array&&(S=we,we=S.pop()),we=E.symbols_[we]||we),we}v(oe,"lex");for(var K,ee,Q,W,Y,Z,se={},ce,ue,te,Ne;;){if(Q=L[L.length-1],this.defaultActions[Q]?W=this.defaultActions[Q]:((K===null||typeof K>"u")&&(K=oe()),W=R[Q]&&R[Q][K]),typeof W>"u"||!W.length||!W[0]){var ae="";Ne=[];for(ce in R[Q])this.terminals_[ce]&&ce>N&&Ne.push("'"+this.terminals_[ce]+"'");P.showPosition?ae="Parse error on line "+(I+1)+`: `+P.showPosition()+` Expecting `+Ne.join(", ")+", got '"+(this.terminals_[K]||K)+"'":ae="Parse error on line "+(I+1)+": Unexpected "+(K==O?"end of input":"'"+(this.terminals_[K]||K)+"'"),this.parseError(ae,{text:P.match,token:this.terminals_[K]||K,line:P.yylineno,loc:H,expected:Ne})}if(W[0]instanceof Array&&W.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Q+", token: "+K);switch(W[0]){case 1:L.push(K),C.push(P.yytext),M.push(P.yylloc),L.push(W[1]),K=null,ee?(K=ee,ee=null):(A=P.yyleng,T=P.yytext,I=P.yylineno,H=P.yylloc,D>0&&D--);break;case 2:if(ue=this.productions_[W[1]][1],se.$=C[C.length-ue],se._$={first_line:M[M.length-(ue||1)].first_line,last_line:M[M.length-1].last_line,first_column:M[M.length-(ue||1)].first_column,last_column:M[M.length-1].last_column},J&&(se._$.range=[M[M.length-(ue||1)].range[0],M[M.length-1].range[1]]),Z=this.performAction.apply(se,[T,A,I,$.yy,W[1],C,M].concat(B)),typeof Z<"u")return Z;ue&&(L=L.slice(0,-1*ue*2),C=C.slice(0,-1*ue),M=M.slice(0,-1*ue)),L.push(this.productions_[W[1]][0]),C.push(se.$),M.push(se._$),te=R[L[L.length-2]][L[L.length-1]],L.push(te);break;case 3:return!0}}return!0},"parse")},b=function(){var _={EOF:1,parseError:v(function(E,L){if(this.yy.parser)this.yy.parser.parseError(E,L);else throw new Error(E)},"parseError"),setInput:v(function(k,E){return this.yy=E||this.yy||{},this._input=k,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var k=this._input[0];this.yytext+=k,this.yyleng++,this.offset++,this.match+=k,this.matched+=k;var E=k.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),k},"input"),unput:v(function(k){var E=k.length,L=k.split(/(?:\r\n?|\n)/g);this._input=k+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),L.length-1&&(this.yylineno-=L.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:L?(L.length===S.length?this.yylloc.first_column:0)+S[S.length-L.length].length-L[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(k){this.unput(this.match.slice(k))},"less"),pastInput:v(function(){var k=this.matched.substr(0,this.matched.length-this.match.length);return(k.length>20?"...":"")+k.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var k=this.match;return k.length<20&&(k+=this._input.substr(0,20-k.length)),(k.substr(0,20)+(k.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var k=this.pastInput(),E=new Array(k.length+1).join("-");return k+this.upcomingInput()+` `+E+"^"},"showPosition"),test_match:v(function(k,E){var L,S,C;if(this.options.backtrack_lexer&&(C={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(C.yylloc.range=this.yylloc.range.slice(0))),S=k[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+k[0].length},this.yytext+=k[0],this.match+=k[0],this.matches=k,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(k[0].length),this.matched+=k[0],L=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),L)return L;if(this._backtrack){for(var M in C)this[M]=C[M];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var k,E,L,S;this._more||(this.yytext="",this.match="");for(var C=this._currentRules(),M=0;ME[0].length)){if(E=L,S=M,this.options.backtrack_lexer){if(k=this.test_match(L,C[M]),k!==!1)return k;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(k=this.test_match(E,C[S]),k!==!1?k:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var E=this.next();return E||this.lex()},"lex"),begin:v(function(E){this.conditionStack.push(E)},"begin"),popState:v(function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},"topState"),pushState:v(function(E){this.begin(E)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(E,L,S,C){var M=C;switch(S){case 0:return E.getLogger().trace("Found comment",L.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:E.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return E.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:E.getLogger().trace("end icon"),this.popState();break;case 10:return E.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return E.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return E.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return E.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:E.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return E.getLogger().trace("description:",L.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),E.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),E.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),E.getLogger().trace("node end ...",L.yytext),"NODE_DEND";break;case 30:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return E.getLogger().trace("Long description:",L.yytext),20;break;case 36:return E.getLogger().trace("Long description:",L.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return _}();x.lexer=b;function w(){this.yy={}}return v(w,"Parser"),w.prototype=x,x.Parser=w,new w}();nO.parser=nO;NXe=nO,zl=[],hpe=0,iO={},IXe=v(()=>{zl=[],hpe=0,iO={}},"clear"),MXe=v(function(t){for(let e=zl.length-1;e>=0;e--)if(zl[e].levelzl.length>0?zl[0]:null,"getMindmap"),OXe=v((t,e,r,n)=>{re.info("addNode",t,e,r,n);let i=pe(),a=i.mindmap?.padding??sr.mindmap.padding;switch(n){case Bi.ROUNDED_RECT:case Bi.RECT:case Bi.HEXAGON:a*=2}let s={id:hpe++,nodeId:yr(e,i),level:t,descr:yr(r,i),type:n,children:[],width:i.mindmap?.maxNodeWidth??sr.mindmap.maxNodeWidth,padding:a},o=MXe(t);if(o)o.children.push(s),zl.push(s);else if(zl.length===0)zl.push(s);else throw new Error('There can be only one root. No parent could be found for ("'+s.descr+'")')},"addNode"),Bi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},PXe=v((t,e)=>{switch(re.debug("In get type",t,e),t){case"[":return Bi.RECT;case"(":return e===")"?Bi.ROUNDED_RECT:Bi.CLOUD;case"((":return Bi.CIRCLE;case")":return Bi.CLOUD;case"))":return Bi.BANG;case"{{":return Bi.HEXAGON;default:return Bi.DEFAULT}},"getType"),BXe=v((t,e)=>{iO[t]=e},"setElementForId"),FXe=v(t=>{if(!t)return;let e=pe(),r=zl[zl.length-1];t.icon&&(r.icon=yr(t.icon,e)),t.class&&(r.class=yr(t.class,e))},"decorateNode"),zXe=v(t=>{switch(t){case Bi.DEFAULT:return"no-border";case Bi.RECT:return"rect";case Bi.ROUNDED_RECT:return"rounded-rect";case Bi.CIRCLE:return"circle";case Bi.CLOUD:return"cloud";case Bi.BANG:return"bang";case Bi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),$Xe=v(()=>re,"getLogger"),GXe=v(t=>iO[t],"getElementById"),UXe={clear:IXe,addNode:OXe,getMindmap:DXe,nodeType:Bi,getType:PXe,setElementForId:BXe,decorateNode:FXe,type2Str:zXe,getLogger:$Xe,getElementById:GXe},VXe=UXe,WXe=12,HXe=v(function(t,e,r,n){e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 ${r.height-5} v${-r.height+2*5} q0,-5 5,-5 h${r.width-2*5} q5,0 5,5 v${r.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",r.height).attr("x2",r.width).attr("y2",r.height)},"defaultBkg"),qXe=v(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("width",r.width)},"rectBkg"),YXe=v(function(t,e,r){let n=r.width,i=r.height,a=.15*n,s=.25*n,o=.35*n,l=.2*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 0 0,1 ${n*.25},${-1*n*.1} a${o},${o} 1 0,1 ${n*.4},${-1*n*.1} a${s},${s} 1 0,1 ${n*.35},${1*n*.2} a${a},${a} 1 0,1 ${n*.15},${1*i*.35} a${l},${l} 1 0,1 ${-1*n*.15},${1*i*.65} a${s},${a} 1 0,1 ${-1*n*.25},${n*.15} a${o},${o} 1 0,1 ${-1*n*.5},0 a${a},${a} 1 0,1 ${-1*n*.25},${-1*n*.15} a${a},${a} 1 0,1 ${-1*n*.1},${-1*i*.35} a${l},${l} 1 0,1 ${n*.1},${-1*i*.65} H0 V0 Z`)},"cloudBkg"),XXe=v(function(t,e,r){let n=r.width,i=r.height,a=.15*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 1 0,0 ${n*.25},${-1*i*.1} a${a},${a} 1 0,0 ${n*.25},0 a${a},${a} 1 0,0 ${n*.25},0 a${a},${a} 1 0,0 ${n*.25},${1*i*.1} a${a},${a} 1 0,0 ${n*.15},${1*i*.33} a${a*.8},${a*.8} 1 0,0 0,${1*i*.34} a${a},${a} 1 0,0 ${-1*n*.15},${1*i*.33} a${a},${a} 1 0,0 ${-1*n*.25},${i*.15} a${a},${a} 1 0,0 ${-1*n*.25},0 a${a},${a} 1 0,0 ${-1*n*.25},0 a${a},${a} 1 0,0 ${-1*n*.25},${-1*i*.15} a${a},${a} 1 0,0 ${-1*n*.1},${-1*i*.33} a${a*.8},${a*.8} 1 0,0 0,${-1*i*.34} a${a},${a} 1 0,0 ${n*.1},${-1*i*.33} H0 V0 Z`)},"bangBkg"),jXe=v(function(t,e,r){e.append("circle").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("r",r.width/2)},"circleBkg");v(dpe,"insertPolygonShape");KXe=v(function(t,e,r){let n=r.height,a=n/4,s=r.width-r.padding+2*a,o=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-n/2},{x:s-a,y:-n},{x:a,y:-n},{x:0,y:-n/2}];dpe(e,s,n,o,r)},"hexagonBkg"),ZXe=v(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("rx",r.padding).attr("ry",r.padding).attr("width",r.width)},"roundedRectBkg"),QXe=v(async function(t,e,r,n,i){let a=i.htmlLabels,s=n%(WXe-1),o=e.append("g");r.section=s;let l="section-"+s;s<0&&(l+=" section-root"),o.attr("class",(r.class?r.class+" ":"")+"mindmap-node "+l);let u=o.append("g"),h=o.append("g"),f=r.descr.replace(/()/g,` `);await oa(h,f,{useHtmlLabels:a,width:r.width,classes:"mindmap-node-label"},i),a||h.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");let d=h.node().getBBox(),[p]=Ro(i.fontSize);if(r.height=d.height+p*1.1*.5+r.padding,r.width=d.width+2*r.padding,r.icon)if(r.type===t.nodeType.CIRCLE)r.height+=50,r.width+=50,o.append("foreignObject").attr("height","50px").attr("width",r.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),h.attr("transform","translate("+r.width/2+", "+(r.height/2-1.5*r.padding)+")");else{r.width+=50;let g=r.height;r.height=Math.max(g,60);let m=Math.abs(r.height-g);o.append("foreignObject").attr("width","60px").attr("height",r.height).attr("style","text-align: center;margin-top:"+m/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),h.attr("transform","translate("+(25+r.width/2)+", "+(m/2+r.padding/2)+")")}else if(a){let g=(r.width-d.width)/2,m=(r.height-d.height)/2;h.attr("transform","translate("+g+", "+m+")")}else{let g=r.width/2,m=r.padding/2;h.attr("transform","translate("+g+", "+m+")")}switch(r.type){case t.nodeType.DEFAULT:HXe(t,u,r,s);break;case t.nodeType.ROUNDED_RECT:ZXe(t,u,r,s);break;case t.nodeType.RECT:qXe(t,u,r,s);break;case t.nodeType.CIRCLE:u.attr("transform","translate("+r.width/2+", "+ +r.height/2+")"),jXe(t,u,r,s);break;case t.nodeType.CLOUD:YXe(t,u,r,s);break;case t.nodeType.BANG:XXe(t,u,r,s);break;case t.nodeType.HEXAGON:KXe(t,u,r,s);break}return t.setElementForId(r.id,o),r.height},"drawNode"),JXe=v(function(t,e){let r=t.getElementById(e.id),n=e.x||0,i=e.y||0;r.attr("transform","translate("+n+","+i+")")},"positionNode");Jo.use(fpe.default);v(aO,"drawNodes");v(ppe,"drawEdges");v(sO,"addNodes");v(gpe,"layoutMindmap");v(mpe,"positionNodes");eje=v(async(t,e,r,n)=>{re.debug(`Rendering mindmap diagram `+t);let i=n.db,a=i.getMindmap();if(!a)return;let s=pe();s.htmlLabels=!1;let o=La(e),l=o.append("g");l.attr("class","mindmap-edges");let u=o.append("g");u.attr("class","mindmap-nodes"),await aO(i,u,a,-1,s);let h=await gpe(a,s);ppe(l,h),mpe(i,h),il(void 0,o,s.mindmap?.padding??sr.mindmap.padding,s.mindmap?.useMaxWidth??sr.mindmap.useMaxWidth)},"draw"),tje={draw:eje},rje=v(t=>{let e="";for(let r=0;r` .edge { stroke-width: 3; } ${rje(t)} .section-root rect, .section-root path, .section-root circle, .section-root polygon { fill: ${t.git0}; } .section-root text { fill: ${t.gitBranchLabel0}; } .icon-container { height:100%; display: flex; justify-content: center; align-items: center; } .edge { fill: none; } .mindmap-node-label { dy: 1em; alignment-baseline: middle; text-anchor: middle; dominant-baseline: middle; text-align: center; } `,"getStyles"),ije=nje,aje={db:VXe,renderer:tje,parser:NXe,styles:ije}});var bpe={};vr(bpe,{diagram:()=>Eje});var oO,sje,el,cO,lO,uO,oje,lje,xpe,cje,uje,Fi,hje,fje,dje,pje,gje,mje,vje,yje,xje,bje,wje,kje,Tje,Eje,wpe=F(()=>{r4();yl();sl();bo();Ya();kn();Iu();or();go();oO=function(){var t=v(function(L,S,C,M){for(C=C||{},M=L.length;M--;C[L[M]]=S);return C},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],o=[1,19],l=[6,7,8],u=[1,26],h=[1,24],f=[1,25],d=[6,7,11],p=[1,31],g=[6,7,11,24],m=[1,6,13,16,17,20,23],y=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],w=[1,38],_={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:v(function(S,C,M,R,T,I,A){var D=I.length-1;switch(T){case 6:case 7:return R;case 8:R.getLogger().trace("Stop NL ");break;case 9:R.getLogger().trace("Stop EOF ");break;case 11:R.getLogger().trace("Stop NL2 ");break;case 12:R.getLogger().trace("Stop EOF2 ");break;case 15:R.getLogger().info("Node: ",I[D-1].id),R.addNode(I[D-2].length,I[D-1].id,I[D-1].descr,I[D-1].type,I[D]);break;case 16:R.getLogger().info("Node: ",I[D].id),R.addNode(I[D-1].length,I[D].id,I[D].descr,I[D].type);break;case 17:R.getLogger().trace("Icon: ",I[D]),R.decorateNode({icon:I[D]});break;case 18:case 23:R.decorateNode({class:I[D]});break;case 19:R.getLogger().trace("SPACELIST");break;case 20:R.getLogger().trace("Node: ",I[D-1].id),R.addNode(0,I[D-1].id,I[D-1].descr,I[D-1].type,I[D]);break;case 21:R.getLogger().trace("Node: ",I[D].id),R.addNode(0,I[D].id,I[D].descr,I[D].type);break;case 22:R.decorateNode({icon:I[D]});break;case 27:R.getLogger().trace("node found ..",I[D-2]),this.$={id:I[D-1],descr:I[D-1],type:R.getType(I[D-2],I[D])};break;case 28:this.$={id:I[D],descr:I[D],type:0};break;case 29:R.getLogger().trace("node found ..",I[D-3]),this.$={id:I[D-3],descr:I[D-1],type:R.getType(I[D-2],I[D])};break;case 30:this.$=I[D-1]+I[D];break;case 31:this.$=I[D];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:o},t(l,[2,3]),{1:[2,2]},t(l,[2,4]),t(l,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:o},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:o},{6:u,7:h,10:23,11:f},t(d,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:o}),t(d,[2,19]),t(d,[2,21],{15:30,24:p}),t(d,[2,22]),t(d,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:u,7:h,10:34,11:f},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:o},t(m,[2,14],{7:y,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(d,[2,16],{15:37,24:p}),t(d,[2,17]),t(d,[2,18]),t(d,[2,20],{24:w}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(m,[2,13],{7:y,11:x}),t(b,[2,11]),t(b,[2,12]),t(d,[2,15],{24:w}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:v(function(S,C){if(C.recoverable)this.trace(S);else{var M=new Error(S);throw M.hash=C,M}},"parseError"),parse:v(function(S){var C=this,M=[0],R=[],T=[null],I=[],A=this.table,D="",N=0,O=0,B=0,P=2,$=1,z=I.slice.call(arguments,1),H=Object.create(this.lexer),J={yy:{}};for(var X in this.yy)Object.prototype.hasOwnProperty.call(this.yy,X)&&(J.yy[X]=this.yy[X]);H.setInput(S,J.yy),J.yy.lexer=H,J.yy.parser=this,typeof H.yylloc>"u"&&(H.yylloc={});var oe=H.yylloc;I.push(oe);var K=H.options&&H.options.ranges;typeof J.yy.parseError=="function"?this.parseError=J.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ee(Oe){M.length=M.length-2*Oe,T.length=T.length-Oe,I.length=I.length-Oe}v(ee,"popStack");function Q(){var Oe;return Oe=R.pop()||H.lex()||$,typeof Oe!="number"&&(Oe instanceof Array&&(R=Oe,Oe=R.pop()),Oe=C.symbols_[Oe]||Oe),Oe}v(Q,"lex");for(var W,Y,Z,se,ce,ue,te={},Ne,ae,we,Ie;;){if(Z=M[M.length-1],this.defaultActions[Z]?se=this.defaultActions[Z]:((W===null||typeof W>"u")&&(W=Q()),se=A[Z]&&A[Z][W]),typeof se>"u"||!se.length||!se[0]){var Ee="";Ie=[];for(Ne in A[Z])this.terminals_[Ne]&&Ne>P&&Ie.push("'"+this.terminals_[Ne]+"'");H.showPosition?Ee="Parse error on line "+(N+1)+`: `+H.showPosition()+` Expecting `+Ie.join(", ")+", got '"+(this.terminals_[W]||W)+"'":Ee="Parse error on line "+(N+1)+": Unexpected "+(W==$?"end of input":"'"+(this.terminals_[W]||W)+"'"),this.parseError(Ee,{text:H.match,token:this.terminals_[W]||W,line:H.yylineno,loc:oe,expected:Ie})}if(se[0]instanceof Array&&se.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Z+", token: "+W);switch(se[0]){case 1:M.push(W),T.push(H.yytext),I.push(H.yylloc),M.push(se[1]),W=null,Y?(W=Y,Y=null):(O=H.yyleng,D=H.yytext,N=H.yylineno,oe=H.yylloc,B>0&&B--);break;case 2:if(ae=this.productions_[se[1]][1],te.$=T[T.length-ae],te._$={first_line:I[I.length-(ae||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(ae||1)].first_column,last_column:I[I.length-1].last_column},K&&(te._$.range=[I[I.length-(ae||1)].range[0],I[I.length-1].range[1]]),ue=this.performAction.apply(te,[D,O,N,J.yy,se[1],T,I].concat(z)),typeof ue<"u")return ue;ae&&(M=M.slice(0,-1*ae*2),T=T.slice(0,-1*ae),I=I.slice(0,-1*ae)),M.push(this.productions_[se[1]][0]),T.push(te.$),I.push(te._$),we=A[M[M.length-2]][M[M.length-1]],M.push(we);break;case 3:return!0}}return!0},"parse")},k=function(){var L={EOF:1,parseError:v(function(C,M){if(this.yy.parser)this.yy.parser.parseError(C,M);else throw new Error(C)},"parseError"),setInput:v(function(S,C){return this.yy=C||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var C=S.match(/(?:\r\n?|\n).*/g);return C?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:v(function(S){var C=S.length,M=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-C),this.offset-=C;var R=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),M.length-1&&(this.yylineno-=M.length-1);var T=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:M?(M.length===R.length?this.yylloc.first_column:0)+R[R.length-M.length].length-M[0].length:this.yylloc.first_column-C},this.options.ranges&&(this.yylloc.range=[T[0],T[0]+this.yyleng-C]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(S){this.unput(this.match.slice(S))},"less"),pastInput:v(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var S=this.pastInput(),C=new Array(S.length+1).join("-");return S+this.upcomingInput()+` `+C+"^"},"showPosition"),test_match:v(function(S,C){var M,R,T;if(this.options.backtrack_lexer&&(T={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(T.yylloc.range=this.yylloc.range.slice(0))),R=S[0].match(/(?:\r\n?|\n).*/g),R&&(this.yylineno+=R.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:R?R[R.length-1].length-R[R.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],M=this.performAction.call(this,this.yy,this,C,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),M)return M;if(this._backtrack){for(var I in T)this[I]=T[I];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,C,M,R;this._more||(this.yytext="",this.match="");for(var T=this._currentRules(),I=0;IC[0].length)){if(C=M,R=I,this.options.backtrack_lexer){if(S=this.test_match(M,T[I]),S!==!1)return S;if(this._backtrack){C=!1;continue}else return!1}else if(!this.options.flex)break}return C?(S=this.test_match(C,T[R]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var C=this.next();return C||this.lex()},"lex"),begin:v(function(C){this.conditionStack.push(C)},"begin"),popState:v(function(){var C=this.conditionStack.length-1;return C>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(C){return C=this.conditionStack.length-1-Math.abs(C||0),C>=0?this.conditionStack[C]:"INITIAL"},"topState"),pushState:v(function(C){this.begin(C)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(C,M,R,T){var I=T;switch(R){case 0:return this.pushState("shapeData"),M.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let A=/\n\s*/g;return M.yytext=M.yytext.replace(A,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return C.getLogger().trace("Found comment",M.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:C.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return C.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:C.getLogger().trace("end icon"),this.popState();break;case 16:return C.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return C.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return C.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return C.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:C.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return C.getLogger().trace("description:",M.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),C.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),C.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),C.getLogger().trace("node end ...",M.yytext),"NODE_DEND";break;case 36:return this.popState(),C.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),C.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),C.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),C.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),C.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return C.getLogger().trace("Long description:",M.yytext),21;break;case 42:return C.getLogger().trace("Long description:",M.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return L}();_.lexer=k;function E(){this.yy={}}return v(E,"Parser"),E.prototype=_,_.Parser=E,new E}();oO.parser=oO;sje=oO,el=[],cO=[],lO=0,uO={},oje=v(()=>{el=[],cO=[],lO=0,uO={}},"clear"),lje=v(t=>{if(el.length===0)return null;let e=el[0].level,r=null;for(let n=el.length-1;n>=0;n--)if(el[n].level===e&&!r&&(r=el[n]),el[n].levelo.parentId===i.id);for(let o of s){let l={id:o.id,parentId:i.id,label:yr(o.label??"",n),isGroup:!1,ticket:o?.ticket,priority:o?.priority,assigned:o?.assigned,icon:o?.icon,shape:"kanbanItem",level:o.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(l)}}return{nodes:e,edges:t,other:{},config:pe()}},"getData"),uje=v((t,e,r,n,i)=>{let a=pe(),s=a.mindmap?.padding??sr.mindmap.padding;switch(n){case Fi.ROUNDED_RECT:case Fi.RECT:case Fi.HEXAGON:s*=2}let o={id:yr(e,a)||"kbn"+lO++,level:t,label:yr(r,a),width:a.mindmap?.maxNodeWidth??sr.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let u;i.includes(` `)?u=i+` `:u=`{ `+i+` }`;let h=sp(u,{schema:ap});if(h.shape&&(h.shape!==h.shape.toLowerCase()||h.shape.includes("_")))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);h?.shape&&h.shape==="kanbanItem"&&(o.shape=h?.shape),h?.label&&(o.label=h?.label),h?.icon&&(o.icon=h?.icon),h?.assigned&&(o.assigned=h?.assigned),h?.ticket&&(o.ticket=h?.ticket),h?.priority&&(o.priority=h?.priority)}let l=lje(t);l?o.parentId=l.id||"kbn"+lO++:cO.push(o),el.push(o)},"addNode"),Fi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},hje=v((t,e)=>{switch(re.debug("In get type",t,e),t){case"[":return Fi.RECT;case"(":return e===")"?Fi.ROUNDED_RECT:Fi.CLOUD;case"((":return Fi.CIRCLE;case")":return Fi.CLOUD;case"))":return Fi.BANG;case"{{":return Fi.HEXAGON;default:return Fi.DEFAULT}},"getType"),fje=v((t,e)=>{uO[t]=e},"setElementForId"),dje=v(t=>{if(!t)return;let e=pe(),r=el[el.length-1];t.icon&&(r.icon=yr(t.icon,e)),t.class&&(r.cssClasses=yr(t.class,e))},"decorateNode"),pje=v(t=>{switch(t){case Fi.DEFAULT:return"no-border";case Fi.RECT:return"rect";case Fi.ROUNDED_RECT:return"rounded-rect";case Fi.CIRCLE:return"circle";case Fi.CLOUD:return"cloud";case Fi.BANG:return"bang";case Fi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),gje=v(()=>re,"getLogger"),mje=v(t=>uO[t],"getElementById"),vje={clear:oje,addNode:uje,getSections:xpe,getData:cje,nodeType:Fi,getType:hje,setElementForId:fje,decorateNode:dje,type2Str:pje,getLogger:gje,getElementById:mje},yje=vje,xje=v(async(t,e,r,n)=>{re.debug(`Rendering kanban diagram `+t);let a=n.db.getData(),s=pe();s.htmlLabels=!1;let o=La(e),l=o.append("g");l.attr("class","sections");let u=o.append("g");u.attr("class","items");let h=a.nodes.filter(y=>y.isGroup),f=0,d=10,p=[],g=25;for(let y of h){let x=s?.kanban?.sectionWidth||200;f=f+1,y.x=x*f+(f-1)*d/2,y.width=x,y.y=0,y.height=x*3,y.rx=5,y.ry=5,y.cssClasses=y.cssClasses+" section-"+f;let b=await tg(l,y);g=Math.max(g,b?.labelBBox?.height),p.push(b)}let m=0;for(let y of h){let x=p[m];m=m+1;let b=s?.kanban?.sectionWidth||200,w=-b*3/2+g,_=w,k=a.nodes.filter(S=>S.parentId===y.id);for(let S of k){if(S.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");S.x=y.x,S.width=b-1.5*d;let M=(await wd(u,S,{config:s})).node().getBBox();S.y=_+M.height/2,await Jv(S),_=S.y+M.height/2+d/2}let E=x.cluster.select("rect"),L=Math.max(_-w+3*d,50)+(g-25);E.attr("height",L)}il(void 0,o,s.mindmap?.padding??sr.kanban.padding,s.mindmap?.useMaxWidth??sr.kanban.useMaxWidth)},"draw"),bje={draw:xje},wje=v(t=>{let e="";for(let n=0;nt.darkMode?Lt(n,i):kt(n,i),"adjuster");for(let n=0;n` .edge { stroke-width: 3; } ${wje(t)} .section-root rect, .section-root path, .section-root circle, .section-root polygon { fill: ${t.git0}; } .section-root text { fill: ${t.gitBranchLabel0}; } .icon-container { height:100%; display: flex; justify-content: center; align-items: center; } .edge { fill: none; } .cluster-label, .label { color: ${t.textColor}; fill: ${t.textColor}; } .kanban-label { dy: 1em; alignment-baseline: middle; text-anchor: middle; dominant-baseline: middle; text-align: center; } `,"getStyles"),Tje=kje,Eje={db:yje,renderer:bje,parser:sje,styles:Tje}});function Yx(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var kpe=F(()=>{});function l1(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var Tpe=F(()=>{});function c1(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var Epe=F(()=>{});var hO=F(()=>{kpe();Tpe();Epe()});function Sje(t){return t.target.depth}function fO(t){return t.depth}function dO(t,e){return e-1-t.height}function Xx(t,e){return t.sourceLinks.length?t.depth:e-1}function pO(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?l1(t.sourceLinks,Sje)-1:0}var gO=F(()=>{hO()});function u1(t){return function(){return t}}var Spe=F(()=>{});function Cpe(t,e){return hE(t.source,e.source)||t.index-e.index}function Ape(t,e){return hE(t.target,e.target)||t.index-e.index}function hE(t,e){return t.y0-e.y0}function mO(t){return t.value}function Cje(t){return t.index}function Aje(t){return t.nodes}function _je(t){return t.links}function _pe(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function Lpe({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function fE(){let t=0,e=0,r=1,n=1,i=24,a=8,s,o=Cje,l=Xx,u,h,f=Aje,d=_je,p=6;function g(){let D={nodes:f.apply(null,arguments),links:d.apply(null,arguments)};return m(D),y(D),x(D),b(D),k(D),Lpe(D),D}g.update=function(D){return Lpe(D),D},g.nodeId=function(D){return arguments.length?(o=typeof D=="function"?D:u1(D),g):o},g.nodeAlign=function(D){return arguments.length?(l=typeof D=="function"?D:u1(D),g):l},g.nodeSort=function(D){return arguments.length?(u=D,g):u},g.nodeWidth=function(D){return arguments.length?(i=+D,g):i},g.nodePadding=function(D){return arguments.length?(a=s=+D,g):a},g.nodes=function(D){return arguments.length?(f=typeof D=="function"?D:u1(D),g):f},g.links=function(D){return arguments.length?(d=typeof D=="function"?D:u1(D),g):d},g.linkSort=function(D){return arguments.length?(h=D,g):h},g.size=function(D){return arguments.length?(t=e=0,r=+D[0],n=+D[1],g):[r-t,n-e]},g.extent=function(D){return arguments.length?(t=+D[0][0],r=+D[1][0],e=+D[0][1],n=+D[1][1],g):[[t,e],[r,n]]},g.iterations=function(D){return arguments.length?(p=+D,g):p};function m({nodes:D,links:N}){for(let[B,P]of D.entries())P.index=B,P.sourceLinks=[],P.targetLinks=[];let O=new Map(D.map((B,P)=>[o(B,P,D),B]));for(let[B,P]of N.entries()){P.index=B;let{source:$,target:z}=P;typeof $!="object"&&($=P.source=_pe(O,$)),typeof z!="object"&&(z=P.target=_pe(O,z)),$.sourceLinks.push(P),z.targetLinks.push(P)}if(h!=null)for(let{sourceLinks:B,targetLinks:P}of D)B.sort(h),P.sort(h)}function y({nodes:D}){for(let N of D)N.value=N.fixedValue===void 0?Math.max(c1(N.sourceLinks,mO),c1(N.targetLinks,mO)):N.fixedValue}function x({nodes:D}){let N=D.length,O=new Set(D),B=new Set,P=0;for(;O.size;){for(let $ of O){$.depth=P;for(let{target:z}of $.sourceLinks)B.add(z)}if(++P>N)throw new Error("circular link");O=B,B=new Set}}function b({nodes:D}){let N=D.length,O=new Set(D),B=new Set,P=0;for(;O.size;){for(let $ of O){$.height=P;for(let{source:z}of $.targetLinks)B.add(z)}if(++P>N)throw new Error("circular link");O=B,B=new Set}}function w({nodes:D}){let N=Yx(D,P=>P.depth)+1,O=(r-t-i)/(N-1),B=new Array(N);for(let P of D){let $=Math.max(0,Math.min(N-1,Math.floor(l.call(null,P,N))));P.layer=$,P.x0=t+$*O,P.x1=P.x0+i,B[$]?B[$].push(P):B[$]=[P]}if(u)for(let P of B)P.sort(u);return B}function _(D){let N=l1(D,O=>(n-e-(O.length-1)*s)/c1(O,mO));for(let O of D){let B=e;for(let P of O){P.y0=B,P.y1=B+P.value*N,B=P.y1+s;for(let $ of P.sourceLinks)$.width=$.value*N}B=(n-B+s)/(O.length+1);for(let P=0;PO.length)-1)),_(N);for(let O=0;O0))continue;let X=(H/J-z.y0)*N;z.y0+=X,z.y1+=X,R(z)}u===void 0&&$.sort(hE),S($,O)}}function L(D,N,O){for(let B=D.length,P=B-2;P>=0;--P){let $=D[P];for(let z of $){let H=0,J=0;for(let{target:oe,value:K}of z.sourceLinks){let ee=K*(oe.layer-z.layer);H+=A(z,oe)*ee,J+=ee}if(!(J>0))continue;let X=(H/J-z.y0)*N;z.y0+=X,z.y1+=X,R(z)}u===void 0&&$.sort(hE),S($,O)}}function S(D,N){let O=D.length>>1,B=D[O];M(D,B.y0-s,O-1,N),C(D,B.y1+s,O+1,N),M(D,n,D.length-1,N),C(D,e,0,N)}function C(D,N,O,B){for(;O1e-6&&(P.y0+=$,P.y1+=$),N=P.y1+s}}function M(D,N,O,B){for(;O>=0;--O){let P=D[O],$=(P.y1-N)*B;$>1e-6&&(P.y0-=$,P.y1-=$),N=P.y0-s}}function R({sourceLinks:D,targetLinks:N}){if(h===void 0){for(let{source:{sourceLinks:O}}of N)O.sort(Ape);for(let{target:{targetLinks:O}}of D)O.sort(Cpe)}}function T(D){if(h===void 0)for(let{sourceLinks:N,targetLinks:O}of D)N.sort(Ape),O.sort(Cpe)}function I(D,N){let O=D.y0-(D.sourceLinks.length-1)*s/2;for(let{target:B,width:P}of D.sourceLinks){if(B===N)break;O+=P+s}for(let{source:B,width:P}of N.targetLinks){if(B===D)break;O-=P}return O}function A(D,N){let O=N.y0-(N.targetLinks.length-1)*s/2;for(let{source:B,width:P}of N.targetLinks){if(B===D)break;O+=P+s}for(let{target:B,width:P}of D.sourceLinks){if(B===N)break;O-=P}return O}return g}var Rpe=F(()=>{hO();gO();Spe()});function xO(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Npe(){return new xO}var vO,yO,G0,Lje,bO,Ipe=F(()=>{vO=Math.PI,yO=2*vO,G0=1e-6,Lje=yO-G0;xO.prototype=Npe.prototype={constructor:xO,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},bezierCurveTo:function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},arcTo:function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,o=r-t,l=n-e,u=a-t,h=s-e,f=u*u+h*h;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(f>G0)if(!(Math.abs(h*o-l*u)>G0)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var d=r-a,p=n-s,g=o*o+l*l,m=d*d+p*p,y=Math.sqrt(g),x=Math.sqrt(f),b=i*Math.tan((vO-Math.acos((g+f-m)/(2*y*x)))/2),w=b/x,_=b/y;Math.abs(w-1)>G0&&(this._+="L"+(t+w*u)+","+(e+w*h)),this._+="A"+i+","+i+",0,0,"+ +(h*d>u*p)+","+(this._x1=t+_*o)+","+(this._y1=e+_*l)}},arc:function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),o=r*Math.sin(n),l=t+s,u=e+o,h=1^a,f=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+l+","+u:(Math.abs(this._x1-l)>G0||Math.abs(this._y1-u)>G0)&&(this._+="L"+l+","+u),r&&(f<0&&(f=f%yO+yO),f>Lje?this._+="A"+r+","+r+",0,1,"+h+","+(t-s)+","+(e-o)+"A"+r+","+r+",0,1,"+h+","+(this._x1=l)+","+(this._y1=u):f>G0&&(this._+="A"+r+","+r+",0,"+ +(f>=vO)+","+h+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},rect:function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},toString:function(){return this._}};bO=Npe});var Mpe=F(()=>{Ipe()});function wO(t){return function(){return t}}var Dpe=F(()=>{});function Ope(t){return t[0]}function Ppe(t){return t[1]}var Bpe=F(()=>{});var Fpe,zpe=F(()=>{Fpe=Array.prototype.slice});function Rje(t){return t.source}function Nje(t){return t.target}function Ije(t){var e=Rje,r=Nje,n=Ope,i=Ppe,a=null;function s(){var o,l=Fpe.call(arguments),u=e.apply(this,l),h=r.apply(this,l);if(a||(a=o=bO()),t(a,+n.apply(this,(l[0]=u,l)),+i.apply(this,l),+n.apply(this,(l[0]=h,l)),+i.apply(this,l)),o)return a=null,o+""||null}return s.source=function(o){return arguments.length?(e=o,s):e},s.target=function(o){return arguments.length?(r=o,s):r},s.x=function(o){return arguments.length?(n=typeof o=="function"?o:wO(+o),s):n},s.y=function(o){return arguments.length?(i=typeof o=="function"?o:wO(+o),s):i},s.context=function(o){return arguments.length?(a=o??null,s):a},s}function Mje(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function kO(){return Ije(Mje)}var $pe=F(()=>{Mpe();zpe();Dpe();Bpe()});var Gpe=F(()=>{$pe()});function Dje(t){return[t.source.x1,t.y0]}function Oje(t){return[t.target.x0,t.y1]}function TO(){return kO().source(Dje).target(Oje)}var Upe=F(()=>{Gpe()});var Vpe=F(()=>{Rpe();gO();Upe()});var Hpe={};vr(Hpe,{diagram:()=>Kje});var EO,dE,gE,mE,pE,Pje,Bje,Fje,zje,$je,Gje,Uje,Vje,Wje,Wpe,Hje,qje,Yje,Xje,jje,Kje,qpe=F(()=>{or();lr();Vpe();EO=function(){var t=v(function(o,l,u,h){for(u=u||{},h=o.length;h--;u[o[h]]=l);return u},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:v(function(l,u,h,f,d,p,g){var m=p.length-1;switch(d){case 7:let y=f.findOrCreateNode(p[m-4].trim().replaceAll('""','"')),x=f.findOrCreateNode(p[m-2].trim().replaceAll('""','"')),b=parseFloat(p[m].trim());f.addLink(y,x,b);break;case 8:case 9:case 11:this.$=p[m];break;case 10:this.$=p[m-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:v(function(l,u){if(u.recoverable)this.trace(l);else{var h=new Error(l);throw h.hash=u,h}},"parseError"),parse:v(function(l){var u=this,h=[0],f=[],d=[null],p=[],g=this.table,m="",y=0,x=0,b=0,w=2,_=1,k=p.slice.call(arguments,1),E=Object.create(this.lexer),L={yy:{}};for(var S in this.yy)Object.prototype.hasOwnProperty.call(this.yy,S)&&(L.yy[S]=this.yy[S]);E.setInput(l,L.yy),L.yy.lexer=E,L.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var C=E.yylloc;p.push(C);var M=E.options&&E.options.ranges;typeof L.yy.parseError=="function"?this.parseError=L.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function R(oe){h.length=h.length-2*oe,d.length=d.length-oe,p.length=p.length-oe}v(R,"popStack");function T(){var oe;return oe=f.pop()||E.lex()||_,typeof oe!="number"&&(oe instanceof Array&&(f=oe,oe=f.pop()),oe=u.symbols_[oe]||oe),oe}v(T,"lex");for(var I,A,D,N,O,B,P={},$,z,H,J;;){if(D=h[h.length-1],this.defaultActions[D]?N=this.defaultActions[D]:((I===null||typeof I>"u")&&(I=T()),N=g[D]&&g[D][I]),typeof N>"u"||!N.length||!N[0]){var X="";J=[];for($ in g[D])this.terminals_[$]&&$>w&&J.push("'"+this.terminals_[$]+"'");E.showPosition?X="Parse error on line "+(y+1)+`: `+E.showPosition()+` Expecting `+J.join(", ")+", got '"+(this.terminals_[I]||I)+"'":X="Parse error on line "+(y+1)+": Unexpected "+(I==_?"end of input":"'"+(this.terminals_[I]||I)+"'"),this.parseError(X,{text:E.match,token:this.terminals_[I]||I,line:E.yylineno,loc:C,expected:J})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+D+", token: "+I);switch(N[0]){case 1:h.push(I),d.push(E.yytext),p.push(E.yylloc),h.push(N[1]),I=null,A?(I=A,A=null):(x=E.yyleng,m=E.yytext,y=E.yylineno,C=E.yylloc,b>0&&b--);break;case 2:if(z=this.productions_[N[1]][1],P.$=d[d.length-z],P._$={first_line:p[p.length-(z||1)].first_line,last_line:p[p.length-1].last_line,first_column:p[p.length-(z||1)].first_column,last_column:p[p.length-1].last_column},M&&(P._$.range=[p[p.length-(z||1)].range[0],p[p.length-1].range[1]]),B=this.performAction.apply(P,[m,x,y,L.yy,N[1],d,p].concat(k)),typeof B<"u")return B;z&&(h=h.slice(0,-1*z*2),d=d.slice(0,-1*z),p=p.slice(0,-1*z)),h.push(this.productions_[N[1]][0]),d.push(P.$),p.push(P._$),H=g[h[h.length-2]][h[h.length-1]],h.push(H);break;case 3:return!0}}return!0},"parse")},a=function(){var o={EOF:1,parseError:v(function(u,h){if(this.yy.parser)this.yy.parser.parseError(u,h);else throw new Error(u)},"parseError"),setInput:v(function(l,u){return this.yy=u||this.yy||{},this._input=l,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var l=this._input[0];this.yytext+=l,this.yyleng++,this.offset++,this.match+=l,this.matched+=l;var u=l.match(/(?:\r\n?|\n).*/g);return u?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),l},"input"),unput:v(function(l){var u=l.length,h=l.split(/(?:\r\n?|\n)/g);this._input=l+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-u),this.offset-=u;var f=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),h.length-1&&(this.yylineno-=h.length-1);var d=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:h?(h.length===f.length?this.yylloc.first_column:0)+f[f.length-h.length].length-h[0].length:this.yylloc.first_column-u},this.options.ranges&&(this.yylloc.range=[d[0],d[0]+this.yyleng-u]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(l){this.unput(this.match.slice(l))},"less"),pastInput:v(function(){var l=this.matched.substr(0,this.matched.length-this.match.length);return(l.length>20?"...":"")+l.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var l=this.match;return l.length<20&&(l+=this._input.substr(0,20-l.length)),(l.substr(0,20)+(l.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var l=this.pastInput(),u=new Array(l.length+1).join("-");return l+this.upcomingInput()+` `+u+"^"},"showPosition"),test_match:v(function(l,u){var h,f,d;if(this.options.backtrack_lexer&&(d={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(d.yylloc.range=this.yylloc.range.slice(0))),f=l[0].match(/(?:\r\n?|\n).*/g),f&&(this.yylineno+=f.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:f?f[f.length-1].length-f[f.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+l[0].length},this.yytext+=l[0],this.match+=l[0],this.matches=l,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(l[0].length),this.matched+=l[0],h=this.performAction.call(this,this.yy,this,u,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),h)return h;if(this._backtrack){for(var p in d)this[p]=d[p];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var l,u,h,f;this._more||(this.yytext="",this.match="");for(var d=this._currentRules(),p=0;pu[0].length)){if(u=h,f=p,this.options.backtrack_lexer){if(l=this.test_match(h,d[p]),l!==!1)return l;if(this._backtrack){u=!1;continue}else return!1}else if(!this.options.flex)break}return u?(l=this.test_match(u,d[f]),l!==!1?l:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var u=this.next();return u||this.lex()},"lex"),begin:v(function(u){this.conditionStack.push(u)},"begin"),popState:v(function(){var u=this.conditionStack.length-1;return u>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(u){return u=this.conditionStack.length-1-Math.abs(u||0),u>=0?this.conditionStack[u]:"INITIAL"},"topState"),pushState:v(function(u){this.begin(u)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:v(function(u,h,f,d){var p=d;switch(f){case 0:return this.pushState("csv"),4;break;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;break;case 5:return 20;case 6:return this.popState("escaped_text"),18;break;case 7:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return o}();i.lexer=a;function s(){this.yy={}}return v(s,"Parser"),s.prototype=i,i.Parser=s,new s}();EO.parser=EO;dE=EO,gE=[],mE=[],pE=new Map,Pje=v(()=>{gE=[],mE=[],pE=new Map,xr()},"clear"),Bje=class{constructor(t,e,r=0){this.source=t,this.target=e,this.value=r}static{v(this,"SankeyLink")}},Fje=v((t,e,r)=>{gE.push(new Bje(t,e,r))},"addLink"),zje=class{constructor(t){this.ID=t}static{v(this,"SankeyNode")}},$je=v(t=>{t=Xe.sanitizeText(t,pe());let e=pE.get(t);return e===void 0&&(e=new zje(t),pE.set(t,e),mE.push(e)),e},"findOrCreateNode"),Gje=v(()=>mE,"getNodes"),Uje=v(()=>gE,"getLinks"),Vje=v(()=>({nodes:mE.map(t=>({id:t.ID})),links:gE.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),Wje={nodesMap:pE,getConfig:v(()=>pe().sankey,"getConfig"),getNodes:Gje,getLinks:Uje,getGraph:Vje,addLink:Fje,findOrCreateNode:$je,getAccTitle:_r,setAccTitle:Tr,getAccDescription:Rr,setAccDescription:Lr,getDiagramTitle:qr,setDiagramTitle:tn,clear:Pje},Wpe=class SO{static{v(this,"Uid")}static{this.count=0}static next(e){return new SO(e+ ++SO.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}},Hje={left:fO,right:dO,center:pO,justify:Xx},qje=v(function(t,e,r,n){let{securityLevel:i,sankey:a}=pe(),s=Vb.sankey,o;i==="sandbox"&&(o=Ve("#i"+e));let l=i==="sandbox"?Ve(o.nodes()[0].contentDocument.body):Ve("body"),u=i==="sandbox"?l.select(`[id="${e}"]`):Ve(`[id="${e}"]`),h=a?.width??s.width,f=a?.height??s.width,d=a?.useMaxWidth??s.useMaxWidth,p=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,m=a?.suffix??s.suffix,y=a?.showValues??s.showValues,x=n.db.getGraph(),b=Hje[p];fE().nodeId(M=>M.id).nodeWidth(10).nodePadding(10+(y?15:0)).nodeAlign(b).extent([[0,0],[h,f]])(x);let k=du(a8);u.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",M=>(M.uid=Wpe.next("node-")).id).attr("transform",function(M){return"translate("+M.x0+","+M.y0+")"}).attr("x",M=>M.x0).attr("y",M=>M.y0).append("rect").attr("height",M=>M.y1-M.y0).attr("width",M=>M.x1-M.x0).attr("fill",M=>k(M.id));let E=v(({id:M,value:R})=>y?`${M} ${g}${Math.round(R*100)/100}${m}`:M,"getText");u.append("g").attr("class","node-labels").attr("font-family","sans-serif").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",M=>M.x0(M.y1+M.y0)/2).attr("dy",`${y?"0":"0.35"}em`).attr("text-anchor",M=>M.x0(R.uid=Wpe.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",R=>R.source.x1).attr("x2",R=>R.target.x0);M.append("stop").attr("offset","0%").attr("stop-color",R=>k(R.source.id)),M.append("stop").attr("offset","100%").attr("stop-color",R=>k(R.target.id))}let C;switch(S){case"gradient":C=v(M=>M.uid,"coloring");break;case"source":C=v(M=>k(M.source.id),"coloring");break;case"target":C=v(M=>k(M.target.id),"coloring");break;default:C=S}L.append("path").attr("d",TO()).attr("stroke",C).attr("stroke-width",M=>Math.max(1,M.width)),il(void 0,u,0,d)},"draw"),Yje={draw:qje},Xje=v(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` `).trim(),"prepareTextForParsing"),jje=dE.parse.bind(dE);dE.parse=t=>jje(Xje(t));Kje={parser:dE,db:Wje,renderer:Yje}});var Xpe={};vr(Xpe,{diagram:()=>hKe});var Ype,CO,Zje,Qje,Jje,eKe,tKe,h1,rKe,nKe,iKe,aKe,sKe,oKe,lKe,cKe,uKe,hKe,jpe=F(()=>{ky();kn();Iu();or();km();Ype={packet:[]},CO=structuredClone(Ype),Zje=sr.packet,Qje=v(()=>{let t=ws({...Zje,...Or().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),Jje=v(()=>CO.packet,"getPacket"),eKe=v(t=>{t.length>0&&CO.packet.push(t)},"pushWord"),tKe=v(()=>{xr(),CO=structuredClone(Ype)},"clear"),h1={pushWord:eKe,getPacket:Jje,getConfig:Qje,clear:tKe,setAccTitle:Tr,getAccTitle:_r,setDiagramTitle:tn,getDiagramTitle:qr,getAccDescription:Rr,setAccDescription:Lr},rKe=1e4,nKe=v(t=>{Pu(t,h1);let e=-1,r=[],n=1,{bitsPerRow:i}=h1.getConfig();for(let{start:a,end:s,label:o}of t.blocks){if(s&&s{if(t.end===void 0&&(t.end=t.start),t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);return t.end+1<=e*r?[t,void 0]:[{start:t.start,end:e*r-1,label:t.label},{start:e*r,end:t.end,label:t.label}]},"getNextFittingBlock"),aKe={parse:v(async t=>{let e=await Nl("packet",t);re.debug(e),nKe(e)},"parse")},sKe=v((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:o,bitWidth:l,bitsPerRow:u}=a,h=i.getPacket(),f=i.getDiagramTitle(),d=s+o,p=d*(h.length+1)-(f?0:s),g=l*u+2,m=La(e);m.attr("viewbox",`0 0 ${g} ${p}`),Hr(m,p,g,a.useMaxWidth);for(let[y,x]of h.entries())oKe(m,x,y,a);m.append("text").text(f).attr("x",g/2).attr("y",p-d/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),oKe=v((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:o,showBits:l})=>{let u=t.append("g"),h=r*(n+a)+a;for(let f of e){let d=f.start%o*s+1,p=(f.end-f.start+1)*s-i;if(u.append("rect").attr("x",d).attr("y",h).attr("width",p).attr("height",n).attr("class","packetBlock"),u.append("text").attr("x",d+p/2).attr("y",h+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(f.label),!l)continue;let g=f.end===f.start,m=h-2;u.append("text").attr("x",d+(g?p/2:0)).attr("y",m).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(f.start),g||u.append("text").attr("x",d+p).attr("y",m).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(f.end)}},"drawWord"),lKe={draw:sKe},cKe={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},uKe=v(({packet:t}={})=>{let e=ws(cKe,t);return` .packetByte { font-size: ${e.byteFontSize}; } .packetByte.start { fill: ${e.startByteColor}; } .packetByte.end { fill: ${e.endByteColor}; } .packetLabel { fill: ${e.labelColor}; font-size: ${e.labelFontSize}; } .packetTitle { fill: ${e.titleColor}; font-size: ${e.titleFontSize}; } .packetBlock { stroke: ${e.blockStrokeColor}; stroke-width: ${e.blockStrokeWidth}; fill: ${e.blockFillColor}; } `},"styles"),hKe={parser:aKe,db:h1,renderer:lKe,styles:uKe}});var Sge={};vr(Sge,{diagram:()=>PZe});function oge(t){switch(re.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return re.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function lge(t){switch(re.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function cge(t){switch(t.trim()){case"--x":return"arrow_cross";case"--o":return"arrow_circle";default:return"arrow_point"}}function uge(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function bE(t,e,r=0,n=0){re.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"sieblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let p of t.children)bE(p,e);let s=qKe(t);i=s.width,a=s.height,re.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let p of t.children)p.size&&(re.debug(`abc95 Setting size of children of ${t.id} id=${p.id} ${i} ${a} ${JSON.stringify(p.size)}`),p.size.width=i*(p.widthInColumns??1)+fi*((p.widthInColumns??1)-1),p.size.height=a,p.size.x=0,p.size.y=0,re.debug(`abc95 updating size of ${t.id} children child:${p.id} maxWidth:${i} maxHeight:${a}`));for(let p of t.children)bE(p,e,i,a);let o=t.columns??-1,l=0;for(let p of t.children)l+=p.widthInColumns??1;let u=t.children.length;o>0&&o0?Math.min(t.children.length,o):t.children.length;if(p>0){let g=(f-p*fi-fi)/p;re.debug("abc95 (growing to fit) width",t.id,f,t.size?.width,g);for(let m of t.children)m.size&&(m.size.width=g)}}t.size={width:f,height:d,x:0,y:0}}re.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function DO(t,e){re.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(re.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*fi;re.debug("widthOfChildren 88",i,"posX");let a=0;re.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-fi,o=0;for(let l of t.children){let u=t;if(!l.size)continue;let{width:h,height:f}=l.size,{px:d,py:p}=uge(r,a);if(p!=o&&(o=p,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-fi,re.debug("New row in layout for block",t.id," and child ",l.id,o)),re.debug(`abc89 layout blocks (child) id: ${l.id} Pos: ${a} (px, py) ${d},${p} (${u?.size?.x},${u?.size?.y}) parent: ${u.id} width: ${h}${fi}`),u.size){let g=h/2;l.size.x=s+fi+g,re.debug(`abc91 layout blocks (calc) px, pyid:${l.id} startingPos=X${s} new startingPosX${l.size.x} ${g} padding=${fi} width=${h} halfWidth=${g} => x:${l.size.x} y:${l.size.y} ${l.widthInColumns} (width * (child?.w || 1)) / 2 ${h*(l?.widthInColumns??1)/2}`),s=l.size.x+g,l.size.y=u.size.y-u.size.height/2+p*(f+fi)+f/2+fi,re.debug(`abc88 layout blocks (calc) px, pyid:${l.id}startingPosX${s}${fi}${g}=>x:${l.size.x}y:${l.size.y}${l.widthInColumns}(width * (child?.w || 1)) / 2${h*(l?.widthInColumns??1)/2}`)}l.children&&DO(l,e),a+=l?.widthInColumns??1,re.debug("abc88 columnsPos",l,a)}}re.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function OO(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:o,height:l}=t.size;a-o/2n&&(n=a+o/2),s+l/2>i&&(i=s+l/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=OO(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function hge(t){let e=t.getBlock("root");if(!e)return;bE(e,t,0,0),DO(e,t),re.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=OO(e),s=a-n,o=i-r;return{x:r,y:n,width:o,height:s}}function LO(t,e){e&&t.attr("style",e)}function fge(t){let e=Ve(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label,i=t.isNode?"nodeLabel":"edgeLabel",a=r.append("span");return a.html(n),LO(a,t.labelStyle),a.attr("class",i),LO(r,t.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}function jx(t,e){pe().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function dge(t,e){return t.intersect(e)}function pge(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,o=a-n.y,l=Math.sqrt(e*e*o*o+r*r*s*s),u=Math.abs(e*r*s/l);n.x0}function yge(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),o=Math.min(o,g.y)}):(s=Math.min(s,e.x),o=Math.min(o,e.y));for(var l=n-t.width/2-s,u=i-t.height/2-o,h=0;h1&&a.sort(function(g,m){var y=g.x-r.x,x=g.y-r.y,b=Math.sqrt(y*y+x*x),w=m.x-r.x,_=m.y-r.y,k=Math.sqrt(w*w+_*_);return b{i.push(o,0)},"addBorder"),s=v(o=>{i.push(0,o)},"skipBorder");e.includes("t")?(re.debug("add top border"),a(r)):s(r),e.includes("r")?(re.debug("add right border"),a(n)):s(n),e.includes("b")?(re.debug("add bottom border"),a(r)):s(r),e.includes("l")?(re.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}function PO(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",o;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",o=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let l=G3(n?.styles??[]),u=n.label,h=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:l.labelStyle,shape:s,labelText:u,rx:a,ry:a,class:i,style:l.style,id:n.id,directions:n.directions,width:h.width,height:h.height,x:h.x,y:h.y,positioned:r,intersect:void 0,type:n.type,padding:o??Or()?.block?.padding??0}}async function bge(t,e,r){let n=PO(e,r,!1);if(n.type==="group")return;let i=Or(),a=await xge(t,n,{config:i}),s=a.node().getBBox(),o=r.getBlock(n.id);o.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(o),a.remove()}async function wge(t,e,r){let n=PO(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=Or();await xge(t,n,{config:a}),e.intersect=n?.intersect,IZe(n)}}async function kE(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await kE(t,i.children,r,n)}async function kge(t,e,r){await kE(t,e,r,bge)}async function Tge(t,e,r){await kE(t,e,r,wge)}async function Ege(t,e,r,n,i){let a=new Sr({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let o=n.getBlock(s.start),l=n.getBlock(s.end);if(o?.size&&l?.size){let u=o.size,h=l.size,f=[{x:u.x,y:u.y},{x:u.x+(h.x-u.x)/2,y:u.y+(h.y-u.y)/2},{x:h.x,y:h.y}];eZe(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:f,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await KKe(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:f,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),ZKe({...s,x:f[1].x,y:f[1].y},{originalPath:f}))}}}var AO,fKe,$l,IO,_O,Kpe,Zpe,dKe,age,pKe,xE,gKe,mKe,vKe,yKe,sge,MO,Kx,xKe,Qpe,bKe,wKe,kKe,TKe,EKe,SKe,CKe,AKe,_Ke,LKe,RKe,NKe,vE,IKe,MKe,DKe,OKe,PKe,BKe,FKe,zKe,$Ke,GKe,UKe,VKe,WKe,HKe,fi,qKe,YKe,tl,XKe,jKe,Jpe,RO,Ba,KKe,ZKe,QKe,JKe,ege,eZe,tZe,rZe,nZe,gge,iZe,aZe,sZe,oZe,lZe,$n,Ki,ai,cZe,uZe,tge,ho,rge,hZe,fZe,dZe,pZe,gZe,mZe,vZe,yZe,xZe,bZe,wZe,kZe,TZe,EZe,SZe,CZe,AZe,_Ze,LZe,nge,RZe,NZe,ige,yE,xge,IZe,MZe,DZe,OZe,PZe,Cge=F(()=>{pc();bo();Ya();kn();or();a_();go();lr();As();lr();lr();lr();lr();AO=function(){var t=v(function(w,_,k,E){for(k=k||{},E=w.length;E--;k[w[E]]=_);return k},"o"),e=[1,7],r=[1,13],n=[1,14],i=[1,15],a=[1,19],s=[1,16],o=[1,17],l=[1,18],u=[8,30],h=[8,21,28,29,30,31,32,40,44,47],f=[1,23],d=[1,24],p=[8,15,16,21,28,29,30,31,32,40,44,47],g=[8,15,16,21,27,28,29,30,31,32,40,44,47],m=[1,49],y={trace:v(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,block:31,NODE_ID:32,nodeShapeNLabel:33,dirList:34,DIR:35,NODE_DSTART:36,NODE_DEND:37,BLOCK_ARROW_START:38,BLOCK_ARROW_END:39,classDef:40,CLASSDEF_ID:41,CLASSDEF_STYLEOPTS:42,DEFAULT:43,class:44,CLASSENTITY_IDS:45,STYLECLASS:46,style:47,STYLE_ENTITY_IDS:48,STYLE_DEFINITION_DATA:49,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"block",32:"NODE_ID",35:"DIR",36:"NODE_DSTART",37:"NODE_DEND",38:"BLOCK_ARROW_START",39:"BLOCK_ARROW_END",40:"classDef",41:"CLASSDEF_ID",42:"CLASSDEF_STYLEOPTS",43:"DEFAULT",44:"class",45:"CLASSENTITY_IDS",46:"STYLECLASS",47:"style",48:"STYLE_ENTITY_IDS",49:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[34,1],[34,2],[33,3],[33,4],[23,3],[23,3],[24,3],[25,3]],performAction:v(function(_,k,E,L,S,C,M){var R=C.length-1;switch(S){case 4:L.getLogger().debug("Rule: separator (NL) ");break;case 5:L.getLogger().debug("Rule: separator (Space) ");break;case 6:L.getLogger().debug("Rule: separator (EOF) ");break;case 7:L.getLogger().debug("Rule: hierarchy: ",C[R-1]),L.setHierarchy(C[R-1]);break;case 8:L.getLogger().debug("Stop NL ");break;case 9:L.getLogger().debug("Stop EOF ");break;case 10:L.getLogger().debug("Stop NL2 ");break;case 11:L.getLogger().debug("Stop EOF2 ");break;case 12:L.getLogger().debug("Rule: statement: ",C[R]),typeof C[R].length=="number"?this.$=C[R]:this.$=[C[R]];break;case 13:L.getLogger().debug("Rule: statement #2: ",C[R-1]),this.$=[C[R-1]].concat(C[R]);break;case 14:L.getLogger().debug("Rule: link: ",C[R],_),this.$={edgeTypeStr:C[R],label:""};break;case 15:L.getLogger().debug("Rule: LABEL link: ",C[R-3],C[R-1],C[R]),this.$={edgeTypeStr:C[R],label:C[R-1]};break;case 18:let T=parseInt(C[R]),I=L.generateId();this.$={id:I,type:"space",label:"",width:T,children:[]};break;case 23:L.getLogger().debug("Rule: (nodeStatement link node) ",C[R-2],C[R-1],C[R]," typestr: ",C[R-1].edgeTypeStr);let A=L.edgeStrToEdgeData(C[R-1].edgeTypeStr);this.$=[{id:C[R-2].id,label:C[R-2].label,type:C[R-2].type,directions:C[R-2].directions},{id:C[R-2].id+"-"+C[R].id,start:C[R-2].id,end:C[R].id,label:C[R-1].label,type:"edge",directions:C[R].directions,arrowTypeEnd:A,arrowTypeStart:"arrow_open"},{id:C[R].id,label:C[R].label,type:L.typeStr2Type(C[R].typeStr),directions:C[R].directions}];break;case 24:L.getLogger().debug("Rule: nodeStatement (abc88 node size) ",C[R-1],C[R]),this.$={id:C[R-1].id,label:C[R-1].label,type:L.typeStr2Type(C[R-1].typeStr),directions:C[R-1].directions,widthInColumns:parseInt(C[R],10)};break;case 25:L.getLogger().debug("Rule: nodeStatement (node) ",C[R]),this.$={id:C[R].id,label:C[R].label,type:L.typeStr2Type(C[R].typeStr),directions:C[R].directions,widthInColumns:1};break;case 26:L.getLogger().debug("APA123",this?this:"na"),L.getLogger().debug("COLUMNS: ",C[R]),this.$={type:"column-setting",columns:C[R]==="auto"?-1:parseInt(C[R])};break;case 27:L.getLogger().debug("Rule: id-block statement : ",C[R-2],C[R-1]);let D=L.generateId();this.$={...C[R-2],type:"composite",children:C[R-1]};break;case 28:L.getLogger().debug("Rule: blockStatement : ",C[R-2],C[R-1],C[R]);let N=L.generateId();this.$={id:N,type:"composite",label:"",children:C[R-1]};break;case 29:L.getLogger().debug("Rule: node (NODE_ID separator): ",C[R]),this.$={id:C[R]};break;case 30:L.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",C[R-1],C[R]),this.$={id:C[R-1],label:C[R].label,typeStr:C[R].typeStr,directions:C[R].directions};break;case 31:L.getLogger().debug("Rule: dirList: ",C[R]),this.$=[C[R]];break;case 32:L.getLogger().debug("Rule: dirList: ",C[R-1],C[R]),this.$=[C[R-1]].concat(C[R]);break;case 33:L.getLogger().debug("Rule: nodeShapeNLabel: ",C[R-2],C[R-1],C[R]),this.$={typeStr:C[R-2]+C[R],label:C[R-1]};break;case 34:L.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",C[R-3],C[R-2]," #3:",C[R-1],C[R]),this.$={typeStr:C[R-3]+C[R],label:C[R-2],directions:C[R-1]};break;case 35:case 36:this.$={type:"classDef",id:C[R-1].trim(),css:C[R].trim()};break;case 37:this.$={type:"applyClass",id:C[R-1].trim(),styleClass:C[R].trim()};break;case 38:this.$={type:"applyStyles",id:C[R-1].trim(),stylesStr:C[R].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{11:3,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:o,47:l},{8:[1,20]},t(u,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,21:e,28:r,29:n,31:i,32:a,40:s,44:o,47:l}),t(h,[2,16],{14:22,15:f,16:d}),t(h,[2,17]),t(h,[2,18]),t(h,[2,19]),t(h,[2,20]),t(h,[2,21]),t(h,[2,22]),t(p,[2,25],{27:[1,25]}),t(h,[2,26]),{19:26,26:12,32:a},{11:27,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:o,47:l},{41:[1,28],43:[1,29]},{45:[1,30]},{48:[1,31]},t(g,[2,29],{33:32,36:[1,33],38:[1,34]}),{1:[2,7]},t(u,[2,13]),{26:35,32:a},{32:[2,14]},{17:[1,36]},t(p,[2,24]),{11:37,13:4,14:22,15:f,16:d,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:o,47:l},{30:[1,38]},{42:[1,39]},{42:[1,40]},{46:[1,41]},{49:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(p,[2,23]),{18:[1,45]},{30:[1,46]},t(h,[2,28]),t(h,[2,35]),t(h,[2,36]),t(h,[2,37]),t(h,[2,38]),{37:[1,47]},{34:48,35:m},{15:[1,50]},t(h,[2,27]),t(g,[2,33]),{39:[1,51]},{34:52,35:m,39:[2,31]},{32:[2,15]},t(g,[2,34]),{39:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:v(function(_,k){if(k.recoverable)this.trace(_);else{var E=new Error(_);throw E.hash=k,E}},"parseError"),parse:v(function(_){var k=this,E=[0],L=[],S=[null],C=[],M=this.table,R="",T=0,I=0,A=0,D=2,N=1,O=C.slice.call(arguments,1),B=Object.create(this.lexer),P={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(P.yy[$]=this.yy[$]);B.setInput(_,P.yy),P.yy.lexer=B,P.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var z=B.yylloc;C.push(z);var H=B.options&&B.options.ranges;typeof P.yy.parseError=="function"?this.parseError=P.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function J(ae){E.length=E.length-2*ae,S.length=S.length-ae,C.length=C.length-ae}v(J,"popStack");function X(){var ae;return ae=L.pop()||B.lex()||N,typeof ae!="number"&&(ae instanceof Array&&(L=ae,ae=L.pop()),ae=k.symbols_[ae]||ae),ae}v(X,"lex");for(var oe,K,ee,Q,W,Y,Z={},se,ce,ue,te;;){if(ee=E[E.length-1],this.defaultActions[ee]?Q=this.defaultActions[ee]:((oe===null||typeof oe>"u")&&(oe=X()),Q=M[ee]&&M[ee][oe]),typeof Q>"u"||!Q.length||!Q[0]){var Ne="";te=[];for(se in M[ee])this.terminals_[se]&&se>D&&te.push("'"+this.terminals_[se]+"'");B.showPosition?Ne="Parse error on line "+(T+1)+`: `+B.showPosition()+` Expecting `+te.join(", ")+", got '"+(this.terminals_[oe]||oe)+"'":Ne="Parse error on line "+(T+1)+": Unexpected "+(oe==N?"end of input":"'"+(this.terminals_[oe]||oe)+"'"),this.parseError(Ne,{text:B.match,token:this.terminals_[oe]||oe,line:B.yylineno,loc:z,expected:te})}if(Q[0]instanceof Array&&Q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ee+", token: "+oe);switch(Q[0]){case 1:E.push(oe),S.push(B.yytext),C.push(B.yylloc),E.push(Q[1]),oe=null,K?(oe=K,K=null):(I=B.yyleng,R=B.yytext,T=B.yylineno,z=B.yylloc,A>0&&A--);break;case 2:if(ce=this.productions_[Q[1]][1],Z.$=S[S.length-ce],Z._$={first_line:C[C.length-(ce||1)].first_line,last_line:C[C.length-1].last_line,first_column:C[C.length-(ce||1)].first_column,last_column:C[C.length-1].last_column},H&&(Z._$.range=[C[C.length-(ce||1)].range[0],C[C.length-1].range[1]]),Y=this.performAction.apply(Z,[R,I,T,P.yy,Q[1],S,C].concat(O)),typeof Y<"u")return Y;ce&&(E=E.slice(0,-1*ce*2),S=S.slice(0,-1*ce),C=C.slice(0,-1*ce)),E.push(this.productions_[Q[1]][0]),S.push(Z.$),C.push(Z._$),ue=M[E[E.length-2]][E[E.length-1]],E.push(ue);break;case 3:return!0}}return!0},"parse")},x=function(){var w={EOF:1,parseError:v(function(k,E){if(this.yy.parser)this.yy.parser.parseError(k,E);else throw new Error(k)},"parseError"),setInput:v(function(_,k){return this.yy=k||this.yy||{},this._input=_,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:v(function(){var _=this._input[0];this.yytext+=_,this.yyleng++,this.offset++,this.match+=_,this.matched+=_;var k=_.match(/(?:\r\n?|\n).*/g);return k?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),_},"input"),unput:v(function(_){var k=_.length,E=_.split(/(?:\r\n?|\n)/g);this._input=_+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-k),this.offset-=k;var L=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),E.length-1&&(this.yylineno-=E.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:E?(E.length===L.length?this.yylloc.first_column:0)+L[L.length-E.length].length-E[0].length:this.yylloc.first_column-k},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-k]),this.yyleng=this.yytext.length,this},"unput"),more:v(function(){return this._more=!0,this},"more"),reject:v(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:v(function(_){this.unput(this.match.slice(_))},"less"),pastInput:v(function(){var _=this.matched.substr(0,this.matched.length-this.match.length);return(_.length>20?"...":"")+_.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:v(function(){var _=this.match;return _.length<20&&(_+=this._input.substr(0,20-_.length)),(_.substr(0,20)+(_.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:v(function(){var _=this.pastInput(),k=new Array(_.length+1).join("-");return _+this.upcomingInput()+` `+k+"^"},"showPosition"),test_match:v(function(_,k){var E,L,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),L=_[0].match(/(?:\r\n?|\n).*/g),L&&(this.yylineno+=L.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:L?L[L.length-1].length-L[L.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+_[0].length},this.yytext+=_[0],this.match+=_[0],this.matches=_,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(_[0].length),this.matched+=_[0],E=this.performAction.call(this,this.yy,this,k,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),E)return E;if(this._backtrack){for(var C in S)this[C]=S[C];return!1}return!1},"test_match"),next:v(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var _,k,E,L;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),C=0;Ck[0].length)){if(k=E,L=C,this.options.backtrack_lexer){if(_=this.test_match(E,S[C]),_!==!1)return _;if(this._backtrack){k=!1;continue}else return!1}else if(!this.options.flex)break}return k?(_=this.test_match(k,S[L]),_!==!1?_:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:v(function(){var k=this.next();return k||this.lex()},"lex"),begin:v(function(k){this.conditionStack.push(k)},"begin"),popState:v(function(){var k=this.conditionStack.length-1;return k>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:v(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:v(function(k){return k=this.conditionStack.length-1-Math.abs(k||0),k>=0?this.conditionStack[k]:"INITIAL"},"topState"),pushState:v(function(k){this.begin(k)},"pushState"),stateStackSize:v(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:v(function(k,E,L,S){var C=S;switch(L){case 0:return 10;case 1:return k.getLogger().debug("Found space-block"),31;break;case 2:return k.getLogger().debug("Found nl-block"),31;break;case 3:return k.getLogger().debug("Found space-block"),29;break;case 4:k.getLogger().debug(".",E.yytext);break;case 5:k.getLogger().debug("_",E.yytext);break;case 6:return 5;case 7:return E.yytext=-1,28;break;case 8:return E.yytext=E.yytext.replace(/columns\s+/,""),k.getLogger().debug("COLUMNS (LEX)",E.yytext),28;break;case 9:this.pushState("md_string");break;case 10:return"MD_STR";case 11:this.popState();break;case 12:this.pushState("string");break;case 13:k.getLogger().debug("LEX: POPPING STR:",E.yytext),this.popState();break;case 14:return k.getLogger().debug("LEX: STR end:",E.yytext),"STR";break;case 15:return E.yytext=E.yytext.replace(/space\:/,""),k.getLogger().debug("SPACE NUM (LEX)",E.yytext),21;break;case 16:return E.yytext="1",k.getLogger().debug("COLUMNS (LEX)",E.yytext),21;break;case 17:return 43;case 18:return"LINKSTYLE";case 19:return"INTERPOLATE";case 20:return this.pushState("CLASSDEF"),40;break;case 21:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 22:return this.popState(),this.pushState("CLASSDEFID"),41;break;case 23:return this.popState(),42;break;case 24:return this.pushState("CLASS"),44;break;case 25:return this.popState(),this.pushState("CLASS_STYLE"),45;break;case 26:return this.popState(),46;break;case 27:return this.pushState("STYLE_STMNT"),47;break;case 28:return this.popState(),this.pushState("STYLE_DEFINITION"),48;break;case 29:return this.popState(),49;break;case 30:return this.pushState("acc_title"),"acc_title";break;case 31:return this.popState(),"acc_title_value";break;case 32:return this.pushState("acc_descr"),"acc_descr";break;case 33:return this.popState(),"acc_descr_value";break;case 34:this.pushState("acc_descr_multiline");break;case 35:this.popState();break;case 36:return"acc_descr_multiline_value";case 37:return 30;case 38:return this.popState(),k.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),k.getLogger().debug("Lex: (("),"NODE_DEND";break;case 40:return this.popState(),k.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 41:return this.popState(),k.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),k.getLogger().debug("Lex: (("),"NODE_DEND";break;case 43:return this.popState(),k.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 44:return this.popState(),k.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 45:return this.popState(),k.getLogger().debug("Lex: (("),"NODE_DEND";break;case 46:return this.popState(),k.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 47:return this.popState(),k.getLogger().debug("Lex: ("),"NODE_DEND";break;case 48:return this.popState(),k.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 49:return this.popState(),k.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),k.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 51:return this.popState(),k.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 52:return this.popState(),k.getLogger().debug("Lex: )"),"NODE_DEND";break;case 53:return this.popState(),k.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 54:return this.popState(),k.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 55:return k.getLogger().debug("Lexa: -)"),this.pushState("NODE"),36;break;case 56:return k.getLogger().debug("Lexa: (-"),this.pushState("NODE"),36;break;case 57:return k.getLogger().debug("Lexa: ))"),this.pushState("NODE"),36;break;case 58:return k.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 59:return k.getLogger().debug("Lex: ((("),this.pushState("NODE"),36;break;case 60:return k.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 61:return k.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 62:return k.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 63:return k.getLogger().debug("Lexc: >"),this.pushState("NODE"),36;break;case 64:return k.getLogger().debug("Lexa: (["),this.pushState("NODE"),36;break;case 65:return k.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 66:return this.pushState("NODE"),36;break;case 67:return this.pushState("NODE"),36;break;case 68:return this.pushState("NODE"),36;break;case 69:return this.pushState("NODE"),36;break;case 70:return this.pushState("NODE"),36;break;case 71:return this.pushState("NODE"),36;break;case 72:return this.pushState("NODE"),36;break;case 73:return k.getLogger().debug("Lexa: ["),this.pushState("NODE"),36;break;case 74:return this.pushState("BLOCK_ARROW"),k.getLogger().debug("LEX ARR START"),38;break;case 75:return k.getLogger().debug("Lex: NODE_ID",E.yytext),32;break;case 76:return k.getLogger().debug("Lex: EOF",E.yytext),8;break;case 77:this.pushState("md_string");break;case 78:this.pushState("md_string");break;case 79:return"NODE_DESCR";case 80:this.popState();break;case 81:k.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 82:k.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 83:return k.getLogger().debug("LEX: NODE_DESCR:",E.yytext),"NODE_DESCR";break;case 84:k.getLogger().debug("LEX POPPING"),this.popState();break;case 85:k.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 86:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (right): dir:",E.yytext),"DIR";break;case 87:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (left):",E.yytext),"DIR";break;case 88:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (x):",E.yytext),"DIR";break;case 89:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (y):",E.yytext),"DIR";break;case 90:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (up):",E.yytext),"DIR";break;case 91:return E.yytext=E.yytext.replace(/^,\s*/,""),k.getLogger().debug("Lex (down):",E.yytext),"DIR";break;case 92:return E.yytext="]>",k.getLogger().debug("Lex (ARROW_DIR end):",E.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 93:return k.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 94:return k.getLogger().debug("Lex: LINK",E.yytext),15;break;case 95:return k.getLogger().debug("Lex: LINK",E.yytext),15;break;case 96:return k.getLogger().debug("Lex: LINK",E.yytext),15;break;case 97:return k.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 98:return k.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 99:return k.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 100:this.pushState("md_string");break;case 101:return k.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 102:return this.popState(),k.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 103:return this.popState(),k.getLogger().debug("Lex: LINK",E.yytext),15;break;case 104:return this.popState(),k.getLogger().debug("Lex: LINK",E.yytext),15;break;case 105:return k.getLogger().debug("Lex: COLON",E.yytext),E.yytext=E.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block\s+)/,/^(?:block\n+)/,/^(?:block:)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[29],inclusive:!1},STYLE_STMNT:{rules:[28],inclusive:!1},CLASSDEFID:{rules:[23],inclusive:!1},CLASSDEF:{rules:[21,22],inclusive:!1},CLASS_STYLE:{rules:[26],inclusive:!1},CLASS:{rules:[25],inclusive:!1},LLABEL:{rules:[100,101,102,103,104],inclusive:!1},ARROW_DIR:{rules:[86,87,88,89,90,91,92],inclusive:!1},BLOCK_ARROW:{rules:[77,82,85],inclusive:!1},NODE:{rules:[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,78,81],inclusive:!1},md_string:{rules:[10,11,79,80],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[13,14,83,84],inclusive:!1},acc_descr_multiline:{rules:[35,36],inclusive:!1},acc_descr:{rules:[33],inclusive:!1},acc_title:{rules:[31],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,12,15,16,17,18,19,20,24,27,30,32,34,37,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,93,94,95,96,97,98,99,105],inclusive:!0}}};return w}();y.lexer=x;function b(){this.yy={}}return v(b,"Parser"),b.prototype=y,y.Parser=b,new b}();AO.parser=AO;fKe=AO,$l=new Map,IO=[],_O=new Map,Kpe="color",Zpe="fill",dKe="bgFill",age=",",pKe=pe(),xE=new Map,gKe=v(t=>Xe.sanitizeText(t,pKe),"sanitizeText"),mKe=v(function(t,e=""){let r=xE.get(t);r||(r={id:t,styles:[],textStyles:[]},xE.set(t,r)),e?.split(age).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(Kpe).exec(n)){let s=i.replace(Zpe,dKe).replace(Kpe,Zpe);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),vKe=v(function(t,e=""){let r=$l.get(t);e!=null&&(r.styles=e.split(age))},"addStyle2Node"),yKe=v(function(t,e){t.split(",").forEach(function(r){let n=$l.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},$l.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),sge=v((t,e)=>{let r=t.flat(),n=[];for(let i of r){if(i.label&&(i.label=gKe(i.label)),i.type==="classDef"){mKe(i.id,i.css);continue}if(i.type==="applyClass"){yKe(i.id,i?.styleClass??"");continue}if(i.type==="applyStyles"){i?.stylesStr&&vKe(i.id,i?.stylesStr);continue}if(i.type==="column-setting")e.columns=i.columns??-1;else if(i.type==="edge"){let a=(_O.get(i.id)??0)+1;_O.set(i.id,a),i.id=a+"-"+i.id,IO.push(i)}else{i.label||(i.type==="composite"?i.label="":i.label=i.id);let a=$l.get(i.id);if(a===void 0?$l.set(i.id,i):(i.type!=="na"&&(a.type=i.type),i.label!==i.id&&(a.label=i.label)),i.children&&sge(i.children,i),i.type==="space"){let s=i.width??1;for(let o=0;o{re.debug("Clear called"),xr(),Kx={id:"root",type:"composite",children:[],columns:-1},$l=new Map([["root",Kx]]),MO=[],xE=new Map,IO=[],_O=new Map},"clear");v(oge,"typeStr2Type");v(lge,"edgeTypeStr2Type");v(cge,"edgeStrToEdgeData");Qpe=0,bKe=v(()=>(Qpe++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Qpe),"generateId"),wKe=v(t=>{Kx.children=t,sge(t,Kx),MO=Kx.children},"setHierarchy"),kKe=v(t=>{let e=$l.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),TKe=v(()=>[...$l.values()],"getBlocksFlat"),EKe=v(()=>MO||[],"getBlocks"),SKe=v(()=>IO,"getEdges"),CKe=v(t=>$l.get(t),"getBlock"),AKe=v(t=>{$l.set(t.id,t)},"setBlock"),_Ke=v(()=>console,"getLogger"),LKe=v(function(){return xE},"getClasses"),RKe={getConfig:v(()=>Or().block,"getConfig"),typeStr2Type:oge,edgeTypeStr2Type:lge,edgeStrToEdgeData:cge,getLogger:_Ke,getBlocksFlat:TKe,getBlocks:EKe,getEdges:SKe,setHierarchy:wKe,getBlock:CKe,setBlock:AKe,getColumns:kKe,getClasses:LKe,clear:xKe,generateId:bKe},NKe=RKe,vE=v((t,e)=>{let r=S1,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return $s(n,i,a,e)},"fade"),IKe=v(t=>`.label { font-family: ${t.fontFamily}; color: ${t.nodeTextColor||t.textColor}; } .cluster-label text { fill: ${t.titleColor}; } .cluster-label span,p { color: ${t.titleColor}; } .label text,span,p { fill: ${t.nodeTextColor||t.textColor}; color: ${t.nodeTextColor||t.textColor}; } .node rect, .node circle, .node ellipse, .node polygon, .node path { fill: ${t.mainBkg}; stroke: ${t.nodeBorder}; stroke-width: 1px; } .flowchart-label text { text-anchor: middle; } // .flowchart-label .text-outer-tspan { // text-anchor: middle; // } // .flowchart-label .text-inner-tspan { // text-anchor: start; // } .node .label { text-align: center; } .node.clickable { cursor: pointer; } .arrowheadPath { fill: ${t.arrowheadColor}; } .edgePath .path { stroke: ${t.lineColor}; stroke-width: 2.0px; } .flowchart-link { stroke: ${t.lineColor}; fill: none; } .edgeLabel { background-color: ${t.edgeLabelBackground}; rect { opacity: 0.5; background-color: ${t.edgeLabelBackground}; fill: ${t.edgeLabelBackground}; } text-align: center; } /* For html labels only */ .labelBkg { background-color: ${vE(t.edgeLabelBackground,.5)}; // background-color: } .node .cluster { // fill: ${vE(t.mainBkg,.5)}; fill: ${vE(t.clusterBkg,.5)}; stroke: ${vE(t.clusterBorder,.2)}; box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; stroke-width: 1px; } .cluster text { fill: ${t.titleColor}; } .cluster span,p { color: ${t.titleColor}; } /* .cluster div { color: ${t.titleColor}; } */ div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: ${t.fontFamily}; font-size: 12px; background: ${t.tertiaryColor}; border: 1px solid ${t.border2}; border-radius: 2px; pointer-events: none; z-index: 100; } .flowchartTitleText { text-anchor: middle; font-size: 18px; fill: ${t.textColor}; } `,"getStyles"),MKe=IKe,DKe=v((t,e,r,n)=>{e.forEach(i=>{WKe[i](t,r,n)})},"insertMarkers"),OKe=v((t,e,r)=>{re.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),PKe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),BKe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),FKe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),zKe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),$Ke=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),GKe=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),UKe=v((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),VKe=v((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),WKe={extension:OKe,composition:PKe,aggregation:BKe,dependency:FKe,lollipop:zKe,point:$Ke,circle:GKe,cross:UKe,barb:VKe},HKe=DKe,fi=pe()?.block?.padding??8;v(uge,"calculateBlockPosition");qKe=v(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:o}=n.size??{width:0,height:0,x:0,y:0};re.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",o,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");v(bE,"setBlockSizes");v(DO,"layoutBlocks");v(OO,"findBounds");v(hge,"layout");v(LO,"applyStyle");v(fge,"addHtmlLabel");YKe=v((t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),Wr(pe().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),re.debug("vertexText"+i);let a={isNode:n,label:Z3(Xs(i)),labelStyle:e.replace("fill:","color:")};return fge(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let o of s){let l=document.createElementNS("http://www.w3.org/2000/svg","tspan");l.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),l.setAttribute("dy","1em"),l.setAttribute("x","0"),r?l.setAttribute("class","title-row"):l.setAttribute("class","row"),l.textContent=o.trim(),a.appendChild(l)}return a}},"createLabel"),tl=YKe,XKe=v((t,e,r,n,i)=>{e.arrowTypeStart&&Jpe(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&Jpe(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),jKe={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},Jpe=v((t,e,r,n,i,a)=>{let s=jKe[r];if(!s){re.warn(`Unknown arrow type: ${r}`);return}let o=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${o})`)},"addEdgeMarker"),RO={},Ba={},KKe=v((t,e)=>{let r=pe(),n=Wr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?oa(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):tl(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let o=i.getBBox();if(n){let u=i.children[0],h=Ve(i);o=u.getBoundingClientRect(),h.attr("width",o.width),h.attr("height",o.height)}s.attr("transform","translate("+-o.width/2+", "+-o.height/2+")"),RO[e.id]=a,e.width=o.width,e.height=o.height;let l;if(e.startLabelLeft){let u=tl(e.startLabelLeft,e.labelStyle),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),Ba[e.id]||(Ba[e.id]={}),Ba[e.id].startLeft=h,jx(l,e.startLabelLeft)}if(e.startLabelRight){let u=tl(e.startLabelRight,e.labelStyle),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=h.node().appendChild(u),f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),Ba[e.id]||(Ba[e.id]={}),Ba[e.id].startRight=h,jx(l,e.startLabelRight)}if(e.endLabelLeft){let u=tl(e.endLabelLeft,e.labelStyle),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),Ba[e.id]||(Ba[e.id]={}),Ba[e.id].endLeft=h,jx(l,e.endLabelLeft)}if(e.endLabelRight){let u=tl(e.endLabelRight,e.labelStyle),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),Ba[e.id]||(Ba[e.id]={}),Ba[e.id].endRight=h,jx(l,e.endLabelRight)}return i},"insertEdgeLabel");v(jx,"setTerminalWidth");ZKe=v((t,e)=>{re.debug("Moving label abc88 ",t.id,t.label,RO[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=pe(),{subGraphTitleTotalMargin:i}=ou(n);if(t.label){let a=RO[t.id],s=t.x,o=t.y;if(r){let l=Ut.calcLabelPosition(r);re.debug("Moving label "+t.label+" from (",s,",",o,") to (",l.x,",",l.y,") abc88"),e.updatedPath&&(s=l.x,o=l.y)}a.attr("transform",`translate(${s}, ${o+i/2})`)}if(t.startLabelLeft){let a=Ba[t.id].startLeft,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.startLabelRight){let a=Ba[t.id].startRight,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.endLabelLeft){let a=Ba[t.id].endLeft,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}if(t.endLabelRight){let a=Ba[t.id].endRight,s=t.x,o=t.y;if(r){let l=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=l.x,o=l.y}a.attr("transform",`translate(${s}, ${o})`)}},"positionEdgeLabel"),QKe=v((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,o=t.height/2;return i>=s||a>=o},"outsideNode"),JKe=v((t,e,r)=>{re.debug(`intersection calc abc89: outsidePoint: ${JSON.stringify(e)} insidePoint : ${JSON.stringify(r)} node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,o=r.xMath.abs(n-e.x)*l){let f=r.y{re.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!QKe(e,a)&&!i){let s=JKe(e,n,a),o=!1;r.forEach(l=>{o=o||l.x===s.x&&l.y===s.y}),r.some(l=>l.x===s.x&&l.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),eZe=v(function(t,e,r,n,i,a,s){let o=r.points;re.debug("abc88 InsertEdge: edge=",r,"e=",e);let l=!1,u=a.node(e.v);var h=a.node(e.w);h?.intersect&&u?.intersect&&(o=o.slice(1,r.points.length-1),o.unshift(u.intersect(o[0])),o.push(h.intersect(o[o.length-1]))),r.toCluster&&(re.debug("to cluster abc88",n[r.toCluster]),o=ege(r.points,n[r.toCluster].node),l=!0),r.fromCluster&&(re.debug("from cluster abc88",n[r.fromCluster]),o=ege(o.reverse(),n[r.fromCluster].node).reverse(),l=!0);let f=o.filter(_=>!Number.isNaN(_.y)),d=gl;r.curve&&(i==="graph"||i==="flowchart")&&(d=r.curve);let{x:p,y:g}=c5(r),m=ms().x(p).y(g).curve(d),y;switch(r.thickness){case"normal":y="edge-thickness-normal";break;case"thick":y="edge-thickness-thick";break;case"invisible":y="edge-thickness-thick";break;default:y=""}switch(r.pattern){case"solid":y+=" edge-pattern-solid";break;case"dotted":y+=" edge-pattern-dotted";break;case"dashed":y+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",m(f)).attr("id",r.id).attr("class"," "+y+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(pe().flowchart.arrowMarkerAbsolute||pe().state.arrowMarkerAbsolute)&&(b=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,b=b.replace(/\(/g,"\\("),b=b.replace(/\)/g,"\\)")),XKe(x,r,b,s,i);let w={};return l&&(w.updatedPath=o),w.originalPath=r.points,w},"insertEdge"),tZe=v(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),rZe=v((t,e,r)=>{let n=tZe(t),i=2,a=e.height+2*r.padding,s=a/i,o=e.width+2*s+r.padding,l=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:o/2,y:2*l},{x:o-s,y:0},{x:o,y:0},{x:o,y:-a/3},{x:o+2*l,y:-a/2},{x:o,y:-2*a/3},{x:o,y:-a},{x:o-s,y:-a},{x:o/2,y:-a-2*l},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*l,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:o-s,y:0},{x:o,y:-a/2},{x:o-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:o-s,y:-a},{x:o,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:o,y:-s},{x:o,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:o,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:o,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-l},{x:o-s,y:-l},{x:o-s,y:0},{x:o,y:-a/2},{x:o-s,y:-a},{x:o-s,y:-a+l},{x:s,y:-a+l},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:o/2,y:0},{x:0,y:-l},{x:s,y:-l},{x:s,y:-a+l},{x:0,y:-a+l},{x:o/2,y:-a},{x:o,y:-a+l},{x:o-s,y:-a+l},{x:o-s,y:-l},{x:o,y:-l}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:o,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:o,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:o,y:0},{x:0,y:-s},{x:o,y:-a}]:n.has("left")&&n.has("down")?[{x:o,y:0},{x:0,y:0},{x:o,y:-a}]:n.has("right")?[{x:s,y:-l},{x:s,y:-l},{x:o-s,y:-l},{x:o-s,y:0},{x:o,y:-a/2},{x:o-s,y:-a},{x:o-s,y:-a+l},{x:s,y:-a+l},{x:s,y:-a+l}]:n.has("left")?[{x:s,y:0},{x:s,y:-l},{x:o-s,y:-l},{x:o-s,y:-a+l},{x:s,y:-a+l},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-l},{x:s,y:-a+l},{x:0,y:-a+l},{x:o/2,y:-a},{x:o,y:-a+l},{x:o-s,y:-a+l},{x:o-s,y:-l}]:n.has("down")?[{x:o/2,y:0},{x:0,y:-l},{x:s,y:-l},{x:s,y:-a+l},{x:o-s,y:-a+l},{x:o-s,y:-l},{x:o,y:-l}]:[{x:0,y:0}]},"getArrowPoints");v(dge,"intersectNode");nZe=dge;v(pge,"intersectEllipse");gge=pge;v(mge,"intersectCircle");iZe=mge;v(vge,"intersectLine");v(NO,"sameSign");aZe=vge,sZe=yge;v(yge,"intersectPolygon");oZe=v((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,o=t.height/2,l,u;return Math.abs(a)*s>Math.abs(i)*o?(a<0&&(o=-o),l=a===0?0:o*i/a,u=o):(i<0&&(s=-s),l=s,u=i===0?0:s*a/i),{x:r+l,y:n+u}},"intersectRect"),lZe=oZe,$n={node:nZe,circle:iZe,ellipse:gge,polygon:sZe,rect:lZe},Ki=v(async(t,e,r,n)=>{let i=pe(),a,s=e.useHtmlLabels||Wr(i.flowchart.htmlLabels);r?a=r:a="node default";let o=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=o.insert("g").attr("class","label").attr("style",e.labelStyle),u;e.labelText===void 0?u="":u=typeof e.labelText=="string"?e.labelText:e.labelText[0];let h=l.node(),f;e.labelType==="markdown"?f=oa(l,yr(Xs(u),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):f=h.appendChild(tl(yr(Xs(u),i),e.labelStyle,!1,n));let d=f.getBBox(),p=e.padding/2;if(Wr(i.flowchart.htmlLabels)){let g=f.children[0],m=Ve(f),y=g.getElementsByTagName("img");if(y){let x=u.replace(/]*>/g,"").trim()==="";await Promise.all([...y].map(b=>new Promise(w=>{function _(){if(b.style.display="flex",b.style.flexDirection="column",x){let k=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,L=parseInt(k,10)*5+"px";b.style.minWidth=L,b.style.maxWidth=L}else b.style.width="100%";w(b)}v(_,"setupImage"),setTimeout(()=>{b.complete&&_()}),b.addEventListener("error",_),b.addEventListener("load",_)})))}d=g.getBoundingClientRect(),m.attr("width",d.width),m.attr("height",d.height)}return s?l.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"):l.attr("transform","translate(0, "+-d.height/2+")"),e.centerLabel&&l.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),l.insert("rect",":first-child"),{shapeSvg:o,bbox:d,halfPadding:p,label:l}},"labelHelper"),ai=v((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");v(Gl,"insertPolygonShape");cZe=v(async(t,e)=>{e.useHtmlLabels||pe().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Ki(t,e,"node "+e.classes,!0);re.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),ai(e,s),e.intersect=function(o){return $n.rect(e,o)},n},"note"),uZe=cZe,tge=v(t=>t?" "+t:"","formatClass"),ho=v((t,e)=>`${e||"node default"}${tge(t.classes)} ${tge(t.class)}`,"getClassesFromNode"),rge=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,o=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];re.info("Question main (Circle)");let l=Gl(r,s,s,o);return l.attr("style",e.style),ai(e,l),e.intersect=function(u){return re.warn("Intersect called"),$n.polygon(e,o,u)},r},"question"),hZe=v((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return $n.circle(e,14,s)},r},"choice"),fZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,o=n.width+2*s+e.padding,l=[{x:s,y:0},{x:o-s,y:0},{x:o,y:-a/2},{x:o-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],u=Gl(r,o,a,l);return u.attr("style",e.style),ai(e,u),e.intersect=function(h){return $n.polygon(e,l,h)},r},"hexagon"),dZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,o=n.width+2*s+e.padding,l=rZe(e.directions,n,e),u=Gl(r,o,a,l);return u.attr("style",e.style),ai(e,u),e.intersect=function(h){return $n.polygon(e,l,h)},r},"block_arrow"),pZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Gl(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(l){return $n.polygon(e,s,l)},r},"rect_left_inv_arrow"),gZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"lean_right"),mZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"lean_left"),vZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"trapezoid"),yZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"inv_trapezoid"),xZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"rect_right_inv_arrow"),bZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),o=n.height+s+e.padding,l="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+o+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-o,u=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",l).attr("transform","translate("+-i/2+","+-(o/2+s)+")");return ai(e,u),e.intersect=function(h){let f=$n.rect(e,h),d=f.x-e.x;if(a!=0&&(Math.abs(d)e.height/2-s)){let p=s*s*(1-d*d/(a*a));p!=0&&(p=Math.sqrt(p)),p=s-p,h.y-e.y>0&&(p=-p),f.y+=p}return f},r},"cylinder"),wZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ki(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,o=e.positioned?e.height:n.height+e.padding,l=e.positioned?-s/2:-n.width/2-i,u=e.positioned?-o/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",l).attr("y",u).attr("width",s).attr("height",o),e.props){let h=new Set(Object.keys(e.props));e.props.borders&&(wE(a,e.props.borders,s,o),h.delete("borders")),h.forEach(f=>{re.warn(`Unknown node property ${f}`)})}return ai(e,a),e.intersect=function(h){return $n.rect(e,h)},r},"rect"),kZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ki(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,o=e.positioned?e.height:n.height+e.padding,l=e.positioned?-s/2:-n.width/2-i,u=e.positioned?-o/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",l).attr("y",u).attr("width",s).attr("height",o),e.props){let h=new Set(Object.keys(e.props));e.props.borders&&(wE(a,e.props.borders,s,o),h.delete("borders")),h.forEach(f=>{re.warn(`Unknown node property ${f}`)})}return ai(e,a),e.intersect=function(h){return $n.rect(e,h)},r},"composite"),TZe=v(async(t,e)=>{let{shapeSvg:r}=await Ki(t,e,"label",!0);re.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(wE(n,e.props.borders,i,a),s.delete("borders")),s.forEach(o=>{re.warn(`Unknown node property ${o}`)})}return ai(e,n),e.intersect=function(s){return $n.rect(e,s)},r},"labelRect");v(wE,"applyNodePropertyBorders");EZe=v((t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),o=e.labelText.flat?e.labelText.flat():e.labelText,l="";typeof o=="object"?l=o[0]:l=o,re.info("Label text abc79",l,o,typeof o=="object");let u=s.node().appendChild(tl(l,e.labelStyle,!0,!0)),h={width:0,height:0};if(Wr(pe().flowchart.htmlLabels)){let m=u.children[0],y=Ve(u);h=m.getBoundingClientRect(),y.attr("width",h.width),y.attr("height",h.height)}re.info("Text 2",o);let f=o.slice(1,o.length),d=u.getBBox(),p=s.node().appendChild(tl(f.join?f.join("
    "):f,e.labelStyle,!0,!0));if(Wr(pe().flowchart.htmlLabels)){let m=p.children[0],y=Ve(p);h=m.getBoundingClientRect(),y.attr("width",h.width),y.attr("height",h.height)}let g=e.padding/2;return Ve(p).attr("transform","translate( "+(h.width>d.width?0:(d.width-h.width)/2)+", "+(d.height+g+5)+")"),Ve(u).attr("transform","translate( "+(h.width{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return ai(e,s),e.intersect=function(o){return $n.rect(e,o)},r},"stadium"),CZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ki(t,e,ho(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),re.info("Circle main"),ai(e,a),e.intersect=function(s){return re.info("Circle intersect",e,n.width/2+i,s),$n.circle(e,n.width/2+i,s)},r},"circle"),AZe=v(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ki(t,e,ho(e,void 0),!0),a=5,s=r.insert("g",":first-child"),o=s.insert("circle"),l=s.insert("circle");return s.attr("class",e.class),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),re.info("DoubleCircle main"),ai(e,o),e.intersect=function(u){return re.info("DoubleCircle intersect",e,n.width/2+i+a,u),$n.circle(e,n.width/2+i+a,u)},r},"doublecircle"),_Ze=v(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ki(t,e,ho(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],o=Gl(r,i,a,s);return o.attr("style",e.style),ai(e,o),e.intersect=function(l){return $n.polygon(e,s,l)},r},"subroutine"),LZe=v((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),ai(e,n),e.intersect=function(i){return $n.circle(e,7,i)},r},"start"),nge=v((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return ai(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(o){return $n.rect(e,o)},n},"forkJoin"),RZe=v((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),ai(e,i),e.intersect=function(a){return $n.circle(e,7,a)},r},"end"),NZe=v((t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),o=s.insert("rect",":first-child"),l=s.insert("line"),u=s.insert("line"),h=0,f=n,d=s.insert("g").attr("class","label"),p=0,g=e.classData.annotations?.[0],m=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",y=d.node().appendChild(tl(m,e.labelStyle,!0,!0)),x=y.getBBox();if(Wr(pe().flowchart.htmlLabels)){let S=y.children[0],C=Ve(y);x=S.getBoundingClientRect(),C.attr("width",x.width),C.attr("height",x.height)}e.classData.annotations[0]&&(f+=x.height+n,h+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(pe().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let w=d.node().appendChild(tl(b,e.labelStyle,!0,!0));Ve(w).attr("class","classTitle");let _=w.getBBox();if(Wr(pe().flowchart.htmlLabels)){let S=w.children[0],C=Ve(w);_=S.getBoundingClientRect(),C.attr("width",_.width),C.attr("height",_.height)}f+=_.height+n,_.width>h&&(h=_.width);let k=[];e.classData.members.forEach(S=>{let C=S.getDisplayDetails(),M=C.displayText;pe().flowchart.htmlLabels&&(M=M.replace(//g,">"));let R=d.node().appendChild(tl(M,C.cssStyle?C.cssStyle:e.labelStyle,!0,!0)),T=R.getBBox();if(Wr(pe().flowchart.htmlLabels)){let I=R.children[0],A=Ve(R);T=I.getBoundingClientRect(),A.attr("width",T.width),A.attr("height",T.height)}T.width>h&&(h=T.width),f+=T.height+n,k.push(R)}),f+=i;let E=[];if(e.classData.methods.forEach(S=>{let C=S.getDisplayDetails(),M=C.displayText;pe().flowchart.htmlLabels&&(M=M.replace(//g,">"));let R=d.node().appendChild(tl(M,C.cssStyle?C.cssStyle:e.labelStyle,!0,!0)),T=R.getBBox();if(Wr(pe().flowchart.htmlLabels)){let I=R.children[0],A=Ve(R);T=I.getBoundingClientRect(),A.attr("width",T.width),A.attr("height",T.height)}T.width>h&&(h=T.width),f+=T.height+n,E.push(R)}),f+=i,g){let S=(h-x.width)/2;Ve(y).attr("transform","translate( "+(-1*h/2+S)+", "+-1*f/2+")"),p=x.height+n}let L=(h-_.width)/2;return Ve(w).attr("transform","translate( "+(-1*h/2+L)+", "+(-1*f/2+p)+")"),p+=_.height+n,l.attr("class","divider").attr("x1",-h/2-r).attr("x2",h/2+r).attr("y1",-f/2-r+i+p).attr("y2",-f/2-r+i+p),p+=i,k.forEach(S=>{Ve(S).attr("transform","translate( "+-h/2+", "+(-1*f/2+p+i/2)+")");let C=S?.getBBox();p+=(C?.height??0)+n}),p+=i,u.attr("class","divider").attr("x1",-h/2-r).attr("x2",h/2+r).attr("y1",-f/2-r+i+p).attr("y2",-f/2-r+i+p),p+=i,E.forEach(S=>{Ve(S).attr("transform","translate( "+-h/2+", "+(-1*f/2+p)+")");let C=S?.getBBox();p+=(C?.height??0)+n}),o.attr("style",e.style).attr("class","outer title-state").attr("x",-h/2-r).attr("y",-(f/2)-r).attr("width",h+e.padding).attr("height",f+e.padding),ai(e,o),e.intersect=function(S){return $n.rect(e,S)},s},"class_box"),ige={rhombus:rge,composite:kZe,question:rge,rect:wZe,labelRect:TZe,rectWithTitle:EZe,choice:hZe,circle:CZe,doublecircle:AZe,stadium:SZe,hexagon:fZe,block_arrow:dZe,rect_left_inv_arrow:pZe,lean_right:gZe,lean_left:mZe,trapezoid:vZe,inv_trapezoid:yZe,rect_right_inv_arrow:xZe,cylinder:bZe,start:LZe,end:RZe,note:uZe,subroutine:_Ze,fork:nge,join:nge,class_box:NZe},yE={},xge=v(async(t,e,r)=>{let n,i;if(e.link){let a;pe().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await ige[e.shape](n,e,r)}else i=await ige[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),yE[e.id]=n,e.haveCallback&&yE[e.id].attr("class",yE[e.id].attr("class")+" clickable"),n},"insertNode"),IZe=v(t=>{let e=yE[t.id];re.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode");v(PO,"getNodeFromBlock");v(bge,"calculateBlockSize");v(wge,"insertBlockPositioned");v(kE,"performOperations");v(kge,"calculateBlockSizes");v(Tge,"insertBlocks");v(Ege,"insertEdges");MZe=v(function(t,e){return e.db.getClasses()},"getClasses"),DZe=v(async function(t,e,r,n){let{securityLevel:i,block:a}=Or(),s=n.db,o;i==="sandbox"&&(o=Ve("#i"+e));let l=i==="sandbox"?Ve(o.nodes()[0].contentDocument.body):Ve("body"),u=i==="sandbox"?l.select(`[id="${e}"]`):Ve(`[id="${e}"]`);HKe(u,["point","circle","cross"],n.type,e);let f=s.getBlocks(),d=s.getBlocksFlat(),p=s.getEdges(),g=u.insert("g").attr("class","block");await kge(g,f,s);let m=hge(s);if(await Tge(g,f,s),await Ege(g,p,d,s,e),m){let y=m,x=Math.max(1,Math.round(.125*(y.width/y.height))),b=y.height+x+10,w=y.width+10,{useMaxWidth:_}=a;Hr(u,b,w,!!_),re.debug("Here Bounds",m,y),u.attr("viewBox",`${y.x-5} ${y.y-5} ${y.width+10} ${y.height+10}`)}},"draw"),OZe={draw:DZe,getClasses:MZe},PZe={parser:fKe,db:NKe,renderer:OZe,styles:MKe}});var FO=di((Zx,BO)=>{(function(e,r){typeof Zx=="object"&&typeof BO=="object"?BO.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Zx=="object"?Zx.layoutBase=r():e.layoutBase=r()})(Zx,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)}([function(t,e,r){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(l,u,h){n.call(this,h),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=h,this.bendpoints=[],this.source=l,this.target=u}s.prototype=Object.create(n.prototype);for(var o in n)s[o]=n[o];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(l){if(this.source===l)return this.target;if(this.target===l)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(l,u){for(var h=this.getOtherEnd(l),f=u.getGraphManager().getRoot();;){if(h.getOwner()==u)return h;if(h.getOwner()==f)break;h=h.getOwner().getParent()}return null},s.prototype.updateLength=function(){var l=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),l),this.isOverlapingSourceAndTarget||(this.lengthX=l[0]-l[2],this.lengthY=l[1]-l[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),o=r(16),l=r(5);function u(f,d,p,g){p==null&&g==null&&(g=d),n.call(this,g),f.graphManager!=null&&(f=f.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=f,p!=null&&d!=null?this.rect=new a(d.x,d.y,p.width,p.height):this.rect=new a}u.prototype=Object.create(n.prototype);for(var h in n)u[h]=n[h];u.prototype.getEdges=function(){return this.edges},u.prototype.getChild=function(){return this.child},u.prototype.getOwner=function(){return this.owner},u.prototype.getWidth=function(){return this.rect.width},u.prototype.setWidth=function(f){this.rect.width=f},u.prototype.getHeight=function(){return this.rect.height},u.prototype.setHeight=function(f){this.rect.height=f},u.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},u.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},u.prototype.getCenter=function(){return new l(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},u.prototype.getLocation=function(){return new l(this.rect.x,this.rect.y)},u.prototype.getRect=function(){return this.rect},u.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},u.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},u.prototype.setRect=function(f,d){this.rect.x=f.x,this.rect.y=f.y,this.rect.width=d.width,this.rect.height=d.height},u.prototype.setCenter=function(f,d){this.rect.x=f-this.rect.width/2,this.rect.y=d-this.rect.height/2},u.prototype.setLocation=function(f,d){this.rect.x=f,this.rect.y=d},u.prototype.moveBy=function(f,d){this.rect.x+=f,this.rect.y+=d},u.prototype.getEdgeListToNode=function(f){var d=[],p,g=this;return g.edges.forEach(function(m){if(m.target==f){if(m.source!=g)throw"Incorrect edge source!";d.push(m)}}),d},u.prototype.getEdgesBetween=function(f){var d=[],p,g=this;return g.edges.forEach(function(m){if(!(m.source==g||m.target==g))throw"Incorrect edge source and/or target";(m.target==f||m.source==f)&&d.push(m)}),d},u.prototype.getNeighborsList=function(){var f=new Set,d=this;return d.edges.forEach(function(p){if(p.source==d)f.add(p.target);else{if(p.target!=d)throw"Incorrect incidency!";f.add(p.source)}}),f},u.prototype.withChildren=function(){var f=new Set,d,p;if(f.add(this),this.child!=null)for(var g=this.child.getNodes(),m=0;md?(this.rect.x-=(this.labelWidth-d)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(d+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(p+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>p?(this.rect.y-=(this.labelHeight-p)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(p+this.labelHeight))}}},u.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},u.prototype.transform=function(f){var d=this.rect.x;d>s.WORLD_BOUNDARY?d=s.WORLD_BOUNDARY:d<-s.WORLD_BOUNDARY&&(d=-s.WORLD_BOUNDARY);var p=this.rect.y;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var g=new l(d,p),m=f.inverseTransformPoint(g);this.setLocation(m.x,m.y)},u.prototype.getLeft=function(){return this.rect.x},u.prototype.getRight=function(){return this.rect.x+this.rect.width},u.prototype.getTop=function(){return this.rect.y},u.prototype.getBottom=function(){return this.rect.y+this.rect.height},u.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=u},function(t,e,r){"use strict";var n=r(0);function i(){}for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),o=r(3),l=r(1),u=r(13),h=r(12),f=r(11);function d(g,m,y){n.call(this,y),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,m!=null&&m instanceof s?this.graphManager=m:m!=null&&m instanceof Layout&&(this.graphManager=m.graphManager)}d.prototype=Object.create(n.prototype);for(var p in n)d[p]=n[p];d.prototype.getNodes=function(){return this.nodes},d.prototype.getEdges=function(){return this.edges},d.prototype.getGraphManager=function(){return this.graphManager},d.prototype.getParent=function(){return this.parent},d.prototype.getLeft=function(){return this.left},d.prototype.getRight=function(){return this.right},d.prototype.getTop=function(){return this.top},d.prototype.getBottom=function(){return this.bottom},d.prototype.isConnected=function(){return this.isConnected},d.prototype.add=function(g,m,y){if(m==null&&y==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(m)>-1&&this.getNodes().indexOf(y)>-1))throw"Source or target not in graph!";if(!(m.owner==y.owner&&m.owner==this))throw"Both owners must be this graph!";return m.owner!=y.owner?null:(b.source=m,b.target=y,b.isInterGraph=!1,this.getEdges().push(b),m.edges.push(b),y!=m&&y.edges.push(b),b)}},d.prototype.remove=function(g){var m=g;if(g instanceof o){if(m==null)throw"Node is null!";if(!(m.owner!=null&&m.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var y=m.edges.slice(),x,b=y.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(k,1),x.target!=x.source&&x.target.edges.splice(E,1);var _=x.source.owner.getEdges().indexOf(x);if(_==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(_,1)}},d.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,m=i.MAX_VALUE,y,x,b,w=this.getNodes(),_=w.length,k=0;k<_;k++){var E=w[k];y=E.getTop(),x=E.getLeft(),g>y&&(g=y),m>x&&(m=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=m-b,this.top=g-b,new h(this.left,this.top))},d.prototype.updateBounds=function(g){for(var m=i.MAX_VALUE,y=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,_,k,E,L,S=this.nodes,C=S.length,M=0;Mw&&(m=w),y<_&&(y=_),x>k&&(x=k),bw&&(m=w),y<_&&(y=_),x>k&&(x=k),b=this.nodes.length){var C=0;y.forEach(function(M){M.owner==g&&C++}),C==this.nodes.length&&(this.isConnected=!0)}},t.exports=d},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var s=this.layout.newGraph(),o=this.layout.newNode(null),l=this.add(s,o);return this.setRootGraph(l),this.rootGraph},a.prototype.add=function(s,o,l,u,h){if(l==null&&u==null&&h==null){if(s==null)throw"Graph is null!";if(o==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(o.child!=null)throw"Already has a child!";return s.parent=o,o.child=s,s}else{h=l,u=o,l=s;var f=u.getOwner(),d=h.getOwner();if(!(f!=null&&f.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(d!=null&&d.getGraphManager()==this))throw"Target not in this graph mgr!";if(f==d)return l.isInterGraph=!1,f.add(l,u,h);if(l.isInterGraph=!0,l.source=u,l.target=h,this.edges.indexOf(l)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(l),!(l.source!=null&&l.target!=null))throw"Edge source and/or target is null!";if(!(l.source.edges.indexOf(l)==-1&&l.target.edges.indexOf(l)==-1))throw"Edge already in source and/or target incidency list!";return l.source.edges.push(l),l.target.edges.push(l),l}},a.prototype.remove=function(s){if(s instanceof n){var o=s;if(o.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(o==this.rootGraph||o.parent!=null&&o.parent.graphManager==this))throw"Invalid parent node!";var l=[];l=l.concat(o.getEdges());for(var u,h=l.length,f=0;f=s.getRight()?o[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(o[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?o[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(o[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var h=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(h=1);var f=h*o[0],d=o[1]/h;o[0]f)return o[0]=l,o[1]=p,o[2]=h,o[3]=S,!1;if(uh)return o[0]=d,o[1]=u,o[2]=E,o[3]=f,!1;if(lh?(o[0]=m,o[1]=y,T=!0):(o[0]=g,o[1]=p,T=!0):A===N&&(l>h?(o[0]=d,o[1]=p,T=!0):(o[0]=x,o[1]=y,T=!0)),-D===N?h>l?(o[2]=L,o[3]=S,I=!0):(o[2]=E,o[3]=k,I=!0):D===N&&(h>l?(o[2]=_,o[3]=k,I=!0):(o[2]=C,o[3]=S,I=!0)),T&&I)return!1;if(l>h?u>f?(O=this.getCardinalDirection(A,N,4),B=this.getCardinalDirection(D,N,2)):(O=this.getCardinalDirection(-A,N,3),B=this.getCardinalDirection(-D,N,1)):u>f?(O=this.getCardinalDirection(-A,N,1),B=this.getCardinalDirection(-D,N,3)):(O=this.getCardinalDirection(A,N,2),B=this.getCardinalDirection(D,N,4)),!T)switch(O){case 1:$=p,P=l+-w/N,o[0]=P,o[1]=$;break;case 2:P=x,$=u+b*N,o[0]=P,o[1]=$;break;case 3:$=y,P=l+w/N,o[0]=P,o[1]=$;break;case 4:P=m,$=u+-b*N,o[0]=P,o[1]=$;break}if(!I)switch(B){case 1:H=k,z=h+-R/N,o[2]=z,o[3]=H;break;case 2:z=C,H=f+M*N,o[2]=z,o[3]=H;break;case 3:H=S,z=h+R/N,o[2]=z,o[3]=H;break;case 4:z=L,H=f+-M*N,o[2]=z,o[3]=H;break}}return!1},i.getCardinalDirection=function(a,s,o){return a>s?o:1+o%4},i.getIntersection=function(a,s,o,l){if(l==null)return this.getIntersection2(a,s,o);var u=a.x,h=a.y,f=s.x,d=s.y,p=o.x,g=o.y,m=l.x,y=l.y,x=void 0,b=void 0,w=void 0,_=void 0,k=void 0,E=void 0,L=void 0,S=void 0,C=void 0;return w=d-h,k=u-f,L=f*h-u*d,_=y-g,E=p-m,S=m*g-p*y,C=w*E-_*k,C===0?null:(x=(k*S-E*L)/C,b=(_*L-w*S)/C,new n(x,b))},i.angleOfVector=function(a,s,o,l){var u=void 0;return a!==o?(u=Math.atan((l-s)/(o-a)),o=0){var y=(-p+Math.sqrt(p*p-4*d*g))/(2*d),x=(-p-Math.sqrt(p*p-4*d*g))/(2*d),b=null;return y>=0&&y<=1?[y]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i},function(t,e,r){"use strict";function n(){}n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function u(h,f){for(var d=0;d"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(p){if(Array.isArray(p)){for(var g=0,m=Array(p.length);g0&&g;){for(w.push(k[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var L=E.getEdges(),x=0;x-1&&k.splice(R,1)}b=new Set,_=new Map}}return p},d.prototype.createDummyNodesForBendpoints=function(p){for(var g=[],m=p.source,y=this.graphManager.calcLowestCommonAncestor(p.source,p.target),x=0;x0){for(var y=this.edgeToDummyNodes.get(m),x=0;x=0&&g.splice(S,1);var C=_.getNeighborsList();C.forEach(function(T){if(m.indexOf(T)<0){var I=y.get(T),A=I-1;A==1&&E.push(T),y.set(T,A)}})}m=m.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},d.prototype.setGraphManager=function(p){this.graphManager=p},t.exports=d},function(t,e,r){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,o=this.lworldExtX;return o!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/o),s},i.prototype.transformY=function(a){var s=0,o=this.lworldExtY;return o!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/o),s},i.prototype.inverseTransformX=function(a){var s=0,o=this.ldeviceExtX;return o!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/o),s},i.prototype.inverseTransformY=function(a){var s=0,o=this.ldeviceExtY;return o!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/o),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(f){if(Array.isArray(f)){for(var d=0,p=Array(f.length);da.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(f-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(f>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(f-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},u.prototype.calcSpringForces=function(){for(var f=this.getAllEdges(),d,p=0;p0&&arguments[0]!==void 0?arguments[0]:!0,d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,p,g,m,y,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&f&&this.updateGrid(),b=new Set,p=0;pw||b>w)&&(f.gravitationForceX=-this.gravityConstant*m,f.gravitationForceY=-this.gravityConstant*y)):(w=d.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(f.gravitationForceX=-this.gravityConstant*m*this.compoundGravityConstant,f.gravitationForceY=-this.gravityConstant*y*this.compoundGravityConstant))},u.prototype.isConverged=function(){var f,d=!1;return this.totalIterations>this.maxIterations/3&&(d=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),f=this.totalDisplacement=x.length||w>=x[0].length)){for(var _=0;_u}}]),o}();t.exports=s},function(t,e,r){"use strict";function n(){}n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=function(ot){for(var et=[];ot-- >0;)et.push(0);return et}(Math.min(this.m+1,this.n)),this.U=function(ot){var et=function ht(bt){if(bt.length==0)return 0;for(var tt=[],_t=0;_t0;)et.push(0);return et}(this.n),o=function(ot){for(var et=[];ot-- >0;)et.push(0);return et}(this.m),l=!0,u=!0,h=Math.min(this.m-1,this.n),f=Math.max(0,Math.min(this.n-2,this.m)),d=0;d=0;N--)if(this.s[N]!==0){for(var O=N+1;O=0;X--){if(function(ot,et){return ot&&et}(X0;){var ue=void 0,te=void 0;for(ue=I-2;ue>=-1&&ue!==-1;ue--)if(Math.abs(s[ue])<=ce+se*(Math.abs(this.s[ue])+Math.abs(this.s[ue+1]))){s[ue]=0;break}if(ue===I-2)te=4;else{var Ne=void 0;for(Ne=I-1;Ne>=ue&&Ne!==ue;Ne--){var ae=(Ne!==I?Math.abs(s[Ne]):0)+(Ne!==ue+1?Math.abs(s[Ne-1]):0);if(Math.abs(this.s[Ne])<=ce+se*ae){this.s[Ne]=0;break}}Ne===ue?te=3:Ne===I-1?te=1:(te=2,ue=Ne)}switch(ue++,te){case 1:{var we=s[I-2];s[I-2]=0;for(var Ie=I-2;Ie>=ue;Ie--){var Ee=n.hypot(this.s[Ie],we),Oe=this.s[Ie]/Ee,De=we/Ee;if(this.s[Ie]=Ee,Ie!==ue&&(we=-De*s[Ie-1],s[Ie-1]=Oe*s[Ie-1]),u)for(var We=0;We=this.s[ue+1]);){var Ke=this.s[ue];if(this.s[ue]=this.s[ue+1],this.s[ue+1]=Ke,u&&ueMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n},function(t,e,r){"use strict";var n=function(){function s(o,l){for(var u=0;u2&&arguments[2]!==void 0?arguments[2]:1,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,f=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=o,this.sequence2=l,this.match_score=u,this.mismatch_penalty=h,this.gap_penalty=f,this.iMax=o.length+1,this.jMax=l.length+1,this.grid=new Array(this.iMax);for(var d=0;d=0;o--){var l=this.listeners[o];l.event===a&&l.callback===s&&this.listeners.splice(o,1)}},i.emit=function(a,s){for(var o=0;o{(function(e,r){typeof Qx=="object"&&typeof zO=="object"?zO.exports=r(FO()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof Qx=="object"?Qx.coseBase=r(FO()):e.coseBase=r(e.layoutBase)})(Qx,function(t){return(()=>{"use strict";var e={45:(a,s,o)=>{var l={};l.layoutBase=o(551),l.CoSEConstants=o(806),l.CoSEEdge=o(767),l.CoSEGraph=o(880),l.CoSEGraphManager=o(578),l.CoSELayout=o(765),l.CoSENode=o(991),l.ConstraintHandler=o(902),a.exports=l},806:(a,s,o)=>{var l=o(551).FDLayoutConstants;function u(){}for(var h in l)u[h]=l[h];u.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,u.DEFAULT_RADIAL_SEPARATION=l.DEFAULT_EDGE_LENGTH,u.DEFAULT_COMPONENT_SEPERATION=60,u.TILE=!0,u.TILING_PADDING_VERTICAL=10,u.TILING_PADDING_HORIZONTAL=10,u.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,u.ENFORCE_CONSTRAINTS=!0,u.APPLY_LAYOUT=!0,u.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,u.TREE_REDUCTION_ON_INCREMENTAL=!0,u.PURE_INCREMENTAL=u.DEFAULT_INCREMENTAL,a.exports=u},767:(a,s,o)=>{var l=o(551).FDLayoutEdge;function u(f,d,p){l.call(this,f,d,p)}u.prototype=Object.create(l.prototype);for(var h in l)u[h]=l[h];a.exports=u},880:(a,s,o)=>{var l=o(551).LGraph;function u(f,d,p){l.call(this,f,d,p)}u.prototype=Object.create(l.prototype);for(var h in l)u[h]=l[h];a.exports=u},578:(a,s,o)=>{var l=o(551).LGraphManager;function u(f){l.call(this,f)}u.prototype=Object.create(l.prototype);for(var h in l)u[h]=l[h];a.exports=u},765:(a,s,o)=>{var l=o(551).FDLayout,u=o(578),h=o(880),f=o(991),d=o(767),p=o(806),g=o(902),m=o(551).FDLayoutConstants,y=o(551).LayoutConstants,x=o(551).Point,b=o(551).PointD,w=o(551).DimensionD,_=o(551).Layout,k=o(551).Integer,E=o(551).IGeometry,L=o(551).LGraph,S=o(551).Transform,C=o(551).LinkedList;function M(){l.call(this),this.toBeTiled={},this.constraints={}}M.prototype=Object.create(l.prototype);for(var R in l)M[R]=l[R];M.prototype.newGraphManager=function(){var T=new u(this);return this.graphManager=T,T},M.prototype.newGraph=function(T){return new h(null,this.graphManager,T)},M.prototype.newNode=function(T){return new f(this.graphManager,T)},M.prototype.newEdge=function(T){return new d(null,null,T)},M.prototype.initParameters=function(){l.prototype.initParameters.call(this,arguments),this.isSubLayout||(p.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=p.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=p.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=m.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=m.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=m.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=m.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},M.prototype.initSpringEmbedder=function(){l.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/m.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},M.prototype.layout=function(){var T=y.DEFAULT_CREATE_BENDS_AS_NEEDED;return T&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},M.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(p.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var I=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(O){return I.has(O)});this.graphManager.setAllNodesToApplyGravitation(A)}}else{var T=this.getFlatForest();if(T.length>0)this.positionNodesRadially(T);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var I=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(D){return I.has(D)});this.graphManager.setAllNodesToApplyGravitation(A),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),p.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},M.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%m.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var T=new Set(this.getAllNodes()),I=this.nodesWithGravity.filter(function(N){return T.has(N)});this.graphManager.setAllNodesToApplyGravitation(I),this.graphManager.updateBounds(),this.updateGrid(),p.PURE_INCREMENTAL?this.coolingFactor=m.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=m.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),p.PURE_INCREMENTAL?this.coolingFactor=m.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=m.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var A=!this.isTreeGrowing&&!this.isGrowthFinished,D=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(A,D),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},M.prototype.getPositionsData=function(){for(var T=this.graphManager.getAllNodes(),I={},A=0;A0&&this.updateDisplacements();for(var A=0;A0&&(D.fixedNodeWeight=O)}}if(this.constraints.relativePlacementConstraint){var B=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(ee){T.fixedNodesOnHorizontal.add(ee),T.fixedNodesOnVertical.add(ee)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var $=this.constraints.alignmentConstraint.vertical,A=0;A<$.length;A++)this.dummyToNodeForVerticalAlignment.set("dummy"+A,[]),$[A].forEach(function(Q){B.set(Q,"dummy"+A),T.dummyToNodeForVerticalAlignment.get("dummy"+A).push(Q),T.fixedNodeSet.has(Q)&&T.fixedNodesOnHorizontal.add("dummy"+A)});if(this.constraints.alignmentConstraint.horizontal)for(var z=this.constraints.alignmentConstraint.horizontal,A=0;A=2*ee.length/3;Y--)Q=Math.floor(Math.random()*(Y+1)),W=ee[Y],ee[Y]=ee[Q],ee[Q]=W;return ee},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(ee){if(ee.left){var Q=B.has(ee.left)?B.get(ee.left):ee.left,W=B.has(ee.right)?B.get(ee.right):ee.right;T.nodesInRelativeHorizontal.includes(Q)||(T.nodesInRelativeHorizontal.push(Q),T.nodeToRelativeConstraintMapHorizontal.set(Q,[]),T.dummyToNodeForVerticalAlignment.has(Q)?T.nodeToTempPositionMapHorizontal.set(Q,T.idToNodeMap.get(T.dummyToNodeForVerticalAlignment.get(Q)[0]).getCenterX()):T.nodeToTempPositionMapHorizontal.set(Q,T.idToNodeMap.get(Q).getCenterX())),T.nodesInRelativeHorizontal.includes(W)||(T.nodesInRelativeHorizontal.push(W),T.nodeToRelativeConstraintMapHorizontal.set(W,[]),T.dummyToNodeForVerticalAlignment.has(W)?T.nodeToTempPositionMapHorizontal.set(W,T.idToNodeMap.get(T.dummyToNodeForVerticalAlignment.get(W)[0]).getCenterX()):T.nodeToTempPositionMapHorizontal.set(W,T.idToNodeMap.get(W).getCenterX())),T.nodeToRelativeConstraintMapHorizontal.get(Q).push({right:W,gap:ee.gap}),T.nodeToRelativeConstraintMapHorizontal.get(W).push({left:Q,gap:ee.gap})}else{var Y=P.has(ee.top)?P.get(ee.top):ee.top,Z=P.has(ee.bottom)?P.get(ee.bottom):ee.bottom;T.nodesInRelativeVertical.includes(Y)||(T.nodesInRelativeVertical.push(Y),T.nodeToRelativeConstraintMapVertical.set(Y,[]),T.dummyToNodeForHorizontalAlignment.has(Y)?T.nodeToTempPositionMapVertical.set(Y,T.idToNodeMap.get(T.dummyToNodeForHorizontalAlignment.get(Y)[0]).getCenterY()):T.nodeToTempPositionMapVertical.set(Y,T.idToNodeMap.get(Y).getCenterY())),T.nodesInRelativeVertical.includes(Z)||(T.nodesInRelativeVertical.push(Z),T.nodeToRelativeConstraintMapVertical.set(Z,[]),T.dummyToNodeForHorizontalAlignment.has(Z)?T.nodeToTempPositionMapVertical.set(Z,T.idToNodeMap.get(T.dummyToNodeForHorizontalAlignment.get(Z)[0]).getCenterY()):T.nodeToTempPositionMapVertical.set(Z,T.idToNodeMap.get(Z).getCenterY())),T.nodeToRelativeConstraintMapVertical.get(Y).push({bottom:Z,gap:ee.gap}),T.nodeToRelativeConstraintMapVertical.get(Z).push({top:Y,gap:ee.gap})}});else{var H=new Map,J=new Map;this.constraints.relativePlacementConstraint.forEach(function(ee){if(ee.left){var Q=B.has(ee.left)?B.get(ee.left):ee.left,W=B.has(ee.right)?B.get(ee.right):ee.right;H.has(Q)?H.get(Q).push(W):H.set(Q,[W]),H.has(W)?H.get(W).push(Q):H.set(W,[Q])}else{var Y=P.has(ee.top)?P.get(ee.top):ee.top,Z=P.has(ee.bottom)?P.get(ee.bottom):ee.bottom;J.has(Y)?J.get(Y).push(Z):J.set(Y,[Z]),J.has(Z)?J.get(Z).push(Y):J.set(Z,[Y])}});var X=function(Q,W){var Y=[],Z=[],se=new C,ce=new Set,ue=0;return Q.forEach(function(te,Ne){if(!ce.has(Ne)){Y[ue]=[],Z[ue]=!1;var ae=Ne;for(se.push(ae),ce.add(ae),Y[ue].push(ae);se.length!=0;){ae=se.shift(),W.has(ae)&&(Z[ue]=!0);var we=Q.get(ae);we.forEach(function(Ie){ce.has(Ie)||(se.push(Ie),ce.add(Ie),Y[ue].push(Ie))})}ue++}}),{components:Y,isFixed:Z}},oe=X(H,T.fixedNodesOnHorizontal);this.componentsOnHorizontal=oe.components,this.fixedComponentsOnHorizontal=oe.isFixed;var K=X(J,T.fixedNodesOnVertical);this.componentsOnVertical=K.components,this.fixedComponentsOnVertical=K.isFixed}}},M.prototype.updateDisplacements=function(){var T=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(K){var ee=T.idToNodeMap.get(K.nodeId);ee.displacementX=0,ee.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var I=this.constraints.alignmentConstraint.vertical,A=0;A1){var P;for(P=0;PD&&(D=Math.floor(B.y)),O=Math.floor(B.x+p.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(y.WORLD_CENTER_X-B.x/2,y.WORLD_CENTER_Y-B.y/2))},M.radialLayout=function(T,I,A){var D=Math.max(this.maxDiagonalInTree(T),p.DEFAULT_RADIAL_SEPARATION);M.branchRadialLayout(I,null,0,359,0,D);var N=L.calculateBounds(T),O=new S;O.setDeviceOrgX(N.getMinX()),O.setDeviceOrgY(N.getMinY()),O.setWorldOrgX(A.x),O.setWorldOrgY(A.y);for(var B=0;B1;){var Y=W[0];W.splice(0,1);var Z=X.indexOf(Y);Z>=0&&X.splice(Z,1),ee--,oe--}I!=null?Q=(X.indexOf(W[0])+1)%ee:Q=0;for(var se=Math.abs(D-A)/oe,ce=Q;K!=oe;ce=++ce%ee){var ue=X[ce].getOtherEnd(T);if(ue!=I){var te=(A+K*se)%360,Ne=(te+se)%360;M.branchRadialLayout(ue,T,te,Ne,N+O,O),K++}}},M.maxDiagonalInTree=function(T){for(var I=k.MIN_VALUE,A=0;AI&&(I=N)}return I},M.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},M.prototype.groupZeroDegreeMembers=function(){var T=this,I={};this.memberGroups={},this.idToDummyNode={};for(var A=[],D=this.graphManager.getAllNodes(),N=0;N"u"&&(I[P]=[]),I[P]=I[P].concat(O)}Object.keys(I).forEach(function($){if(I[$].length>1){var z="DummyCompound_"+$;T.memberGroups[z]=I[$];var H=I[$][0].getParent(),J=new f(T.graphManager);J.id=z,J.paddingLeft=H.paddingLeft||0,J.paddingRight=H.paddingRight||0,J.paddingBottom=H.paddingBottom||0,J.paddingTop=H.paddingTop||0,T.idToDummyNode[z]=J;var X=T.getGraphManager().add(T.newGraph(),J),oe=H.getChild();oe.add(J);for(var K=0;KN?(D.rect.x-=(D.labelWidth-N)/2,D.setWidth(D.labelWidth),D.labelMarginLeft=(D.labelWidth-N)/2):D.labelPosHorizontal=="right"&&D.setWidth(N+D.labelWidth)),D.labelHeight&&(D.labelPosVertical=="top"?(D.rect.y-=D.labelHeight,D.setHeight(O+D.labelHeight),D.labelMarginTop=D.labelHeight):D.labelPosVertical=="center"&&D.labelHeight>O?(D.rect.y-=(D.labelHeight-O)/2,D.setHeight(D.labelHeight),D.labelMarginTop=(D.labelHeight-O)/2):D.labelPosVertical=="bottom"&&D.setHeight(O+D.labelHeight))}})},M.prototype.repopulateCompounds=function(){for(var T=this.compoundOrder.length-1;T>=0;T--){var I=this.compoundOrder[T],A=I.id,D=I.paddingLeft,N=I.paddingTop,O=I.labelMarginLeft,B=I.labelMarginTop;this.adjustLocations(this.tiledMemberPack[A],I.rect.x,I.rect.y,D,N,O,B)}},M.prototype.repopulateZeroDegreeMembers=function(){var T=this,I=this.tiledZeroDegreePack;Object.keys(I).forEach(function(A){var D=T.idToDummyNode[A],N=D.paddingLeft,O=D.paddingTop,B=D.labelMarginLeft,P=D.labelMarginTop;T.adjustLocations(I[A],D.rect.x,D.rect.y,N,O,B,P)})},M.prototype.getToBeTiled=function(T){var I=T.id;if(this.toBeTiled[I]!=null)return this.toBeTiled[I];var A=T.getChild();if(A==null)return this.toBeTiled[I]=!1,!1;for(var D=A.getNodes(),N=0;N0)return this.toBeTiled[I]=!1,!1;if(O.getChild()==null){this.toBeTiled[O.id]=!1;continue}if(!this.getToBeTiled(O))return this.toBeTiled[I]=!1,!1}return this.toBeTiled[I]=!0,!0},M.prototype.getNodeDegree=function(T){for(var I=T.id,A=T.getEdges(),D=0,N=0;NH&&(H=X.rect.height)}A+=H+T.verticalPadding}},M.prototype.tileCompoundMembers=function(T,I){var A=this;this.tiledMemberPack=[],Object.keys(T).forEach(function(D){var N=I[D];if(A.tiledMemberPack[D]=A.tileNodes(T[D],N.paddingLeft+N.paddingRight),N.rect.width=A.tiledMemberPack[D].width,N.rect.height=A.tiledMemberPack[D].height,N.setCenter(A.tiledMemberPack[D].centerX,A.tiledMemberPack[D].centerY),N.labelMarginLeft=0,N.labelMarginTop=0,p.NODE_DIMENSIONS_INCLUDE_LABELS){var O=N.rect.width,B=N.rect.height;N.labelWidth&&(N.labelPosHorizontal=="left"?(N.rect.x-=N.labelWidth,N.setWidth(O+N.labelWidth),N.labelMarginLeft=N.labelWidth):N.labelPosHorizontal=="center"&&N.labelWidth>O?(N.rect.x-=(N.labelWidth-O)/2,N.setWidth(N.labelWidth),N.labelMarginLeft=(N.labelWidth-O)/2):N.labelPosHorizontal=="right"&&N.setWidth(O+N.labelWidth)),N.labelHeight&&(N.labelPosVertical=="top"?(N.rect.y-=N.labelHeight,N.setHeight(B+N.labelHeight),N.labelMarginTop=N.labelHeight):N.labelPosVertical=="center"&&N.labelHeight>B?(N.rect.y-=(N.labelHeight-B)/2,N.setHeight(N.labelHeight),N.labelMarginTop=(N.labelHeight-B)/2):N.labelPosVertical=="bottom"&&N.setHeight(B+N.labelHeight))}})},M.prototype.tileNodes=function(T,I){var A=this.tileNodesByFavoringDim(T,I,!0),D=this.tileNodesByFavoringDim(T,I,!1),N=this.getOrgRatio(A),O=this.getOrgRatio(D),B;return OP&&(P=K.getWidth())});var $=O/N,z=B/N,H=Math.pow(A-D,2)+4*($+D)*(z+A)*N,J=(D-A+Math.sqrt(H))/(2*($+D)),X;I?(X=Math.ceil(J),X==J&&X++):X=Math.floor(J);var oe=X*($+D)-D;return P>oe&&(oe=P),oe+=D*2,oe},M.prototype.tileNodesByFavoringDim=function(T,I,A){var D=p.TILING_PADDING_VERTICAL,N=p.TILING_PADDING_HORIZONTAL,O=p.TILING_COMPARE_BY,B={rows:[],rowWidth:[],rowHeight:[],width:0,height:I,verticalPadding:D,horizontalPadding:N,centerX:0,centerY:0};O&&(B.idealRowWidth=this.calcIdealRowWidth(T,A));var P=function(ee){return ee.rect.width*ee.rect.height},$=function(ee,Q){return P(Q)-P(ee)};T.sort(function(K,ee){var Q=$;return B.idealRowWidth?(Q=O,Q(K.id,ee.id)):Q(K,ee)});for(var z=0,H=0,J=0;J0&&(B+=T.horizontalPadding),T.rowWidth[A]=B,T.width0&&(P+=T.verticalPadding);var $=0;P>T.rowHeight[A]&&($=T.rowHeight[A],T.rowHeight[A]=P,$=T.rowHeight[A]-$),T.height+=$,T.rows[A].push(I)},M.prototype.getShortestRowIndex=function(T){for(var I=-1,A=Number.MAX_VALUE,D=0;DA&&(I=D,A=T.rowWidth[D]);return I},M.prototype.canAddHorizontal=function(T,I,A){if(T.idealRowWidth){var D=T.rows.length-1,N=T.rowWidth[D];return N+I+T.horizontalPadding<=T.idealRowWidth}var O=this.getShortestRowIndex(T);if(O<0)return!0;var B=T.rowWidth[O];if(B+T.horizontalPadding+I<=T.width)return!0;var P=0;T.rowHeight[O]0&&(P=A+T.verticalPadding-T.rowHeight[O]);var $;T.width-B>=I+T.horizontalPadding?$=(T.height+P)/(B+I+T.horizontalPadding):$=(T.height+P)/T.width,P=A+T.verticalPadding;var z;return T.widthO&&I!=A){D.splice(-1,1),T.rows[A].push(N),T.rowWidth[I]=T.rowWidth[I]-O,T.rowWidth[A]=T.rowWidth[A]+O,T.width=T.rowWidth[instance.getLongestRowIndex(T)];for(var B=Number.MIN_VALUE,P=0;PB&&(B=D[P].height);I>0&&(B+=T.verticalPadding);var $=T.rowHeight[I]+T.rowHeight[A];T.rowHeight[I]=B,T.rowHeight[A]0)for(var oe=N;oe<=O;oe++)X[0]+=this.grid[oe][B-1].length+this.grid[oe][B].length-1;if(O0)for(var oe=B;oe<=P;oe++)X[3]+=this.grid[N-1][oe].length+this.grid[N][oe].length-1;for(var K=k.MAX_VALUE,ee,Q,W=0;W{var l=o(551).FDLayoutNode,u=o(551).IMath;function h(d,p,g,m){l.call(this,d,p,g,m)}h.prototype=Object.create(l.prototype);for(var f in l)h[f]=l[f];h.prototype.calculateDisplacement=function(){var d=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=d.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=d.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=d.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=d.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>d.coolingFactor*d.maxNodeDisplacement&&(this.displacementX=d.coolingFactor*d.maxNodeDisplacement*u.sign(this.displacementX)),Math.abs(this.displacementY)>d.coolingFactor*d.maxNodeDisplacement&&(this.displacementY=d.coolingFactor*d.maxNodeDisplacement*u.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},h.prototype.propogateDisplacementToChildren=function(d,p){for(var g=this.getChild().getNodes(),m,y=0;y{function l(g){if(Array.isArray(g)){for(var m=0,y=Array(g.length);m0){var st=0;Ze.forEach(function(Ke){ke=="horizontal"?(ge.set(Ke,x.has(Ke)?b[x.get(Ke)]:ye.get(Ke)),st+=ge.get(Ke)):(ge.set(Ke,x.has(Ke)?w[x.get(Ke)]:ye.get(Ke)),st+=ge.get(Ke))}),st=st/Ze.length,ft.forEach(function(Ke){j.has(Ke)||ge.set(Ke,st)})}else{var Ue=0;ft.forEach(function(Ke){ke=="horizontal"?Ue+=x.has(Ke)?b[x.get(Ke)]:ye.get(Ke):Ue+=x.has(Ke)?w[x.get(Ke)]:ye.get(Ke)}),Ue=Ue/ft.length,ft.forEach(function(Ke){ge.set(Ke,Ue)})}});for(var qe=function(){var Ze=Ce.shift(),st=U.get(Ze);st.forEach(function(Ue){if(ge.get(Ue.id)Ke&&(Ke=tt),_tit&&(it=_t)}}catch(Rn){Ht=!0,ot=Rn}finally{try{!mt&&et.return&&et.return()}finally{if(Ht)throw ot}}var ur=(st+Ke)/2-(Ue+it)/2,Qt=!0,Jt=!1,en=void 0;try{for(var Cr=ft[Symbol.iterator](),Kn;!(Qt=(Kn=Cr.next()).done);Qt=!0){var cn=Kn.value;ge.set(cn,ge.get(cn)+ur)}}catch(Rn){Jt=!0,en=Rn}finally{try{!Qt&&Cr.return&&Cr.return()}finally{if(Jt)throw en}}})}return ge},R=function(U){var ke=0,j=0,ye=0,Ae=0;if(U.forEach(function($e){$e.left?b[x.get($e.left)]-b[x.get($e.right)]>=0?ke++:j++:w[x.get($e.top)]-w[x.get($e.bottom)]>=0?ye++:Ae++}),ke>j&&ye>Ae)for(var Ge=0;Gej)for(var Fe=0;FeAe)for(var ge=0;ge1)m.fixedNodeConstraint.forEach(function(he,U){D[U]=[he.position.x,he.position.y],N[U]=[b[x.get(he.nodeId)],w[x.get(he.nodeId)]]}),O=!0;else if(m.alignmentConstraint)(function(){var he=0;if(m.alignmentConstraint.vertical){for(var U=m.alignmentConstraint.vertical,ke=function(ge){var $e=new Set;U[ge].forEach(function(lt){$e.add(lt)});var Ce=new Set([].concat(l($e)).filter(function(lt){return P.has(lt)})),qe=void 0;Ce.size>0?qe=b[x.get(Ce.values().next().value)]:qe=C($e).x,U[ge].forEach(function(lt){D[he]=[qe,w[x.get(lt)]],N[he]=[b[x.get(lt)],w[x.get(lt)]],he++})},j=0;j0?qe=b[x.get(Ce.values().next().value)]:qe=C($e).y,ye[ge].forEach(function(lt){D[he]=[b[x.get(lt)],qe],N[he]=[b[x.get(lt)],w[x.get(lt)]],he++})},Ge=0;GeJ&&(J=H[oe].length,X=oe);if(J0){var Oe={x:0,y:0};m.fixedNodeConstraint.forEach(function(he,U){var ke={x:b[x.get(he.nodeId)],y:w[x.get(he.nodeId)]},j=he.position,ye=S(j,ke);Oe.x+=ye.x,Oe.y+=ye.y}),Oe.x/=m.fixedNodeConstraint.length,Oe.y/=m.fixedNodeConstraint.length,b.forEach(function(he,U){b[U]+=Oe.x}),w.forEach(function(he,U){w[U]+=Oe.y}),m.fixedNodeConstraint.forEach(function(he){b[x.get(he.nodeId)]=he.position.x,w[x.get(he.nodeId)]=he.position.y})}if(m.alignmentConstraint){if(m.alignmentConstraint.vertical)for(var De=m.alignmentConstraint.vertical,We=function(U){var ke=new Set;De[U].forEach(function(Ae){ke.add(Ae)});var j=new Set([].concat(l(ke)).filter(function(Ae){return P.has(Ae)})),ye=void 0;j.size>0?ye=b[x.get(j.values().next().value)]:ye=C(ke).x,ke.forEach(function(Ae){P.has(Ae)||(b[x.get(Ae)]=ye)})},Re=0;Re0?ye=w[x.get(j.values().next().value)]:ye=C(ke).y,ke.forEach(function(Ae){P.has(Ae)||(w[x.get(Ae)]=ye)})},q=0;q{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var o=r[a]={exports:{}};return e[a](o,o.exports,n),o.exports}var i=n(45);return i})()})});var Age=di((Jx,GO)=>{(function(e,r){typeof Jx=="object"&&typeof GO=="object"?GO.exports=r($O()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof Jx=="object"?Jx.cytoscapeFcose=r($O()):e.cytoscapeFcose=r(e.coseBase)})(Jx,function(t){return(()=>{"use strict";var e={658:a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var o=arguments.length,l=Array(o>1?o-1:0),u=1;u{var l=function(){function f(d,p){var g=[],m=!0,y=!1,x=void 0;try{for(var b=d[Symbol.iterator](),w;!(m=(w=b.next()).done)&&(g.push(w.value),!(p&&g.length===p));m=!0);}catch(_){y=!0,x=_}finally{try{!m&&b.return&&b.return()}finally{if(y)throw x}}return g}return function(d,p){if(Array.isArray(d))return d;if(Symbol.iterator in Object(d))return f(d,p);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),u=o(140).layoutBase.LinkedList,h={};h.getTopMostNodes=function(f){for(var d={},p=0;p0&&O.merge(z)});for(var B=0;B1){w=x[0],_=w.connectedEdges().length,x.forEach(function(N){N.connectedEdges().length<_&&(_=N.connectedEdges().length,w=N)}),L.push(w.id());var D=f.collection();D.merge(x[0]),x.forEach(function(N){D.merge(N)}),x=[],p=p.difference(D),E++}};do C();while(!k);return g&&L.length>0&&g.set("dummy"+(g.size+1),L),S},h.relocateComponent=function(f,d,p){if(!p.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,m=Number.NEGATIVE_INFINITY,y=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(p.quality=="draft"){var b=!0,w=!1,_=void 0;try{for(var k=d.nodeIndexes[Symbol.iterator](),E;!(b=(E=k.next()).done);b=!0){var L=E.value,S=l(L,2),C=S[0],M=S[1],R=p.cy.getElementById(C);if(R){var T=R.boundingBox(),I=d.xCoords[M]-T.w/2,A=d.xCoords[M]+T.w/2,D=d.yCoords[M]-T.h/2,N=d.yCoords[M]+T.h/2;Im&&(m=A),Dx&&(x=N)}}}catch(z){w=!0,_=z}finally{try{!b&&k.return&&k.return()}finally{if(w)throw _}}var O=f.x-(m+g)/2,B=f.y-(x+y)/2;d.xCoords=d.xCoords.map(function(z){return z+O}),d.yCoords=d.yCoords.map(function(z){return z+B})}else{Object.keys(d).forEach(function(z){var H=d[z],J=H.getRect().x,X=H.getRect().x+H.getRect().width,oe=H.getRect().y,K=H.getRect().y+H.getRect().height;Jm&&(m=X),oex&&(x=K)});var P=f.x-(m+g)/2,$=f.y-(x+y)/2;Object.keys(d).forEach(function(z){var H=d[z];H.setCenter(H.getCenterX()+P,H.getCenterY()+$)})}}},h.calcBoundingBox=function(f,d,p,g){for(var m=Number.MAX_SAFE_INTEGER,y=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,w=void 0,_=void 0,k=void 0,E=void 0,L=f.descendants().not(":parent"),S=L.length,C=0;Cw&&(m=w),y<_&&(y=_),x>k&&(x=k),b{var l=o(548),u=o(140).CoSELayout,h=o(140).CoSENode,f=o(140).layoutBase.PointD,d=o(140).layoutBase.DimensionD,p=o(140).layoutBase.LayoutConstants,g=o(140).layoutBase.FDLayoutConstants,m=o(140).CoSEConstants,y=function(b,w){var _=b.cy,k=b.eles,E=k.nodes(),L=k.edges(),S=void 0,C=void 0,M=void 0,R={};b.randomize&&(S=w.nodeIndexes,C=w.xCoords,M=w.yCoords);var T=function(z){return typeof z=="function"},I=function(z,H){return T(z)?z(H):z},A=l.calcParentsWithoutChildren(_,k),D=function $(z,H,J,X){for(var oe=H.length,K=0;K0){var se=void 0;se=J.getGraphManager().add(J.newGraph(),W),$(se,Q,J,X)}}},N=function(z,H,J){for(var X=0,oe=0,K=0;K0?m.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=X/oe:T(b.idealEdgeLength)?m.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:m.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,m.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,m.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},O=function(z,H){H.fixedNodeConstraint&&(z.constraints.fixedNodeConstraint=H.fixedNodeConstraint),H.alignmentConstraint&&(z.constraints.alignmentConstraint=H.alignmentConstraint),H.relativePlacementConstraint&&(z.constraints.relativePlacementConstraint=H.relativePlacementConstraint)};b.nestingFactor!=null&&(m.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(m.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(m.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(m.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(m.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(m.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(m.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(m.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?p.QUALITY=2:p.QUALITY=0,m.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=p.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,m.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=p.DEFAULT_INCREMENTAL=!b.randomize,m.ANIMATE=g.ANIMATE=p.ANIMATE=b.animate,m.TILE=b.tile,m.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,m.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,m.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=p.DEFAULT_INCREMENTAL=!0,m.PURE_INCREMENTAL=!b.randomize,p.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(m.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,m.ENFORCE_CONSTRAINTS=!1,m.APPLY_LAYOUT=!1),b.step=="enforced"&&(m.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,m.ENFORCE_CONSTRAINTS=!0,m.APPLY_LAYOUT=!1),b.step=="cose"&&(m.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,m.ENFORCE_CONSTRAINTS=!1,m.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?m.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:m.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,m.ENFORCE_CONSTRAINTS=!0,m.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?m.TREE_REDUCTION_ON_INCREMENTAL=!1:m.TREE_REDUCTION_ON_INCREMENTAL=!0;var B=new u,P=B.newGraphManager();return D(P.addRoot(),l.getTopMostNodes(E),B,b),N(B,P,L),O(B,b),B.runLayout(),R};a.exports={coseLayout:y}},212:(a,s,o)=>{var l=function(){function b(w,_){for(var k=0;k<_.length;k++){var E=_[k];E.enumerable=E.enumerable||!1,E.configurable=!0,"value"in E&&(E.writable=!0),Object.defineProperty(w,E.key,E)}}return function(w,_,k){return _&&b(w.prototype,_),k&&b(w,k),w}}();function u(b,w){if(!(b instanceof w))throw new TypeError("Cannot call a class as a function")}var h=o(658),f=o(548),d=o(657),p=d.spectralLayout,g=o(816),m=g.coseLayout,y=Object.freeze({quality:"default",randomize:!0,animate:!0,animationDuration:1e3,animationEasing:void 0,fit:!0,padding:30,nodeDimensionsIncludeLabels:!1,uniformNodeDimensions:!1,packComponents:!0,step:"all",samplingType:!0,sampleSize:25,nodeSeparation:75,piTol:1e-7,nodeRepulsion:function(w){return 4500},idealEdgeLength:function(w){return 50},edgeElasticity:function(w){return .45},nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,tilingCompareBy:void 0,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.3,fixedNodeConstraint:void 0,alignmentConstraint:void 0,relativePlacementConstraint:void 0,ready:function(){},stop:function(){}}),x=function(){function b(w){u(this,b),this.options=h({},y,w)}return l(b,[{key:"run",value:function(){var _=this,k=this.options,E=k.cy,L=k.eles,S=[],C=void 0,M=void 0,R=[],T=void 0,I=[];k.fixedNodeConstraint&&(!Array.isArray(k.fixedNodeConstraint)||k.fixedNodeConstraint.length==0)&&(k.fixedNodeConstraint=void 0),k.alignmentConstraint&&(k.alignmentConstraint.vertical&&(!Array.isArray(k.alignmentConstraint.vertical)||k.alignmentConstraint.vertical.length==0)&&(k.alignmentConstraint.vertical=void 0),k.alignmentConstraint.horizontal&&(!Array.isArray(k.alignmentConstraint.horizontal)||k.alignmentConstraint.horizontal.length==0)&&(k.alignmentConstraint.horizontal=void 0)),k.relativePlacementConstraint&&(!Array.isArray(k.relativePlacementConstraint)||k.relativePlacementConstraint.length==0)&&(k.relativePlacementConstraint=void 0);var A=k.fixedNodeConstraint||k.alignmentConstraint||k.relativePlacementConstraint;A&&(k.tile=!1,k.packComponents=!1);var D=void 0,N=!1;if(E.layoutUtilities&&k.packComponents&&(D=E.layoutUtilities("get"),D||(D=E.layoutUtilities()),N=!0),L.nodes().length>0)if(N){var P=f.getTopMostNodes(k.eles.nodes());if(T=f.connectComponents(E,k.eles,P),T.forEach(function(ae){var we=ae.boundingBox();I.push({x:we.x1+we.w/2,y:we.y1+we.h/2})}),k.randomize&&T.forEach(function(ae){k.eles=ae,S.push(p(k))}),k.quality=="default"||k.quality=="proof"){var $=E.collection();if(k.tile){var z=new Map,H=[],J=[],X=0,oe={nodeIndexes:z,xCoords:H,yCoords:J},K=[];if(T.forEach(function(ae,we){ae.edges().length==0&&(ae.nodes().forEach(function(Ie,Ee){$.merge(ae.nodes()[Ee]),Ie.isParent()||(oe.nodeIndexes.set(ae.nodes()[Ee].id(),X++),oe.xCoords.push(ae.nodes()[0].position().x),oe.yCoords.push(ae.nodes()[0].position().y))}),K.push(we))}),$.length>1){var ee=$.boundingBox();I.push({x:ee.x1+ee.w/2,y:ee.y1+ee.h/2}),T.push($),S.push(oe);for(var Q=K.length-1;Q>=0;Q--)T.splice(K[Q],1),S.splice(K[Q],1),I.splice(K[Q],1)}}T.forEach(function(ae,we){k.eles=ae,R.push(m(k,S[we])),f.relocateComponent(I[we],R[we],k)})}else T.forEach(function(ae,we){f.relocateComponent(I[we],S[we],k)});var W=new Set;if(T.length>1){var Y=[],Z=L.filter(function(ae){return ae.css("display")=="none"});T.forEach(function(ae,we){var Ie=void 0;if(k.quality=="draft"&&(Ie=S[we].nodeIndexes),ae.nodes().not(Z).length>0){var Ee={};Ee.edges=[],Ee.nodes=[];var Oe=void 0;ae.nodes().not(Z).forEach(function(De){if(k.quality=="draft")if(!De.isParent())Oe=Ie.get(De.id()),Ee.nodes.push({x:S[we].xCoords[Oe]-De.boundingbox().w/2,y:S[we].yCoords[Oe]-De.boundingbox().h/2,width:De.boundingbox().w,height:De.boundingbox().h});else{var We=f.calcBoundingBox(De,S[we].xCoords,S[we].yCoords,Ie);Ee.nodes.push({x:We.topLeftX,y:We.topLeftY,width:We.width,height:We.height})}else R[we][De.id()]&&Ee.nodes.push({x:R[we][De.id()].getLeft(),y:R[we][De.id()].getTop(),width:R[we][De.id()].getWidth(),height:R[we][De.id()].getHeight()})}),ae.edges().forEach(function(De){var We=De.source(),Re=De.target();if(We.css("display")!="none"&&Re.css("display")!="none")if(k.quality=="draft"){var Pe=Ie.get(We.id()),xe=Ie.get(Re.id()),q=[],de=[];if(We.isParent()){var ie=f.calcBoundingBox(We,S[we].xCoords,S[we].yCoords,Ie);q.push(ie.topLeftX+ie.width/2),q.push(ie.topLeftY+ie.height/2)}else q.push(S[we].xCoords[Pe]),q.push(S[we].yCoords[Pe]);if(Re.isParent()){var he=f.calcBoundingBox(Re,S[we].xCoords,S[we].yCoords,Ie);de.push(he.topLeftX+he.width/2),de.push(he.topLeftY+he.height/2)}else de.push(S[we].xCoords[xe]),de.push(S[we].yCoords[xe]);Ee.edges.push({startX:q[0],startY:q[1],endX:de[0],endY:de[1]})}else R[we][We.id()]&&R[we][Re.id()]&&Ee.edges.push({startX:R[we][We.id()].getCenterX(),startY:R[we][We.id()].getCenterY(),endX:R[we][Re.id()].getCenterX(),endY:R[we][Re.id()].getCenterY()})}),Ee.nodes.length>0&&(Y.push(Ee),W.add(we))}});var se=D.packComponents(Y,k.randomize).shifts;if(k.quality=="draft")S.forEach(function(ae,we){var Ie=ae.xCoords.map(function(Oe){return Oe+se[we].dx}),Ee=ae.yCoords.map(function(Oe){return Oe+se[we].dy});ae.xCoords=Ie,ae.yCoords=Ee});else{var ce=0;W.forEach(function(ae){Object.keys(R[ae]).forEach(function(we){var Ie=R[ae][we];Ie.setCenter(Ie.getCenterX()+se[ce].dx,Ie.getCenterY()+se[ce].dy)}),ce++})}}}else{var O=k.eles.boundingBox();if(I.push({x:O.x1+O.w/2,y:O.y1+O.h/2}),k.randomize){var B=p(k);S.push(B)}k.quality=="default"||k.quality=="proof"?(R.push(m(k,S[0])),f.relocateComponent(I[0],R[0],k)):f.relocateComponent(I[0],S[0],k)}var ue=function(we,Ie){if(k.quality=="default"||k.quality=="proof"){typeof we=="number"&&(we=Ie);var Ee=void 0,Oe=void 0,De=we.data("id");return R.forEach(function(Re){De in Re&&(Ee={x:Re[De].getRect().getCenterX(),y:Re[De].getRect().getCenterY()},Oe=Re[De])}),k.nodeDimensionsIncludeLabels&&(Oe.labelWidth&&(Oe.labelPosHorizontal=="left"?Ee.x+=Oe.labelWidth/2:Oe.labelPosHorizontal=="right"&&(Ee.x-=Oe.labelWidth/2)),Oe.labelHeight&&(Oe.labelPosVertical=="top"?Ee.y+=Oe.labelHeight/2:Oe.labelPosVertical=="bottom"&&(Ee.y-=Oe.labelHeight/2))),Ee==null&&(Ee={x:we.position("x"),y:we.position("y")}),{x:Ee.x,y:Ee.y}}else{var We=void 0;return S.forEach(function(Re){var Pe=Re.nodeIndexes.get(we.id());Pe!=null&&(We={x:Re.xCoords[Pe],y:Re.yCoords[Pe]})}),We==null&&(We={x:we.position("x"),y:we.position("y")}),{x:We.x,y:We.y}}};if(k.quality=="default"||k.quality=="proof"||k.randomize){var te=f.calcParentsWithoutChildren(E,L),Ne=L.filter(function(ae){return ae.css("display")=="none"});k.eles=L.not(Ne),L.nodes().not(":parent").not(Ne).layoutPositions(_,k,ue),te.length>0&&te.forEach(function(ae){ae.position(ue(ae))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),b}();a.exports=x},657:(a,s,o)=>{var l=o(548),u=o(140).layoutBase.Matrix,h=o(140).layoutBase.SVD,f=function(p){var g=p.cy,m=p.eles,y=m.nodes(),x=m.nodes(":parent"),b=new Map,w=new Map,_=new Map,k=[],E=[],L=[],S=[],C=[],M=[],R=[],T=[],I=void 0,A=void 0,D=1e8,N=1e-9,O=p.piTol,B=p.samplingType,P=p.nodeSeparation,$=void 0,z=function(){for(var ke=0,j=0,ye=!1;j<$;){ke=Math.floor(Math.random()*A),ye=!1;for(var Ae=0;Ae=Ge;){ge=Ae[Ge++];for(var ft=k[ge],Ze=0;Zeqe&&(qe=C[Ue],lt=Ue)}return lt},J=function(ke){var j=void 0;if(ke){j=Math.floor(Math.random()*A),I=j;for(var Ae=0;Ae=1)break;qe=Ce}for(var ft=0;ft=1)break;qe=Ce}for(var st=0;st0&&(j.isParent()?k[ke].push(_.get(j.id())):k[ke].push(j.id()))})});var te=function(ke){var j=w.get(ke),ye=void 0;b.get(ke).forEach(function(Ae){g.getElementById(Ae).isParent()?ye=_.get(Ae):ye=Ae,k[j].push(ye),k[w.get(ye)].push(ke)})},Ne=!0,ae=!1,we=void 0;try{for(var Ie=b.keys()[Symbol.iterator](),Ee;!(Ne=(Ee=Ie.next()).done);Ne=!0){var Oe=Ee.value;te(Oe)}}catch(U){ae=!0,we=U}finally{try{!Ne&&Ie.return&&Ie.return()}finally{if(ae)throw we}}A=w.size;var De=void 0;if(A>2){$=A{var l=o(212),u=function(f){f&&f("layout","fcose",l)};typeof cytoscape<"u"&&u(cytoscape),a.exports=u},140:a=>{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var o=r[a]={exports:{}};return e[a](o,o.exports,n),o.exports}var i=n(579);return i})()})});var Vge={};vr(Vge,{diagram:()=>pQe});function zi(t){let e=pe().architecture;return e?.[t]?e[t]:Mge[t]}function Oge(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"service",id:r.id,icon:r.icon,label:r.title,parent:r.in,width:zi("iconSize"),height:zi("iconSize")},classes:"node-service"})})}function Pge(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"junction",id:r.id,parent:r.in,width:zi("iconSize"),height:zi("iconSize")},classes:"node-junction"})})}function Bge(t,e){e.nodes().map(r=>{let n=d1(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function Fge(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function zge(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:o,lhsDir:l,rhsDir:u,rhsGroup:h,title:f}=r,d=Nge(r.lhsDir,r.rhsDir)?"segments":"straight",p={id:`${n}-${i}`,label:f,source:n,sourceDir:l,sourceArrow:a,sourceGroup:s,sourceEndpoint:l==="L"?"0 50%":l==="R"?"100% 50%":l==="T"?"50% 0":"50% 100%",target:i,targetDir:u,targetArrow:o,targetGroup:h,targetEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:p,classes:d})})}function $ge(t){let e=t.map(i=>{let a={},s={};return Object.entries(i).forEach(([o,[l,u]])=>{a[u]||(a[u]=[]),s[l]||(s[l]=[]),a[u].push(o),s[l].push(o)}),{horiz:Object.values(a).filter(o=>o.length>1),vert:Object.values(s).filter(o=>o.length>1)}}),[r,n]=e.reduce(([i,a],{horiz:s,vert:o})=>[[...i,...s],[...a,...o]],[[],[]]);return{horizontal:r,vertical:n}}function Gge(t){let e=[],r=v(i=>`${i[0]},${i[1]}`,"posToStr"),n=v(i=>i.split(",").map(a=>parseInt(a)),"strToPos");return t.forEach(i=>{let a=Object.fromEntries(Object.entries(i).map(([u,h])=>[r(h),u])),s=[r([0,0])],o={},l={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;s.length>0;){let u=s.shift();if(u){o[u]=1;let h=a[u];if(h){let f=n(u);Object.entries(l).forEach(([d,p])=>{let g=r([f[0]+p[0],f[1]+p[1]]),m=a[g];m&&!o[g]&&(s.push(g),e.push({[_ge[d]]:m,[_ge[BZe(d)]]:h,gap:1.5*zi("iconSize")}))})}}}}),e}function Uge(t,e,r,n,{spatialMaps:i}){return new Promise(a=>{let s=Ve("body").append("div").attr("id","cy").attr("style","display:none"),o=Jo({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${zi("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${zi("padding")}px`}}]});s.remove(),Fge(r,o),Oge(t,o),Pge(e,o),zge(n,o);let l=$ge(i),u=Gge(i),h=o.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(f){let[d,p]=f.connectedNodes(),{parent:g}=d1(d),{parent:m}=d1(p);return g===m?1.5*zi("iconSize"):.5*zi("iconSize")},edgeElasticity(f){let[d,p]=f.connectedNodes(),{parent:g}=d1(d),{parent:m}=d1(p);return g===m?.45:.001},alignmentConstraint:l,relativePlacementConstraint:u});h.one("layoutstop",()=>{function f(d,p,g,m){let y,x,{x:b,y:w}=d,{x:_,y:k}=p;x=(m-w+(b-g)*(w-k)/(b-_))/Math.sqrt(1+Math.pow((w-k)/(b-_),2)),y=Math.sqrt(Math.pow(m-w,2)+Math.pow(g-b,2)-Math.pow(x,2));let E=Math.sqrt(Math.pow(_-b,2)+Math.pow(k-w,2));y=y/E;let L=(_-b)*(m-w)-(k-w)*(g-b);switch(!0){case L>=0:L=1;break;case L<0:L=-1;break}let S=(_-b)*(g-b)+(k-w)*(m-w);switch(!0){case S>=0:S=1;break;case S<0:S=-1;break}return x=Math.abs(x)*L,y=y*S,{distances:x,weights:y}}v(f,"getSegmentWeights"),o.startBatch();for(let d of Object.values(o.edges()))if(d.data?.()){let{x:p,y:g}=d.source().position(),{x:m,y}=d.target().position();if(p!==m&&g!==y){let x=d.sourceEndpoint(),b=d.targetEndpoint(),{sourceDir:w}=Ige(d),[_,k]=Af(w)?[x.x,b.y]:[b.x,x.y],{weights:E,distances:L}=f(x,b,_,k);d.style("segment-distances",L),d.style("segment-weights",E)}}o.endBatch(),h.run()}),h.run(),o.ready(f=>{re.info("Ready",f),a(o)})})}var Dge,_ge,Lge,TE,BZe,Rge,zs,Af,Nge,FZe,zZe,UO,$Ze,GZe,UZe,VZe,Ige,d1,Mge,cr,WZe,HZe,qZe,YZe,XZe,jZe,KZe,ZZe,QZe,JZe,eQe,tQe,rQe,nQe,EE,iQe,aQe,sQe,oQe,f1,eb,lQe,cQe,uQe,hQe,fQe,dQe,pQe,Wge=F(()=>{sl();Ya();ky();Hw();kn();Iu();or();km();ZD();Dge=Gi(Age(),1);lr();_ge={L:"left",R:"right",T:"top",B:"bottom"},Lge={L:v(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:v(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:v(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:v(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},TE={L:v((t,e)=>t-e+2,"L"),R:v((t,e)=>t-2,"R"),T:v((t,e)=>t-e+2,"T"),B:v((t,e)=>t-2,"B")},BZe=v(function(t){return zs(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),Rge=v(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),zs=v(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),Af=v(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),Nge=v(function(t,e){let r=zs(t)&&Af(e),n=Af(t)&&zs(e);return r||n},"isArchitectureDirectionXY"),FZe=v(function(t){let e=t[0],r=t[1],n=zs(e)&&Af(r),i=Af(e)&&zs(r);return n||i},"isArchitecturePairXY"),zZe=v(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),UO=v(function(t,e){let r=`${t}${e}`;return zZe(r)?r:void 0},"getArchitectureDirectionPair"),$Ze=v(function([t,e],r){let n=r[0],i=r[1];return zs(n)?Af(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:zs(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),GZe=v(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),UZe=v(function(t){return t.type==="service"},"isArchitectureService"),VZe=v(function(t){return t.type==="junction"},"isArchitectureJunction"),Ige=v(t=>t.data(),"edgeData"),d1=v(t=>t.data(),"nodeData"),Mge=sr.architecture,cr=new Rg(()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:Mge,dataStructures:void 0,elements:{}})),WZe=v(()=>{cr.reset(),xr()},"clear"),HZe=v(function({id:t,icon:e,in:r,title:n,iconText:i}){if(cr.records.registeredIds[t]!==void 0)throw new Error(`The service id [${t}] is already in use by another ${cr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The service [${t}] cannot be placed within itself`);if(cr.records.registeredIds[r]===void 0)throw new Error(`The service [${t}]'s parent does not exist. Please make sure the parent is created before this service`);if(cr.records.registeredIds[r]==="node")throw new Error(`The service [${t}]'s parent is not a group`)}cr.records.registeredIds[t]="node",cr.records.nodes[t]={id:t,type:"service",icon:e,iconText:i,title:n,edges:[],in:r}},"addService"),qZe=v(()=>Object.values(cr.records.nodes).filter(UZe),"getServices"),YZe=v(function({id:t,in:e}){cr.records.registeredIds[t]="node",cr.records.nodes[t]={id:t,type:"junction",edges:[],in:e}},"addJunction"),XZe=v(()=>Object.values(cr.records.nodes).filter(VZe),"getJunctions"),jZe=v(()=>Object.values(cr.records.nodes),"getNodes"),KZe=v(t=>cr.records.nodes[t],"getNode"),ZZe=v(function({id:t,icon:e,in:r,title:n}){if(cr.records.registeredIds[t]!==void 0)throw new Error(`The group id [${t}] is already in use by another ${cr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The group [${t}] cannot be placed within itself`);if(cr.records.registeredIds[r]===void 0)throw new Error(`The group [${t}]'s parent does not exist. Please make sure the parent is created before this group`);if(cr.records.registeredIds[r]==="node")throw new Error(`The group [${t}]'s parent is not a group`)}cr.records.registeredIds[t]="group",cr.records.groups[t]={id:t,icon:e,title:n,in:r}},"addGroup"),QZe=v(()=>Object.values(cr.records.groups),"getGroups"),JZe=v(function({lhsId:t,rhsId:e,lhsDir:r,rhsDir:n,lhsInto:i,rhsInto:a,lhsGroup:s,rhsGroup:o,title:l}){if(!Rge(r))throw new Error(`Invalid direction given for left hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${r}`);if(!Rge(n))throw new Error(`Invalid direction given for right hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${n}`);if(cr.records.nodes[t]===void 0&&cr.records.groups[t]===void 0)throw new Error(`The left-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(cr.records.nodes[e]===void 0&&cr.records.groups[t]===void 0)throw new Error(`The right-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);let u=cr.records.nodes[t].in,h=cr.records.nodes[e].in;if(s&&u&&h&&u==h)throw new Error(`The left-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(o&&u&&h&&u==h)throw new Error(`The right-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let f={lhsId:t,lhsDir:r,lhsInto:i,lhsGroup:s,rhsId:e,rhsDir:n,rhsInto:a,rhsGroup:o,title:l};cr.records.edges.push(f),cr.records.nodes[t]&&cr.records.nodes[e]&&(cr.records.nodes[t].edges.push(cr.records.edges[cr.records.edges.length-1]),cr.records.nodes[e].edges.push(cr.records.edges[cr.records.edges.length-1]))},"addEdge"),eQe=v(()=>cr.records.edges,"getEdges"),tQe=v(()=>{if(cr.records.dataStructures===void 0){let t=Object.entries(cr.records.nodes).reduce((s,[o,l])=>(s[o]=l.edges.reduce((u,h)=>{if(h.lhsId===o){let f=UO(h.lhsDir,h.rhsDir);f&&(u[f]=h.rhsId)}else{let f=UO(h.rhsDir,h.lhsDir);f&&(u[f]=h.lhsId)}return u},{}),s),{}),e=Object.keys(t)[0],r={[e]:1},n=Object.keys(t).reduce((s,o)=>o===e?s:{...s,[o]:1},{}),i=v(s=>{let o={[s]:[0,0]},l=[s];for(;l.length>0;){let u=l.shift();if(u){r[u]=1,delete n[u];let h=t[u],[f,d]=o[u];Object.entries(h).forEach(([p,g])=>{r[g]||(o[g]=$Ze([f,d],p),l.push(g))})}}return o},"BFS"),a=[i(e)];for(;Object.keys(n).length>0;)a.push(i(Object.keys(n)[0]));cr.records.dataStructures={adjList:t,spatialMaps:a}}return cr.records.dataStructures},"getDataStructures"),rQe=v((t,e)=>{cr.records.elements[t]=e},"setElementForId"),nQe=v(t=>cr.records.elements[t],"getElementById"),EE={clear:WZe,setDiagramTitle:tn,getDiagramTitle:qr,setAccTitle:Tr,getAccTitle:_r,setAccDescription:Lr,getAccDescription:Rr,addService:HZe,getServices:qZe,addJunction:YZe,getJunctions:XZe,getNodes:jZe,getNode:KZe,addGroup:ZZe,getGroups:QZe,addEdge:JZe,getEdges:eQe,setElementForId:rQe,getElementById:nQe,getDataStructures:tQe};v(zi,"getConfigField");iQe=v((t,e)=>{Pu(t,e),t.groups.map(e.addGroup),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(e.addEdge)},"populateDb"),aQe={parse:v(async t=>{let e=await Nl("architecture",t);re.debug(e),iQe(e,EE)},"parse")},sQe=v(t=>` .edge { stroke-width: ${t.archEdgeWidth}; stroke: ${t.archEdgeColor}; fill: none; } .arrow { fill: ${t.archEdgeArrowColor}; } .node-bkg { fill: none; stroke: ${t.archGroupBorderColor}; stroke-width: ${t.archGroupBorderWidth}; stroke-dasharray: 8; } .node-icon-text { display: flex; align-items: center; } .node-icon-text > div { color: #fff; margin: 1px; height: fit-content; text-align: center; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; } `,"getStyles"),oQe=sQe,f1=v(t=>`${t}`,"wrapIcon"),eb={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:f1('')},server:{body:f1('')},disk:{body:f1('')},internet:{body:f1('')},cloud:{body:f1('')},unknown:EC,blank:{body:f1("")}}},lQe=v(async function(t,e){let r=zi("padding"),n=zi("iconSize"),i=n/2,a=n/6,s=a/2;await Promise.all(e.edges().map(async o=>{let{source:l,sourceDir:u,sourceArrow:h,sourceGroup:f,target:d,targetDir:p,targetArrow:g,targetGroup:m,label:y}=Ige(o),{x,y:b}=o[0].sourceEndpoint(),{x:w,y:_}=o[0].midpoint(),{x:k,y:E}=o[0].targetEndpoint(),L=r+4;if(f&&(zs(u)?x+=u==="L"?-L:L:b+=u==="T"?-L:L+18),m&&(zs(p)?k+=p==="L"?-L:L:E+=p==="T"?-L:L+18),!f&&EE.getNode(l)?.type==="junction"&&(zs(u)?x+=u==="L"?i:-i:b+=u==="T"?i:-i),!m&&EE.getNode(d)?.type==="junction"&&(zs(p)?k+=p==="L"?i:-i:E+=p==="T"?i:-i),o[0]._private.rscratch){let S=t.insert("g");if(S.insert("path").attr("d",`M ${x},${b} L ${w},${_} L${k},${E} `).attr("class","edge"),h){let C=zs(u)?TE[u](x,a):x-s,M=Af(u)?TE[u](b,a):b-s;S.insert("polygon").attr("points",Lge[u](a)).attr("transform",`translate(${C},${M})`).attr("class","arrow")}if(g){let C=zs(p)?TE[p](k,a):k-s,M=Af(p)?TE[p](E,a):E-s;S.insert("polygon").attr("points",Lge[p](a)).attr("transform",`translate(${C},${M})`).attr("class","arrow")}if(y){let C=Nge(u,p)?"XY":zs(u)?"X":"Y",M=0;C==="X"?M=Math.abs(x-k):C==="Y"?M=Math.abs(b-E)/1.5:M=Math.abs(x-k)/2;let R=S.append("g");if(await oa(R,y,{useHtmlLabels:!1,width:M,classes:"architecture-service-label"},pe()),R.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),C==="X")R.attr("transform","translate("+w+", "+_+")");else if(C==="Y")R.attr("transform","translate("+w+", "+_+") rotate(-90)");else if(C==="XY"){let T=UO(u,p);if(T&&FZe(T)){let I=R.node().getBoundingClientRect(),[A,D]=GZe(T);R.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*A*D*45})`);let N=R.node().getBoundingClientRect();R.attr("transform",` translate(${w}, ${_-I.height/2}) translate(${A*N.width/2}, ${D*N.height/2}) rotate(${-1*A*D*45}, 0, ${I.height/2}) `)}}}}}))},"drawEdges"),cQe=v(async function(t,e){let n=zi("padding")*.75,i=zi("fontSize"),s=zi("iconSize")/2;await Promise.all(e.nodes().map(async o=>{let l=d1(o);if(l.type==="group"){let{h:u,w:h,x1:f,y1:d}=o.boundingBox();t.append("rect").attr("x",f+s).attr("y",d+s).attr("width",h).attr("height",u).attr("class","node-bkg");let p=t.append("g"),g=f,m=d;if(l.icon){let y=p.append("g");y.html(`${await su(l.icon,{height:n,width:n,fallbackPrefix:eb.prefix})}`),y.attr("transform","translate("+(g+s+1)+", "+(m+s+1)+")"),g+=n,m+=i/2-1-2}if(l.label){let y=p.append("g");await oa(y,l.label,{useHtmlLabels:!1,width:h,classes:"architecture-service-label"},pe()),y.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),y.attr("transform","translate("+(g+s+4)+", "+(m+s+2)+")")}}}))},"drawGroups"),uQe=v(async function(t,e,r){for(let n of r){let i=e.append("g"),a=zi("iconSize");if(n.title){let u=i.append("g");await oa(u,n.title,{useHtmlLabels:!1,width:a*1.5,classes:"architecture-service-label"},pe()),u.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),u.attr("transform","translate("+a/2+", "+a+")")}let s=i.append("g");if(n.icon)s.html(`${await su(n.icon,{height:a,width:a,fallbackPrefix:eb.prefix})}`);else if(n.iconText){s.html(`${await su("blank",{height:a,width:a,fallbackPrefix:eb.prefix})}`);let f=s.append("g").append("foreignObject").attr("width",a).attr("height",a).append("div").attr("class","node-icon-text").attr("style",`height: ${a}px;`).append("div").html(n.iconText),d=parseInt(window.getComputedStyle(f.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;f.attr("style",`-webkit-line-clamp: ${Math.floor((a-2)/d)};`)}else s.append("path").attr("class","node-bkg").attr("id","node-"+n.id).attr("d",`M0 ${a} v${-a} q0,-5 5,-5 h${a} q5,0 5,5 v${a} H0 Z`);i.attr("class","architecture-service");let{width:o,height:l}=i._groups[0][0].getBBox();n.width=o,n.height=l,t.setElementForId(n.id,i)}return 0},"drawServices"),hQe=v(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=zi("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:o,height:l}=i._groups[0][0].getBBox();i.width=o,i.height=l,t.setElementForId(n.id,i)})},"drawJunctions");l4([{name:eb.prefix,icons:eb}]);Jo.use(Dge.default);v(Oge,"addServices");v(Pge,"addJunctions");v(Bge,"positionNodes");v(Fge,"addGroups");v(zge,"addEdges");v($ge,"getAlignments");v(Gge,"getRelativeConstraints");v(Uge,"layoutArchitecture");fQe=v(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),o=i.getGroups(),l=i.getEdges(),u=i.getDataStructures(),h=La(e),f=h.append("g");f.attr("class","architecture-edges");let d=h.append("g");d.attr("class","architecture-services");let p=h.append("g");p.attr("class","architecture-groups"),await uQe(i,d,a),hQe(i,d,s);let g=await Uge(a,s,o,l,u);await lQe(f,g),await cQe(p,g),Bge(i,g),il(void 0,h,zi("padding"),zi("useMaxWidth"))},"draw"),dQe={draw:fQe},pQe={parser:aQe,db:EE,renderer:dQe,styles:oQe}});function oP(t){for(;t.firstChild;)t.removeChild(t.firstChild)}r4();Nu();_u();yl();sl();pc();bo();Ya();kn();o9();Iu();or();xA();lr();var yw="comm",xw="rule",bw="decl";var Pre="@import";var Bre="@keyframes";var Fre="@layer";var l9=Math.abs,py=String.fromCharCode;function ww(t){return t.trim()}function gy(t,e,r){return t.replace(e,r)}function zre(t,e,r){return t.indexOf(e,r)}function Md(t,e){return t.charCodeAt(e)|0}function Yh(t,e,r){return t.slice(e,r)}function Js(t){return t.length}function $re(t){return t.length}function Tg(t,e){return e.push(t),t}var kw=1,Eg=1,Gre=0,Oo=0,mi=0,Cg="";function Tw(t,e,r,n,i,a,s,o){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:kw,column:Eg,length:s,return:"",siblings:o}}function Ure(){return mi}function Vre(){return mi=Oo>0?Md(Cg,--Oo):0,Eg--,mi===10&&(Eg=1,kw--),mi}function Po(){return mi=Oo2||Sg(mi)>3?"":" "}function Yre(t,e){for(;--e&&Po()&&!(mi<48||mi>102||mi>57&&mi<65||mi>70&&mi<97););return Ew(t,my()+(e<6&&Mu()==32&&Po()==32))}function c9(t){for(;Po();)switch(mi){case t:return Oo;case 34:case 39:t!==34&&t!==39&&c9(mi);break;case 40:t===41&&c9(t);break;case 92:Po();break}return Oo}function Xre(t,e){for(;Po()&&t+mi!==57;)if(t+mi===84&&Mu()===47)break;return"/*"+Ew(e,Oo-1)+"*"+py(t===47?t:Po())}function jre(t){for(;!Sg(Mu());)Po();return Ew(t,Oo)}function Qre(t){return Hre(Cw("",null,null,null,[""],t=Wre(t),0,[0],t))}function Cw(t,e,r,n,i,a,s,o,l){for(var u=0,h=0,f=s,d=0,p=0,g=0,m=1,y=1,x=1,b=0,w="",_=i,k=a,E=n,L=w;y;)switch(g=b,b=Po()){case 40:if(g!=108&&Md(L,f-1)==58){zre(L+=gy(Sw(b),"&","&\f"),"&\f",l9(u?o[u-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:L+=Sw(b);break;case 9:case 10:case 13:case 32:L+=qre(g);break;case 92:L+=Yre(my()-1,7);continue;case 47:switch(Mu()){case 42:case 47:Tg(A9e(Xre(Po(),my()),e,r,l),l),(Sg(g||1)==5||Sg(Mu()||1)==5)&&Js(L)&&Yh(L,-1,void 0)!==" "&&(L+=" ");break;default:L+="/"}break;case 123*m:o[u++]=Js(L)*x;case 125*m:case 59:case 0:switch(b){case 0:case 125:y=0;case 59+h:x==-1&&(L=gy(L,/\f/g,"")),p>0&&(Js(L)-f||m===0&&g===47)&&Tg(p>32?Zre(L+";",n,r,f-1,l):Zre(gy(L," ","")+";",n,r,f-2,l),l);break;case 59:L+=";";default:if(Tg(E=Kre(L,e,r,u,h,i,o,w,_=[],k=[],f,a),a),b===123)if(h===0)Cw(L,e,E,E,_,a,f,o,k);else switch(d===99&&Md(L,3)===110?100:d){case 100:case 108:case 109:case 115:Cw(t,E,E,n&&Tg(Kre(t,E,E,0,0,i,o,w,i,_=[],f,k),k),i,k,f,o,n?_:k);break;default:Cw(L,E,E,E,[""],k,0,o,k)}}u=h=p=0,m=x=1,w=L="",f=s;break;case 58:f=1+Js(L),p=g;default:if(m<1){if(b==123)--m;else if(b==125&&m++==0&&Vre()==125)continue}switch(L+=py(b),b*m){case 38:x=h>0?1:(L+="\f",-1);break;case 44:o[u++]=(Js(L)-1)*x,x=1;break;case 64:Mu()===45&&(L+=Sw(Po())),d=Mu(),h=f=Js(w=L+=jre(my())),b++;break;case 45:g===45&&Js(L)==2&&(m=0)}}return a}function Kre(t,e,r,n,i,a,s,o,l,u,h,f){for(var d=i-1,p=i===0?a:[""],g=$re(p),m=0,y=0,x=0;m0?p[b]+" "+w:gy(w,/&\f/g,p[b])))&&(l[x++]=_);return Tw(t,e,r,i===0?xw:o,l,u,h,f)}function A9e(t,e,r,n){return Tw(t,e,r,yw,py(Ure()),Yh(t,2,-2),0,n)}function Zre(t,e,r,n,i){return Tw(t,e,r,bw,Yh(t,0,n),Yh(t,n+1,-1),n,i)}function Aw(t,e){for(var r="",n=0;n/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),mQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(gne(),pne));return{id:jge,diagram:t}},"loader"),vQe={id:jge,detector:gQe,loader:mQe},yQe=vQe,Kge="flowchart",xQe=v((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),bQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ww(),Vw));return{id:Kge,diagram:t}},"loader"),wQe={id:Kge,detector:xQe,loader:bQe},kQe=wQe,Zge="flowchart-v2",TQe=v((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),EQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ww(),Vw));return{id:Zge,diagram:t}},"loader"),SQe={id:Zge,detector:TQe,loader:EQe},CQe=SQe,Qge="er",AQe=v(t=>/^\s*erDiagram/.test(t),"detector"),_Qe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Hne(),Wne));return{id:Qge,diagram:t}},"loader"),LQe={id:Qge,detector:AQe,loader:_Qe},RQe=LQe,Jge="gitGraph",NQe=v(t=>/^\s*gitGraph/.test(t),"detector"),IQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Xle(),Yle));return{id:Jge,diagram:t}},"loader"),MQe={id:Jge,detector:NQe,loader:IQe},DQe=MQe,eme="gantt",OQe=v(t=>/^\s*gantt/.test(t),"detector"),PQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(pce(),dce));return{id:eme,diagram:t}},"loader"),BQe={id:eme,detector:OQe,loader:PQe},FQe=BQe,tme="info",zQe=v(t=>/^\s*info/.test(t),"detector"),$Qe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(mce(),gce));return{id:tme,diagram:t}},"loader"),GQe={id:tme,detector:zQe,loader:$Qe},rme="pie",UQe=v(t=>/^\s*pie/.test(t),"detector"),VQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bce(),xce));return{id:rme,diagram:t}},"loader"),WQe={id:rme,detector:UQe,loader:VQe},nme="quadrantChart",HQe=v(t=>/^\s*quadrantChart/.test(t),"detector"),qQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Bce(),Pce));return{id:nme,diagram:t}},"loader"),YQe={id:nme,detector:HQe,loader:qQe},XQe=YQe,ime="xychart",jQe=v(t=>/^\s*xychart-beta/.test(t),"detector"),KQe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(iue(),nue));return{id:ime,diagram:t}},"loader"),ZQe={id:ime,detector:jQe,loader:KQe},QQe=ZQe,ame="requirement",JQe=v(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),eJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(hue(),uue));return{id:ame,diagram:t}},"loader"),tJe={id:ame,detector:JQe,loader:eJe},rJe=tJe,sme="sequence",nJe=v(t=>/^\s*sequenceDiagram/.test(t),"detector"),iJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Oue(),Due));return{id:sme,diagram:t}},"loader"),aJe={id:sme,detector:nJe,loader:iJe},sJe=aJe,ome="class",oJe=v((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),lJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(que(),Hue));return{id:ome,diagram:t}},"loader"),cJe={id:ome,detector:oJe,loader:lJe},uJe=cJe,lme="classDiagram",hJe=v((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),fJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Xue(),Yue));return{id:lme,diagram:t}},"loader"),dJe={id:lme,detector:hJe,loader:fJe},pJe=dJe,cme="state",gJe=v((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),mJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Mhe(),Ihe));return{id:cme,diagram:t}},"loader"),vJe={id:cme,detector:gJe,loader:mJe},yJe=vJe,ume="stateDiagram",xJe=v((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),bJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ohe(),Dhe));return{id:ume,diagram:t}},"loader"),wJe={id:ume,detector:xJe,loader:bJe},kJe=wJe,hme="journey",TJe=v(t=>/^\s*journey/.test(t),"detector"),EJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(qhe(),Hhe));return{id:hme,diagram:t}},"loader"),SJe={id:hme,detector:TJe,loader:EJe},CJe=SJe,AJe=v((t,e,r)=>{re.debug(`rendering svg for syntax error `);let n=La(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),Hr(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),fme={draw:AJe},_Je=fme,LJe={db:{},renderer:fme,parser:{parse:v(()=>{},"parse")}},RJe=LJe,dme="flowchart-elk",NJe=v((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*flowchart|graph/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),IJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ww(),Vw));return{id:dme,diagram:t}},"loader"),MJe={id:dme,detector:NJe,loader:IJe},DJe=MJe,pme="timeline",OJe=v(t=>/^\s*timeline/.test(t),"detector"),PJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(cfe(),lfe));return{id:pme,diagram:t}},"loader"),BJe={id:pme,detector:OJe,loader:PJe},FJe=BJe,gme="mindmap",zJe=v(t=>/^\s*mindmap/.test(t),"detector"),$Je=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ype(),vpe));return{id:gme,diagram:t}},"loader"),GJe={id:gme,detector:zJe,loader:$Je},UJe=GJe,mme="kanban",VJe=v(t=>/^\s*kanban/.test(t),"detector"),WJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(wpe(),bpe));return{id:mme,diagram:t}},"loader"),HJe={id:mme,detector:VJe,loader:WJe},qJe=HJe,vme="sankey",YJe=v(t=>/^\s*sankey-beta/.test(t),"detector"),XJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(qpe(),Hpe));return{id:vme,diagram:t}},"loader"),jJe={id:vme,detector:YJe,loader:XJe},KJe=jJe,yme="packet",ZJe=v(t=>/^\s*packet-beta/.test(t),"detector"),QJe=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(jpe(),Xpe));return{id:yme,diagram:t}},"loader"),JJe={id:yme,detector:ZJe,loader:QJe},xme="block",eet=v(t=>/^\s*block-beta/.test(t),"detector"),tet=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Cge(),Sge));return{id:xme,diagram:t}},"loader"),ret={id:xme,detector:eet,loader:tet},net=ret,bme="architecture",iet=v(t=>/^\s*architecture/.test(t),"detector"),aet=v(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Wge(),Vge));return{id:bme,diagram:t}},"loader"),set={id:bme,detector:iet,loader:aet},oet=set,Hge=!1,CE=v(()=>{Hge||(Hge=!0,G1("error",RJe,t=>t.toLowerCase().trim()==="error"),G1("---",{db:{clear:v(()=>{},"clear")},styles:{},renderer:{draw:v(()=>{},"draw")},parser:{parse:v(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:v(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),PS(yQe,qJe,pJe,uJe,RQe,FQe,GQe,WQe,rJe,sJe,DJe,CQe,kQe,UJe,FJe,DQe,kJe,yJe,CJe,XQe,KJe,JJe,QQe,net,oet))},"addDiagrams"),cet=v(async()=>{re.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(Bf).map(async([r,{detector:n,loader:i}])=>{if(i)try{Wb(r)}catch{try{let{diagram:a,id:s}=await i();G1(s,a,n)}catch(a){throw re.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete Bf[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){re.error(`Failed to load ${e.length} external diagrams`);for(let r of e)re.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams"),uet="graphics-document document";function kme(t,e){t.attr("role",uet),e!==""&&t.attr("aria-roledescription",e)}v(kme,"setA11yDiagramInfo");function Tme(t,e,r,n){if(t.insert!==void 0){if(r){let i=`chart-desc-${n}`;t.attr("aria-describedby",i),t.insert("desc",":first-child").attr("id",i).text(r)}if(e){let i=`chart-title-${n}`;t.attr("aria-labelledby",i),t.insert("title",":first-child").attr("id",i).text(e)}}}v(Tme,"addSVGa11yTitleDescription");var WO=class Eme{constructor(e,r,n,i,a){this.type=e,this.text=r,this.db=n,this.parser=i,this.renderer=a}static{v(this,"Diagram")}static async fromText(e,r={}){let n=Or(),i=F1(e,n);e=jX(e)+` `;try{Wb(i)}catch{let u=yF(i);if(!u)throw new OS(`Diagram ${i} not found.`);let{id:h,diagram:f}=await u();G1(h,f)}let{db:a,parser:s,renderer:o,init:l}=Wb(i);return s.parser&&(s.parser.yy=a),a.clear?.(),l?.(n),r.title&&a.setDiagramTitle?.(r.title),await s.parse(e),new Eme(i,e,a,s,o)}async render(e,r){await this.renderer.draw(this.text,e,r,this)}getParser(){return this.parser}getType(){return this.type}},qge=[],het=v(()=>{qge.forEach(t=>{t()}),qge=[]},"attachFunctions"),fet=v(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");function Sme(t){let e=t.match(DS);if(!e)return{text:t,metadata:{}};let r=sp(e[1],{schema:ap})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}v(Sme,"extractFrontMatter");var det=v(t=>t.replace(/\r\n?/g,` `).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),pet=v(t=>{let{text:e,metadata:r}=Sme(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),get=v(t=>{let e=Ut.detectInit(t)??{},r=Ut.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:VX(t),directive:e}},"processDirectives");function qO(t){let e=det(t),r=pet(e),n=get(r.text),i=ws(r.config,n.directive);return t=fet(n.text),{code:t,title:r.title,config:i}}v(qO,"preprocessDiagram");function Cme(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}v(Cme,"toBase64");var met=5e4,vet="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",yet="sandbox",xet="loose",bet="http://www.w3.org/2000/svg",wet="http://www.w3.org/1999/xlink",ket="http://www.w3.org/1999/xhtml",Tet="100%",Eet="100%",Cet="border:0;margin:0;",Aet="margin:0",_et="allow-top-navigation-by-user-activation allow-popups",Let='The "iframe" tag is not supported by your browser.',Ret=["foreignobject"],Net=["dominant-baseline"];function YO(t){let e=qO(t);return $1(),CF(e.config??{}),e}v(YO,"processAndSetConfigs");async function Ame(t,e){CE();try{let{code:r,config:n}=YO(t);return{diagramType:(await Lme(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}v(Ame,"parse");var Yge=v((t,e,r=[])=>` .${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),Iet=v((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` ${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` :root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` :root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(o=>{ir(o.styles)||s.forEach(l=>{r+=Yge(o.id,l,o.styles)}),ir(o.textStyles)||(r+=Yge(o.id,"tspan",(o?.textStyles||[]).map(l=>l.replace("color","fill"))))})}return r},"createCssStyles"),Met=v((t,e,r,n)=>{let i=Iet(t,r),a=NF(e,i,t.themeVariables);return Aw(Qre(`${n}{${a}}`),Jre)},"createUserStyles"),Det=v((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=Xs(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),Oet=v((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":Eet,n=Cme(`${t}`);return``},"putIntoIFrame"),Xge=v((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",bet);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function HO(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}v(HO,"sandboxedIframe");var Pet=v((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),Bet=v(async function(t,e,r){CE();let n=YO(e);e=n.code;let i=Or();re.debug(i),e.length>(i?.maxTextSize??met)&&(e=vet);let a="#"+t,s="i"+t,o="#"+s,l="d"+t,u="#"+l,h=v(()=>{let I=Ve(d?o:u).node();I&&"remove"in I&&I.remove()},"removeTempElements"),f=Ve("body"),d=i.securityLevel===yet,p=i.securityLevel===xet,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),d){let T=HO(Ve(r),s);f=Ve(T.nodes()[0].contentDocument.body),f.node().style.margin=0}else f=Ve(r);Xge(f,t,l,`font-family: ${g}`,wet)}else{if(Pet(document,t,l,s),d){let T=HO(Ve("body"),s);f=Ve(T.nodes()[0].contentDocument.body),f.node().style.margin=0}else f=Ve("body");Xge(f,t,l)}let m,y;try{m=await WO.fromText(e,{title:n.title})}catch(T){if(i.suppressErrorRendering)throw h(),T;m=await WO.fromText("error"),y=T}let x=f.select(u).node(),b=m.type,w=x.firstChild,_=w.firstChild,k=m.renderer.getClasses?.(e,m),E=Met(i,b,k,a),L=document.createElement("style");L.innerHTML=E,w.insertBefore(L,_);try{await m.renderer.draw(e,t,dy,m)}catch(T){throw i.suppressErrorRendering?h():_Je.draw(e,t,dy),T}let S=f.select(`${u} svg`),C=m.db.getAccTitle?.(),M=m.db.getAccDescription?.();Rme(b,S,C,M),f.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",ket);let R=f.select(u).node().innerHTML;if(re.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),R=Det(R,d,Wr(i.arrowMarkerAbsolute)),d){let T=f.select(u+" svg").node();R=Oet(R,T)}else p||(R=wme.default.sanitize(R,{ADD_TAGS:Ret,ADD_ATTR:Net}));if(het(),y)throw y;return h(),{diagramType:b,svg:R,bindFunctions:m.db.bindFunctions}},"render");function _me(t={}){let e=Hn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),TF(e),e?.theme&&e.theme in ec?e.themeVariables=ec[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=ec.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?kF(e):BS();Fb(r.logLevel),CE()}v(_me,"initialize");var Lme=v((t,e={})=>{let{code:r}=qO(t);return WO.fromText(r,e)},"getDiagramFromText");function Rme(t,e,r,n){kme(e,t),Tme(e,r,n,e.attr("id"))}v(Rme,"addA11yInfo");var U0=Object.freeze({render:Bet,parse:Ame,getDiagramFromText:Lme,initialize:_me,getConfig:Or,setConfig:FS,getSiteConfig:BS,updateSiteConfig:EF,reset:v(()=>{$1()},"reset"),globalReset:v(()=>{$1(Ff)},"globalReset"),defaultConfig:Ff});Fb(Or().logLevel);$1(Or());var Fet=v((t,e,r)=>{re.warn(t),U3(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),Nme=v(async function(t={querySelector:".mermaid"}){try{await zet(t)}catch(e){if(U3(e)&&re.error(e.str),nh.parseError&&nh.parseError(e),!t.suppressErrors)throw re.error("Use the suppressErrors option to suppress these errors"),e}},"run"),zet=v(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=U0.getConfig();re.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");re.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(re.debug("Start On Load: "+n?.startOnLoad),U0.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new Ut.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,o=[];for(let l of Array.from(i)){if(re.info("Rendering diagram: "+l.id),l.getAttribute("data-processed"))continue;l.setAttribute("data-processed","true");let u=`mermaid-${a.next()}`;s=l.innerHTML,s=Y3(Ut.entityDecode(s)).trim().replace(//gi,"
    ");let h=Ut.detectInit(s);h&&re.debug("Detected early reinit: ",h);try{let{svg:f,bindFunctions:d}=await Ome(u,s,l);l.innerHTML=f,t&&await t(u),d&&d(l)}catch(f){Fet(f,o,nh.parseError)}}if(o.length>0)throw o[0]},"runThrowsErrors"),Ime=v(function(t){U0.initialize(t)},"initialize"),$et=v(async function(t,e,r){re.warn("mermaid.init is deprecated. Please use run instead."),t&&Ime(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await Nme(n)},"init"),Get=v(async(t,{lazyLoad:e=!0}={})=>{CE(),PS(...t),e===!1&&await cet()},"registerExternalDiagrams"),Mme=v(function(){if(nh.startOnLoad){let{startOnLoad:t}=U0.getConfig();t&&nh.run().catch(e=>re.error("Mermaid failed to initialize",e))}},"contentLoaded");typeof document<"u"&&window.addEventListener("load",Mme,!1);var Uet=v(function(t){nh.parseError=t},"setParseErrorHandler"),SE=[],VO=!1,Dme=v(async()=>{if(!VO){for(VO=!0;SE.length>0;){let t=SE.shift();if(t)try{await t()}catch(e){re.error("Error executing queue",e)}}VO=!1}},"executeQueue"),Vet=v(async(t,e)=>new Promise((r,n)=>{let i=v(()=>new Promise((a,s)=>{U0.parse(t,e).then(o=>{a(o),r(o)},o=>{re.error("Error parsing",o),nh.parseError?.(o),s(o),n(o)})}),"performCall");SE.push(i),Dme().catch(n)}),"parse"),Ome=v((t,e,r)=>new Promise((n,i)=>{let a=v(()=>new Promise((s,o)=>{U0.render(t,e,r).then(l=>{s(l),n(l)},l=>{re.error("Error parsing",l),nh.parseError?.(l),o(l),i(l)})}),"performCall");SE.push(a),Dme().catch(i)}),"render"),nh={startOnLoad:!0,mermaidAPI:U0,parse:Vet,render:Ome,init:$et,run:Nme,registerExternalDiagrams:Get,registerLayoutLoaders:s9,initialize:Ime,parseError:void 0,contentLoaded:Mme,setParseErrorHandler:Uet,detectType:F1,registerIconPacks:l4},XO=nh;var jO=class{constructor(e,r){this.container=e;this.content=r;this.setupEventListeners(),this.setupNavigationControls()}isDragging=!1;startPan={x:0,y:0};currentPan={x:0,y:0};scale=1;MIN_SCALE=.5;MAX_SCALE=3;ZOOM_SENSITIVITY=.001;setupEventListeners(){this.container.addEventListener("mousedown",this.onMouseDown.bind(this)),document.addEventListener("mousemove",this.onMouseMove.bind(this)),document.addEventListener("mouseup",this.onMouseUp.bind(this)),this.container.addEventListener("wheel",this.onWheel.bind(this),{passive:!1}),window.addEventListener("resize",this.resetTransform.bind(this))}setupNavigationControls(){let e=document.createElement("div");e.className="mermaid-controls";let r=this.createButton("+",()=>this.zoom(.1)),n=this.createButton("-",()=>this.zoom(-.1)),i=this.createButton("Reset",()=>this.resetTransform());e.appendChild(n),e.appendChild(i),e.appendChild(r),this.container.appendChild(e)}createButton(e,r){let n=document.createElement("button");return n.textContent=e,n.className="mermaid-control-button",n.addEventListener("click",r),window.addCleanup(()=>n.removeEventListener("click",r)),n}onMouseDown(e){e.button===0&&(this.isDragging=!0,this.startPan={x:e.clientX-this.currentPan.x,y:e.clientY-this.currentPan.y},this.container.style.cursor="grabbing")}onMouseMove(e){this.isDragging&&(e.preventDefault(),this.currentPan={x:e.clientX-this.startPan.x,y:e.clientY-this.startPan.y},this.updateTransform())}onMouseUp(){this.isDragging=!1,this.container.style.cursor="grab"}onWheel(e){e.preventDefault();let r=-e.deltaY*this.ZOOM_SENSITIVITY,n=Math.min(Math.max(this.scale+r,this.MIN_SCALE),this.MAX_SCALE),i=this.content.getBoundingClientRect(),a=e.clientX-i.left,s=e.clientY-i.top,o=n-this.scale;this.currentPan.x-=a*o,this.currentPan.y-=s*o,this.scale=n,this.updateTransform()}zoom(e){let r=Math.min(Math.max(this.scale+e,this.MIN_SCALE),this.MAX_SCALE),n=this.content.getBoundingClientRect(),i=n.width/2,a=n.height/2,s=r-this.scale;this.currentPan.x-=i*s,this.currentPan.y-=a*s,this.scale=r,this.updateTransform()}updateTransform(){this.content.style.transform=`translate(${this.currentPan.x}px, ${this.currentPan.y}px) scale(${this.scale})`}resetTransform(){this.scale=1,this.currentPan={x:0,y:0},this.updateTransform()}},Wet=["--secondary","--tertiary","--gray","--light","--lightgray","--highlight","--dark","--darkgray","--codeFont"];document.addEventListener("nav",async()=>{let e=document.querySelector(".center").querySelectorAll("code.mermaid");if(e.length===0)return;let r=Wet.reduce((i,a)=>(i[a]=getComputedStyle(document.documentElement).getPropertyValue(a),i),{}),n=document.documentElement.getAttribute("saved-theme")==="dark";XO.initialize({startOnLoad:!1,securityLevel:"loose",theme:n?"dark":"base",themeVariables:{fontFamily:r["--codeFont"],primaryColor:r["--light"],primaryTextColor:r["--darkgray"],primaryBorderColor:r["--tertiary"],lineColor:r["--darkgray"],secondaryColor:r["--secondary"],tertiaryColor:r["--tertiary"],clusterBkg:r["--light"],edgeLabelBackground:r["--highlight"]}}),await XO.run({nodes:e});for(let i=0;i{y.removeEventListener("click",g),l.removeEventListener("click",p),document.removeEventListener("keydown",m)})}}); /*! Bundled license information: dompurify/dist/purify.js: (*! @license DOMPurify 3.1.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.6/LICENSE *) mermaid/dist/chunks/mermaid.core/chunk-RDESMYQM.mjs: (*! Bundled license information: js-yaml/dist/js-yaml.mjs: (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) *) lodash-es/lodash.js: (** * @license * Lodash (Custom Build) * Build: `lodash modularize exports="es" -o ./` * Copyright OpenJS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *) cytoscape/dist/cytoscape.esm.mjs: (*! Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) Licensed under The MIT License (http://opensource.org/licenses/MIT) *) (*! Event object based on jQuery events, MIT license https://jquery.org/license/ https://tldrlegal.com/license/mit-license https://github.com/jquery/jquery/blob/master/src/event.js *) (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) mermaid/dist/mermaid.core.mjs: (*! Check if previously processed *) (*! * Wait for document loaded before starting the execution *) */