1 介绍

1.1 定义

01.技术定位
    a.工具库特性
        a.功能说明
            go-kit是一个用于构建微服务的Go语言工具库,提供了一套标准化的组件和模式来解决分布式系统开发中的常见问题。它不是一个框架,而是一组可组合的库,开发者可以根据需求选择性使用。go-kit遵循Go语言的设计哲学,强调简洁性和可组合性,通过提供传输层抽象、服务端点定义、中间件机制等核心组件,帮助开发者快速构建可维护、可扩展的微服务系统。
        b.代码示例
            ---
            // go-kit基础服务定义示例
            package main

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // 定义服务接口
            type StringService interface {
                Uppercase(context.Context, string) (string, error)
                Count(context.Context, string) int
            }

            // 实现服务接口
            type stringService struct{}

            func (stringService) Uppercase(_ context.Context, s string) (string, error) {
                return strings.ToUpper(s), nil
            }

            func (stringService) Count(_ context.Context, s string) int {
                return len(s)
            }
            ---
    b.设计理念
        a.功能说明
            go-kit采用洋葱架构模式,将服务分为三个核心层次:Service层负责业务逻辑实现,Endpoint层处理请求响应转换,Transport层负责协议适配。这种分层设计使得业务逻辑与传输协议解耦,同一个服务可以轻松支持HTTP、gRPC、Thrift等多种传输协议。中间件机制贯穿各个层次,提供日志、监控、限流、熔断等横切关注点的统一处理方式。
        b.代码示例
            ---
            // Endpoint层定义
            func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(uppercaseRequest)
                    v, err := svc.Uppercase(ctx, req.S)
                    if err != nil {
                        return uppercaseResponse{v, err.Error()}, nil
                    }
                    return uppercaseResponse{v, ""}, nil
                }
            }

            // 请求响应结构
            type uppercaseRequest struct {
                S string `json:"s"`
            }

            type uppercaseResponse struct {
                V   string `json:"v"`
                Err string `json:"err,omitempty"`
            }
            ---

02.核心价值
    a.标准化开发
        a.功能说明
            go-kit为微服务开发提供了一套标准化的开发模式和最佳实践,包括服务定义、端点创建、传输层绑定、中间件应用等环节都有明确的规范。这种标准化降低了团队协作成本,新成员可以快速理解项目结构,代码审查和维护也更加容易。同时,标准化的模式使得服务间的集成更加顺畅,减少了因实现差异导致的问题。
        b.代码示例
            ---
            // 标准化的服务构建流程
            func main() {
                // 1. 创建服务实例
                var svc StringService
                svc = stringService{}

                // 2. 添加中间件
                svc = loggingMiddleware{logger, svc}
                svc = instrumentingMiddleware{requestCount, requestLatency, countResult, svc}

                // 3. 创建端点
                uppercaseEndpoint := makeUppercaseEndpoint(svc)
                countEndpoint := makeCountEndpoint(svc)

                // 4. 添加端点中间件
                uppercaseEndpoint = loggingMiddleware(logger)(uppercaseEndpoint)
                uppercaseEndpoint = rateLimitMiddleware(rate.NewLimiter(1, 100))(uppercaseEndpoint)

                // 5. 绑定传输层
                uppercaseHandler := httptransport.NewServer(
                    uppercaseEndpoint,
                    decodeUppercaseRequest,
                    encodeResponse,
                )
            }
            ---
    b.可观测性
        a.功能说明
            go-kit内置了对日志、监控指标、分布式追踪的完整支持,通过中间件机制可以无侵入地为服务添加可观测性能力。支持与Prometheus、Zipkin、Jaeger等主流监控系统集成,提供请求计数、延迟统计、错误率监控等关键指标。这些能力对于生产环境的服务运维至关重要,帮助开发者快速定位问题、分析性能瓶颈。
        b.代码示例
            ---
            // 监控中间件示例
            import (
                "github.com/go-kit/kit/metrics"
                "github.com/go-kit/kit/metrics/prometheus"
                stdprometheus "github.com/prometheus/client_golang/prometheus"
            )

            func instrumentingMiddleware(
                requestCount metrics.Counter,
                requestLatency metrics.Histogram,
                countResult metrics.Histogram,
            ) ServiceMiddleware {
                return func(next StringService) StringService {
                    return instrmw{requestCount, requestLatency, countResult, next}
                }
            }

            type instrmw struct {
                requestCount   metrics.Counter
                requestLatency metrics.Histogram
                countResult    metrics.Histogram
                StringService
            }

            func (mw instrmw) Uppercase(ctx context.Context, s string) (output string, err error) {
                defer func(begin time.Time) {
                    mw.requestCount.With("method", "uppercase").Add(1)
                    mw.requestLatency.With("method", "uppercase").Observe(time.Since(begin).Seconds())
                }(time.Now())
                output, err = mw.StringService.Uppercase(ctx, s)
                return
            }
            ---

1.2 核心概念

01.服务层Service
    a.业务逻辑封装
        a.功能说明
            Service层是go-kit架构的核心,负责封装所有业务逻辑。它通常定义为Go接口,包含服务提供的所有业务方法。Service层不关心传输协议、序列化方式或中间件逻辑,只专注于业务功能的实现。这种设计使得业务逻辑可以独立测试,不依赖于任何外部框架或传输机制。Service接口的方法签名通常接收context.Context作为第一个参数,用于传递请求上下文和超时控制。
        b.代码示例
            ---
            // Service层接口定义
            package service

            import "context"

            // UserService 用户服务接口
            type UserService interface {
                // CreateUser 创建用户
                CreateUser(ctx context.Context, username, email string) (User, error)
                // GetUser 获取用户信息
                GetUser(ctx context.Context, id string) (User, error)
                // UpdateUser 更新用户信息
                UpdateUser(ctx context.Context, id string, updates UserUpdates) error
                // DeleteUser 删除用户
                DeleteUser(ctx context.Context, id string) error
            }

            // User 用户模型
            type User struct {
                ID       string `json:"id"`
                Username string `json:"username"`
                Email    string `json:"email"`
                Created  int64  `json:"created"`
            }

            // UserUpdates 用户更新字段
            type UserUpdates struct {
                Username *string `json:"username,omitempty"`
                Email    *string `json:"email,omitempty"`
            }
            ---
    b.服务实现
        a.功能说明
            Service接口的具体实现包含实际的业务逻辑处理,可能涉及数据库操作、外部API调用、业务规则验证等。实现类通常持有必要的依赖项,如数据库连接、缓存客户端、其他服务的客户端等。通过依赖注入的方式,可以方便地进行单元测试和集成测试。Service实现应该保持纯粹的业务逻辑,避免混入日志、监控等横切关注点,这些功能应该通过中间件来实现。
        b.代码示例
            ---
            // Service接口实现
            package service

            import (
                "context"
                "errors"
                "time"
            )

            type userService struct {
                db    Database
                cache Cache
            }

            // NewUserService 创建用户服务实例
            func NewUserService(db Database, cache Cache) UserService {
                return &userService{
                    db:    db,
                    cache: cache,
                }
            }

            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                // 验证输入
                if username == "" || email == "" {
                    return User{}, errors.New("username and email are required")
                }

                // 创建用户对象
                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                    Created:  time.Now().Unix(),
                }

                // 保存到数据库
                if err := s.db.SaveUser(ctx, user); err != nil {
                    return User{}, err
                }

                // 更新缓存
                s.cache.Set(ctx, "user:"+user.ID, user, 5*time.Minute)

                return user, nil
            }

            func (s *userService) GetUser(ctx context.Context, id string) (User, error) {
                // 先查缓存
                if user, ok := s.cache.Get(ctx, "user:"+id); ok {
                    return user.(User), nil
                }

                // 查数据库
                user, err := s.db.GetUser(ctx, id)
                if err != nil {
                    return User{}, err
                }

                // 写入缓存
                s.cache.Set(ctx, "user:"+id, user, 5*time.Minute)

                return user, nil
            }
            ---

02.端点层Endpoint
    a.请求响应转换
        a.功能说明
            Endpoint是go-kit中连接Service层和Transport层的桥梁,它将具体的业务方法抽象为统一的函数签名。每个Endpoint接收context.Context和request接口,返回response接口和error。Endpoint的主要职责是将传输层的请求数据转换为Service方法的参数,调用Service方法,然后将返回结果封装为响应对象。这种抽象使得同一个Service可以通过不同的Endpoint暴露给不同的传输协议。
        b.代码示例
            ---
            // Endpoint定义
            package endpoint

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // MakeCreateUserEndpoint 创建用户端点
            func MakeCreateUserEndpoint(svc service.UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }

            // MakeGetUserEndpoint 获取用户端点
            func MakeGetUserEndpoint(svc service.UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(GetUserRequest)
                    user, err := svc.GetUser(ctx, req.ID)
                    if err != nil {
                        return GetUserResponse{Err: err.Error()}, nil
                    }
                    return GetUserResponse{User: user}, nil
                }
            }

            // 请求响应结构
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }

            type CreateUserResponse struct {
                User service.User `json:"user,omitempty"`
                Err  string       `json:"err,omitempty"`
            }

            type GetUserRequest struct {
                ID string `json:"id"`
            }

            type GetUserResponse struct {
                User service.User `json:"user,omitempty"`
                Err  string       `json:"err,omitempty"`
            }
            ---
    b.端点组合
        a.功能说明
            Endpoint可以通过中间件进行组合和增强,形成处理链。中间件可以在Endpoint执行前后添加额外的处理逻辑,如日志记录、性能监控、限流控制、熔断保护等。多个中间件可以链式组合,按照添加顺序依次执行。这种设计模式使得横切关注点的实现与业务逻辑完全解耦,提高了代码的可维护性和可测试性。
        b.代码示例
            ---
            // Endpoint中间件组合
            package endpoint

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/metrics"
            )

            // LoggingMiddleware 日志中间件
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        logger.Log("msg", "calling endpoint", "request", request)
                        defer func(begin time.Time) {
                            logger.Log(
                                "msg", "called endpoint",
                                "request", request,
                                "response", response,
                                "err", err,
                                "took", time.Since(begin),
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // InstrumentingMiddleware 监控中间件
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            duration.With("success", fmt.Sprint(err == nil)).Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 应用中间件
            func ApplyMiddleware(e endpoint.Endpoint, logger log.Logger, duration metrics.Histogram) endpoint.Endpoint {
                e = LoggingMiddleware(logger)(e)
                e = InstrumentingMiddleware(duration)(e)
                return e
            }
            ---

1.3 优缺点

01.优势
    a.架构清晰
        a.功能说明
            go-kit采用分层架构设计,将服务分为Service、Endpoint、Transport三层,每层职责明确,边界清晰。这种架构使得代码组织结构化,易于理解和维护。业务逻辑与传输协议完全解耦,同一个服务可以轻松支持多种传输方式。分层设计也便于团队协作,不同层次可以由不同的开发人员负责,降低了开发复杂度。
        b.代码示例
            ---
            // 清晰的分层架构示例
            package main

            // Service层:纯业务逻辑
            type CalculatorService interface {
                Add(a, b int) int
                Subtract(a, b int) int
            }

            type calculatorService struct{}

            func (calculatorService) Add(a, b int) int      { return a + b }
            func (calculatorService) Subtract(a, b int) int { return a - b }

            // Endpoint层:请求响应转换
            func makeAddEndpoint(svc CalculatorService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(addRequest)
                    result := svc.Add(req.A, req.B)
                    return addResponse{Result: result}, nil
                }
            }

            // Transport层:HTTP绑定
            func makeHTTPHandler(endpoints Endpoints) http.Handler {
                r := mux.NewRouter()
                r.Methods("POST").Path("/add").Handler(httptransport.NewServer(
                    endpoints.AddEndpoint,
                    decodeAddRequest,
                    encodeResponse,
                ))
                return r
            }

            // Transport层:gRPC绑定(同一个Service)
            func makeGRPCServer(endpoints Endpoints) pb.CalculatorServer {
                return &grpcServer{
                    add: grpctransport.NewServer(
                        endpoints.AddEndpoint,
                        decodeGRPCAddRequest,
                        encodeGRPCAddResponse,
                    ),
                }
            }
            ---
    b.可扩展性强
        a.功能说明
            go-kit的中间件机制提供了强大的扩展能力,可以在不修改业务代码的情况下添加新功能。中间件可以应用在Service层、Endpoint层和Transport层,实现日志、监控、限流、熔断等横切关注点。中间件采用装饰器模式,可以灵活组合,按需启用或禁用。这种设计使得系统功能可以渐进式增强,降低了维护成本。
        b.代码示例
            ---
            // 灵活的中间件扩展
            package middleware

            import (
                "context"
                "time"
            )

            // Service层中间件:日志
            func LoggingMiddleware(logger log.Logger) ServiceMiddleware {
                return func(next StringService) StringService {
                    return loggingMiddleware{logger, next}
                }
            }

            type loggingMiddleware struct {
                logger log.Logger
                next   StringService
            }

            func (mw loggingMiddleware) Uppercase(ctx context.Context, s string) (output string, err error) {
                defer func(begin time.Time) {
                    mw.logger.Log(
                        "method", "uppercase",
                        "input", s,
                        "output", output,
                        "err", err,
                        "took", time.Since(begin),
                    )
                }(time.Now())
                return mw.next.Uppercase(ctx, s)
            }

            // Endpoint层中间件:限流
            func RateLimitMiddleware(limit rate.Limiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limit.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 组合多个中间件
            func BuildService() StringService {
                var svc StringService
                svc = basicService{}
                svc = LoggingMiddleware(logger)(svc)
                svc = InstrumentingMiddleware(counter, histogram)(svc)
                svc = CachingMiddleware(cache)(svc)
                return svc
            }
            ---
    c.生产就绪
        a.功能说明
            go-kit内置了生产环境所需的各种能力,包括日志记录、指标监控、分布式追踪、服务发现、负载均衡、熔断降级等。这些功能都经过了大规模生产环境的验证,可以直接使用。go-kit与主流的监控系统如Prometheus、Zipkin、Jaeger等无缝集成,提供了开箱即用的可观测性支持。这大大降低了微服务系统从开发到生产部署的门槛。
        b.代码示例
            ---
            // 生产就绪的服务配置
            package main

            import (
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/metrics/prometheus"
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/consul"
                stdprometheus "github.com/prometheus/client_golang/prometheus"
            )

            func main() {
                // 日志配置
                var logger log.Logger
                logger = log.NewLogfmtLogger(os.Stderr)
                logger = log.With(logger, "ts", log.DefaultTimestampUTC)
                logger = log.With(logger, "caller", log.DefaultCaller)

                // 监控指标
                fieldKeys := []string{"method", "error"}
                requestCount := prometheus.NewCounterFrom(stdprometheus.CounterOpts{
                    Namespace: "my_service",
                    Subsystem: "string_service",
                    Name:      "request_count",
                    Help:      "Number of requests received.",
                }, fieldKeys)
                requestLatency := prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
                    Namespace: "my_service",
                    Subsystem: "string_service",
                    Name:      "request_latency_microseconds",
                    Help:      "Total duration of requests in microseconds.",
                }, fieldKeys)

                // 服务发现(Consul)
                consulClient, _ := api.NewClient(api.DefaultConfig())
                client := consul.NewClient(consulClient)
                registrar := consul.NewRegistrar(client, &api.AgentServiceRegistration{
                    ID:      "my-service-1",
                    Name:    "my-service",
                    Port:    8080,
                    Address: "localhost",
                    Check: &api.AgentServiceCheck{
                        HTTP:     "http://localhost:8080/health",
                        Interval: "10s",
                        Timeout:  "1s",
                    },
                })
                registrar.Register()
                defer registrar.Deregister()

                // 构建服务
                var svc StringService
                svc = stringService{}
                svc = loggingMiddleware{logger, svc}
                svc = instrumentingMiddleware{requestCount, requestLatency, svc}
            }
            ---

02.局限性
    a.学习曲线
        a.功能说明
            go-kit的概念较多,包括Service、Endpoint、Transport、Middleware等多个层次,初学者需要时间理解这些概念及其关系。相比于传统的Web框架,go-kit的抽象层次更高,代码结构更复杂。开发者需要理解函数式编程的思想,掌握中间件的组合模式。对于简单的应用,go-kit可能显得过于复杂,增加了不必要的开发成本。
        b.代码示例
            ---
            // 初学者可能觉得复杂的代码结构
            package main

            // 需要理解多个概念
            type StringService interface { /* Service层 */ }
            type Endpoints struct { /* Endpoint层 */ }
            type Middleware func(endpoint.Endpoint) endpoint.Endpoint /* 中间件 */

            // 需要编写大量样板代码
            func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(uppercaseRequest)
                    v, err := svc.Uppercase(ctx, req.S)
                    if err != nil {
                        return uppercaseResponse{v, err.Error()}, nil
                    }
                    return uppercaseResponse{v, ""}, nil
                }
            }

            func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var request uppercaseRequest
                if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
                    return nil, err
                }
                return request, nil
            }

            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                return json.NewEncoder(w).Encode(response)
            }

            // 对于简单的Hello World,代码量较大
            ---
    b.样板代码多
        a.功能说明
            使用go-kit开发服务需要编写较多的样板代码,包括请求响应结构定义、编解码函数、Endpoint创建函数等。每个服务方法都需要定义对应的请求响应类型,编写Endpoint转换逻辑和编解码函数。虽然这些代码结构清晰,但对于小型项目来说可能显得繁琐。不过,这些样板代码可以通过代码生成工具自动生成,减轻开发负担。
        b.代码示例
            ---
            // 每个方法需要的样板代码
            package endpoint

            // 1. 定义请求响应结构
            type uppercaseRequest struct {
                S string `json:"s"`
            }

            type uppercaseResponse struct {
                V   string `json:"v"`
                Err string `json:"err,omitempty"`
            }

            // 2. 创建Endpoint
            func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(uppercaseRequest)
                    v, err := svc.Uppercase(ctx, req.S)
                    if err != nil {
                        return uppercaseResponse{v, err.Error()}, nil
                    }
                    return uppercaseResponse{v, ""}, nil
                }
            }

            // 3. HTTP编解码函数
            func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var request uppercaseRequest
                if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
                    return nil, err
                }
                return request, nil
            }

            // 4. gRPC编解码函数(如果支持gRPC)
            func decodeGRPCUppercaseRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.UppercaseRequest)
                return uppercaseRequest{S: req.S}, nil
            }

            // 每个方法都需要重复以上步骤
            ---

1.4 使用场景

01.微服务架构
    a.分布式系统构建
        a.功能说明
            go-kit专为微服务架构设计,适合构建大规模分布式系统。它提供了服务发现、负载均衡、熔断降级等微服务必备功能,帮助开发者快速搭建可靠的分布式服务集群。go-kit的分层架构使得服务间的通信标准化,降低了系统集成的复杂度。支持多种传输协议,可以根据不同场景选择最合适的通信方式,如内部服务使用gRPC提高性能,对外API使用HTTP提供兼容性。
        b.代码示例
            ---
            // 微服务集群示例
            package main

            import (
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/consul"
                "github.com/go-kit/kit/sd/lb"
            )

            func main() {
                // 服务发现配置
                consulClient, _ := api.NewClient(api.DefaultConfig())
                client := consul.NewClient(consulClient)

                // 订阅用户服务实例
                instancer := consul.NewInstancer(client, logger, "user-service", []string{}, true)

                // 创建端点工厂
                factory := func(instance string) (endpoint.Endpoint, io.Closer, error) {
                    return makeUserServiceEndpoint(instance), nil, nil
                }

                // 负载均衡器(轮询策略)
                endpointer := sd.NewEndpointer(instancer, factory, logger)
                balancer := lb.NewRoundRobin(endpointer)

                // 重试机制
                retry := lb.Retry(3, 500*time.Millisecond, balancer)

                // 使用负载均衡的端点
                response, err := retry(ctx, createUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                })
            }

            // 服务注册
            func registerService() {
                registrar := consul.NewRegistrar(client, &api.AgentServiceRegistration{
                    ID:      "user-service-1",
                    Name:    "user-service",
                    Port:    8080,
                    Address: "192.168.1.10",
                    Tags:    []string{"v1", "production"},
                    Check: &api.AgentServiceCheck{
                        HTTP:     "http://192.168.1.10:8080/health",
                        Interval: "10s",
                        Timeout:  "2s",
                    },
                })
                registrar.Register()
            }
            ---
    b.服务网格集成
        a.功能说明
            go-kit可以与服务网格如Istio、Linkerd等无缝集成,利用服务网格提供的流量管理、安全通信、可观测性等能力。go-kit负责业务逻辑实现,服务网格负责基础设施层面的服务治理。这种组合可以充分发挥各自的优势,go-kit的中间件机制与服务网格的Sidecar模式相辅相成,共同构建健壮的微服务系统。
        b.代码示例
            ---
            // 与Istio集成的服务配置
            package main

            import (
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/tracing/opentracing"
                stdopentracing "github.com/opentracing/opentracing-go"
            )

            func main() {
                // OpenTracing配置(与Istio Jaeger集成)
                tracer := stdopentracing.GlobalTracer()

                // 创建带追踪的Endpoint
                var endpoint endpoint.Endpoint
                endpoint = makeCreateUserEndpoint(svc)
                endpoint = opentracing.TraceServer(tracer, "CreateUser")(endpoint)

                // HTTP服务器配置
                handler := httptransport.NewServer(
                    endpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                    httptransport.ServerBefore(
                        opentracing.HTTPToContext(tracer, "CreateUser", logger),
                    ),
                )

                // 健康检查端点(供Istio探测)
                http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
                    w.WriteHeader(http.StatusOK)
                    w.Write([]byte("OK"))
                })

                // 就绪检查端点
                http.HandleFunc("/ready", func(w http.ResponseWriter, r *http.Request) {
                    if isReady() {
                        w.WriteHeader(http.StatusOK)
                    } else {
                        w.WriteHeader(http.StatusServiceUnavailable)
                    }
                })

                // 启动服务(Istio会自动注入Envoy Sidecar)
                http.ListenAndServe(":8080", handler)
            }
            ---

02.API网关
    a.统一入口
        a.功能说明
            go-kit可以用于构建API网关,作为微服务集群的统一入口。API网关负责请求路由、协议转换、认证授权、限流熔断等功能。go-kit的中间件机制非常适合实现这些横切关注点,可以灵活组合各种功能模块。通过Endpoint的组合和转发,可以实现服务聚合、请求编排等高级功能,为前端提供统一的API接口。
        b.代码示例
            ---
            // API网关实现
            package gateway

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/lb"
            )

            // Gateway 网关结构
            type Gateway struct {
                userEndpoint    endpoint.Endpoint
                productEndpoint endpoint.Endpoint
                orderEndpoint   endpoint.Endpoint
            }

            // NewGateway 创建网关实例
            func NewGateway(
                userInstancer sd.Instancer,
                productInstancer sd.Instancer,
                orderInstancer sd.Instancer,
            ) *Gateway {
                // 用户服务端点
                userFactory := makeUserServiceFactory()
                userEndpointer := sd.NewEndpointer(userInstancer, userFactory, logger)
                userBalancer := lb.NewRoundRobin(userEndpointer)
                userEndpoint := lb.Retry(3, 500*time.Millisecond, userBalancer)

                // 商品服务端点
                productFactory := makeProductServiceFactory()
                productEndpointer := sd.NewEndpointer(productInstancer, productFactory, logger)
                productBalancer := lb.NewRoundRobin(productEndpointer)
                productEndpoint := lb.Retry(3, 500*time.Millisecond, productBalancer)

                // 订单服务端点
                orderFactory := makeOrderServiceFactory()
                orderEndpointer := sd.NewEndpointer(orderInstancer, orderFactory, logger)
                orderBalancer := lb.NewRoundRobin(orderEndpointer)
                orderEndpoint := lb.Retry(3, 500*time.Millisecond, orderBalancer)

                return &Gateway{
                    userEndpoint:    userEndpoint,
                    productEndpoint: productEndpoint,
                    orderEndpoint:   orderEndpoint,
                }
            }

            // AggregateOrderDetails 聚合订单详情(调用多个服务)
            func (g *Gateway) AggregateOrderDetails(ctx context.Context, orderID string) (OrderDetails, error) {
                // 并发调用多个服务
                var wg sync.WaitGroup
                var order Order
                var user User
                var products []Product
                var err error

                wg.Add(3)

                // 获取订单信息
                go func() {
                    defer wg.Done()
                    resp, e := g.orderEndpoint(ctx, getOrderRequest{ID: orderID})
                    if e != nil {
                        err = e
                        return
                    }
                    order = resp.(getOrderResponse).Order
                }()

                // 获取用户信息
                go func() {
                    defer wg.Done()
                    resp, e := g.userEndpoint(ctx, getUserRequest{ID: order.UserID})
                    if e != nil {
                        err = e
                        return
                    }
                    user = resp.(getUserResponse).User
                }()

                // 获取商品信息
                go func() {
                    defer wg.Done()
                    resp, e := g.productEndpoint(ctx, getProductsRequest{IDs: order.ProductIDs})
                    if e != nil {
                        err = e
                        return
                    }
                    products = resp.(getProductsResponse).Products
                }()

                wg.Wait()

                if err != nil {
                    return OrderDetails{}, err
                }

                return OrderDetails{
                    Order:    order,
                    User:     user,
                    Products: products,
                }, nil
            }
            ---
    b.协议转换
        a.功能说明
            API网关可以实现不同协议之间的转换,如将HTTP请求转换为gRPC��用后端服务,或将内部的Thrift服务暴露为RESTful API。go-kit的Transport层抽象使得协议转换变得简单,只需要为同一个Endpoint绑定不同的Transport即可。这种能力对于渐进式迁移非常有用,可以在不影响客户端的情况下逐步升级后端服务的通信协议。
        b.代码示例
            ---
            // 协议转换网关
            package gateway

            import (
                "github.com/go-kit/kit/transport/http"
                "github.com/go-kit/kit/transport/grpc"
            )

            // 将HTTP请求转换为gRPC调用
            func makeHTTPToGRPCGateway(grpcConn *grpc.ClientConn) http.Handler {
                // 创建gRPC客户端端点
                createUserEndpoint := grpctransport.NewClient(
                    grpcConn,
                    "UserService",
                    "CreateUser",
                    encodeGRPCCreateUserRequest,
                    decodeGRPCCreateUserResponse,
                    pb.CreateUserResponse{},
                ).Endpoint()

                // 绑定HTTP传输层
                createUserHandler := httptransport.NewServer(
                    createUserEndpoint,
                    decodeHTTPCreateUserRequest,
                    encodeHTTPResponse,
                    httptransport.ServerBefore(
                        httptransport.PopulateRequestContext,
                    ),
                )

                r := mux.NewRouter()
                r.Methods("POST").Path("/users").Handler(createUserHandler)
                return r
            }

            // HTTP请求解码
            func decodeHTTPCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            // gRPC请求编码
            func encodeGRPCCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(CreateUserRequest)
                return &pb.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            // gRPC响应解码
            func decodeGRPCCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(*pb.CreateUserResponse)
                return CreateUserResponse{
                    User: User{
                        ID:       resp.User.Id,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }
            ---

03.遗留系统改造
    a.渐进式迁移
        a.功能说明
            go-kit适合用于遗留系统的微服务化改造,可以采用渐进式迁移策略,逐步将单体应用拆分为微服务。首先将核心业务逻辑抽取为Service接口,然后通过Endpoint和Transport层暴露服务。在迁移过程中,可以保持原有系统继续运行,新功能使用微服务实现,逐步替换旧模块。go-kit的灵活性使得新旧系统可以并存,降低了迁移风险。
        b.代码示例
            ---
            // 遗留系统适配器
            package adapter

            import (
                "context"
                "legacy/oldservice"
            )

            // LegacyServiceAdapter 遗留服务适配器
            type LegacyServiceAdapter struct {
                legacyService *oldservice.OldService
            }

            // NewLegacyServiceAdapter 创建适配器
            func NewLegacyServiceAdapter(legacy *oldservice.OldService) UserService {
                return &LegacyServiceAdapter{
                    legacyService: legacy,
                }
            }

            // CreateUser 适配旧接口到新接口
            func (a *LegacyServiceAdapter) CreateUser(ctx context.Context, username, email string) (User, error) {
                // 调用遗留系统的方法
                oldUser, err := a.legacyService.AddUser(username, email)
                if err != nil {
                    return User{}, err
                }

                // 转换数据结构
                return User{
                    ID:       oldUser.UserID,
                    Username: oldUser.Name,
                    Email:    oldUser.EmailAddress,
                    Created:  oldUser.CreateTime.Unix(),
                }, nil
            }

            // 主程序中使用适配器
            func main() {
                // 初始化遗留系统
                legacyService := oldservice.NewOldService(db)

                // 创建适配器
                var svc UserService
                svc = NewLegacyServiceAdapter(legacyService)

                // 添加go-kit中间件
                svc = loggingMiddleware{logger, svc}
                svc = instrumentingMiddleware{counter, histogram, svc}

                // 创建Endpoint
                createUserEndpoint := makeCreateUserEndpoint(svc)

                // 暴露为HTTP服务
                handler := httptransport.NewServer(
                    createUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                )

                // 新旧系统共存
                http.Handle("/api/v2/users", handler)           // 新API
                http.Handle("/api/v1/", legacyService.Handler()) // 旧API
                http.ListenAndServe(":8080", nil)
            }
            ---
    b.功能增强
        a.功能说明
            在不修改遗留系统代码的前提下,通过go-kit的中间件机制为旧服务添加新功能。可以为遗留服务添加日志记录、性能监控、限流保护、熔断降级等现代微服务所需的能力。这种非侵入式的增强方式不会影响原有系统的稳定性,同时提升了系统的可维护性和可观测性。适配器模式使得新旧系统的集成变得简单,降低了技术债务。
        b.代码示例
            ---
            // 为遗留服务添加现代化能力
            package main

            import (
                "github.com/go-kit/kit/circuitbreaker"
                "github.com/go-kit/kit/ratelimit"
                "github.com/sony/gobreaker"
                "golang.org/x/time/rate"
            )

            func enhanceLegacyService(legacy UserService) UserService {
                // 1. 添加日志
                legacy = loggingMiddleware{logger, legacy}

                // 2. 添加监控指标
                legacy = instrumentingMiddleware{
                    requestCount:   requestCounter,
                    requestLatency: requestHistogram,
                    next:           legacy,
                }

                // 3. 添加限流(每秒100个请求)
                limiter := rate.NewLimiter(100, 100)
                legacy = rateLimitMiddleware{limiter, legacy}

                // 4. 添加熔断器
                breaker := gobreaker.NewCircuitBreaker(gobreaker.Settings{
                    Name:        "UserService",
                    MaxRequests: 3,
                    Interval:    time.Minute,
                    Timeout:     30 * time.Second,
                })
                legacy = circuitBreakerMiddleware{breaker, legacy}

                // 5. 添加缓存
                cache := NewRedisCache(redisClient)
                legacy = cachingMiddleware{cache, 5 * time.Minute, legacy}

                return legacy
            }

            // 限流中间件
            type rateLimitMiddleware struct {
                limiter *rate.Limiter
                next    UserService
            }

            func (mw rateLimitMiddleware) CreateUser(ctx context.Context, username, email string) (User, error) {
                if !mw.limiter.Allow() {
                    return User{}, ErrRateLimitExceeded
                }
                return mw.next.CreateUser(ctx, username, email)
            }

            // 熔断中间件
            type circuitBreakerMiddleware struct {
                breaker *gobreaker.CircuitBreaker
                next    UserService
            }

            func (mw circuitBreakerMiddleware) CreateUser(ctx context.Context, username, email string) (User, error) {
                result, err := mw.breaker.Execute(func() (interface{}, error) {
                    return mw.next.CreateUser(ctx, username, email)
                })
                if err != nil {
                    return User{}, err
                }
                return result.(User), nil
            }
            ---

1.5 架构原理

01.洋葱架构
    a.分层设计
        a.功能说明
            go-kit采用洋葱架构模式,将服务分为多个同心圆层次,从内到外依次是Service层、Endpoint层、Transport层和Middleware层。最内层的Service层包含纯粹的业务逻辑,不依赖任何外部框架。Endpoint层负责请求响应的转换和编排。Transport层处理具体的传输协议如HTTP、gRPC等。Middleware层横跨各层,提供日志、监控、限流等横切关注点。这种架构使得各层职责清晰,依赖关系单向,便于测试和维护。
        b.代码示例
            ---
            // 洋葱架构实现
            package architecture

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // 第1层:Service层(核心业务逻辑)
            type OrderService interface {
                CreateOrder(ctx context.Context, userID string, items []Item) (Order, error)
                GetOrder(ctx context.Context, orderID string) (Order, error)
            }

            type orderService struct {
                db    Database
                cache Cache
            }

            func (s *orderService) CreateOrder(ctx context.Context, userID string, items []Item) (Order, error) {
                // 纯业务逻辑:验证、计算、存储
                order := Order{
                    ID:     generateOrderID(),
                    UserID: userID,
                    Items:  items,
                    Total:  calculateTotal(items),
                    Status: "pending",
                }
                return s.db.SaveOrder(ctx, order)
            }

            // 第2层:Endpoint层(请求响应转换)
            func makeCreateOrderEndpoint(svc OrderService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(createOrderRequest)
                    order, err := svc.CreateOrder(ctx, req.UserID, req.Items)
                    if err != nil {
                        return createOrderResponse{Err: err.Error()}, nil
                    }
                    return createOrderResponse{Order: order}, nil
                }
            }

            // 第3层:Transport层(协议绑定)
            func makeHTTPHandler(endpoint endpoint.Endpoint) http.Handler {
                return httptransport.NewServer(
                    endpoint,
                    decodeCreateOrderRequest,
                    encodeResponse,
                )
            }

            // 第4层:Middleware层(横切关注点)
            func applyMiddleware(e endpoint.Endpoint) endpoint.Endpoint {
                e = loggingMiddleware(logger)(e)
                e = instrumentingMiddleware(metrics)(e)
                e = rateLimitMiddleware(limiter)(e)
                e = circuitBreakerMiddleware(breaker)(e)
                return e
            }
            ---
    b.依赖倒置
        a.功能说明
            go-kit遵循依赖倒置原则,高层模块不依赖低层模块,两者都依赖抽象。Service层定义为接口,具体实现可以灵活替换。Endpoint层依赖Service接口而非具体实现,使得业务逻辑可以独立测试。Transport层依赖Endpoint抽象,可以支持多种传输协议。这种设计使得系统各部分松耦合,易于扩展和维护。依赖注入机制使得组件的组装和配置变得灵活。
        b.代码示例
            ---
            // 依赖倒置示例
            package main

            import "context"

            // 定义抽象接口(高层模块依赖)
            type UserRepository interface {
                Save(ctx context.Context, user User) error
                FindByID(ctx context.Context, id string) (User, error)
            }

            type EmailService interface {
                SendWelcomeEmail(ctx context.Context, email string) error
            }

            // Service层依赖抽象接口
            type userService struct {
                repo  UserRepository  // 依赖抽象
                email EmailService    // 依赖抽象
            }

            func NewUserService(repo UserRepository, email EmailService) UserService {
                return &userService{
                    repo:  repo,
                    email: email,
                }
            }

            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                }

                // 使用抽象接口
                if err := s.repo.Save(ctx, user); err != nil {
                    return User{}, err
                }

                // 使用抽象接口
                if err := s.email.SendWelcomeEmail(ctx, email); err != nil {
                    // 记录错误但不影响用户创建
                    logger.Log("err", err)
                }

                return user, nil
            }

            // 具体实现(低层模块)
            type postgresRepository struct {
                db *sql.DB
            }

            func (r *postgresRepository) Save(ctx context.Context, user User) error {
                _, err := r.db.ExecContext(ctx, "INSERT INTO users ...")
                return err
            }

            // 可以轻松替换实现
            type mongoRepository struct {
                client *mongo.Client
            }

            func (r *mongoRepository) Save(ctx context.Context, user User) error {
                _, err := r.client.Database("app").Collection("users").InsertOne(ctx, user)
                return err
            }

            // 依赖注入组装
            func main() {
                // 可以注入不同的实现
                repo := &postgresRepository{db: db}
                // repo := &mongoRepository{client: mongoClient}

                email := &smtpEmailService{config: smtpConfig}
                svc := NewUserService(repo, email)
            }
            ---

02.中间件模式
    a.装饰器模式
        a.功能说明
            go-kit的中间件采用装饰器模式实现,通过函数包装的方式为原有功能添加额外的行为。中间件是一个接收Endpoint或Service并返回增强后的Endpoint或Service的函数。多个中间件可以链式组合,形成处理管道。每个中间件负��单一职责,如日志记录、性能监控、错误处理等。这种设计使得功能模块化,易于组合和复用。中间件的执行顺序由添加顺序决定,形成洋葱式的调用链。
        b.代码示例
            ---
            // 装饰器模式中间件
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
            )

            // Middleware 中间件类型定义
            type Middleware func(endpoint.Endpoint) endpoint.Endpoint

            // LoggingMiddleware 日志中间件
            func LoggingMiddleware(logger log.Logger) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            logger.Log(
                                "method", "endpoint",
                                "took", time.Since(begin),
                                "err", err,
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // InstrumentingMiddleware 监控中间件
            func InstrumentingMiddleware(duration metrics.Histogram) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // RateLimitMiddleware 限流中间件
            func RateLimitMiddleware(limiter *rate.Limiter) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 链式组合中间件
            func ChainMiddleware(outer Middleware, others ...Middleware) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    for i := len(others) - 1; i >= 0; i-- {
                        next = others[i](next)
                    }
                    return outer(next)
                }
            }

            // 使用示例
            func BuildEndpoint(svc Service) endpoint.Endpoint {
                var endpoint endpoint.Endpoint
                endpoint = makeEndpoint(svc)

                // 应用多个中间件(从内到外执行)
                endpoint = LoggingMiddleware(logger)(endpoint)
                endpoint = InstrumentingMiddleware(histogram)(endpoint)
                endpoint = RateLimitMiddleware(limiter)(endpoint)

                // 或使用链式组��
                endpoint = ChainMiddleware(
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(histogram),
                    RateLimitMiddleware(limiter),
                )(endpoint)

                return endpoint
            }
            ---
    b.管道模式
        a.功能说明
            中间件形成的处理管道类似于Unix管道,数据从一个中间件流向下一个中间件。每个中间件可以在调用下一个中间件之前或之后执行操作,也可以决定是否继续传递请求。这种模式使得请求处理流程清晰可控,便于调试和监控。管道中的每个环节都可以独立测试,提高了代码质量。中间件的组合顺序会影响最终行为,需要根据实际需求合理安排。
        b.代码示例
            ---
            // 管道模式示例
            package pipeline

            import (
                "context"
                "errors"
                "time"
            )

            // 认证中间件(最外层)
            func AuthMiddleware(tokenValidator TokenValidator) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        // 前置处理:验证token
                        token := extractToken(ctx)
                        if !tokenValidator.Validate(token) {
                            return nil, ErrUnauthorized
                        }

                        // 将用户信息注入context
                        userID := tokenValidator.GetUserID(token)
                        ctx = context.WithValue(ctx, "userID", userID)

                        // 继续管道
                        return next(ctx, request)
                    }
                }
            }

            // 限流中间件(第二层)
            func RateLimitMiddleware(limiter *rate.Limiter) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        // 前置处理:检查限流
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }

                        // 继续管道
                        return next(ctx, request)
                    }
                }
            }

            // 日志中间件(第三层)
            func LoggingMiddleware(logger log.Logger) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        // 前置处理:记录请求
                        logger.Log("msg", "request received", "request", request)

                        // 继续管道
                        response, err := next(ctx, request)

                        // 后置处理:记录响应
                        logger.Log("msg", "request completed", "response", response, "err", err)

                        return response, err
                    }
                }
            }

            // 重试中间件(第四层)
            func RetryMiddleware(maxRetries int, backoff time.Duration) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var response interface{}
                        var err error

                        for i := 0; i <= maxRetries; i++ {
                            response, err = next(ctx, request)
                            if err == nil {
                                return response, nil
                            }

                            // 可重试的错误才重试
                            if !isRetryable(err) {
                                return response, err
                            }

                            // 等待后重试
                            if i < maxRetries {
                                time.Sleep(backoff * time.Duration(i+1))
                            }
                        }

                        return response, err
                    }
                }
            }

            // 构建完整管道
            func BuildPipeline(svc Service) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = makeEndpoint(svc)

                // 从内到外应用中间件
                // 执行顺序:Auth -> RateLimit -> Logging -> Retry -> Endpoint
                e = RetryMiddleware(3, 100*time.Millisecond)(e)
                e = LoggingMiddleware(logger)(e)
                e = RateLimitMiddleware(limiter)(e)
                e = AuthMiddleware(validator)(e)

                return e
            }

            // 请求流程:
            // 1. Auth验证token
            // 2. RateLimit检查限流
            // 3. Logging记录请求
            // 4. Retry执行重试逻���
            // 5. Endpoint处理业务
            // 6. Logging记录响应
            // 7. 返回结果
            ---

03.传输抽象
    a.协议无关
        a.功能说明
            go-kit的Transport层提供了协议无关的抽象,使得业务逻辑与传输协议完全解耦。同一个Endpoint可以绑定到HTTP、gRPC、Thrift等多种传输协议上,无需修改业务代码。Transport层负责协议特定的编解码、错误处理、上下文传递等工作。这种抽象使得服务可以同时支持多种协议,满足不同客户端的需求。协议的切换和升级不会影响核心业务逻辑,降低了系统演进的成本。
        b.代码示例
            ---
            // 协议无关的传输层
            package transport

            import (
                "context"
                "encoding/json"
                "github.com/go-kit/kit/transport/http"
                "github.com/go-kit/kit/transport/grpc"
            )

            // 同一个Endpoint
            var createUserEndpoint endpoint.Endpoint = makeCreateUserEndpoint(svc)

            // HTTP传输绑定
            func MakeHTTPHandler(endpoint endpoint.Endpoint) http.Handler {
                return httptransport.NewServer(
                    endpoint,
                    decodeHTTPCreateUserRequest,
                    encodeHTTPResponse,
                    httptransport.ServerBefore(httptransport.PopulateRequestContext),
                )
            }

            // HTTP编解码
            func decodeHTTPCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            func encodeHTTPResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            // gRPC传输绑定(同一个Endpoint)
            func MakeGRPCServer(endpoint endpoint.Endpoint) pb.UserServiceServer {
                return &grpcServer{
                    createUser: grpctransport.NewServer(
                        endpoint,
                        decodeGRPCCreateUserRequest,
                        encodeGRPCCreateUserResponse,
                    ),
                }
            }

            // gRPC编解码
            func decodeGRPCCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.CreateUserRequest)
                return CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func encodeGRPCCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(CreateUserResponse)
                return &pb.CreateUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            // 主程序:同时支持HTTP和gRPC
            func main() {
                // 创建Endpoint
                endpoint := makeCreateUserEndpoint(svc)

                // HTTP服务器
                httpHandler := MakeHTTPHandler(endpoint)
                go http.ListenAndServe(":8080", httpHandler)

                // gRPC服务器
                grpcServer := MakeGRPCServer(endpoint)
                lis, _ := net.Listen("tcp", ":9090")
                s := grpc.NewServer()
                pb.RegisterUserServiceServer(s, grpcServer)
                s.Serve(lis)
            }
            ---
    b.编解码分离
        a.功能说明
            Transport层将编解码逻辑与业务逻辑分离,每个传输协议有独立的编解码器。编码器负责将Endpoint的响应转换为协议特定的格式,解码器负责将协议请求转换为Endpoint的请求对象。这种分离使得编解码逻辑可以独立测试和优化,不会影响业务逻辑。支持自定义编解码器,可以实现特殊的序列化需求,如使用Protobuf、MessagePack等高效格式。
        b.代码示例
            ---
            // 编解码分离示例
            package codec

            import (
                "context"
                "encoding/json"
                "io"
            )

            // HTTP JSON编解码器
            type HTTPJSONCodec struct{}

            func (c HTTPJSONCodec) Decode(ctx context.Context, r io.Reader) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            func (c HTTPJSONCodec) Encode(ctx context.Context, w io.Writer, response interface{}) error {
                return json.NewEncoder(w).Encode(response)
            }

            // HTTP Protobuf编解码器
            type HTTPProtobufCodec struct{}

            func (c HTTPProtobufCodec) Decode(ctx context.Context, r io.Reader) (interface{}, error) {
                data, err := io.ReadAll(r)
                if err != nil {
                    return nil, err
                }
                var req pb.CreateUserRequest
                if err := proto.Unmarshal(data, &req); err != nil {
                    return nil, err
                }
                return CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func (c HTTPProtobufCodec) Encode(ctx context.Context, w io.Writer, response interface{}) error {
                resp := response.(CreateUserResponse)
                pbResp := &pb.CreateUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }
                data, err := proto.Marshal(pbResp)
                if err != nil {
                    return err
                }
                _, err = w.Write(data)
                return err
            }

            // 可配置的编解码器
            func MakeHTTPHandler(endpoint endpoint.Endpoint, codec Codec) http.Handler {
                return httptransport.NewServer(
                    endpoint,
                    func(ctx context.Context, r *http.Request) (interface{}, error) {
                        return codec.Decode(ctx, r.Body)
                    },
                    func(ctx context.Context, w http.ResponseWriter, response interface{}) error {
                        contentType := "application/json"
                        if _, ok := codec.(HTTPProtobufCodec); ok {
                            contentType = "application/protobuf"
                        }
                        w.Header().Set("Content-Type", contentType)
                        return codec.Encode(ctx, w, response)
                    },
                )
            }

            // 根据Content-Type选择编解码器
            func SelectCodec(contentType string) Codec {
                switch contentType {
                case "application/json":
                    return HTTPJSONCodec{}
                case "application/protobuf":
                    return HTTPProtobufCodec{}
                default:
                    return HTTPJSONCodec{}
                }
            }
            ---

1.6 核心特性

01.服务发现
    a.多种注册中心支持
        a.功能说明
            go-kit提供了对主流服务注册中心的支持,包括Consul、Etcd、Eureka、ZooKeeper等。服务实例可以自动注册到注册中心,并定期发送心跳保持注册状态。客户端通过订阅注册中心获取服务实例列表,实现动态服务发现。支持健康检查机制,自动剔除不健康的服务实例。服务发现与负载均衡紧密集成,为客户端提供透明的服务调用体验。
        b.代码示例
            ---
            // Consul服务发现
            package discovery

            import (
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/consul"
                consulapi "github.com/hashicorp/consul/api"
            )

            func SetupConsulDiscovery() (sd.Instancer, *consul.Registrar, error) {
                // 创建Consul客户端
                consulConfig := consulapi.DefaultConfig()
                consulConfig.Address = "localhost:8500"
                consulClient, err := consulapi.NewClient(consulConfig)
                if err != nil {
                    return nil, nil, err
                }

                client := consul.NewClient(consulClient)

                // 服务注册
                registration := &consulapi.AgentServiceRegistration{
                    ID:      "user-service-1",
                    Name:    "user-service",
                    Port:    8080,
                    Address: "192.168.1.10",
                    Tags:    []string{"v1.0", "production"},
                    Meta: map[string]string{
                        "version": "1.0.0",
                        "region":  "us-west",
                    },
                    Check: &consulapi.AgentServiceCheck{
                        HTTP:                           "http://192.168.1.10:8080/health",
                        Interval:                       "10s",
                        Timeout:                        "2s",
                        DeregisterCriticalServiceAfter: "1m",
                    },
                }

                registrar := consul.NewRegistrar(client, registration, logger)
                registrar.Register()

                // 服务发现
                instancer := consul.NewInstancer(
                    client,
                    logger,
                    "user-service",
                    []string{"production"},
                    true,
                )

                return instancer, registrar, nil
            }

            // Etcd服务发现
            func SetupEtcdDiscovery() (sd.Instancer, error) {
                // 创建Etcd客户端
                etcdClient, err := clientv3.New(clientv3.Config{
                    Endpoints:   []string{"localhost:2379"},
                    DialTimeout: 5 * time.Second,
                })
                if err != nil {
                    return nil, err
                }

                // 服务注册
                prefix := "/services/user-service/"
                instance := prefix + "192.168.1.10:8080"
                value := `{"address":"192.168.1.10:8080","version":"1.0.0"}`

                // 创建租约
                lease, err := etcdClient.Grant(context.Background(), 10)
                if err != nil {
                    return nil, err
                }

                // 注册服务
                _, err = etcdClient.Put(
                    context.Background(),
                    instance,
                    value,
                    clientv3.WithLease(lease.ID),
                )
                if err != nil {
                    return nil, err
                }

                // 保持租约
                ch, err := etcdClient.KeepAlive(context.Background(), lease.ID)
                go func() {
                    for range ch {
                        // 租约续期
                    }
                }()

                // 服务发现
                client := etcdv3.NewClient(etcdClient, prefix, logger)
                instancer, err := etcdv3.NewInstancer(client, logger)
                return instancer, err
            }
            ---
    b.负载均衡策略
        a.功能说明
            go-kit内置了多种负载均衡策略,包括轮询、随机、一致性哈希等。负载均衡器���服务发现集成,自动从注册中心获取服务实例列表,根据策略选择目标实例。支持动态更新实例列表,当服务实例上下线时自动调整。可以自定义负载均衡策略,实现基于权重、响应时间等高级算法。负载均衡器还支持重试机制,当请求失败时自动选择其他实例重试。
        b.代码示例
            ---
            // 负载均衡实现
            package loadbalancer

            import (
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/lb"
            )

            // 轮询负载均衡
            func SetupRoundRobinBalancer(instancer sd.Instancer) endpoint.Endpoint {
                // 端点工厂
                factory := func(instance string) (endpoint.Endpoint, io.Closer, error) {
                    return makeRemoteEndpoint(instance), nil, nil
                }

                // 创建端点管理器
                endpointer := sd.NewEndpointer(instancer, factory, logger)

                // 轮询策略
                balancer := lb.NewRoundRobin(endpointer)

                // 重试机制
                retry := lb.Retry(3, 500*time.Millisecond, balancer)

                return retry
            }

            // 随机负载均衡
            func SetupRandomBalancer(instancer sd.Instancer) endpoint.Endpoint {
                factory := func(instance string) (endpoint.Endpoint, io.Closer, error) {
                    return makeRemoteEndpoint(instance), nil, nil
                }

                endpointer := sd.NewEndpointer(instancer, factory, logger)
                balancer := lb.NewRandom(endpointer, time.Now().UnixNano())
                retry := lb.Retry(3, 500*time.Millisecond, balancer)

                return retry
            }

            // 自定义负载均衡:基于权重
            type WeightedBalancer struct {
                endpoints []weightedEndpoint
                mu        sync.RWMutex
            }

            type weightedEndpoint struct {
                endpoint endpoint.Endpoint
                weight   int
            }

            func NewWeightedBalancer(endpointer sd.Endpointer, weights map[string]int) *WeightedBalancer {
                wb := &WeightedBalancer{}

                // 监听端点变化
                go func() {
                    for endpoints := range endpointer.Endpoints() {
                        wb.mu.Lock()
                        wb.endpoints = make([]weightedEndpoint, 0, len(endpoints))
                        for i, ep := range endpoints {
                            weight := weights[fmt.Sprintf("instance-%d", i)]
                            if weight == 0 {
                                weight = 1
                            }
                            wb.endpoints = append(wb.endpoints, weightedEndpoint{
                                endpoint: ep,
                                weight:   weight,
                            })
                        }
                        wb.mu.Unlock()
                    }
                }()

                return wb
            }

            func (wb *WeightedBalancer) Endpoint() (endpoint.Endpoint, error) {
                wb.mu.RLock()
                defer wb.mu.RUnlock()

                if len(wb.endpoints) == 0 {
                    return nil, lb.ErrNoEndpoints
                }

                // 计算总权重
                totalWeight := 0
                for _, ep := range wb.endpoints {
                    totalWeight += ep.weight
                }

                // 随机选择
                r := rand.Intn(totalWeight)
                for _, ep := range wb.endpoints {
                    r -= ep.weight
                    if r < 0 {
                        return ep.endpoint, nil
                    }
                }

                return wb.endpoints[0].endpoint, nil
            }
            ---

02.可观测性
    a.日志记录
        a.功能说明
            go-kit提供了结构化日志支持,采用键值对格式记录日志信息。日志接口简洁统一,支持多种日志后端如logfmt、JSON等。通过日志中间件可以自动记录请求响应、执行时间、错误信息等关键数据。支持日志级别控制和上下文传递,便于问题排查和审计。日志记录对性能影响小,适合生产环境使用。
        b.代码示例
            ---
            // 结构化日志
            package logging

            import (
                "context"
                "time"
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/log/level"
            )

            // 创建日志记录器
            func NewLogger() log.Logger {
                var logger log.Logger
                logger = log.NewLogfmtLogger(os.Stderr)
                logger = log.With(logger, "ts", log.DefaultTimestampUTC)
                logger = log.With(logger, "caller", log.DefaultCaller)
                return logger
            }

            // Service层日志中间件
            type loggingMiddleware struct {
                logger log.Logger
                next   UserService
            }

            func LoggingMiddleware(logger log.Logger) ServiceMiddleware {
                return func(next UserService) UserService {
                    return &loggingMiddleware{
                        logger: logger,
                        next:   next,
                    }
                }
            }

            func (mw loggingMiddleware) CreateUser(ctx context.Context, username, email string) (user User, err error) {
                defer func(begin time.Time) {
                    level.Info(mw.logger).Log(
                        "method", "CreateUser",
                        "username", username,
                        "email", email,
                        "user_id", user.ID,
                        "err", err,
                        "took", time.Since(begin),
                    )
                }(time.Now())

                return mw.next.CreateUser(ctx, username, email)
            }

            // Endpoint层日志中间件
            func EndpointLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            level.Debug(logger).Log(
                                "transport", "endpoint",
                                "request", fmt.Sprintf("%+v", request),
                                "response", fmt.Sprintf("%+v", response),
                                "err", err,
                                "took", time.Since(begin),
                            )
                        }(time.Now())

                        return next(ctx, request)
                    }
                }
            }

            // 带级别的日志
            func LogWithLevel(logger log.Logger, err error, msg string, keyvals ...interface{}) {
                if err != nil {
                    level.Error(logger).Log(append(keyvals, "err", err, "msg", msg)...)
                } else {
                    level.Info(logger).Log(append(keyvals, "msg", msg)...)
                }
            }

            // 使用示例
            func main() {
                logger := NewLogger()

                var svc UserService
                svc = newUserService(db)
                svc = LoggingMiddleware(logger)(svc)

                endpoint := makeCreateUserEndpoint(svc)
                endpoint = EndpointLoggingMiddleware(logger)(endpoint)
            }
            ---
    b.指标监控
        a.功能说明
            go-kit与Prometheus深度集成,提供了丰富的监控指标支持。内置Counter、Gauge、Histogram、Summary等指标类型,可以记录请求计数、延迟分布、错误率等关键指标。通过监控中间件自动采集服务运行数据,无需手动埋点。支持多维度标签,可以按方法、状态码、错误类型等维度聚合分析。监控数据可以导出到Prometheus、Graphite等监控系统。
        b.代码示例
            ---
            // Prometheus监控
            package metrics

            import (
                "context"
                "time"
                "github.com/go-kit/kit/metrics"
                "github.com/go-kit/kit/metrics/prometheus"
                stdprometheus "github.com/prometheus/client_golang/prometheus"
                "github.com/prometheus/client_golang/prometheus/promhttp"
            )

            // 定义监控指标
            type Metrics struct {
                RequestCount   metrics.Counter
                RequestLatency metrics.Histogram
                ErrorCount     metrics.Counter
            }

            func NewMetrics() *Metrics {
                fieldKeys := []string{"method", "error"}

                return &Metrics{
                    RequestCount: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
                        Namespace: "user_service",
                        Subsystem: "api",
                        Name:      "request_count",
                        Help:      "Number of requests received.",
                    }, fieldKeys),
                    RequestLatency: prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
                        Namespace: "user_service",
                        Subsystem: "api",
                        Name:      "request_latency_seconds",
                        Help:      "Total duration of requests in seconds.",
                        Objectives: map[float64]float64{
                            0.5:  0.05,
                            0.9:  0.01,
                            0.99: 0.001,
                        },
                    }, fieldKeys),
                    ErrorCount: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
                        Namespace: "user_service",
                        Subsystem: "api",
                        Name:      "error_count",
                        Help:      "Number of errors occurred.",
                    }, []string{"method", "error_type"}),
                }
            }

            // 监控中间件
            type instrumentingMiddleware struct {
                metrics *Metrics
                next    UserService
            }

            func InstrumentingMiddleware(m *Metrics) ServiceMiddleware {
                return func(next UserService) UserService {
                    return &instrumentingMiddleware{
                        metrics: m,
                        next:    next,
                    }
                }
            }

            func (mw instrumentingMiddleware) CreateUser(ctx context.Context, username, email string) (user User, err error) {
                defer func(begin time.Time) {
                    lvs := []string{"method", "CreateUser", "error", fmt.Sprint(err != nil)}
                    mw.metrics.RequestCount.With(lvs...).Add(1)
                    mw.metrics.RequestLatency.With(lvs...).Observe(time.Since(begin).Seconds())

                    if err != nil {
                        mw.metrics.ErrorCount.With(
                            "method", "CreateUser",
                            "error_type", classifyError(err),
                        ).Add(1)
                    }
                }(time.Now())

                return mw.next.CreateUser(ctx, username, email)
            }

            // 暴露Prometheus指标端点
            func ExposeMetrics() {
                http.Handle("/metrics", promhttp.Handler())
                go http.ListenAndServe(":9090", nil)
            }

            // 自定义指标
            var (
                activeConnections = prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
                    Namespace: "user_service",
                    Name:      "active_connections",
                    Help:      "Number of active connections.",
                }, []string{})

                cacheHitRate = prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{
                    Namespace: "user_service",
                    Name:      "cache_hit_rate",
                    Help:      "Cache hit rate distribution.",
                    Buckets:   []float64{0.5, 0.7, 0.8, 0.9, 0.95, 0.99, 1.0},
                }, []string{"cache_type"})
            )

            func RecordCacheHit(cacheType string, hit bool) {
                rate := 0.0
                if hit {
                    rate = 1.0
                }
                cacheHitRate.With("cache_type", cacheType).Observe(rate)
            }
            ---
    c.分布式追踪
        a.功能说明
            go-kit支持OpenTracing标准,可以与Zipkin、Jaeger等分布式追踪系统集成。通过追踪中间件自动创建和传播Span,记录请求在微服务间的调用链路。支持采样策略,控制追踪数据的采集比例。追踪信息包含时间戳、标签、日志等详细数据,帮助分析性能瓶颈和定位问题。追踪上下文通过HTTP Header或gRPC Metadata自动传递,实现跨服务的链路追踪。
        b.代码示例
            ---
            // 分布式追踪
            package tracing

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/tracing/opentracing"
                "github.com/go-kit/kit/tracing/zipkin"
                stdopentracing "github.com/opentracing/opentracing-go"
                zipkinot "github.com/openzipkin-contrib/zipkin-go-opentracing"
                zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http"
            )

            // 初始化Zipkin追踪
            func InitZipkinTracer(serviceName, zipkinURL string) (stdopentracing.Tracer, error) {
                reporter := zipkinhttp.NewReporter(zipkinURL)
                endpoint, err := zipkin.NewEndpoint(serviceName, "localhost:8080")
                if err != nil {
                    return nil, err
                }

                nativeTracer, err := zipkin.NewTracer(
                    reporter,
                    zipkin.WithLocalEndpoint(endpoint),
                    zipkin.WithSharedSpans(false),
                )
                if err != nil {
                    return nil, err
                }

                tracer := zipkinot.Wrap(nativeTracer)
                stdopentracing.SetGlobalTracer(tracer)

                return tracer, nil
            }

            // Endpoint追踪中间件
            func TracingMiddleware(tracer stdopentracing.Tracer, operationName string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return opentracing.TraceServer(tracer, operationName)(next)
                }
            }

            // HTTP传输层追踪
            func MakeHTTPHandler(endpoint endpoint.Endpoint, tracer stdopentracing.Tracer) http.Handler {
                return httptransport.NewServer(
                    endpoint,
                    decodeRequest,
                    encodeResponse,
                    httptransport.ServerBefore(
                        opentracing.HTTPToContext(tracer, "CreateUser", logger),
                    ),
                    httptransport.ServerAfter(
                        opentracing.ContextToHTTP(tracer, logger),
                    ),
                )
            }

            // gRPC传输层追踪
            func MakeGRPCServer(endpoint endpoint.Endpoint, tracer stdopentracing.Tracer) pb.UserServiceServer {
                return &grpcServer{
                    createUser: grpctransport.NewServer(
                        endpoint,
                        decodeGRPCRequest,
                        encodeGRPCResponse,
                        grpctransport.ServerBefore(
                            opentracing.GRPCToContext(tracer, "CreateUser", logger),
                        ),
                    ),
                }
            }

            // 客户端追踪
            func MakeTracedClient(tracer stdopentracing.Tracer, instance string) endpoint.Endpoint {
                var endpoint endpoint.Endpoint
                endpoint = makeRemoteEndpoint(instance)
                endpoint = opentracing.TraceClient(tracer, "CreateUser")(endpoint)
                return endpoint
            }

            // 手动创建Span
            func DoSomethingWithTracing(ctx context.Context) error {
                span, ctx := stdopentracing.StartSpanFromContext(ctx, "DoSomething")
                defer span.Finish()

                // 添加标签
                span.SetTag("user_id", "12345")
                span.SetTag("operation", "database_query")

                // 添加日志
                span.LogKV("event", "query_start", "table", "users")

                // 执行操作
                result, err := db.Query(ctx, "SELECT * FROM users")
                if err != nil {
                    span.SetTag("error", true)
                    span.LogKV("event", "error", "message", err.Error())
                    return err
                }

                span.LogKV("event", "query_complete", "rows", result.RowCount())
                return nil
            }

            // 完整示例
            func main() {
                // 初始化追踪器
                tracer, _ := InitZipkinTracer("user-service", "http://localhost:9411/api/v2/spans")

                // 创建服务
                var svc UserService
                svc = newUserService(db)

                // 创建Endpoint
                endpoint := makeCreateUserEndpoint(svc)
                endpoint = TracingMiddleware(tracer, "CreateUser")(endpoint)

                // 创建HTTP处理器
                handler := MakeHTTPHandler(endpoint, tracer)
                http.ListenAndServe(":8080", handler)
            }
            ---

1.7 生态系统

01.官方组件
    a.传输层组件
        a.功能说明
            go-kit官方提供了HTTP、gRPC、Thrift等主流传输协议的支持包。HTTP传输基于标准库net/http,提供了请求解码、响应编码、错误处理等完整功能。gRPC传输支持双向流、元数据传递、拦截器等高级特性。Thrift传输兼容Apache Thrift协议,可以与其他语言的Thrift服务互操作。每个传输层组件都提供了统一的接口,便于在不同协议间切换。
        b.代码示例
            ---
            // 多传输层支持
            package transport

            import (
                "github.com/go-kit/kit/transport/http"
                "github.com/go-kit/kit/transport/grpc"
                "github.com/go-kit/kit/transport/thrift"
            )

            // HTTP传输
            func MakeHTTPHandler(endpoints Endpoints) http.Handler {
                r := mux.NewRouter()

                r.Methods("POST").Path("/users").Handler(httptransport.NewServer(
                    endpoints.CreateUser,
                    decodeHTTPCreateUserRequest,
                    encodeHTTPResponse,
                ))

                r.Methods("GET").Path("/users/{id}").Handler(httptransport.NewServer(
                    endpoints.GetUser,
                    decodeHTTPGetUserRequest,
                    encodeHTTPResponse,
                ))

                return r
            }

            // gRPC传输
            type grpcServer struct {
                createUser grpctransport.Handler
                getUser    grpctransport.Handler
            }

            func NewGRPCServer(endpoints Endpoints) pb.UserServiceServer {
                return &grpcServer{
                    createUser: grpctransport.NewServer(
                        endpoints.CreateUser,
                        decodeGRPCCreateUserRequest,
                        encodeGRPCCreateUserResponse,
                    ),
                    getUser: grpctransport.NewServer(
                        endpoints.GetUser,
                        decodeGRPCGetUserRequest,
                        encodeGRPCGetUserResponse,
                    ),
                }
            }

            func (s *grpcServer) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
                _, resp, err := s.createUser.ServeGRPC(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*pb.CreateUserResponse), nil
            }

            // Thrift传输
            func NewThriftServer(endpoints Endpoints) *thrift.Server {
                return thrift.NewServer(
                    makeThriftHandler(endpoints),
                )
            }
            ---
    b.中间件组件
        a.功能说明
            go-kit提供了丰富的中间件组件库,包括限流、熔断、重试、超时等常用功能。限流中间件基于golang.org/x/time/rate实现令牌桶算法。熔断中间件集成sony/gobreaker,支持自动熔断和恢复。重试中间件支持指数退避策略。这些中间件都经过生产环境验证,可以直接使用。中间件之间可以自由组合,构建复杂的处理链。
        b.代码示例
            ---
            // 官方中间件使用
            package middleware

            import (
                "github.com/go-kit/kit/circuitbreaker"
                "github.com/go-kit/kit/ratelimit"
                "github.com/sony/gobreaker"
                "golang.org/x/time/rate"
            )

            func BuildEndpointWithMiddleware(svc Service) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = makeEndpoint(svc)

                // 限流中间件
                limiter := rate.NewLimiter(rate.Every(time.Second), 100)
                e = ratelimit.NewErroringLimiter(limiter)(e)

                // 熔断中间件
                breaker := gobreaker.NewCircuitBreaker(gobreaker.Settings{
                    Name:        "UserService",
                    MaxRequests: 3,
                    Interval:    time.Minute,
                    Timeout:     30 * time.Second,
                    ReadyToTrip: func(counts gobreaker.Counts) bool {
                        failureRatio := float64(counts.TotalFailures) / float64(counts.Requests)
                        return counts.Requests >= 3 && failureRatio >= 0.6
                    },
                })
                e = circuitbreaker.Gobreaker(breaker)(e)

                // 超时中间件
                e = func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
                        defer cancel()
                        return next(ctx, request)
                    }
                }(e)

                return e
            }

            // 重试中间件
            func RetryMiddleware(max int, timeout time.Duration) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var resp interface{}
                        var err error

                        for i := 0; i <= max; i++ {
                            resp, err = next(ctx, request)
                            if err == nil {
                                return resp, nil
                            }

                            if i < max {
                                select {
                                case <-time.After(timeout * time.Duration(i+1)):
                                case <-ctx.Done():
                                    return nil, ctx.Err()
                                }
                            }
                        }

                        return resp, err
                    }
                }
            }
            ---

02.第三方集成
    a.服务注册中心
        a.功能说明
            go-kit社区提供了与主流服务注册中心的集成包,包括Consul、Etcd、Eureka、ZooKeeper等。这些集成包封装了服务注册、发现、健康检查等功能,提供统一的API接口。支持自动注册和注销,处理网络异常和重连。与go-kit的负载均衡器无缝集成,实现动态服务发现。社区维护活跃,及时跟进各注册中心的新特性。
        b.代码示例
            ---
            // 多注册中心集成
            package registry

            import (
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/consul"
                "github.com/go-kit/kit/sd/etcdv3"
                "github.com/go-kit/kit/sd/eureka"
            )

            // Consul集成
            func SetupConsul() (sd.Instancer, sd.Registrar) {
                consulClient, _ := consulapi.NewClient(consulapi.DefaultConfig())
                client := consul.NewClient(consulClient)

                registration := &consulapi.AgentServiceRegistration{
                    ID:      "user-service-1",
                    Name:    "user-service",
                    Port:    8080,
                    Address: "localhost",
                }

                registrar := consul.NewRegistrar(client, registration, logger)
                instancer := consul.NewInstancer(client, logger, "user-service", []string{}, true)

                return instancer, registrar
            }

            // Etcd集成
            func SetupEtcd() (sd.Instancer, error) {
                etcdClient, _ := clientv3.New(clientv3.Config{
                    Endpoints: []string{"localhost:2379"},
                })

                client := etcdv3.NewClient(etcdClient, "/services/user-service/", logger)
                instancer, err := etcdv3.NewInstancer(client, logger)

                return instancer, err
            }

            // Eureka集成
            func SetupEureka() (sd.Instancer, sd.Registrar) {
                eurekaClient := eureka.NewClient([]string{"http://localhost:8761/eureka"})

                instance := &eureka.Instance{
                    HostName: "localhost",
                    Port:     8080,
                    App:      "USER-SERVICE",
                }

                registrar := eureka.NewRegistrar(eurekaClient, instance, logger)
                instancer := eureka.NewInstancer(eurekaClient, "USER-SERVICE", logger)

                return instancer, registrar
            }

            // 统一服务发现接口
            type ServiceDiscovery struct {
                instancer sd.Instancer
                registrar sd.Registrar
            }

            func NewServiceDiscovery(registryType string) (*ServiceDiscovery, error) {
                var instancer sd.Instancer
                var registrar sd.Registrar

                switch registryType {
                case "consul":
                    instancer, registrar = SetupConsul()
                case "etcd":
                    instancer, _ = SetupEtcd()
                case "eureka":
                    instancer, registrar = SetupEureka()
                default:
                    return nil, errors.New("unsupported registry type")
                }

                return &ServiceDiscovery{
                    instancer: instancer,
                    registrar: registrar,
                }, nil
            }
            ---
    b.监控系统
        a.功能说明
            go-kit与Prometheus、Graphite、InfluxDB等监控系统深度集成。提供了统一的metrics接口,支持Counter、Gauge、Histogram、Summary等指标类型。可以轻松切换不同的监控后端,无需修改业务代码。支持多维度标签,便于指标聚合和分析。社区提供了丰富的Grafana仪表板模板,可以快速搭建监控大屏。
        b.代码示例
            ---
            // 多监控系统集成
            package monitoring

            import (
                "github.com/go-kit/kit/metrics"
                "github.com/go-kit/kit/metrics/prometheus"
                "github.com/go-kit/kit/metrics/influx"
                "github.com/go-kit/kit/metrics/graphite"
            )

            // Prometheus监控
            func SetupPrometheus() *Metrics {
                fieldKeys := []string{"method", "error"}

                return &Metrics{
                    RequestCount: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
                        Namespace: "user_service",
                        Name:      "request_count",
                        Help:      "Number of requests.",
                    }, fieldKeys),
                    RequestLatency: prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
                        Namespace: "user_service",
                        Name:      "request_latency_seconds",
                        Help:      "Request latency in seconds.",
                    }, fieldKeys),
                }
            }

            // InfluxDB监控
            func SetupInfluxDB() *Metrics {
                influxClient := influx.New(map[string]string{
                    "service": "user-service",
                }, influxdb.BatchPointsConfig{
                    Database: "metrics",
                }, logger)

                return &Metrics{
                    RequestCount:   influxClient.NewCounter("request_count"),
                    RequestLatency: influxClient.NewHistogram("request_latency"),
                }
            }

            // Graphite监控
            func SetupGraphite() *Metrics {
                graphiteClient := graphite.New("user.service.", logger)

                return &Metrics{
                    RequestCount:   graphiteClient.NewCounter("request_count"),
                    RequestLatency: graphiteClient.NewHistogram("request_latency"),
                }
            }

            // 统一监控接口
            type Metrics struct {
                RequestCount   metrics.Counter
                RequestLatency metrics.Histogram
            }

            func NewMetrics(monitoringType string) *Metrics {
                switch monitoringType {
                case "prometheus":
                    return SetupPrometheus()
                case "influxdb":
                    return SetupInfluxDB()
                case "graphite":
                    return SetupGraphite()
                default:
                    return SetupPrometheus()
                }
            }

            // 使用示例
            func main() {
                metrics := NewMetrics("prometheus")

                var svc UserService
                svc = newUserService(db)
                svc = instrumentingMiddleware{metrics, svc}

                // 暴露Prometheus指标
                http.Handle("/metrics", promhttp.Handler())
                go http.ListenAndServe(":9090", nil)
            }
            ---

03.社区工具
    a.代码生成工具
        a.功能说明
            社区提供了多个代码生成工具,可以根据服务定义自动生成样板代码。kitgen工具可以从接口定义生成Endpoint、Transport等代码。truss工具支持从Protobuf定义生成完整的go-kit服务。这些工具大大减少了手工编写重复代码的工作量,提高了开发效率。生成的代码遵循go-kit最佳实践,保证了代码质量。
        b.代码示例
            ---
            // 使用truss生成代码
            // 1. 定义Protobuf文件 user.proto
            syntax = "proto3";

            package user;

            service UserService {
                rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
                rpc GetUser(GetUserRequest) returns (GetUserResponse);
            }

            message CreateUserRequest {
                string username = 1;
                string email = 2;
            }

            message CreateUserResponse {
                User user = 1;
            }

            message GetUserRequest {
                string id = 1;
            }

            message GetUserResponse {
                User user = 1;
            }

            message User {
                string id = 1;
                string username = 2;
                string email = 3;
            }

            // 2. 运行truss生成代码
            // $ truss user.proto

            // 3. 生成的目录结构
            // user-service/
            //   ├── cmd/
            //   │   └── user-service/
            //   │       └── main.go
            //   ├── handlers/
            //   │   └── handlers.go
            //   ├── svc/
            //   │   ├── server/
            //   │   │   ├── run.go
            //   │   │   └── server.go
            //   │   ├── client/
            //   │   │   └── client.go
            //   │   └── transport_grpc.go
            //   └── pb/
            //       └── user.pb.go

            // 4. 实现业务逻辑
            package handlers

            import "context"

            type UserService struct{}

            func (s *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
                // 实现业务逻辑
                user := &pb.User{
                    Id:       generateID(),
                    Username: req.Username,
                    Email:    req.Email,
                }
                return &pb.CreateUserResponse{User: user}, nil
            }

            func (s *UserService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
                // 实现业务逻辑
                user, err := db.GetUser(ctx, req.Id)
                if err != nil {
                    return nil, err
                }
                return &pb.GetUserResponse{User: user}, nil
            }
            ---
    b.测试工具
        a.功能说明
            社区提供了专门的测试工具和库,简化go-kit服务的测试。go-kit/kit/endpoint/endpointtest包提供了Endpoint测试辅助函数。可以方便地模拟Service、测试中间件、验证编解码逻辑。支持集成测试和端到端测试,可以启动完整的服务进行测试。测试工具与标准testing包兼容,可以使用熟悉的测试框架。
        b.代码示例
            ---
            // go-kit服务测试
            package service

            import (
                "context"
                "testing"
                "github.com/stretchr/testify/assert"
                "github.com/stretchr/testify/mock"
            )

            // Mock Service
            type MockUserService struct {
                mock.Mock
            }

            func (m *MockUserService) CreateUser(ctx context.Context, username, email string) (User, error) {
                args := m.Called(ctx, username, email)
                return args.Get(0).(User), args.Error(1)
            }

            // 测试Service层
            func TestCreateUser(t *testing.T) {
                mockSvc := new(MockUserService)
                expectedUser := User{ID: "123", Username: "john", Email: "john@example.com"}

                mockSvc.On("CreateUser", mock.Anything, "john", "john@example.com").
                    Return(expectedUser, nil)

                user, err := mockSvc.CreateUser(context.Background(), "john", "john@example.com")

                assert.NoError(t, err)
                assert.Equal(t, expectedUser, user)
                mockSvc.AssertExpectations(t)
            }

            // 测试Endpoint层
            func TestCreateUserEndpoint(t *testing.T) {
                mockSvc := new(MockUserService)
                expectedUser := User{ID: "123", Username: "john", Email: "john@example.com"}

                mockSvc.On("CreateUser", mock.Anything, "john", "john@example.com").
                    Return(expectedUser, nil)

                endpoint := makeCreateUserEndpoint(mockSvc)

                request := CreateUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                }

                response, err := endpoint(context.Background(), request)

                assert.NoError(t, err)
                resp := response.(CreateUserResponse)
                assert.Equal(t, expectedUser, resp.User)
            }

            // 测试中间件
            func TestLoggingMiddleware(t *testing.T) {
                var buf bytes.Buffer
                logger := log.NewLogfmtLogger(&buf)

                mockSvc := new(MockUserService)
                mockSvc.On("CreateUser", mock.Anything, "john", "john@example.com").
                    Return(User{ID: "123"}, nil)

                svc := LoggingMiddleware(logger)(mockSvc)
                _, err := svc.CreateUser(context.Background(), "john", "john@example.com")

                assert.NoError(t, err)
                assert.Contains(t, buf.String(), "method=CreateUser")
            }

            // 集成测试
            func TestHTTPServer(t *testing.T) {
                // 启动测试服务器
                svc := newUserService(testDB)
                endpoint := makeCreateUserEndpoint(svc)
                handler := httptransport.NewServer(
                    endpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                )

                server := httptest.NewServer(handler)
                defer server.Close()

                // 发送HTTP请求
                reqBody := `{"username":"john","email":"john@example.com"}`
                resp, err := http.Post(
                    server.URL,
                    "application/json",
                    strings.NewReader(reqBody),
                )

                assert.NoError(t, err)
                assert.Equal(t, http.StatusOK, resp.StatusCode)

                // 验证响应
                var response CreateUserResponse
                json.NewDecoder(resp.Body).Decode(&response)
                assert.Equal(t, "john", response.User.Username)
            }
            ---

2 三层架构

2.1 架构概览

01.分层职责
    a.整体架构
        a.功能说明
            go-kit采用三层架构模式,从内到外分别是Service层、Endpoint层和Transport层。Service层位于最内层,包含纯粹的业务逻辑实现,不依赖任何框架或传输协议。Endpoint层位于中间,负责将Service方法转换为统一的请求响应模型,处理业务逻辑的编排和组合。Transport层位于最外层,负责具体传输协议的适配,如HTTP、gRPC等。这种分层设计使得各层职责清晰,依赖关系单向,便于测试和维护。
        b.代码示例
            ---
            // 三层架构完整示例
            package architecture

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            // 第1层:Service层(业务逻辑)
            type StringService interface {
                Uppercase(ctx context.Context, s string) (string, error)
                Count(ctx context.Context, s string) int
            }

            type stringService struct{}

            func (stringService) Uppercase(_ context.Context, s string) (string, error) {
                if s == "" {
                    return "", ErrEmpty
                }
                return strings.ToUpper(s), nil
            }

            func (stringService) Count(_ context.Context, s string) int {
                return len(s)
            }

            // 第2层:Endpoint层(请求响应转换)
            type Endpoints struct {
                UppercaseEndpoint endpoint.Endpoint
                CountEndpoint     endpoint.Endpoint
            }

            func MakeEndpoints(svc StringService) Endpoints {
                return Endpoints{
                    UppercaseEndpoint: makeUppercaseEndpoint(svc),
                    CountEndpoint:     makeCountEndpoint(svc),
                }
            }

            func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(uppercaseRequest)
                    v, err := svc.Uppercase(ctx, req.S)
                    if err != nil {
                        return uppercaseResponse{v, err.Error()}, nil
                    }
                    return uppercaseResponse{v, ""}, nil
                }
            }

            // 第3层:Transport层(协议适配)
            func MakeHTTPHandler(endpoints Endpoints) http.Handler {
                m := http.NewServeMux()

                m.Handle("/uppercase", httptransport.NewServer(
                    endpoints.UppercaseEndpoint,
                    decodeUppercaseRequest,
                    encodeResponse,
                ))

                m.Handle("/count", httptransport.NewServer(
                    endpoints.CountEndpoint,
                    decodeCountRequest,
                    encodeResponse,
                ))

                return m
            }

            // 请求响应结构
            type uppercaseRequest struct {
                S string `json:"s"`
            }

            type uppercaseResponse struct {
                V   string `json:"v"`
                Err string `json:"err,omitempty"`
            }
            ---
    b.数据流转
        a.功能说明
            请求从Transport层进入,经过解码转换为Endpoint的请求对象,Endpoint调用Service方法处理业务逻辑,Service返回结果后,Endpoint将其封装为响应对象,最后Transport层将响应编码为协议特定的格式返回给客户端。整个流程中,数据在各层之间单向流动,每层只关注自己的职责。中间件可以在各层之间插入,对数据流进行拦截和处理。这种清晰的数据流转模式使得系统行为可预测,便于调试和监控。
        b.代码示例
            ---
            // 数据流转示例
            package dataflow

            import (
                "context"
                "encoding/json"
                "net/http"
            )

            // 完整的请求处理流程
            func HandleRequest(w http.ResponseWriter, r *http.Request) {
                // 1. Transport层:HTTP请求解码
                request, err := decodeHTTPRequest(r)
                if err != nil {
                    http.Error(w, err.Error(), http.StatusBadRequest)
                    return
                }

                // 2. Endpoint层:调用端点
                ctx := r.Context()
                response, err := uppercaseEndpoint(ctx, request)
                if err != nil {
                    http.Error(w, err.Error(), http.StatusInternalServerError)
                    return
                }

                // 3. Transport层:HTTP响应编码
                if err := encodeHTTPResponse(w, response); err != nil {
                    http.Error(w, err.Error(), http.StatusInternalServerError)
                    return
                }
            }

            // Transport层:解码HTTP请求
            func decodeHTTPRequest(r *http.Request) (interface{}, error) {
                var req uppercaseRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            // Endpoint层:处理请求
            var uppercaseEndpoint = func(ctx context.Context, request interface{}) (interface{}, error) {
                req := request.(uppercaseRequest)

                // 调用Service层
                result, err := svc.Uppercase(ctx, req.S)
                if err != nil {
                    return uppercaseResponse{Err: err.Error()}, nil
                }

                return uppercaseResponse{V: result}, nil
            }

            // Service层:业务逻辑
            var svc StringService = stringService{}

            func (stringService) Uppercase(ctx context.Context, s string) (string, error) {
                return strings.ToUpper(s), nil
            }

            // Transport层:编码HTTP响应
            func encodeHTTPResponse(w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            // 数据流转路径:
            // HTTP Request -> decodeHTTPRequest -> uppercaseRequest
            // -> uppercaseEndpoint -> svc.Uppercase -> result
            // -> uppercaseResponse -> encodeHTTPResponse -> HTTP Response
            ---

02.层级隔离
    a.依赖方向
        a.功能说明
            三层架构遵循严格的依赖方向规则,外层依赖内层,内层不依赖外层。Transport层依赖Endpoint层,Endpoint层依赖Service层,Service层不依赖任何外层。这种单向依赖使得内层可以独立测试,不需要启动完整的服务。Service层可以在没有HTTP服务器的情况下进行单元测试。Endpoint层可以使用Mock Service进行测试。这种隔离性大大提高了代码的可测试性和可维护性。
        b.代码示例
            ---
            // 依赖方向示例
            package dependency

            import "context"

            // Service层:不依赖任何外层
            type UserService interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
            }

            type userService struct {
                db Database // 只依赖同层或更内层的组件
            }

            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                // 纯业务逻辑,不知道HTTP、gRPC等传输协议的存在
                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                }
                return s.db.Save(ctx, user)
            }

            // Endpoint层:依赖Service层
            func makeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(createUserRequest)
                    // 调用Service层方法
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return createUserResponse{Err: err.Error()}, nil
                    }
                    return createUserResponse{User: user}, nil
                }
            }

            // Transport层:依赖Endpoint层
            func MakeHTTPHandler(endpoint endpoint.Endpoint) http.Handler {
                return httptransport.NewServer(
                    endpoint, // 依赖Endpoint
                    decodeHTTPCreateUserRequest,
                    encodeHTTPResponse,
                )
            }

            // 测试Service层:不需要HTTP��务器
            func TestCreateUser(t *testing.T) {
                mockDB := &MockDatabase{}
                svc := &userService{db: mockDB}

                user, err := svc.CreateUser(context.Background(), "john", "john@example.com")

                assert.NoError(t, err)
                assert.Equal(t, "john", user.Username)
            }

            // 测试Endpoint层:不需要HTTP服务器
            func TestCreateUserEndpoint(t *testing.T) {
                mockSvc := &MockUserService{}
                endpoint := makeCreateUserEndpoint(mockSvc)

                request := createUserRequest{Username: "john", Email: "john@example.com"}
                response, err := endpoint(context.Background(), request)

                assert.NoError(t, err)
            }
            ---
    b.接口抽象
        a.功能说明
            各层之间通过接口进行交互,而不是具体实现。Service层定义为接口,Endpoint层依赖Service接口而非具体实现。Transport层依赖Endpoint抽象,不关心具体的业务逻辑。这种接口抽象使得各层可以独立演进,实现可以灵活替换。可以为同一个接口提供多种实现,如生产实现、测试实现、Mock实现等。接口抽象也便于依赖注入,提高了代码的灵活性和可测试性。
        b.代码示例
            ---
            // 接口抽象示例
            package abstraction

            import "context"

            // Service层接口定义
            type OrderService interface {
                CreateOrder(ctx context.Context, userID string, items []Item) (Order, error)
                GetOrder(ctx context.Context, orderID string) (Order, error)
                CancelOrder(ctx context.Context, orderID string) error
            }

            // 生产环境实现
            type productionOrderService struct {
                db    Database
                cache Cache
                queue MessageQueue
            }

            func (s *productionOrderService) CreateOrder(ctx context.Context, userID string, items []Item) (Order, error) {
                // 真实的业务逻辑
                order := Order{
                    ID:     generateOrderID(),
                    UserID: userID,
                    Items:  items,
                }
                if err := s.db.SaveOrder(ctx, order); err != nil {
                    return Order{}, err
                }
                s.queue.Publish("order.created", order)
                return order, nil
            }

            // 测试环境实现
            type mockOrderService struct {
                orders map[string]Order
            }

            func (s *mockOrderService) CreateOrder(ctx context.Context, userID string, items []Item) (Order, error) {
                // 简化的测试逻辑
                order := Order{
                    ID:     "test-order-1",
                    UserID: userID,
                    Items:  items,
                }
                s.orders[order.ID] = order
                return order, nil
            }

            // Endpoint层:依赖接口而非具体实现
            func makeCreateOrderEndpoint(svc OrderService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(createOrderRequest)
                    // 调用接口方法,不关心具体实现
                    order, err := svc.CreateOrder(ctx, req.UserID, req.Items)
                    if err != nil {
                        return createOrderResponse{Err: err.Error()}, nil
                    }
                    return createOrderResponse{Order: order}, nil
                }
            }

            // 依赖注入:可以注入不同的实现
            func NewProductionService(db Database, cache Cache, queue MessageQueue) OrderService {
                return &productionOrderService{
                    db:    db,
                    cache: cache,
                    queue: queue,
                }
            }

            func NewMockService() OrderService {
                return &mockOrderService{
                    orders: make(map[string]Order),
                }
            }

            // 使用示例
            func main() {
                // 生产环境
                svc := NewProductionService(db, cache, queue)
                endpoint := makeCreateOrderEndpoint(svc)

                // 测试环境
                testSvc := NewMockService()
                testEndpoint := makeCreateOrderEndpoint(testSvc)
            }

            // 接口抽象的优势:
            // 1. 可以轻松切换实现
            // 2. 便于单元测试
            // 3. 支持依赖注入
            // 4. 降低耦合度
            ---

2.2 Transport层

01.HTTP传输
    a.服务器端
        a.功能说明
            HTTP传输层负责将Endpoint绑定到HTTP协议上,处理HTTP请求的接收和响应的发送。go-kit提供了httptransport.Server类型,封装了请求解码、端点调用、响应编码的完整流程。支持自定义请求解码器和响应编码器,可以处理JSON、XML、Protobuf等多种格式。支持HTTP中间件,可以添加CORS、认证、日志等功能。与标准库net/http完全兼容,可以集成到现有的HTTP服务中。
        b.代码示例
            ---
            // HTTP服务器实现
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            func MakeHTTPHandler(endpoints Endpoints) http.Handler {
                m := http.NewServeMux()

                // 创建用户端点
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUser,
                    decodeCreateUserRequest,
                    encodeResponse,
                    httptransport.ServerBefore(extractToken),
                    httptransport.ServerAfter(setResponseHeaders),
                    httptransport.ServerErrorEncoder(encodeError),
                ))

                // 获取用户端点
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUser,
                    decodeGetUserRequest,
                    encodeResponse,
                ))

                return m
            }

            // 请求解码器
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req createUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                parts := strings.Split(r.URL.Path, "/")
                id := parts[len(parts)-1]
                return getUserRequest{ID: id}, nil
            }

            // 响应编码器
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            // 错误编码器
            func encodeError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                code := http.StatusInternalServerError
                if e, ok := err.(httptransport.Error); ok {
                    code = e.StatusCode()
                }
                w.WriteHeader(code)
                json.NewEncoder(w).Encode(map[string]interface{}{
                    "error": err.Error(),
                })
            }

            // ServerBefore:请求前处理
            func extractToken(ctx context.Context, r *http.Request) context.Context {
                token := r.Header.Get("Authorization")
                return context.WithValue(ctx, "token", token)
            }

            // ServerAfter:响应后处理
            func setResponseHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                w.Header().Set("X-Service-Version", "1.0.0")
                return ctx
            }
            ---
    b.客户端
        a.功能说明
            HTTP客户端用于调用远程HTTP服务,将本地方法调用转换为HTTP请求。go-kit提供了httptransport.Client类型,封装了请求编码、HTTP调用、响应解码的流程。支持自定义HTTP客户端,可以配置超时、重试、连接池等参数。客户端返回Endpoint类型,可以像调用本地服务一样调用远程服务。支持客户端中间件,可以添加重试、熔断、追踪等功能。
        b.代码示例
            ---
            // HTTP客户端实现
            package client

            import (
                "bytes"
                "context"
                "encoding/json"
                "io"
                "net/http"
                "net/url"
                "time"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            // 创建HTTP客户端
            func NewHTTPClient(instance string) (Service, error) {
                u, err := url.Parse(instance)
                if err != nil {
                    return nil, err
                }

                // 配置HTTP客户端
                httpClient := &http.Client{
                    Timeout: 10 * time.Second,
                    Transport: &http.Transport{
                        MaxIdleConns:        100,
                        MaxIdleConnsPerHost: 10,
                        IdleConnTimeout:     90 * time.Second,
                    },
                }

                // 创建用户端点
                createUserEndpoint := httptransport.NewClient(
                    "POST",
                    copyURL(u, "/users"),
                    encodeCreateUserRequest,
                    decodeCreateUserResponse,
                    httptransport.SetClient(httpClient),
                    httptransport.ClientBefore(setRequestHeaders),
                ).Endpoint()

                // 获取用户端点
                getUserEndpoint := httptransport.NewClient(
                    "GET",
                    copyURL(u, "/users"),
                    encodeGetUserRequest,
                    decodeGetUserResponse,
                    httptransport.SetClient(httpClient),
                ).Endpoint()

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                }, nil
            }

            // 请求编码器
            func encodeCreateUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(createUserRequest)
                var buf bytes.Buffer
                if err := json.NewEncoder(&buf).Encode(req); err != nil {
                    return err
                }
                r.Body = io.NopCloser(&buf)
                return nil
            }

            func encodeGetUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(getUserRequest)
                r.URL.Path = r.URL.Path + "/" + req.ID
                return nil
            }

            // 响应解码器
            func decodeCreateUserResponse(_ context.Context, r *http.Response) (interface{}, error) {
                if r.StatusCode != http.StatusOK {
                    return nil, errors.New("request failed")
                }
                var resp createUserResponse
                if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
                    return nil, err
                }
                return resp, nil
            }

            func decodeGetUserResponse(_ context.Context, r *http.Response) (interface{}, error) {
                var resp getUserResponse
                if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
                    return nil, err
                }
                return resp, nil
            }

            // ClientBefore:请求前处理
            func setRequestHeaders(ctx context.Context, r *http.Request) context.Context {
                r.Header.Set("Content-Type", "application/json")
                if token, ok := ctx.Value("token").(string); ok {
                    r.Header.Set("Authorization", token)
                }
                return ctx
            }

            func copyURL(base *url.URL, path string) *url.URL {
                next := *base
                next.Path = path
                return &next
            }
            ---

02.gRPC传输
    a.服务器端
        a.功能说明
            gRPC传输层提供了对gRPC协议的支持,可以将Endpoint暴露为gRPC服务。go-kit的grpctransport.Server封装了gRPC请求处理流程,包括请求解码、端点调用、响应编码。支持gRPC的流式调用、元数据传递、拦截器等特性。与Protobuf深度集成,可以使用.proto文件定义服务接口。gRPC传输性能优于HTTP,适合内部服务间通信。
        b.代码示例
            ---
            // gRPC服务器实现
            package transport

            import (
                "context"
                grpctransport "github.com/go-kit/kit/transport/grpc"
                "google.golang.org/grpc"
            )

            // gRPC服务器结构
            type grpcServer struct {
                createUser grpctransport.Handler
                getUser    grpctransport.Handler
            }

            // 创建gRPC服务器
            func NewGRPCServer(endpoints Endpoints) pb.UserServiceServer {
                return &grpcServer{
                    createUser: grpctransport.NewServer(
                        endpoints.CreateUser,
                        decodeGRPCCreateUserRequest,
                        encodeGRPCCreateUserResponse,
                        grpctransport.ServerBefore(extractGRPCMetadata),
                    ),
                    getUser: grpctransport.NewServer(
                        endpoints.GetUser,
                        decodeGRPCGetUserRequest,
                        encodeGRPCGetUserResponse,
                    ),
                }
            }

            // 实现gRPC服务接口
            func (s *grpcServer) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
                _, resp, err := s.createUser.ServeGRPC(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*pb.CreateUserResponse), nil
            }

            func (s *grpcServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
                _, resp, err := s.getUser.ServeGRPC(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*pb.GetUserResponse), nil
            }

            // 请求解码器
            func decodeGRPCCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.CreateUserRequest)
                return createUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func decodeGRPCGetUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.GetUserRequest)
                return getUserRequest{ID: req.Id}, nil
            }

            // 响应编码器
            func encodeGRPCCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(createUserResponse)
                return &pb.CreateUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            func encodeGRPCGetUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(getUserResponse)
                return &pb.GetUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            // 提取gRPC元数据
            func extractGRPCMetadata(ctx context.Context, md metadata.MD) context.Context {
                if tokens := md.Get("authorization"); len(tokens) > 0 {
                    ctx = context.WithValue(ctx, "token", tokens[0])
                }
                return ctx
            }

            // 启动gRPC服务器
            func ServeGRPC(endpoints Endpoints, port string) error {
                lis, err := net.Listen("tcp", port)
                if err != nil {
                    return err
                }

                s := grpc.NewServer()
                pb.RegisterUserServiceServer(s, NewGRPCServer(endpoints))

                return s.Serve(lis)
            }
            ---
    b.客户端
        a.功能说明
            gRPC客户端用于调用远程gRPC服务,提供了类型安全的调用方式。go-kit的grpctransport.Client封装了gRPC调用流程,包括请求编码、gRPC调用、响应解码。支持连接复用、负载均衡、超时控制等特性。客户端返回Endpoint类型,可以与其他中间件组合使用。支持流式调用,可以处理大数据量的传输。
        b.代码示例
            ---
            // gRPC客户端实现
            package client

            import (
                "context"
                "time"
                grpctransport "github.com/go-kit/kit/transport/grpc"
                "google.golang.org/grpc"
            )

            // 创建gRPC客户端
            func NewGRPCClient(conn *grpc.ClientConn) Service {
                // 创建用户端点
                createUserEndpoint := grpctransport.NewClient(
                    conn,
                    "pb.UserService",
                    "CreateUser",
                    encodeGRPCCreateUserRequest,
                    decodeGRPCCreateUserResponse,
                    &pb.CreateUserResponse{},
                    grpctransport.ClientBefore(setGRPCMetadata),
                ).Endpoint()

                // 获取用户端点
                getUserEndpoint := grpctransport.NewClient(
                    conn,
                    "pb.UserService",
                    "GetUser",
                    encodeGRPCGetUserRequest,
                    decodeGRPCGetUserResponse,
                    &pb.GetUserResponse{},
                ).Endpoint()

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                }
            }

            // 请求编码器
            func encodeGRPCCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(createUserRequest)
                return &pb.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func encodeGRPCGetUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(getUserRequest)
                return &pb.GetUserRequest{Id: req.ID}, nil
            }

            // 响应解码器
            func decodeGRPCCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(*pb.CreateUserResponse)
                return createUserResponse{
                    User: User{
                        ID:       resp.User.Id,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            func decodeGRPCGetUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(*pb.GetUserResponse)
                return getUserResponse{
                    User: User{
                        ID:       resp.User.Id,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            // 设置gRPC元数据
            func setGRPCMetadata(ctx context.Context, md *metadata.MD) context.Context {
                if token, ok := ctx.Value("token").(string); ok {
                    (*md)["authorization"] = []string{token}
                }
                return ctx
            }

            // 创建gRPC连接
            func DialGRPC(target string) (*grpc.ClientConn, error) {
                return grpc.Dial(
                    target,
                    grpc.WithInsecure(),
                    grpc.WithTimeout(10*time.Second),
                    grpc.WithBlock(),
                )
            }

            // 使用示例
            func main() {
                conn, err := DialGRPC("localhost:9090")
                if err != nil {
                    log.Fatal(err)
                }
                defer conn.Close()

                client := NewGRPCClient(conn)
                resp, err := client.CreateUserEndpoint(context.Background(), createUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                })
            }
            ---

2.3 Endpoint层

01.端点定义
    a.标准签名
        a.功能说明
            Endpoint是go-kit的核心抽象,定义为接收context.Context和request接口,返回response接口和error的函数。这种统一的签名使得所有业务方法都可以转换为Endpoint,便于中间件的应用和组合。Endpoint将具体的业务方法抽象为通用的请求响应模型,实现了业务逻辑与传输协议的解耦。每个Service方法对应一个Endpoint,Endpoint负责参数转换和结果封装。
        b.代码示例
            ---
            // Endpoint标准定义
            package endpoint

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // Endpoint类型定义
            type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

            // 创建Endpoint
            func MakeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }

            func MakeGetUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(GetUserRequest)
                    user, err := svc.GetUser(ctx, req.ID)
                    if err != nil {
                        return GetUserResponse{Err: err.Error()}, nil
                    }
                    return GetUserResponse{User: user}, nil
                }
            }

            // 请求响应结构
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }

            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }

            type GetUserRequest struct {
                ID string `json:"id"`
            }

            type GetUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }
            ---
    b.端点集合
        a.功能说明
            通常将一个服务的所有Endpoint组织为一个结构体,便于统一管理和传递。Endpoint集合包含服务的所有业务方法对应的Endpoint,可以作为一个整体传递给Transport层。这种组织方式使得服务的接口清晰明确,便于客户端调用。Endpoint集合也可以实现Service接口,使得Endpoint可以像Service一样使用。
        b.代码示例
            ---
            // Endpoint集合
            package endpoint

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // Endpoints结构
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
                UpdateUserEndpoint endpoint.Endpoint
                DeleteUserEndpoint endpoint.Endpoint
            }

            // 创建Endpoints
            func MakeEndpoints(svc UserService, middlewares []endpoint.Middleware) Endpoints {
                var createUserEndpoint endpoint.Endpoint
                createUserEndpoint = MakeCreateUserEndpoint(svc)
                for _, m := range middlewares {
                    createUserEndpoint = m(createUserEndpoint)
                }

                var getUserEndpoint endpoint.Endpoint
                getUserEndpoint = MakeGetUserEndpoint(svc)
                for _, m := range middlewares {
                    getUserEndpoint = m(getUserEndpoint)
                }

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                }
            }

            // Endpoints实现Service接口
            func (e Endpoints) CreateUser(ctx context.Context, username, email string) (User, error) {
                request := CreateUserRequest{Username: username, Email: email}
                response, err := e.CreateUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }
                resp := response.(CreateUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }
                return resp.User, nil
            }

            func (e Endpoints) GetUser(ctx context.Context, id string) (User, error) {
                request := GetUserRequest{ID: id}
                response, err := e.GetUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }
                resp := response.(GetUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }
                return resp.User, nil
            }
            ---

02.中间件应用
    a.中间件链
        a.功能说明
            Endpoint中间件可以链式组合,形成处理管道。每个中间件接收一个Endpoint并返回增强后的Endpoint,多个中间件按顺序应用。中间件可以在Endpoint执行前后添加逻辑,如日志记录、性能监控、参数验证等。中间件的执行顺序由添加顺序决定,最先添加的中间件最外层,最后执行。合理组织中间件顺序可以优化性能和功能。
        b.代码示例
            ---
            // 中间件链应用
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
            )

            // 日志中间件
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer func(begin time.Time) {
                            logger.Log("msg", "called endpoint", "took", time.Since(begin))
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 监控中间件
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 限流中间件
            func RateLimitMiddleware(limiter *rate.Limiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 应用中间件链
            func ApplyMiddlewares(e endpoint.Endpoint, middlewares ...endpoint.Middleware) endpoint.Endpoint {
                for i := len(middlewares) - 1; i >= 0; i-- {
                    e = middlewares[i](e)
                }
                return e
            }

            // 使用示例
            func BuildEndpoint(svc UserService) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = MakeCreateUserEndpoint(svc)

                // 应用多个中间件
                e = ApplyMiddlewares(e,
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(histogram),
                    RateLimitMiddleware(limiter),
                )

                return e
            }
            ---
    b.条件中间件
        a.功能说明
            可以根据条件选择性地应用中间件,实现灵活的功能控制。条件中间件可以根据配置、环境变量、请求特征等条件决定是否执行。这种机制使得同一套代码可以在不同环境下有不同的行为,如开发环境启用详细日志,生产环境启用性能监控。条件中间件也可以用于A/B测试、灰度发布等场景。
        b.代码示例
            ---
            // 条件中间件
            package middleware

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // 条件中间件包装器
            func ConditionalMiddleware(condition func() bool, middleware endpoint.Middleware) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    if condition() {
                        return middleware(next)
                    }
                    return next
                }
            }

            // 环境条件中间件
            func EnvironmentMiddleware(env string, middleware endpoint.Middleware) endpoint.Middleware {
                return ConditionalMiddleware(
                    func() bool { return os.Getenv("ENV") == env },
                    middleware,
                )
            }

            // 功能开关中间件
            func FeatureFlagMiddleware(flag string, middleware endpoint.Middleware) endpoint.Middleware {
                return ConditionalMiddleware(
                    func() bool { return isFeatureEnabled(flag) },
                    middleware,
                )
            }

            // 使用示例
            func BuildEndpointWithConditions(svc UserService) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = MakeCreateUserEndpoint(svc)

                // 开发环境启用详细日志
                e = EnvironmentMiddleware("development", DetailedLoggingMiddleware(logger))(e)

                // 生产环境启用性能监控
                e = EnvironmentMiddleware("production", InstrumentingMiddleware(metrics))(e)

                // 功能开关控制限流
                e = FeatureFlagMiddleware("rate_limiting", RateLimitMiddleware(limiter))(e)

                // 始终启用的中间件
                e = LoggingMiddleware(logger)(e)

                return e
            }

            // 请求特征条件中间件
            func RequestBasedMiddleware(predicate func(interface{}) bool, middleware endpoint.Middleware) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    wrapped := middleware(next)
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if predicate(request) {
                            return wrapped(ctx, request)
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 根据用户类型应用不同中间件
            func UserTypeMiddleware(svc UserService) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = MakeCreateUserEndpoint(svc)

                // VIP用户不限流
                e = RequestBasedMiddleware(
                    func(req interface{}) bool {
                        r := req.(CreateUserRequest)
                        return !isVIPUser(r.Username)
                    },
                    RateLimitMiddleware(limiter),
                )(e)

                return e
            }
            ---

2.4 Service层

01.接口设计
    a.方法定义
        a.功能说明
            Service层接口定义了服务的所有业务方法,每个方法代表一个业务操作。方法签名应该清晰明确,第一个参数必须是context.Context用于传递请求上下文和超时控制。返回值通常包含业务对象和error,error用于表示业务异常。接口设计应该遵循单一职责原则,每个接口只负责一类业务功能。方法命名应该使用动词开头,清晰表达操作意图。
        b.代码示例
            ---
            // Service接口设计
            package service

            import "context"

            type UserService interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
                UpdateUser(ctx context.Context, id string, updates UserUpdates) error
                DeleteUser(ctx context.Context, id string) error
                ListUsers(ctx context.Context, offset, limit int) ([]User, error)
            }

            type OrderService interface {
                CreateOrder(ctx context.Context, userID string, items []Item) (Order, error)
                GetOrder(ctx context.Context, orderID string) (Order, error)
                CancelOrder(ctx context.Context, orderID string) error
                UpdateOrderStatus(ctx context.Context, orderID string, status OrderStatus) error
            }

            type User struct {
                ID       string `json:"id"`
                Username string `json:"username"`
                Email    string `json:"email"`
                Created  int64  `json:"created"`
            }

            type UserUpdates struct {
                Username *string `json:"username,omitempty"`
                Email    *string `json:"email,omitempty"`
            }
            ---
    b.实现类
        a.功能说明
            Service接口的实现类包含具体的业务逻辑,通常持有必要的依赖项如数据库连接、缓存客户端、其他服务客户端等。实现类通过构造函数接收依赖项,遵循依赖注入原则。业务逻辑应该保持纯粹,不包含日志、监控等横切关注点,这些功能通过中间件实现。实现类应该处理业务规则验证、数据转换、事务管理等核心业务逻辑。
        b.代码示例
            ---
            // Service实现
            package service

            import (
                "context"
                "errors"
                "time"
            )

            type userService struct {
                db    Database
                cache Cache
                email EmailService
            }

            func NewUserService(db Database, cache Cache, email EmailService) UserService {
                return &userService{
                    db:    db,
                    cache: cache,
                    email: email,
                }
            }

            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                if username == "" || email == "" {
                    return User{}, errors.New("username and email required")
                }

                exists, err := s.db.UserExists(ctx, username)
                if err != nil {
                    return User{}, err
                }
                if exists {
                    return User{}, errors.New("username already exists")
                }

                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                    Created:  time.Now().Unix(),
                }

                if err := s.db.SaveUser(ctx, user); err != nil {
                    return User{}, err
                }

                s.cache.Set(ctx, "user:"+user.ID, user, 5*time.Minute)
                s.email.SendWelcomeEmail(ctx, email)

                return user, nil
            }

            func (s *userService) GetUser(ctx context.Context, id string) (User, error) {
                if cached, ok := s.cache.Get(ctx, "user:"+id); ok {
                    return cached.(User), nil
                }

                user, err := s.db.GetUser(ctx, id)
                if err != nil {
                    return User{}, err
                }

                s.cache.Set(ctx, "user:"+id, user, 5*time.Minute)
                return user, nil
            }

            func (s *userService) UpdateUser(ctx context.Context, id string, updates UserUpdates) error {
                user, err := s.db.GetUser(ctx, id)
                if err != nil {
                    return err
                }

                if updates.Username != nil {
                    user.Username = *updates.Username
                }
                if updates.Email != nil {
                    user.Email = *updates.Email
                }

                if err := s.db.UpdateUser(ctx, user); err != nil {
                    return err
                }

                s.cache.Delete(ctx, "user:"+id)
                return nil
            }
            ---

02.依赖管理
    a.依赖注入
        a.功能说明
            Service层通过构造函数接收所有依赖项,实现依赖注入。依赖项应该定义为接口而非具体实现,提高灵活性和可测试性。构造函数应该验证依赖项的有效性,确保Service实例处于可用状态。依赖注入使得Service可以在不同环境下使用不同的实现,如测试环境使用Mock实现,生产环境使用真实实现。
        b.代码示例
            ---
            // 依赖注入示例
            package service

            import "context"

            type Database interface {
                SaveUser(ctx context.Context, user User) error
                GetUser(ctx context.Context, id string) (User, error)
                UpdateUser(ctx context.Context, user User) error
                DeleteUser(ctx context.Context, id string) error
            }

            type Cache interface {
                Get(ctx context.Context, key string) (interface{}, bool)
                Set(ctx context.Context, key string, value interface{}, ttl time.Duration) error
                Delete(ctx context.Context, key string) error
            }

            type EmailService interface {
                SendWelcomeEmail(ctx context.Context, email string) error
                SendPasswordResetEmail(ctx context.Context, email, token string) error
            }

            type userService struct {
                db    Database
                cache Cache
                email EmailService
            }

            func NewUserService(db Database, cache Cache, email EmailService) UserService {
                if db == nil {
                    panic("database is required")
                }
                if cache == nil {
                    panic("cache is required")
                }
                if email == nil {
                    panic("email service is required")
                }

                return &userService{
                    db:    db,
                    cache: cache,
                    email: email,
                }
            }

            func main() {
                db := NewPostgresDatabase(dbConfig)
                cache := NewRedisCache(redisConfig)
                email := NewSMTPEmailService(smtpConfig)

                svc := NewUserService(db, cache, email)

                endpoints := MakeEndpoints(svc)
                handler := MakeHTTPHandler(endpoints)
                http.ListenAndServe(":8080", handler)
            }
            ---
    b.接口隔离
        a.功能说明
            Service层的依赖应该定义为最小化的接口,只包含Service实际需要的方法。这遵循接口隔离原则,避免Service依赖过大的接口。小接口更容易Mock和测试,也更容易理解和维护。可以为不同的Service定义不同的接口,即使它们使用同一个底层实现。接口隔离使得Service与具体实现解耦,提高了系统的灵活性。
        b.代码示例
            ---
            // 接口隔离示例
            package service

            import "context"

            type UserRepository interface {
                SaveUser(ctx context.Context, user User) error
                GetUser(ctx context.Context, id string) (User, error)
                UserExists(ctx context.Context, username string) (bool, error)
            }

            type OrderRepository interface {
                SaveOrder(ctx context.Context, order Order) error
                GetOrder(ctx context.Context, id string) (Order, error)
                UpdateOrderStatus(ctx context.Context, id string, status OrderStatus) error
            }

            type UserCache interface {
                GetUser(ctx context.Context, id string) (User, bool)
                SetUser(ctx context.Context, id string, user User, ttl time.Duration) error
                DeleteUser(ctx context.Context, id string) error
            }

            type userService struct {
                repo  UserRepository
                cache UserCache
            }

            func NewUserService(repo UserRepository, cache UserCache) UserService {
                return &userService{
                    repo:  repo,
                    cache: cache,
                }
            }

            type postgresDB struct {
                db *sql.DB
            }

            func (p *postgresDB) SaveUser(ctx context.Context, user User) error {
                _, err := p.db.ExecContext(ctx, "INSERT INTO users ...")
                return err
            }

            func (p *postgresDB) GetUser(ctx context.Context, id string) (User, error) {
                var user User
                err := p.db.QueryRowContext(ctx, "SELECT * FROM users WHERE id = $1", id).Scan(&user)
                return user, err
            }

            func (p *postgresDB) UserExists(ctx context.Context, username string) (bool, error) {
                var exists bool
                err := p.db.QueryRowContext(ctx, "SELECT EXISTS(SELECT 1 FROM users WHERE username = $1)", username).Scan(&exists)
                return exists, err
            }

            func (p *postgresDB) SaveOrder(ctx context.Context, order Order) error {
                _, err := p.db.ExecContext(ctx, "INSERT INTO orders ...")
                return err
            }

            func NewPostgresDB(config DBConfig) (*postgresDB, error) {
                db, err := sql.Open("postgres", config.DSN)
                if err != nil {
                    return nil, err
                }
                return &postgresDB{db: db}, nil
            }

            func main() {
                db, _ := NewPostgresDB(dbConfig)
                cache := NewRedisCache(redisConfig)

                userSvc := NewUserService(db, cache)
                orderSvc := NewOrderService(db)
            }
            ---

2.5 层级交互

01.请求流程
    a.完整链路
        a.功能说明
            请求从客户端发起,经过Transport层解码为请求对象,传递给Endpoint层。Endpoint层调用Service层的业务方法处理请求,Service层返回结果后,Endpoint将其封装为响应对象。Transport层将响应对象编码为协议格式返回给客户端。整个流程中,各层职责清晰,数据单向流动。中间件可以在各个环节插入,实现日志、监控、限流等功能。
        b.代码示例
            ---
            // 完整请求流程
            package flow

            import (
                "context"
                "encoding/json"
                "net/http"
            )

            func CompleteRequestFlow() {
                // 1. 创建Service层
                db := NewDatabase()
                cache := NewCache()
                svc := NewUserService(db, cache)

                // 2. 创建Endpoint层
                endpoint := MakeCreateUserEndpoint(svc)
                endpoint = LoggingMiddleware(logger)(endpoint)
                endpoint = InstrumentingMiddleware(metrics)(endpoint)

                // 3. 创建Transport层
                handler := httptransport.NewServer(
                    endpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                )

                // 4. 启动HTTP服务器
                http.Handle("/users", handler)
                http.ListenAndServe(":8080", nil)
            }

            // 请求处理流程
            func HandleCreateUserRequest(w http.ResponseWriter, r *http.Request) {
                ctx := r.Context()

                // Transport层:解码HTTP请求
                request, err := decodeCreateUserRequest(ctx, r)
                if err != nil {
                    http.Error(w, err.Error(), http.StatusBadRequest)
                    return
                }

                // Endpoint层:调用端点
                response, err := createUserEndpoint(ctx, request)
                if err != nil {
                    http.Error(w, err.Error(), http.StatusInternalServerError)
                    return
                }

                // Transport层:编码HTTP响应
                encodeResponse(ctx, w, response)
            }

            var createUserEndpoint = func(ctx context.Context, request interface{}) (interface{}, error) {
                req := request.(CreateUserRequest)
                user, err := svc.CreateUser(ctx, req.Username, req.Email)
                if err != nil {
                    return CreateUserResponse{Err: err.Error()}, nil
                }
                return CreateUserResponse{User: user}, nil
            }
            ---
    b.错误处理
        a.功能说明
            各层对错误的处理方式不同。Service层返回业务错误,Endpoint层将错误封装到响应对象中,Transport层将错误转换为协议特定的错误格式。可以定义自定义错误类型,携带错误码、错误消息等信息。错误处理应该区分业务错误和系统错误,业务错误返回给客户端,系统错误记录日志。错误信息应该清晰明确,便于问题排查。
        b.代码示例
            ---
            // 错误处理示例
            package errors

            import (
                "encoding/json"
                "net/http"
            )

            // 自定义错误类型
            type ServiceError struct {
                Code    string `json:"code"`
                Message string `json:"message"`
            }

            func (e ServiceError) Error() string {
                return e.Message
            }

            var (
                ErrUserNotFound     = ServiceError{"USER_NOT_FOUND", "User not found"}
                ErrInvalidInput     = ServiceError{"INVALID_INPUT", "Invalid input"}
                ErrUnauthorized     = ServiceError{"UNAUTHORIZED", "Unauthorized"}
                ErrInternalError    = ServiceError{"INTERNAL_ERROR", "Internal server error"}
            )

            // Service层:返回业务错误
            func (s *userService) GetUser(ctx context.Context, id string) (User, error) {
                if id == "" {
                    return User{}, ErrInvalidInput
                }

                user, err := s.db.GetUser(ctx, id)
                if err == sql.ErrNoRows {
                    return User{}, ErrUserNotFound
                }
                if err != nil {
                    return User{}, ErrInternalError
                }

                return user, nil
            }

            // Endpoint层:封装错误到响应
            func MakeGetUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(GetUserRequest)
                    user, err := svc.GetUser(ctx, req.ID)
                    if err != nil {
                        return GetUserResponse{Err: err.Error()}, nil
                    }
                    return GetUserResponse{User: user}, nil
                }
            }

            // Transport层:转换为HTTP错误
            func encodeError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")

                code := http.StatusInternalServerError
                if e, ok := err.(ServiceError); ok {
                    switch e.Code {
                    case "USER_NOT_FOUND":
                        code = http.StatusNotFound
                    case "INVALID_INPUT":
                        code = http.StatusBadRequest
                    case "UNAUTHORIZED":
                        code = http.StatusUnauthorized
                    }
                }

                w.WriteHeader(code)
                json.NewEncoder(w).Encode(map[string]interface{}{
                    "error": err.Error(),
                })
            }
            ---

02.上下文传递
    a.Context使用
        a.功能说明
            context.Context在各层之间传递请求上下文信息,包括超时控制、取消信号、请求ID、用户信息等。每个Service方法的第一个参数必须是context.Context,Endpoint和Transport层也使用Context传递信息。可以使用context.WithValue存储请求相关的数据,如认证token、追踪ID等。Context应该只用于传递请求范围的数据,不应该存储业务逻辑需要的参数。
        b.代码示例
            ---
            // Context传递示例
            package context

            import (
                "context"
                "time"
            )

            type contextKey string

            const (
                ContextKeyRequestID contextKey = "request_id"
                ContextKeyUserID    contextKey = "user_id"
                ContextKeyToken     contextKey = "token"
            )

            // Transport层:从HTTP请求提取信息到Context
            func extractRequestContext(ctx context.Context, r *http.Request) context.Context {
                requestID := r.Header.Get("X-Request-ID")
                if requestID == "" {
                    requestID = generateRequestID()
                }
                ctx = context.WithValue(ctx, ContextKeyRequestID, requestID)

                token := r.Header.Get("Authorization")
                if token != "" {
                    ctx = context.WithValue(ctx, ContextKeyToken, token)
                    userID := extractUserIDFromToken(token)
                    ctx = context.WithValue(ctx, ContextKeyUserID, userID)
                }

                return ctx
            }

            // Endpoint层:使用Context信息
            func MakeCreateOrderEndpoint(svc OrderService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateOrderRequest)

                    userID, ok := ctx.Value(ContextKeyUserID).(string)
                    if !ok {
                        return nil, ErrUnauthorized
                    }

                    order, err := svc.CreateOrder(ctx, userID, req.Items)
                    if err != nil {
                        return CreateOrderResponse{Err: err.Error()}, nil
                    }
                    return CreateOrderResponse{Order: order}, nil
                }
            }

            // Service层:使用Context控制超时
            func (s *orderService) CreateOrder(ctx context.Context, userID string, items []Item) (Order, error) {
                ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
                defer cancel()

                order := Order{
                    ID:     generateOrderID(),
                    UserID: userID,
                    Items:  items,
                }

                if err := s.db.SaveOrder(ctx, order); err != nil {
                    return Order{}, err
                }

                select {
                case <-ctx.Done():
                    return Order{}, ctx.Err()
                default:
                    return order, nil
                }
            }

            // 日志中间件:使用Context中的RequestID
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        requestID := ctx.Value(ContextKeyRequestID)
                        logger.Log("request_id", requestID, "msg", "calling endpoint")
                        return next(ctx, request)
                    }
                }
            }
            ---
    b.元数据传递
        a.功能说明
            元数据包括请求ID、追踪ID、用户信息、认证token等非业务数据,通过Context在各层之间传递。Transport层负责从协议中提取元数据并注入Context,如从HTTP Header或gRPC Metadata中提取。Endpoint层和Service层可以从Context中读取元数据,用于日志记录、权限验证等。元���据的传递应该是透明的,不影响业务逻辑的实现。
        b.代码示例
            ---
            // 元数据传递示例
            package metadata

            import (
                "context"
                "google.golang.org/grpc/metadata"
            )

            // HTTP元数据提取
            func HTTPMetadataToContext(ctx context.Context, r *http.Request) context.Context {
                md := make(map[string]string)
                md["request-id"] = r.Header.Get("X-Request-ID")
                md["user-agent"] = r.Header.Get("User-Agent")
                md["client-ip"] = r.RemoteAddr

                for k, v := range md {
                    ctx = context.WithValue(ctx, contextKey(k), v)
                }

                return ctx
            }

            // gRPC元数据提取
            func GRPCMetadataToContext(ctx context.Context) context.Context {
                md, ok := metadata.FromIncomingContext(ctx)
                if !ok {
                    return ctx
                }

                if requestID := md.Get("request-id"); len(requestID) > 0 {
                    ctx = context.WithValue(ctx, ContextKeyRequestID, requestID[0])
                }

                if token := md.Get("authorization"); len(token) > 0 {
                    ctx = context.WithValue(ctx, ContextKeyToken, token[0])
                }

                return ctx
            }

            // 元数据注入HTTP响应
            func ContextToHTTPResponse(ctx context.Context, w http.ResponseWriter) {
                if requestID, ok := ctx.Value(ContextKeyRequestID).(string); ok {
                    w.Header().Set("X-Request-ID", requestID)
                }
                if traceID, ok := ctx.Value("trace-id").(string); ok {
                    w.Header().Set("X-Trace-ID", traceID)
                }
            }

            // 元数据注入gRPC响应
            func ContextToGRPCMetadata(ctx context.Context) context.Context {
                md := metadata.New(map[string]string{})

                if requestID, ok := ctx.Value(ContextKeyRequestID).(string); ok {
                    md.Set("request-id", requestID)
                }

                return metadata.NewOutgoingContext(ctx, md)
            }

            // 使用示例
            func MakeHTTPHandler(endpoint endpoint.Endpoint) http.Handler {
                return httptransport.NewServer(
                    endpoint,
                    decodeRequest,
                    encodeResponse,
                    httptransport.ServerBefore(HTTPMetadataToContext),
                    httptransport.ServerAfter(func(ctx context.Context, w http.ResponseWriter) context.Context {
                        ContextToHTTPResponse(ctx, w)
                        return ctx
                    }),
                )
            }
            ---

2.6 最佳实践

01.分层原则
    a.职责分离
        a.功能说明
            严格遵守各层职责分离原则,Service层只包含业务逻辑,Endpoint层只做请求响应转换,Transport层只处理协议适配。不要在Service层处理HTTP请求,不要在Transport层编写业务逻辑。保持各层的纯粹性,使得代码易于理解和维护。职责分离也便于单元测试,每层可以独立测试。遵循单一职责原则,每个组件只做一件事。
        b.代码示例
            ---
            // 职责分离示例
            package practice

            // ✅ 正确:Service层只包含业务逻辑
            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                if username == "" || email == "" {
                    return User{}, errors.New("invalid input")
                }

                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                }

                return s.db.SaveUser(ctx, user)
            }

            // ❌ 错误:Service层不应该处理HTTP
            func (s *userService) CreateUserFromHTTP(w http.ResponseWriter, r *http.Request) {
                var req CreateUserRequest
                json.NewDecoder(r.Body).Decode(&req)
                user, _ := s.CreateUser(r.Context(), req.Username, req.Email)
                json.NewEncoder(w).Encode(user)
            }

            // ✅ 正确:Endpoint层只做转换
            func MakeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }

            // ❌ 错误:Endpoint层不应该包含业务逻辑
            func MakeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    if req.Username == "" {
                        return nil, errors.New("username required")
                    }
                    if !isValidEmail(req.Email) {
                        return nil, errors.New("invalid email")
                    }
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    return CreateUserResponse{User: user}, err
                }
            }
            ---
    b.接口优先
        a.功能说明
            始终使用接口而非具体实现进行依赖,提高代码的灵活性和可测试性。Service层定义为接口,依赖项也定义为接口。接口应该小而专注,只包含必要的方法。通过接口可以轻松替换实现,如测试时使用Mock实现。接口优先的设计使得代码更容易扩展和维护。
        b.代码示例
            ---
            // 接口优先示例
            package practice

            // ✅ 正确:使用接口定义依赖
            type UserService interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
            }

            type UserRepository interface {
                SaveUser(ctx context.Context, user User) error
                GetUser(ctx context.Context, id string) (User, error)
            }

            type userService struct {
                repo UserRepository
            }

            func NewUserService(repo UserRepository) UserService {
                return &userService{repo: repo}
            }

            // ❌ 错误:直接依赖具体实现
            type userService struct {
                db *sql.DB
            }

            func NewUserService(db *sql.DB) *userService {
                return &userService{db: db}
            }

            // ✅ 正确:小而专注的接口
            type UserReader interface {
                GetUser(ctx context.Context, id string) (User, error)
            }

            type UserWriter interface {
                SaveUser(ctx context.Context, user User) error
            }

            // ❌ 错误:过大的接口
            type UserRepository interface {
                SaveUser(ctx context.Context, user User) error
                GetUser(ctx context.Context, id string) (User, error)
                DeleteUser(ctx context.Context, id string) error
                ListUsers(ctx context.Context) ([]User, error)
                SaveOrder(ctx context.Context, order Order) error
                GetOrder(ctx context.Context, id string) (Order, error)
            }
            ---

02.代码组织
    a.目录结构
        a.功能说明
            合理组织代码目录结构,按照功能模块划分包。通常将Service、Endpoint、Transport分别放在不同的包中。每个服务一个独立的目录,包含该服务的所有代码。公共代码如中间件、工具函数放在shared包中。清晰的目录结构使得代码易于导航和维护。
        b.代码示例
            ---
            // 推荐的目录结构
            user-service/
            ├── cmd/
            │   └── server/
            │       └── main.go              # 服务入口
            ├── pkg/
            │   ├── service/
            │   │   ├── service.go           # Service接口定义
            │   │   ├── user.go              # User服务实现
            │   │   └── middleware.go        # Service中间件
            │   ├── endpoint/
            │   │   ├── endpoint.go          # Endpoint定义
            │   │   ├── middleware.go        # Endpoint中间件
            │   │   └── request_response.go  # 请求响应结构
            │   ├── transport/
            │   │   ├── http.go              # HTTP传输
            │   │   ├── grpc.go              # gRPC传输
            │   │   └── encode_decode.go     # 编解码函数
            │   └── model/
            │       └── user.go              # 数据模型
            ├── internal/
            │   ├── repository/
            │   │   └── postgres.go          # 数据库实现
            │   └── cache/
            │       └── redis.go             # 缓存实现
            ├── shared/
            │   ├── middleware/
            │   │   ├── logging.go
            │   │   ├── metrics.go
            │   │   └── tracing.go
            │   └── errors/
            │       └── errors.go
            └── go.mod

            // main.go 组织
            package main

            import (
                "user-service/pkg/service"
                "user-service/pkg/endpoint"
                "user-service/pkg/transport"
                "user-service/internal/repository"
            )

            func main() {
                db := repository.NewPostgresDB(config)
                svc := service.NewUserService(db)
                endpoints := endpoint.MakeEndpoints(svc)
                handler := transport.MakeHTTPHandler(endpoints)
                http.ListenAndServe(":8080", handler)
            }
            ---
    b.命名规范
        a.功能说明
            遵循Go语言命名规范,使用清晰明确的命名。接口名使用名词,方法名使用动词开头。请求响应结构使用Request和Response后缀。中间件函数使用Middleware后缀。包名使用小写单数名词。避免使用缩写,除非是广为人知的缩写。好的命名使得代码自文档化,易于理解。
        b.代码示例
            ---
            // 命名规范示例
            package naming

            // ✅ 正确:接口使用名词
            type UserService interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
            }

            type OrderService interface {
                CreateOrder(ctx context.Context, userID string, items []Item) (Order, error)
            }

            // ❌ 错误:接口名不清晰
            type IUser interface {
                Create(ctx context.Context, username, email string) (User, error)
            }

            // ✅ 正确:方法使用动词开头
            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error)
            func (s *userService) GetUser(ctx context.Context, id string) (User, error)
            func (s *userService) UpdateUser(ctx context.Context, id string, updates UserUpdates) error
            func (s *userService) DeleteUser(ctx context.Context, id string) error

            // ❌ 错误:方法名不清晰
            func (s *userService) User(ctx context.Context, username, email string) (User, error)
            func (s *userService) Fetch(ctx context.Context, id string) (User, error)

            // ✅ 正确:请求响应使用Request/Response后缀
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }

            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }

            // ❌ 错误:命名不规范
            type CreateUserReq struct {
                Username string
                Email    string
            }

            type CreateUserResp struct {
                User User
                Err  string
            }

            // ✅ 正确:中间件使用Middleware后缀
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware
            func InstrumentingMiddleware(metrics Metrics) endpoint.Middleware
            func RateLimitMiddleware(limiter *rate.Limiter) endpoint.Middleware

            // ❌ 错误:中间件命名不规范
            func Logger(logger log.Logger) endpoint.Middleware
            func Metrics(metrics Metrics) endpoint.Middleware
            func RateLimit(limiter *rate.Limiter) endpoint.Middleware
            ---

3 服务端点

3.1 Endpoint定义

01.基础概念
    a.端点抽象
        a.功能说明
            Endpoint是go-kit的核心抽象,将所有业务方法统一为相同的函数签名。接收context.Context和request接口,返回response接口和error。这种统一的签名使得所有业务方法都可以使用相同的中间件和处理逻辑,实现了业务逻辑与传输协议的完全解耦。Endpoint作为Service层和Transport层之间的桥梁,负责将具体的业务方法调用转换为通用的请求响应模型。
        b.代码示例
            ---
            // Endpoint基础定义
            package endpoint

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
            )

            // Endpoint类型定义
            type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

            // 创建基础Endpoint
            func MakeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }

            func MakeGetUserEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(GetUserRequest)
                    user, err := svc.GetUser(ctx, req.ID)
                    if err != nil {
                        return GetUserResponse{Err: err.Error()}, nil
                    }
                    return GetUserResponse{User: user}, nil
                }
            }

            // 请求响应结构
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }

            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }

            type GetUserRequest struct {
                ID string `json:"id"`
            }

            type GetUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }
            ---
    b.端点工厂
        a.功能说明
            端点工厂函数负责创建和配置Endpoint实例,接收Service作为参数,返回配置好的Endpoint。工厂函数封装了Endpoint的创建逻辑,包括请求响应转换、错误处理、中间件应用等。使用工厂模式可以标准化Endpoint的创建过程,便于维护和测试。工厂函数还可以根据配置动态调整Endpoint的行为,如启用或禁用某些中间件。
        b.代码示例
            ---
            // Endpoint工厂函数
            package endpoint

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/metrics"
            )

            // EndpointFactory 端点工厂
            type EndpointFactory struct {
                logger  log.Logger
                metrics metrics.Histogram
            }

            func NewEndpointFactory(logger log.Logger, metrics metrics.Histogram) *EndpointFactory {
                return &EndpointFactory{
                    logger:  logger,
                    metrics: metrics,
                }
            }

            // CreateEndpoint 创建带中间件的Endpoint
            func (f *EndpointFactory) CreateEndpoint(svc UserService, method string) endpoint.Endpoint {
                var e endpoint.Endpoint

                switch method {
                case "CreateUser":
                    e = MakeCreateUserEndpoint(svc)
                case "GetUser":
                    e = MakeGetUserEndpoint(svc)
                case "UpdateUser":
                    e = MakeUpdateUserEndpoint(svc)
                case "DeleteUser":
                    e = MakeDeleteUserEndpoint(svc)
                default:
                    panic("unknown method: " + method)
                }

                // 应用通用中间件
                e = LoggingMiddleware(f.logger)(e)
                e = InstrumentingMiddleware(f.metrics)(e)

                return e
            }

            // MakeEndpoints 批量创建Endpoints
            func MakeEndpoints(svc UserService, logger log.Logger, metrics metrics.Histogram) Endpoints {
                factory := NewEndpointFactory(logger, metrics)

                return Endpoints{
                    CreateUserEndpoint: factory.CreateEndpoint(svc, "CreateUser"),
                    GetUserEndpoint:    factory.CreateEndpoint(svc, "GetUser"),
                    UpdateUserEndpoint: factory.CreateEndpoint(svc, "UpdateUser"),
                    DeleteUserEndpoint: factory.CreateEndpoint(svc, "DeleteUser"),
                }
            }

            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
                UpdateUserEndpoint endpoint.Endpoint
                DeleteUserEndpoint endpoint.Endpoint
            }
            ---

02.请求响应模型
    a.结构设计
        a.功能说明
            请求响应结构定义了Endpoint的输入输出格式,每个Endpoint都有对应的Request和Response类型。Request结构包含业务方法所需的所有参数,Response结构包含业务方法的返回值和错误信息。使用结构体而非多个参数可以提高代码的可读性和可维护性,便于添加新字段而不影响现有代码。Response结构通常包含Err字段用于传递错误信息,避免使用error返回值。
        b.代码示例
            ---
            // 请求响应模型设计
            package endpoint

            import "time"

            // CreateUserRequest 创建用户请求
            type CreateUserRequest struct {
                Username string `json:"username" validate:"required,min=3,max=20"`
                Email    string `json:"email" validate:"required,email"`
                Password string `json:"password" validate:"required,min=6"`
            }

            // CreateUserResponse 创建用户响应
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }

            // GetUserRequest 获取用户请求
            type GetUserRequest struct {
                ID string `json:"id" validate:"required"`
            }

            // GetUserResponse 获取用户响应
            type GetUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  string `json:"err,omitempty"`
            }

            // UpdateUserRequest 更新用户请求
            type UpdateUserRequest struct {
                ID       string  `json:"id" validate:"required"`
                Username *string `json:"username,omitempty" validate:"omitempty,min=3,max=20"`
                Email    *string `json:"email,omitempty" validate:"omitempty,email"`
            }

            // UpdateUserResponse 更新用户响应
            type UpdateUserResponse struct {
                Err string `json:"err,omitempty"`
            }

            // DeleteUserRequest 删除用户请求
            type DeleteUserRequest struct {
                ID string `json:"id" validate:"required"`
            }

            // DeleteUserResponse 删除用户响应
            type DeleteUserResponse struct {
                Err string `json:"err,omitempty"`
            }

            // ListUsersRequest 列表查询请求
            type ListUsersRequest struct {
                Offset int    `json:"offset" validate:"min=0"`
                Limit  int    `json:"limit" validate:"min=1,max=100"`
                Filter string `json:"filter,omitempty"`
            }

            // ListUsersResponse 列表查询响应
            type ListUsersResponse struct {
                Users []User `json:"users,omitempty"`
                Total int    `json:"total"`
                Err   string `json:"err,omitempty"`
            }

            // User 用户模型
            type User struct {
                ID        string    `json:"id"`
                Username  string    `json:"username"`
                Email     string    `json:"email"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
            }
            ---
    b.参数验证
        a.功能说明
            请求参数验证是Endpoint层的重要职责,确保传入的数据符合业务规则。可以使用validator库进行声明式验证,在结构体标签中定义验证规则。参数验证应该在调用Service方法之前进行,避免无效数据进入业务逻辑层。验证失败应该返回清晰的错误信息,帮助客户端快速定位问题。
        b.代码示例
            ---
            // 参数验证实现
            package endpoint

            import (
                "context"
                "fmt"
                "github.com/go-playground/validator/v10"
                "github.com/go-kit/kit/endpoint"
            )

            var validate = validator.New()

            // ValidationMiddleware 参数验证中间件
            func ValidationMiddleware() endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if err := validate.Struct(request); err != nil {
                            return nil, fmt.Errorf("validation failed: %w", err)
                        }
                        return next(ctx, request)
                    }
                }
            }

            // MakeCreateUserEndpoint 带验证的Endpoint
            func MakeCreateUserEndpoint(svc UserService) endpoint.Endpoint {
                e := func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)

                    // 自定义验证逻辑
                    if req.Username == "" {
                        return CreateUserResponse{Err: "username is required"}, nil
                    }
                    if len(req.Username) < 3 {
                        return CreateUserResponse{Err: "username must be at least 3 characters"}, nil
                    }
                    if req.Email == "" {
                        return CreateUserResponse{Err: "email is required"}, nil
                    }

                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }

                // 应用验证中间件
                return ValidationMiddleware()(e)
            }

            // ValidateRequest 通用验证函数
            func ValidateRequest(request interface{}) error {
                if err := validate.Struct(request); err != nil {
                    validationErrors := err.(validator.ValidationErrors)
                    for _, e := range validationErrors {
                        return fmt.Errorf("field %s failed validation: %s", e.Field(), e.Tag())
                    }
                }
                return nil
            }

            // 使用示例
            func ExampleValidation() {
                req := CreateUserRequest{
                    Username: "jo",
                    Email:    "invalid-email",
                }

                if err := ValidateRequest(req); err != nil {
                    fmt.Println("Validation error:", err)
                    // Output: Validation error: field Username failed validation: min
                }
            }
            ---

03.端点组合
    a.端点集合
        a.功能说明
            将服务的所有Endpoint组织为一个结构体,便于统一管理和传递。Endpoint集合作为服务的完整接口定义,包含所有业务操作对应的Endpoint。这种组织方式使得服务接口清晰明确,便于Transport层绑定和客户端调用。Endpoint集合还可以实现Service接口,使得Endpoint可以像Service一样使用,便于测试和Mock。
        b.代码示例
            ---
            // Endpoint集合实现
            package endpoint

            import (
                "context"
                "errors"
                "github.com/go-kit/kit/endpoint"
            )

            // Endpoints 端点集合
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
                UpdateUserEndpoint endpoint.Endpoint
                DeleteUserEndpoint endpoint.Endpoint
                ListUsersEndpoint  endpoint.Endpoint
            }

            // MakeEndpoints 创建端点集合
            func MakeEndpoints(svc UserService) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(svc),
                    GetUserEndpoint:    MakeGetUserEndpoint(svc),
                    UpdateUserEndpoint: MakeUpdateUserEndpoint(svc),
                    DeleteUserEndpoint: MakeDeleteUserEndpoint(svc),
                    ListUsersEndpoint:  MakeListUsersEndpoint(svc),
                }
            }

            // Endpoints实现UserService接口
            func (e Endpoints) CreateUser(ctx context.Context, username, email string) (User, error) {
                request := CreateUserRequest{
                    Username: username,
                    Email:    email,
                }

                response, err := e.CreateUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }

                resp := response.(CreateUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }

                return resp.User, nil
            }

            func (e Endpoints) GetUser(ctx context.Context, id string) (User, error) {
                request := GetUserRequest{ID: id}

                response, err := e.GetUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }

                resp := response.(GetUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }

                return resp.User, nil
            }

            func (e Endpoints) UpdateUser(ctx context.Context, id string, updates UserUpdates) error {
                request := UpdateUserRequest{
                    ID:       id,
                    Username: updates.Username,
                    Email:    updates.Email,
                }

                response, err := e.UpdateUserEndpoint(ctx, request)
                if err != nil {
                    return err
                }

                resp := response.(UpdateUserResponse)
                if resp.Err != "" {
                    return errors.New(resp.Err)
                }

                return nil
            }

            func (e Endpoints) DeleteUser(ctx context.Context, id string) error {
                request := DeleteUserRequest{ID: id}

                response, err := e.DeleteUserEndpoint(ctx, request)
                if err != nil {
                    return err
                }

                resp := response.(DeleteUserResponse)
                if resp.Err != "" {
                    return errors.New(resp.Err)
                }

                return nil
            }

            func (e Endpoints) ListUsers(ctx context.Context, offset, limit int) ([]User, error) {
                request := ListUsersRequest{
                    Offset: offset,
                    Limit:  limit,
                }

                response, err := e.ListUsersEndpoint(ctx, request)
                if err != nil {
                    return nil, err
                }

                resp := response.(ListUsersResponse)
                if resp.Err != "" {
                    return nil, errors.New(resp.Err)
                }

                return resp.Users, nil
            }
            ---
    b.端点复用
        a.功能说明
            通过Endpoint集合实现Service接口,可以将Endpoint当作Service使用,实现端点的复用。这种方式使得客户端可以像调用本地Service一样调用远程服务,隐藏了网络通信的细节。端点复用也便于构建服务代理和API网关,可以将多个服务的Endpoint组合为统一的接口。这种设计提高了代码的灵活性和可组合性。
        b.代码示例
            ---
            // 端点复用示例
            package endpoint

            import (
                "context"
                "io"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/lb"
            )

            // NewClientEndpoints 创建客户端端点集合
            func NewClientEndpoints(instancer sd.Instancer) Endpoints {
                // 端点工厂
                factory := func(instance string) (endpoint.Endpoint, io.Closer, error) {
                    return makeRemoteEndpoint(instance), nil, nil
                }

                // 创建端点管理器
                endpointer := sd.NewEndpointer(instancer, factory, logger)

                // 负载均衡器
                balancer := lb.NewRoundRobin(endpointer)

                // 重试机制
                retry := lb.Retry(3, 500*time.Millisecond, balancer)

                return Endpoints{
                    CreateUserEndpoint: retry,
                    GetUserEndpoint:    retry,
                    UpdateUserEndpoint: retry,
                    DeleteUserEndpoint: retry,
                    ListUsersEndpoint:  retry,
                }
            }

            // ProxyService 服务代理
            type ProxyService struct {
                createUserEndpoint endpoint.Endpoint
                getUserEndpoint    endpoint.Endpoint
            }

            func NewProxyService(endpoints Endpoints) UserService {
                return &ProxyService{
                    createUserEndpoint: endpoints.CreateUserEndpoint,
                    getUserEndpoint:    endpoints.GetUserEndpoint,
                }
            }

            func (p *ProxyService) CreateUser(ctx context.Context, username, email string) (User, error) {
                request := CreateUserRequest{Username: username, Email: email}
                response, err := p.createUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }
                resp := response.(CreateUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }
                return resp.User, nil
            }

            func (p *ProxyService) GetUser(ctx context.Context, id string) (User, error) {
                request := GetUserRequest{ID: id}
                response, err := p.getUserEndpoint(ctx, request)
                if err != nil {
                    return User{}, err
                }
                resp := response.(GetUserResponse)
                if resp.Err != "" {
                    return User{}, errors.New(resp.Err)
                }
                return resp.User, nil
            }

            // 使用示例
            func ExampleProxyService() {
                // 服务发现
                instancer := consul.NewInstancer(client, logger, "user-service", []string{}, true)

                // 创建客户端端点
                endpoints := NewClientEndpoints(instancer)

                // 创建代理服务
                proxySvc := NewProxyService(endpoints)

                // 像调用本地服务一样使用
                user, err := proxySvc.CreateUser(context.Background(), "john", "john@example.com")
                if err != nil {
                    log.Fatal(err)
                }
                fmt.Printf("Created user: %+v\n", user)
            }
            ---

3.2 中间件模式

01.中间件定义
    a.函数签名
        a.功能说明
            Endpoint中间件是一个接收Endpoint并返回新Endpoint的函数,类型定义为Middleware func(Endpoint) Endpoint。中间件可以在原始Endpoint执行前后添加额外逻辑,如日志记录、性能监控、参数验证、错误处理等。中间件采用装饰器模式,可以层层包装Endpoint,形成处理链。每个中间件都是独立的、可复用的功能单元,可以灵活组合应用到不同的Endpoint上。中间件的执行顺序由包装顺序决定,最外层的中间件最先执行。
        b.代码示例
            ---
            // 中间件基础定义
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/log"
            )

            // Middleware 中间件类型定义
            type Middleware func(endpoint.Endpoint) endpoint.Endpoint

            // LoggingMiddleware 日志中间件
            func LoggingMiddleware(logger log.Logger) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint", "request", request)
                        defer func(begin time.Time) {
                            logger.Log("msg", "called endpoint", "took", time.Since(begin))
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // InstrumentingMiddleware 性能监控中间件
            func InstrumentingMiddleware(duration metrics.Histogram) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.With("success", "true").Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // AuthMiddleware 认证中间件
            func AuthMiddleware(validator TokenValidator) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        token, ok := ctx.Value("token").(string)
                        if !ok || token == "" {
                            return nil, ErrUnauthorized
                        }
                        if err := validator.Validate(token); err != nil {
                            return nil, ErrInvalidToken
                        }
                        return next(ctx, request)
                    }
                }
            }
            ---
    b.链式组合
        a.功能说明
            多个中间件可以链式组合,形成中间件链。中间件链按照添加顺序依次执行,每个中间件都可以决定是否继续调用下一个中间件。可以使用辅助函数简化中间件链的构建,如Chain函数接收多个中间件并返回组合后的中间件。中间件链的顺序很重要,通常将认证、限流等前置中间件放在最外层,日志、监控等后置中间件放在内层。合理的中间件顺序可以提高性能和安全性。
        b.代码示例
            ---
            // 中间件链组合
            package middleware

            import "github.com/go-kit/kit/endpoint"

            // Chain 链式组合多个中间件
            func Chain(outer Middleware, others ...Middleware) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    for i := len(others) - 1; i >= 0; i-- {
                        next = others[i](next)
                    }
                    return outer(next)
                }
            }

            // ChainEndpoint 直接对Endpoint应用中间件链
            func ChainEndpoint(e endpoint.Endpoint, middlewares ...Middleware) endpoint.Endpoint {
                for i := len(middlewares) - 1; i >= 0; i-- {
                    e = middlewares[i](e)
                }
                return e
            }

            // 使用示例
            func BuildEndpoint(svc UserService) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = MakeCreateUserEndpoint(svc)

                // 方式1:逐个应用中间件
                e = LoggingMiddleware(logger)(e)
                e = InstrumentingMiddleware(histogram)(e)
                e = AuthMiddleware(validator)(e)

                // 方式2:使用Chain函数
                middleware := Chain(
                    AuthMiddleware(validator),
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(histogram),
                )
                e = middleware(e)

                // 方式3:使用ChainEndpoint函数
                e = ChainEndpoint(e,
                    AuthMiddleware(validator),
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(histogram),
                )

                return e
            }
            ---

02.常用中间件
    a.日志中间件
        a.功能说明
            日志中间件记录Endpoint的调用信息,包括请求参数、响应结果、执行时间、错误信息等。可以使用go-kit的log包实现结构化日志,支持多种日志格式和输出目标。日志中间件应该记录足够的信息用于问题排查,但避免记录敏感信息如密码、token等。可以根据日志级别控制日志详细程度,如DEBUG级别记录完整请求响应,INFO级别只记录关键信息。日志中间件通常放在中间件链的外层,确保所有请求都被记录。
        b.代码示例
            ---
            // 日志中间件实现
            package middleware

            import (
                "context"
                "fmt"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/log"
                "github.com/go-kit/kit/log/level"
            )

            // LoggingMiddleware 基础日志中间件
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            level.Info(logger).Log(
                                "request", fmt.Sprintf("%+v", request),
                                "response", fmt.Sprintf("%+v", response),
                                "err", err,
                                "took", time.Since(begin),
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // DetailedLoggingMiddleware 详细日志中间件
            func DetailedLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        requestID := ctx.Value("request_id")
                        userID := ctx.Value("user_id")

                        level.Debug(logger).Log(
                            "msg", "endpoint called",
                            "request_id", requestID,
                            "user_id", userID,
                            "request", request,
                        )

                        defer func(begin time.Time) {
                            if err != nil {
                                level.Error(logger).Log(
                                    "msg", "endpoint failed",
                                    "request_id", requestID,
                                    "err", err,
                                    "took", time.Since(begin),
                                )
                            } else {
                                level.Info(logger).Log(
                                    "msg", "endpoint succeeded",
                                    "request_id", requestID,
                                    "took", time.Since(begin),
                                )
                            }
                        }(time.Now())

                        return next(ctx, request)
                    }
                }
            }
            ---
    b.监控中间件
        a.功能说明
            监控中间件收集Endpoint的性能指标,如请求数量、响应时间、错误率等。可以使用go-kit的metrics包集成Prometheus、StatsD等监控系统。监控中间件应该记录关键业务指标,如QPS、延迟分布、成功率等,用于性能分析和容量规划。可以为不同的Endpoint设置不同的监控标签,便于区分和聚合。监控数据应该定期导出到监控系统,避免内存占用过高。
        b.代码示例
            ---
            // 监控中间件实现
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/metrics"
                "github.com/prometheus/client_golang/prometheus"
            )

            // InstrumentingMiddleware 基础监控中间件
            func InstrumentingMiddleware(duration metrics.Histogram, counter metrics.Counter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                            counter.Add(1)
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // MetricsMiddleware 完整监控中间件
            func MetricsMiddleware(
                requestCount metrics.Counter,
                requestDuration metrics.Histogram,
                errorCount metrics.Counter,
            ) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            lvs := []string{"method", "endpoint"}
                            requestCount.With(lvs...).Add(1)
                            requestDuration.With(lvs...).Observe(time.Since(begin).Seconds())
                        }(time.Now())

                        response, err := next(ctx, request)
                        if err != nil {
                            errorCount.With("method", "endpoint").Add(1)
                        }

                        return response, err
                    }
                }
            }

            // PrometheusMiddleware Prometheus监控中间件
            func PrometheusMiddleware(namespace, subsystem, name string) endpoint.Middleware {
                requestCount := prometheus.NewCounterVec(
                    prometheus.CounterOpts{
                        Namespace: namespace,
                        Subsystem: subsystem,
                        Name:      name + "_request_count",
                        Help:      "Total request count",
                    },
                    []string{"method", "status"},
                )
                requestDuration := prometheus.NewHistogramVec(
                    prometheus.HistogramOpts{
                        Namespace: namespace,
                        Subsystem: subsystem,
                        Name:      name + "_request_duration_seconds",
                        Help:      "Request duration in seconds",
                    },
                    []string{"method"},
                )

                prometheus.MustRegister(requestCount, requestDuration)

                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            requestDuration.WithLabelValues(name).Observe(time.Since(begin).Seconds())
                        }(time.Now())

                        response, err := next(ctx, request)

                        status := "success"
                        if err != nil {
                            status = "error"
                        }
                        requestCount.WithLabelValues(name, status).Inc()

                        return response, err
                    }
                }
            }
            ---

03.高级中间件
    a.限流中间件
        a.功能说明
            限流中间件控制Endpoint的请求速率,防止系统过载。可以使用令牌桶、漏桶等算法实现限流,go-kit推荐使用golang.org/x/time/rate包。限流可以基于全局速率、用户速率、IP速率等不同维度。限流中间件应该返回明确的错误信息,告知客户端请求被限流。可以配置限流参数如每秒请求数、突发容量等,根据系统容量动态调整。限流中间件通常放在认证之后、业务逻辑之前。
        b.代码示例
            ---
            // 限流中间件实现
            package middleware

            import (
                "context"
                "errors"
                "golang.org/x/time/rate"
                "github.com/go-kit/kit/endpoint"
            )

            var ErrRateLimitExceeded = errors.New("rate limit exceeded")

            // RateLimitMiddleware 基础限流中间件
            func RateLimitMiddleware(limiter *rate.Limiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // TokenBucketMiddleware 令牌桶限流中间件
            func TokenBucketMiddleware(qps int, burst int) endpoint.Middleware {
                limiter := rate.NewLimiter(rate.Limit(qps), burst)
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if err := limiter.Wait(ctx); err != nil {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // UserRateLimitMiddleware 用户级限流中间件
            func UserRateLimitMiddleware(limiters map[string]*rate.Limiter, defaultQPS int) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        userID, ok := ctx.Value("user_id").(string)
                        if !ok {
                            return nil, errors.New("user_id not found")
                        }

                        limiter, exists := limiters[userID]
                        if !exists {
                            limiter = rate.NewLimiter(rate.Limit(defaultQPS), defaultQPS*2)
                            limiters[userID] = limiter
                        }

                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }

                        return next(ctx, request)
                    }
                }
            }
            ---
    b.熔断中间件
        a.功能说明
            熔断中间件在服务异常时自动切断请求,防止故障扩散。可以使用go-kit的circuitbreaker包集成hystrix、gobreaker等熔断器。熔断器有三种状态:关闭(正常)、开启(熔断)、半开(尝试恢复)。当错误率超过阈值时熔断器开启,拒绝所有请求;经过一段时间后进入半开状态,允许少量请求通过;如果请求成功则关闭熔断器,否则继续开启。熔断中间件应该配置合理的阈值和超时时间,避免误判和过度保护。
        b.代码示例
            ---
            // 熔断中间件实现
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/sony/gobreaker"
            )

            // CircuitBreakerMiddleware 熔断中间件
            func CircuitBreakerMiddleware(cb *gobreaker.CircuitBreaker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := cb.Execute(func() (interface{}, error) {
                            return next(ctx, request)
                        })
                        return response, err
                    }
                }
            }

            // NewCircuitBreaker 创建熔断器
            func NewCircuitBreaker(name string, maxRequests uint32, interval time.Duration, timeout time.Duration) *gobreaker.CircuitBreaker {
                settings := gobreaker.Settings{
                    Name:        name,
                    MaxRequests: maxRequests,
                    Interval:    interval,
                    Timeout:     timeout,
                    ReadyToTrip: func(counts gobreaker.Counts) bool {
                        failureRatio := float64(counts.TotalFailures) / float64(counts.Requests)
                        return counts.Requests >= 3 && failureRatio >= 0.6
                    },
                    OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {
                        log.Printf("CircuitBreaker %s: %s -> %s", name, from, to)
                    },
                }
                return gobreaker.NewCircuitBreaker(settings)
            }

            // 使用示例
            func BuildEndpointWithCircuitBreaker(svc UserService) endpoint.Endpoint {
                var e endpoint.Endpoint
                e = MakeCreateUserEndpoint(svc)

                cb := NewCircuitBreaker("CreateUser", 10, 10*time.Second, 60*time.Second)
                e = CircuitBreakerMiddleware(cb)(e)
                e = LoggingMiddleware(logger)(e)

                return e
            }
            ---

3.3 请求处理

01.请求解码
    a.解码器设计
        a.功能说明
            请求解码器负责将传输层的原始数据转换为Endpoint可以处理的请求对象。每个Endpoint都需要一个对应的解码器,解码器的签名为DecodeRequestFunc func(context.Context, interface{}) (interface{}, error)。解码器接收传输层的原始请求(如*http.Request),返回业务请求对象。解码器应该处理数据格式转换、参数提取、基础验证等工作。不同的传输协议需要不同的解码器实现,如HTTP解码器从Body或URL中提取参数,gRPC解码器从Protobuf消息中提取。
        b.代码示例
            ---
            // HTTP请求解码器
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
                "strconv"
                "github.com/gorilla/mux"
            )

            // decodeCreateUserRequest HTTP POST请求解码
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req endpoint.CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            // decodeGetUserRequest 从URL路径提取参数
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                vars := mux.Vars(r)
                id := vars["id"]
                if id == "" {
                    return nil, errors.New("missing user id")
                }
                return endpoint.GetUserRequest{ID: id}, nil
            }

            // decodeListUsersRequest 从查询参数提取
            func decodeListUsersRequest(_ context.Context, r *http.Request) (interface{}, error) {
                query := r.URL.Query()

                offset, err := strconv.Atoi(query.Get("offset"))
                if err != nil {
                    offset = 0
                }

                limit, err := strconv.Atoi(query.Get("limit"))
                if err != nil {
                    limit = 10
                }

                return endpoint.ListUsersRequest{
                    Offset: offset,
                    Limit:  limit,
                    Filter: query.Get("filter"),
                }, nil
            }

            // decodeUpdateUserRequest 组合路径和Body参数
            func decodeUpdateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                vars := mux.Vars(r)
                id := vars["id"]

                var updates endpoint.UserUpdates
                if err := json.NewDecoder(r.Body).Decode(&updates); err != nil {
                    return nil, err
                }

                return endpoint.UpdateUserRequest{
                    ID:      id,
                    Updates: updates,
                }, nil
            }
            ---
    b.错误处理
        a.功能说明
            解码器应该妥善处理各种错误情况,如JSON格式错误、参数缺失、类型转换失败等。错误应该返回清晰的错误信息,帮助客户端快速定位问题。可以定义自定义错误类型,携带错误码和详细信息。解码器的错误会被Transport层捕获,转换为协议特定的错误响应。对于可选参数,应该提供合理的默认值而不是返回错误。
        b.代码示例
            ---
            // 解码器错误处理
            package transport

            import (
                "context"
                "encoding/json"
                "errors"
                "fmt"
                "net/http"
            )

            var (
                ErrInvalidJSON    = errors.New("invalid JSON format")
                ErrMissingParam   = errors.New("missing required parameter")
                ErrInvalidParam   = errors.New("invalid parameter value")
            )

            // DecodeError 解码错误类型
            type DecodeError struct {
                Field   string
                Message string
                Err     error
            }

            func (e DecodeError) Error() string {
                return fmt.Sprintf("decode error in field %s: %s", e.Field, e.Message)
            }

            // decodeCreateUserRequestWithValidation 带验证的解码器
            func decodeCreateUserRequestWithValidation(_ context.Context, r *http.Request) (interface{}, error) {
                var req endpoint.CreateUserRequest

                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, DecodeError{
                        Field:   "body",
                        Message: "failed to parse JSON",
                        Err:     err,
                    }
                }

                if req.Username == "" {
                    return nil, DecodeError{
                        Field:   "username",
                        Message: "username is required",
                        Err:     ErrMissingParam,
                    }
                }

                if len(req.Username) < 3 {
                    return nil, DecodeError{
                        Field:   "username",
                        Message: "username must be at least 3 characters",
                        Err:     ErrInvalidParam,
                    }
                }

                if req.Email == "" {
                    return nil, DecodeError{
                        Field:   "email",
                        Message: "email is required",
                        Err:     ErrMissingParam,
                    }
                }

                return req, nil
            }

            // SafeDecode 安全解码辅助函数
            func SafeDecode(r *http.Request, v interface{}) error {
                decoder := json.NewDecoder(r.Body)
                decoder.DisallowUnknownFields()

                if err := decoder.Decode(v); err != nil {
                    return fmt.Errorf("decode failed: %w", err)
                }

                return nil
            }
            ---

02.响应编码
    a.编码器设计
        a.功能说明
            响应编码器负责将Endpoint返回的响应对象转换为传输层的格式。编码器的签名为EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error。编码器接收响应对象,将其序列化为协议格式并写入输出流。编码器应该设置正确的Content-Type、状态码等HTTP头。对于不同的响应类型,可以实现不同的编码逻辑,如JSON、XML、Protobuf等。编码器也负责处理响应中的错误信息,将其转换为合适的HTTP状态码。
        b.代码示例
            ---
            // HTTP响应编码器
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
            )

            // encodeResponse 标准JSON响应编码器
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            // encodeResponseWithStatus 带状态码的响应编码器
            func encodeResponseWithStatus(status int) httptransport.EncodeResponseFunc {
                return func(_ context.Context, w http.ResponseWriter, response interface{}) error {
                    w.Header().Set("Content-Type", "application/json; charset=utf-8")
                    w.WriteHeader(status)
                    return json.NewEncoder(w).Encode(response)
                }
            }

            // encodeCreateUserResponse 创建用户响应编码器
            func encodeCreateUserResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                resp := response.(endpoint.CreateUserResponse)

                w.Header().Set("Content-Type", "application/json; charset=utf-8")

                if resp.Err != "" {
                    w.WriteHeader(http.StatusBadRequest)
                } else {
                    w.WriteHeader(http.StatusCreated)
                    w.Header().Set("Location", "/users/"+resp.User.ID)
                }

                return json.NewEncoder(w).Encode(resp)
            }

            // encodeNoContent 无内容响应编码器
            func encodeNoContent(_ context.Context, w http.ResponseWriter, _ interface{}) error {
                w.WriteHeader(http.StatusNoContent)
                return nil
            }

            // encodePrettyJSON 格式化JSON响应编码器
            func encodePrettyJSON(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                encoder := json.NewEncoder(w)
                encoder.SetIndent("", "  ")
                return encoder.Encode(response)
            }
            ---
    b.错误编码
        a.功能说明
            错误编码器专门处理Endpoint返回的错误,将其转换为HTTP错误响应。错误编码器的签名为ErrorEncoder func(context.Context, error, http.ResponseWriter)。应该根据错误类型返回合适的HTTP状态码,如404 Not Found、400 Bad Request、500 Internal Server Error等。错误响应应该包含清晰的错误信息和错误码,便于客户端处理。可以定义错误映射表,将业务错误映射到HTTP状态码。敏感的错误信息不应该暴露给客户端。
        b.代码示例
            ---
            // 错误编码器实现
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
            )

            // ErrorResponse 错误响应结构
            type ErrorResponse struct {
                Error string `json:"error"`
                Code  string `json:"code,omitempty"`
            }

            // encodeError 标准错误编码器
            func encodeError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")

                code := http.StatusInternalServerError
                message := err.Error()

                switch err {
                case endpoint.ErrUserNotFound:
                    code = http.StatusNotFound
                case endpoint.ErrInvalidInput:
                    code = http.StatusBadRequest
                case endpoint.ErrUnauthorized:
                    code = http.StatusUnauthorized
                case endpoint.ErrForbidden:
                    code = http.StatusForbidden
                }

                w.WriteHeader(code)
                json.NewEncoder(w).Encode(ErrorResponse{
                    Error: message,
                })
            }

            // encodeDetailedError 详细错误编码器
            func encodeDetailedError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")

                var code int
                var errCode string

                if e, ok := err.(endpoint.ServiceError); ok {
                    errCode = e.Code
                    switch e.Code {
                    case "USER_NOT_FOUND":
                        code = http.StatusNotFound
                    case "INVALID_INPUT":
                        code = http.StatusBadRequest
                    case "UNAUTHORIZED":
                        code = http.StatusUnauthorized
                    default:
                        code = http.StatusInternalServerError
                    }
                } else {
                    code = http.StatusInternalServerError
                    errCode = "INTERNAL_ERROR"
                }

                w.WriteHeader(code)
                json.NewEncoder(w).Encode(ErrorResponse{
                    Error: err.Error(),
                    Code:  errCode,
                })
            }
            ---

03.上下文处理
    a.请求上下文
        a.功能说明
            Transport层负责从协议中提取元数据并注入Context,如HTTP Header、gRPC Metadata等。可以使用ServerBefore选项在请求处理前修改Context,添加请求ID、认证信息、追踪ID等。Context在整个请求处理链中传递,Endpoint和Service层都可以访问。应该使用类型安全的Context Key,避免键冲突。Context只应该存储请求范围的数据,不应该存储业务逻辑需要的参数。
        b.代码示例
            ---
            // 上下文处理实现
            package transport

            import (
                "context"
                "net/http"
                "github.com/google/uuid"
            )

            type contextKey string

            const (
                ContextKeyRequestID contextKey = "request_id"
                ContextKeyUserID    contextKey = "user_id"
                ContextKeyToken     contextKey = "token"
            )

            // extractRequestID 提取或生成请求ID
            func extractRequestID(ctx context.Context, r *http.Request) context.Context {
                requestID := r.Header.Get("X-Request-ID")
                if requestID == "" {
                    requestID = uuid.New().String()
                }
                return context.WithValue(ctx, ContextKeyRequestID, requestID)
            }

            // extractAuthToken 提取认证Token
            func extractAuthToken(ctx context.Context, r *http.Request) context.Context {
                token := r.Header.Get("Authorization")
                if token != "" {
                    return context.WithValue(ctx, ContextKeyToken, token)
                }
                return ctx
            }

            // extractUserInfo 提取用户信息
            func extractUserInfo(ctx context.Context, r *http.Request) context.Context {
                token, ok := ctx.Value(ContextKeyToken).(string)
                if !ok {
                    return ctx
                }

                userID := parseUserIDFromToken(token)
                if userID != "" {
                    ctx = context.WithValue(ctx, ContextKeyUserID, userID)
                }

                return ctx
            }

            // MakeHTTPHandler 创建HTTP处理器
            func MakeHTTPHandler(e endpoint.Endpoint) http.Handler {
                return httptransport.NewServer(
                    e,
                    decodeRequest,
                    encodeResponse,
                    httptransport.ServerBefore(
                        extractRequestID,
                        extractAuthToken,
                        extractUserInfo,
                    ),
                    httptransport.ServerAfter(setResponseHeaders),
                    httptransport.ServerErrorEncoder(encodeError),
                )
            }
            ---
    b.响应上下文
        a.功能说明
            ServerAfter选项允许在响应发送前修改Context或设置响应头。可以用于添加追踪信息、设置CORS头、记录响应时间等。ServerAfter函数接收Context和ResponseWriter,可以修改响应头但不能修改响应体。多个ServerAfter函数按顺序执行,每个函数都可以修改Context并传递给下一个。响应上下文处理应该快速完成,避免阻塞响应发送。
        b.代码示例
            ---
            // 响应上下文处理
            package transport

            import (
                "context"
                "net/http"
                "time"
            )

            // setResponseHeaders 设置响应头
            func setResponseHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                if requestID, ok := ctx.Value(ContextKeyRequestID).(string); ok {
                    w.Header().Set("X-Request-ID", requestID)
                }

                w.Header().Set("X-Service-Version", "1.0.0")
                w.Header().Set("X-Response-Time", time.Now().Format(time.RFC3339))

                return ctx
            }

            // setCORSHeaders 设置CORS头
            func setCORSHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                w.Header().Set("Access-Control-Allow-Origin", "*")
                w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
                w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
                return ctx
            }

            // setSecurityHeaders 设置安全头
            func setSecurityHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                w.Header().Set("X-Content-Type-Options", "nosniff")
                w.Header().Set("X-Frame-Options", "DENY")
                w.Header().Set("X-XSS-Protection", "1; mode=block")
                return ctx
            }

            // logResponseTime 记录响应时间
            func logResponseTime(logger log.Logger) httptransport.ServerResponseFunc {
                return func(ctx context.Context, w http.ResponseWriter) context.Context {
                    if startTime, ok := ctx.Value("start_time").(time.Time); ok {
                        duration := time.Since(startTime)
                        logger.Log("response_time", duration.Milliseconds())
                    }
                    return ctx
                }
            }
            ---

3.4 客户端实现

01.客户端端点
    a.端点创建
        a.功能说明
            客户端端点用于调用远程服务,将本地方法调用转换为网络请求。go-kit提供了httptransport.NewClient和grpctransport.NewClient用于创建客户端端点。客户端端点的创建需要指定服务地址、HTTP方法、请求编码器、响应解码器等参数。客户端端点返回标准的Endpoint类型,可以像本地Endpoint一样使用,也可以应用中间件。客户端端点封装了网络通信的细节,使得远程调用像本地调用一样简单。
        b.代码示例
            ---
            // HTTP客户端端点创建
            package client

            import (
                "context"
                "net/url"
                "github.com/go-kit/kit/endpoint"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            // NewHTTPClient 创建HTTP客户端
            func NewHTTPClient(instance string) (endpoint.Endpoints, error) {
                if !strings.HasPrefix(instance, "http") {
                    instance = "http://" + instance
                }

                u, err := url.Parse(instance)
                if err != nil {
                    return endpoint.Endpoints{}, err
                }

                // 创建用户端点
                createUserEndpoint := httptransport.NewClient(
                    "POST",
                    copyURL(u, "/users"),
                    encodeCreateUserRequest,
                    decodeCreateUserResponse,
                ).Endpoint()

                getUserEndpoint := httptransport.NewClient(
                    "GET",
                    copyURL(u, "/users"),
                    encodeGetUserRequest,
                    decodeGetUserResponse,
                ).Endpoint()

                updateUserEndpoint := httptransport.NewClient(
                    "PUT",
                    copyURL(u, "/users"),
                    encodeUpdateUserRequest,
                    decodeUpdateUserResponse,
                ).Endpoint()

                deleteUserEndpoint := httptransport.NewClient(
                    "DELETE",
                    copyURL(u, "/users"),
                    encodeDeleteUserRequest,
                    decodeDeleteUserResponse,
                ).Endpoint()

                return endpoint.Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                    UpdateUserEndpoint: updateUserEndpoint,
                    DeleteUserEndpoint: deleteUserEndpoint,
                }, nil
            }

            func copyURL(base *url.URL, path string) *url.URL {
                next := *base
                next.Path = path
                return &next
            }
            ---
    b.请求编码
        a.功能说明
            客户端请求编码器将Endpoint的请求对象转换为HTTP请求。编码器的签名为EncodeRequestFunc func(context.Context, *http.Request, interface{}) error。编码器接收请求对象,将其序列化并写入HTTP请求的Body或URL。对于GET请求,通常将参数编码到URL路径或查询字符串中。对于POST/PUT请求,通常将参数编码为JSON写入Body。编码器还可以设置HTTP头,如Content-Type、Authorization等。
        b.代码示例
            ---
            // 客户端请求编码器
            package client

            import (
                "bytes"
                "context"
                "encoding/json"
                "io"
                "net/http"
            )

            // encodeCreateUserRequest POST请求编码
            func encodeCreateUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(endpoint.CreateUserRequest)
                var buf bytes.Buffer
                if err := json.NewEncoder(&buf).Encode(req); err != nil {
                    return err
                }
                r.Body = io.NopCloser(&buf)
                r.Header.Set("Content-Type", "application/json")
                return nil
            }

            // encodeGetUserRequest GET请求编码
            func encodeGetUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(endpoint.GetUserRequest)
                r.URL.Path = r.URL.Path + "/" + req.ID
                return nil
            }

            // encodeUpdateUserRequest PUT请求编码
            func encodeUpdateUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(endpoint.UpdateUserRequest)
                r.URL.Path = r.URL.Path + "/" + req.ID

                var buf bytes.Buffer
                if err := json.NewEncoder(&buf).Encode(req.Updates); err != nil {
                    return err
                }
                r.Body = io.NopCloser(&buf)
                r.Header.Set("Content-Type", "application/json")
                return nil
            }

            // encodeDeleteUserRequest DELETE请求编码
            func encodeDeleteUserRequest(_ context.Context, r *http.Request, request interface{}) error {
                req := request.(endpoint.DeleteUserRequest)
                r.URL.Path = r.URL.Path + "/" + req.ID
                return nil
            }

            // encodeJSONRequest 通用JSON请求编码器
            func encodeJSONRequest(_ context.Context, r *http.Request, request interface{}) error {
                var buf bytes.Buffer
                if err := json.NewEncoder(&buf).Encode(request); err != nil {
                    return err
                }
                r.Body = io.NopCloser(&buf)
                r.Header.Set("Content-Type", "application/json")
                return nil
            }
            ---

02.响应处理
    a.响应解码
        a.功能说明
            客户端响应解码器将HTTP响应转换为Endpoint的响应对象。解码器的签名为DecodeResponseFunc func(context.Context, *http.Response) (interface{}, error)。解码器接收HTTP响应,从Body中读取数据并反序列化为响应对象。解码器应该检查HTTP状态码,对于非2xx状态码应该返回错误。解码器还可以从响应头中提取元数据,如追踪ID、速率限制信息等。响应解码后应该关闭响应Body,避免资源泄漏。
        b.代码示例
            ---
            // 客户端响应解码器
            package client

            import (
                "context"
                "encoding/json"
                "fmt"
                "io"
                "net/http"
            )

            // decodeCreateUserResponse 创建用户响应解码
            func decodeCreateUserResponse(_ context.Context, r *http.Response) (interface{}, error) {
                if r.StatusCode != http.StatusCreated && r.StatusCode != http.StatusOK {
                    return nil, decodeError(r)
                }

                var resp endpoint.CreateUserResponse
                if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
                    return nil, err
                }

                return resp, nil
            }

            // decodeGetUserResponse 获取用户响应解码
            func decodeGetUserResponse(_ context.Context, r *http.Response) (interface{}, error) {
                if r.StatusCode != http.StatusOK {
                    return nil, decodeError(r)
                }

                var resp endpoint.GetUserResponse
                if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
                    return nil, err
                }

                return resp, nil
            }

            // decodeUpdateUserResponse 更新用户响应解码
            func decodeUpdateUserResponse(_ context.Context, r *http.Response) (interface{}, error) {
                if r.StatusCode != http.StatusOK && r.StatusCode != http.StatusNoContent {
                    return nil, decodeError(r)
                }

                var resp endpoint.UpdateUserResponse
                if r.StatusCode == http.StatusNoContent {
                    return resp, nil
                }

                if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
                    return nil, err
                }

                return resp, nil
            }

            // decodeError 错误响应解码
            func decodeError(r *http.Response) error {
                defer r.Body.Close()

                body, err := io.ReadAll(r.Body)
                if err != nil {
                    return fmt.Errorf("HTTP %d: failed to read body", r.StatusCode)
                }

                var errResp ErrorResponse
                if err := json.Unmarshal(body, &errResp); err != nil {
                    return fmt.Errorf("HTTP %d: %s", r.StatusCode, string(body))
                }

                return fmt.Errorf("HTTP %d: %s", r.StatusCode, errResp.Error)
            }

            // decodeJSONResponse 通用JSON响应解码器
            func decodeJSONResponse(v interface{}) httptransport.DecodeResponseFunc {
                return func(_ context.Context, r *http.Response) (interface{}, error) {
                    if r.StatusCode < 200 || r.StatusCode >= 300 {
                        return nil, decodeError(r)
                    }

                    if err := json.NewDecoder(r.Body).Decode(v); err != nil {
                        return nil, err
                    }

                    return v, nil
                }
            }
            ---
    b.错误处理
        a.功能说明
            客户端应该妥善处理各种错误情况,包括网络错误、超时错误、服务端错误等。可以定义自定义错误类型,区分不同类型的错误。对于临时性错误,可以实现重试机制。对于不可恢复的错误,应该快速失败并返回明确的错误信息。客户端错误处理应该考虑熔断、降级等容错机制,避免故障扩散。错误信息应该包含足够的上下文,便于问题排查。
        b.代码示例
            ---
            // 客户端错误处理
            package client

            import (
                "errors"
                "fmt"
                "net/http"
            )

            var (
                ErrNetworkError    = errors.New("network error")
                ErrTimeout         = errors.New("request timeout")
                ErrServiceError    = errors.New("service error")
                ErrInvalidResponse = errors.New("invalid response")
            )

            // ClientError 客户端错误类型
            type ClientError struct {
                StatusCode int
                Message    string
                Err        error
            }

            func (e ClientError) Error() string {
                return fmt.Sprintf("client error (status %d): %s", e.StatusCode, e.Message)
            }

            func (e ClientError) Unwrap() error {
                return e.Err
            }

            // handleHTTPError 处理HTTP错误
            func handleHTTPError(r *http.Response) error {
                switch r.StatusCode {
                case http.StatusBadRequest:
                    return ClientError{
                        StatusCode: r.StatusCode,
                        Message:    "bad request",
                        Err:        ErrInvalidResponse,
                    }
                case http.StatusUnauthorized:
                    return ClientError{
                        StatusCode: r.StatusCode,
                        Message:    "unauthorized",
                        Err:        ErrServiceError,
                    }
                case http.StatusNotFound:
                    return ClientError{
                        StatusCode: r.StatusCode,
                        Message:    "not found",
                        Err:        ErrServiceError,
                    }
                case http.StatusInternalServerError:
                    return ClientError{
                        StatusCode: r.StatusCode,
                        Message:    "internal server error",
                        Err:        ErrServiceError,
                    }
                default:
                    return ClientError{
                        StatusCode: r.StatusCode,
                        Message:    fmt.Sprintf("unexpected status code: %d", r.StatusCode),
                        Err:        ErrServiceError,
                    }
                }
            }

            // IsRetryable 判断错误是否可重试
            func IsRetryable(err error) bool {
                var clientErr ClientError
                if errors.As(err, &clientErr) {
                    return clientErr.StatusCode >= 500
                }

                if errors.Is(err, ErrTimeout) || errors.Is(err, ErrNetworkError) {
                    return true
                }

                return false
            }
            ---

03.客户端配置
    a.HTTP客户端
        a.功能说明
            可以配置HTTP客户端的各种参数,如超时时间、连接池大小、重试策略等。go-kit使用标准库的http.Client,可以自定义Transport配置连接池、TLS、代理等。合理的超时配置可以避免请求长时间阻塞,提高系统的响应性。连接池配置影响并发性能和资源占用,应该根据实际负载调整。可以使用ClientBefore和ClientAfter选项添加请求前后的处理逻辑。
        b.代码示例
            ---
            // HTTP客户端配置
            package client

            import (
                "crypto/tls"
                "net"
                "net/http"
                "time"
            )

            // NewHTTPClient 创建配置好的HTTP客户端
            func NewHTTPClient(config ClientConfig) *http.Client {
                transport := &http.Transport{
                    Proxy: http.ProxyFromEnvironment,
                    DialContext: (&net.Dialer{
                        Timeout:   30 * time.Second,
                        KeepAlive: 30 * time.Second,
                    }).DialContext,
                    MaxIdleConns:          100,
                    MaxIdleConnsPerHost:   10,
                    IdleConnTimeout:       90 * time.Second,
                    TLSHandshakeTimeout:   10 * time.Second,
                    ExpectContinueTimeout: 1 * time.Second,
                }

                if config.TLSConfig != nil {
                    transport.TLSClientConfig = config.TLSConfig
                }

                return &http.Client{
                    Transport: transport,
                    Timeout:   config.Timeout,
                }
            }

            // ClientConfig 客户端配置
            type ClientConfig struct {
                Timeout   time.Duration
                TLSConfig *tls.Config
            }

            // DefaultClientConfig 默认客户端配置
            func DefaultClientConfig() ClientConfig {
                return ClientConfig{
                    Timeout: 10 * time.Second,
                }
            }

            // 使用示例
            func ExampleHTTPClient() {
                config := DefaultClientConfig()
                httpClient := NewHTTPClient(config)

                createUserEndpoint := httptransport.NewClient(
                    "POST",
                    targetURL,
                    encodeRequest,
                    decodeResponse,
                    httptransport.SetClient(httpClient),
                    httptransport.ClientBefore(setAuthHeader),
                ).Endpoint()

                resp, err := createUserEndpoint(context.Background(), request)
                if err != nil {
                    log.Fatal(err)
                }
            }

            // setAuthHeader 设置认证头
            func setAuthHeader(token string) httptransport.RequestFunc {
                return func(ctx context.Context, r *http.Request) context.Context {
                    r.Header.Set("Authorization", "Bearer "+token)
                    return ctx
                }
            }
            ---
    b.中间件应用
        a.功能说明
            客户端端点也可以应用中间件,实现重试、熔断、追踪、日志等功能。客户端中间件的使用方式与服务端相同,都是装饰器模式。常用的客户端中间件包括重试中间件、超时中间件、熔断中间件、追踪中间件等。中间件的顺序很重要,通常将重试放在最外层,熔断放在重试内层,追踪和日志放在最内层。合理使用客户端中间件可以提高系统的可靠性和可观测性。
        b.代码示例
            ---
            // 客户端中间件应用
            package client

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/sd"
                "github.com/go-kit/kit/sd/lb"
            )

            // BuildClientEndpoint 构建客户端端点
            func BuildClientEndpoint(instance string) endpoint.Endpoint {
                var e endpoint.Endpoint

                // 创建基础端点
                e = makeHTTPEndpoint(instance)

                // 应用中间件
                e = RetryMiddleware(3, 100*time.Millisecond)(e)
                e = CircuitBreakerMiddleware(circuitBreaker)(e)
                e = TimeoutMiddleware(5 * time.Second)(e)
                e = LoggingMiddleware(logger)(e)

                return e
            }

            // RetryMiddleware 重试中间件
            func RetryMiddleware(max int, delay time.Duration) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var resp interface{}
                        var err error

                        for i := 0; i <= max; i++ {
                            resp, err = next(ctx, request)
                            if err == nil {
                                return resp, nil
                            }

                            if !IsRetryable(err) {
                                return nil, err
                            }

                            if i < max {
                                time.Sleep(delay * time.Duration(i+1))
                            }
                        }

                        return nil, err
                    }
                }
            }

            // TimeoutMiddleware 超时中间件
            func TimeoutMiddleware(timeout time.Duration) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        ctx, cancel := context.WithTimeout(ctx, timeout)
                        defer cancel()

                        type response struct {
                            resp interface{}
                            err  error
                        }

                        ch := make(chan response, 1)
                        go func() {
                            resp, err := next(ctx, request)
                            ch <- response{resp, err}
                        }()

                        select {
                        case r := <-ch:
                            return r.resp, r.err
                        case <-ctx.Done():
                            return nil, ctx.Err()
                        }
                    }
                }
            }
            ---

3.5 测试实践

01.端点测试
    a.单元测试
        a.功能说明
            Endpoint的单元测试应该独立于Transport层,直接测试Endpoint的输入输出。可以Mock Service层的依赖,专注于测试Endpoint的请求响应转换逻辑。单元测试应该覆盖正常情况和各种异常情况,如参数错误、Service错误等。使用表驱动测试可以提高测试覆盖率和可维护性。Endpoint测试不需要启动HTTP服务器,执行速度快,适合频繁运行。
        b.代码示例
            ---
            // Endpoint单元测试
            package endpoint_test

            import (
                "context"
                "errors"
                "testing"
                "github.com/stretchr/testify/assert"
                "github.com/stretchr/testify/mock"
            )

            // MockUserService Mock服务
            type MockUserService struct {
                mock.Mock
            }

            func (m *MockUserService) CreateUser(ctx context.Context, username, email string) (User, error) {
                args := m.Called(ctx, username, email)
                return args.Get(0).(User), args.Error(1)
            }

            func (m *MockUserService) GetUser(ctx context.Context, id string) (User, error) {
                args := m.Called(ctx, id)
                return args.Get(0).(User), args.Error(1)
            }

            // TestCreateUserEndpoint 测试创建用户端点
            func TestCreateUserEndpoint(t *testing.T) {
                tests := []struct {
                    name           string
                    request        CreateUserRequest
                    mockUser       User
                    mockError      error
                    expectedErr    string
                    expectedUser   User
                }{
                    {
                        name: "success",
                        request: CreateUserRequest{
                            Username: "john",
                            Email:    "john@example.com",
                        },
                        mockUser: User{
                            ID:       "123",
                            Username: "john",
                            Email:    "john@example.com",
                        },
                        mockError:    nil,
                        expectedErr:  "",
                        expectedUser: User{ID: "123", Username: "john"},
                    },
                    {
                        name: "service error",
                        request: CreateUserRequest{
                            Username: "john",
                            Email:    "john@example.com",
                        },
                        mockUser:     User{},
                        mockError:    errors.New("database error"),
                        expectedErr:  "database error",
                        expectedUser: User{},
                    },
                }

                for _, tt := range tests {
                    t.Run(tt.name, func(t *testing.T) {
                        mockSvc := new(MockUserService)
                        mockSvc.On("CreateUser", mock.Anything, tt.request.Username, tt.request.Email).
                            Return(tt.mockUser, tt.mockError)

                        endpoint := MakeCreateUserEndpoint(mockSvc)
                        resp, err := endpoint(context.Background(), tt.request)

                        if tt.expectedErr != "" {
                            assert.Nil(t, err)
                            response := resp.(CreateUserResponse)
                            assert.Equal(t, tt.expectedErr, response.Err)
                        } else {
                            assert.NoError(t, err)
                            response := resp.(CreateUserResponse)
                            assert.Equal(t, tt.expectedUser.ID, response.User.ID)
                        }

                        mockSvc.AssertExpectations(t)
                    })
                }
            }
            ---
    b.集成测试
        a.功能说明
            集成测试验证Endpoint与Transport层的集成,测试完整的HTTP请求响应流程。需要启动测试HTTP服务器,使用httptest包创建测试服务器。集成测试应该测试请求解码、Endpoint调用、响应编码的完整链路。可以测试HTTP头、状态码、响应格式等Transport层的细节。集成测试比单元测试慢,但能发现层间集成的问题。
        b.代码示例
            ---
            // Endpoint集成测试
            package transport_test

            import (
                "bytes"
                "encoding/json"
                "net/http"
                "net/http/httptest"
                "testing"
                "github.com/stretchr/testify/assert"
            )

            func TestCreateUserHTTP(t *testing.T) {
                svc := NewUserService(db, cache)
                endpoints := MakeEndpoints(svc)
                handler := MakeHTTPHandler(endpoints)

                tests := []struct {
                    name           string
                    method         string
                    path           string
                    body           interface{}
                    expectedStatus int
                    expectedBody   map[string]interface{}
                }{
                    {
                        name:   "create user success",
                        method: "POST",
                        path:   "/users",
                        body: map[string]string{
                            "username": "john",
                            "email":    "john@example.com",
                        },
                        expectedStatus: http.StatusCreated,
                        expectedBody: map[string]interface{}{
                            "user": map[string]interface{}{
                                "username": "john",
                                "email":    "john@example.com",
                            },
                        },
                    },
                    {
                        name:   "create user invalid input",
                        method: "POST",
                        path:   "/users",
                        body: map[string]string{
                            "username": "",
                            "email":    "invalid",
                        },
                        expectedStatus: http.StatusBadRequest,
                    },
                }

                for _, tt := range tests {
                    t.Run(tt.name, func(t *testing.T) {
                        body, _ := json.Marshal(tt.body)
                        req := httptest.NewRequest(tt.method, tt.path, bytes.NewReader(body))
                        req.Header.Set("Content-Type", "application/json")

                        w := httptest.NewRecorder()
                        handler.ServeHTTP(w, req)

                        assert.Equal(t, tt.expectedStatus, w.Code)

                        if tt.expectedBody != nil {
                            var resp map[string]interface{}
                            json.NewDecoder(w.Body).Decode(&resp)
                            assert.Equal(t, tt.expectedBody["user"], resp["user"])
                        }
                    })
                }
            }
            ---

02.中间件测试
    a.功能测试
        a.功能说明
            中间件测试验证中间件的功能是否正确,如日志是否记录、指标是否收集、限流是否生效等。可以Mock Endpoint,专注于测试中间件的逻辑。中间件测试应该验证中间件对请求响应的影响,如是否修改了Context、是否返回了错误等。使用Spy模式可以验证中间件是否调用了依赖的组件,如Logger、Metrics等。中间件测试应该覆盖各种边界情况。
        b.代码示例
            ---
            // 中间件功能测试
            package middleware_test

            import (
                "context"
                "errors"
                "testing"
                "time"
                "github.com/stretchr/testify/assert"
            )

            func TestLoggingMiddleware(t *testing.T) {
                var loggedMessages []string
                logger := &MockLogger{
                    LogFunc: func(keyvals ...interface{}) error {
                        loggedMessages = append(loggedMessages, keyvals[1].(string))
                        return nil
                    },
                }

                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                middleware := LoggingMiddleware(logger)
                wrappedEndpoint := middleware(endpoint)

                resp, err := wrappedEndpoint(context.Background(), "request")

                assert.NoError(t, err)
                assert.Equal(t, "response", resp)
                assert.Contains(t, loggedMessages, "calling endpoint")
                assert.Contains(t, loggedMessages, "called endpoint")
            }

            func TestRateLimitMiddleware(t *testing.T) {
                limiter := rate.NewLimiter(rate.Limit(1), 1)

                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                middleware := RateLimitMiddleware(limiter)
                wrappedEndpoint := middleware(endpoint)

                // 第一次请求应该成功
                resp, err := wrappedEndpoint(context.Background(), "request")
                assert.NoError(t, err)
                assert.Equal(t, "response", resp)

                // 第二次请求应该被限流
                resp, err = wrappedEndpoint(context.Background(), "request")
                assert.Error(t, err)
                assert.Equal(t, ErrRateLimitExceeded, err)
            }

            func TestCircuitBreakerMiddleware(t *testing.T) {
                cb := NewCircuitBreaker("test", 1, time.Second, time.Second)

                failingEndpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return nil, errors.New("service error")
                }

                middleware := CircuitBreakerMiddleware(cb)
                wrappedEndpoint := middleware(failingEndpoint)

                // 触发熔断
                for i := 0; i < 5; i++ {
                    wrappedEndpoint(context.Background(), "request")
                }

                // 熔断器应该开启
                _, err := wrappedEndpoint(context.Background(), "request")
                assert.Error(t, err)
                assert.Contains(t, err.Error(), "circuit breaker is open")
            }
            ---
    b.性能测试
        a.功能说明
            性能测试评估中间件对系统性能的影响,测量中间件的开销。使用Go的benchmark测试框架进行性能测试,测量每次操作的耗时和内存分配。性能测试应该比较有无中间件的性能差异,评估中间件的成本。对于性能敏感的系统,应该优化中间件的实现,减少不必要的开销。性能测试结果可以指导中间件的选择和配置。
        b.代码示例
            ---
            // 中间件性能测试
            package middleware_test

            import (
                "context"
                "testing"
            )

            func BenchmarkEndpointWithoutMiddleware(b *testing.B) {
                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                b.ResetTimer()
                for i := 0; i < b.N; i++ {
                    endpoint(context.Background(), "request")
                }
            }

            func BenchmarkEndpointWithLogging(b *testing.B) {
                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                logger := NewNopLogger()
                middleware := LoggingMiddleware(logger)
                wrappedEndpoint := middleware(endpoint)

                b.ResetTimer()
                for i := 0; i < b.N; i++ {
                    wrappedEndpoint(context.Background(), "request")
                }
            }

            func BenchmarkEndpointWithMultipleMiddlewares(b *testing.B) {
                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                logger := NewNopLogger()
                metrics := NewNopMetrics()
                limiter := rate.NewLimiter(rate.Inf, 1)

                wrappedEndpoint := endpoint
                wrappedEndpoint = LoggingMiddleware(logger)(wrappedEndpoint)
                wrappedEndpoint = InstrumentingMiddleware(metrics)(wrappedEndpoint)
                wrappedEndpoint = RateLimitMiddleware(limiter)(wrappedEndpoint)

                b.ResetTimer()
                for i := 0; i < b.N; i++ {
                    wrappedEndpoint(context.Background(), "request")
                }
            }

            func BenchmarkMiddlewareAllocation(b *testing.B) {
                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }

                logger := NewNopLogger()
                middleware := LoggingMiddleware(logger)

                b.ReportAllocs()
                b.ResetTimer()
                for i := 0; i < b.N; i++ {
                    wrappedEndpoint := middleware(endpoint)
                    wrappedEndpoint(context.Background(), "request")
                }
            }
            ---

03.Mock和Stub
    a.Service Mock
        a.功能说明
            Mock Service用于隔离Endpoint测试,避免依赖真实的Service实现。可以使用testify/mock或gomock等Mock框架生成Mock对象。Mock对象可以预设返回值和行为,验证方法调用次数和参数。使用Mock可以测试各种边界情况和错误场景,无需准备复杂的测试数据。Mock应该只模拟必要的方法,保持测试的简洁性。
        b.代码示例
            ---
            // Service Mock实现
            package endpoint_test

            import (
                "context"
                "github.com/stretchr/testify/mock"
            )

            // MockUserService Mock用户服务
            type MockUserService struct {
                mock.Mock
            }

            func (m *MockUserService) CreateUser(ctx context.Context, username, email string) (User, error) {
                args := m.Called(ctx, username, email)
                if args.Get(0) == nil {
                    return User{}, args.Error(1)
                }
                return args.Get(0).(User), args.Error(1)
            }

            func (m *MockUserService) GetUser(ctx context.Context, id string) (User, error) {
                args := m.Called(ctx, id)
                return args.Get(0).(User), args.Error(1)
            }

            func (m *MockUserService) UpdateUser(ctx context.Context, id string, updates UserUpdates) error {
                args := m.Called(ctx, id, updates)
                return args.Error(0)
            }

            func (m *MockUserService) DeleteUser(ctx context.Context, id string) error {
                args := m.Called(ctx, id)
                return args.Error(0)
            }

            // 使用示例
            func TestEndpointWithMock(t *testing.T) {
                mockSvc := new(MockUserService)

                // 设置期望
                mockSvc.On("CreateUser", mock.Anything, "john", "john@example.com").
                    Return(User{ID: "123", Username: "john"}, nil)

                endpoint := MakeCreateUserEndpoint(mockSvc)
                resp, err := endpoint(context.Background(), CreateUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                })

                assert.NoError(t, err)
                response := resp.(CreateUserResponse)
                assert.Equal(t, "123", response.User.ID)

                // 验证调用
                mockSvc.AssertExpectations(t)
                mockSvc.AssertCalled(t, "CreateUser", mock.Anything, "john", "john@example.com")
            }
            ---
    b.Transport Stub
        a.功能说明
            Transport Stub用于测试客户端Endpoint,模拟HTTP服务器的响应。使用httptest包创建测试服务器,返回预设的响应。Stub可以模拟各种HTTP状态码、响应头、响应体,测试客户端的错误处理。使用Stub可以测试网络错误、超时等异常情况,无需依赖真实的服务器。Stub应该尽可能简单,只返回测试所需的最小响应。
        b.代码示例
            ---
            // Transport Stub实现
            package client_test

            import (
                "encoding/json"
                "net/http"
                "net/http/httptest"
                "testing"
            )

            // StubServer 创建测试服务器
            func StubServer(t *testing.T, statusCode int, response interface{}) *httptest.Server {
                return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                    w.Header().Set("Content-Type", "application/json")
                    w.WriteHeader(statusCode)
                    json.NewEncoder(w).Encode(response)
                }))
            }

            // TestClientEndpoint 测试客户端端点
            func TestClientEndpoint(t *testing.T) {
                // 创建Stub服务器
                server := StubServer(t, http.StatusOK, CreateUserResponse{
                    User: User{ID: "123", Username: "john"},
                })
                defer server.Close()

                // 创建客户端
                client, err := NewHTTPClient(server.URL)
                assert.NoError(t, err)

                // 调用端点
                resp, err := client.CreateUserEndpoint(context.Background(), CreateUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                })

                assert.NoError(t, err)
                response := resp.(CreateUserResponse)
                assert.Equal(t, "123", response.User.ID)
            }

            // TestClientError 测试客户端错误处理
            func TestClientError(t *testing.T) {
                server := StubServer(t, http.StatusInternalServerError, ErrorResponse{
                    Error: "internal server error",
                })
                defer server.Close()

                client, err := NewHTTPClient(server.URL)
                assert.NoError(t, err)

                resp, err := client.CreateUserEndpoint(context.Background(), CreateUserRequest{
                    Username: "john",
                    Email:    "john@example.com",
                })

                assert.Error(t, err)
                assert.Contains(t, err.Error(), "500")
            }
            ---

3.6 最佳实践

01.设计原则
    a.单一职责
        a.功能说明
            Endpoint层应该只负责请求响应的转换,不包含业务逻辑。业务逻辑应该放在Service层,Endpoint只是Service的薄包装。这种分离使得业务逻辑可以独立测试,不依赖于传输协议。Endpoint应该保持简洁,避免复杂的条件判断和数据处理。如果Endpoint变得复杂,应该考虑将逻辑下沉到Service层或上移到中间件。单一职责原则使得代码更易于理解和维护。
        b.代码示例
            ---
            // 单一职责示例
            package endpoint

            import "context"

            // 错误示例:Endpoint包含业务逻辑
            func MakeCreateUserEndpointBad(db Database) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)

                    // 不应该在Endpoint中直接操作数据库
                    if exists, _ := db.UserExists(ctx, req.Username); exists {
                        return CreateUserResponse{Err: "user exists"}, nil
                    }

                    user := User{
                        ID:       generateID(),
                        Username: req.Username,
                        Email:    req.Email,
                    }

                    if err := db.SaveUser(ctx, user); err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }

                    return CreateUserResponse{User: user}, nil
                }
            }

            // 正确示例:Endpoint只做转换
            func MakeCreateUserEndpointGood(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)

                    // 只调用Service,不包含业务逻辑
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }

                    return CreateUserResponse{User: user}, nil
                }
            }

            // Service层包含业务逻辑
            func (s *userService) CreateUser(ctx context.Context, username, email string) (User, error) {
                if exists, _ := s.db.UserExists(ctx, username); exists {
                    return User{}, errors.New("user exists")
                }

                user := User{
                    ID:       generateID(),
                    Username: username,
                    Email:    email,
                }

                if err := s.db.SaveUser(ctx, user); err != nil {
                    return User{}, err
                }

                return user, nil
            }
            ---
    b.接口隔离
        a.功能说明
            Endpoint应该依赖于Service接口而非具体实现,遵循依赖倒置原则。Service接口应该定义清晰的方法签名,每个方法对应一个业务操作。接口应该小而专注,避免定义过大的接口。使用接口可以方便地Mock Service进行测试,也便于替换不同的Service实现。接口隔离使得Endpoint与Service的耦合度降低,提高了代码的灵活性。
        b.代码示例
            ---
            // 接口隔离示例
            package endpoint

            import "context"

            // 错误示例:依赖具体实现
            type ConcreteUserService struct {
                db    *sql.DB
                cache *redis.Client
            }

            func MakeEndpointBad(svc *ConcreteUserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    // 依赖具体实现,难以测试和替换
                    return svc.CreateUser(ctx, request)
                }
            }

            // 正确示例:依赖接口
            type UserService interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
                UpdateUser(ctx context.Context, id string, updates UserUpdates) error
                DeleteUser(ctx context.Context, id string) error
            }

            func MakeEndpointGood(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }

            // 可以轻松Mock进行测试
            type MockUserService struct {
                CreateUserFunc func(ctx context.Context, username, email string) (User, error)
            }

            func (m *MockUserService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return m.CreateUserFunc(ctx, username, email)
            }
            ---

02.性能优化
    a.减少分配
        a.功能说明
            Endpoint处理请求时应该尽量减少内存分配,避免频繁的GC。可以复用对象,使用对象池减少分配。避免在热路径上创建不必要的临时对象,如字符串拼接、切片扩容等。使用指针传递大对象,避免值拷贝。性能优化应该基于性能分析的结果,不要过早优化。使用pprof等工具分析内存分配热点,针对性地优化。
        b.代码示例
            ---
            // 性能优化示例
            package endpoint

            import (
                "context"
                "sync"
            )

            // 使用对象池减少分配
            var requestPool = sync.Pool{
                New: func() interface{} {
                    return &CreateUserRequest{}
                },
            }

            var responsePool = sync.Pool{
                New: func() interface{} {
                    return &CreateUserResponse{}
                },
            }

            // 优化的Endpoint实现
            func MakeOptimizedEndpoint(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)

                    user, err := svc.CreateUser(ctx, req.Username, req.Email)

                    // 从对象池获取响应对象
                    resp := responsePool.Get().(*CreateUserResponse)
                    defer responsePool.Put(resp)

                    if err != nil {
                        resp.Err = err.Error()
                        resp.User = User{}
                    } else {
                        resp.User = user
                        resp.Err = ""
                    }

                    return *resp, nil
                }
            }

            // 避免不必要的字符串拼接
            func BuildErrorMessageBad(field, message string) string {
                return "field " + field + ": " + message  // 多次分配
            }

            func BuildErrorMessageGood(field, message string) string {
                var buf strings.Builder
                buf.Grow(len("field ") + len(field) + len(": ") + len(message))
                buf.WriteString("field ")
                buf.WriteString(field)
                buf.WriteString(": ")
                buf.WriteString(message)
                return buf.String()  // 一次分配
            }

            // 使用指针传递大对象
            func ProcessLargeRequestBad(req LargeRequest) Response {
                // 值拷贝,如果LargeRequest很大会影响性能
                return processRequest(req)
            }

            func ProcessLargeRequestGood(req *LargeRequest) Response {
                // 指针传递,避免拷贝
                return processRequest(req)
            }
            ---
    b.并发控制
        a.功能说明
            Endpoint应该是并发安全的,可以被多个goroutine同时调用。避免在Endpoint中使用共享状态,如全局变量、包级变量等。如果必须使用共享状态,应该使用互斥锁或其他同步机制保护。使用Context传递请求范围的数据,避免使用全局状态。并发控制应该在中间件层实现,如限流、熔断等,Endpoint本身应该保持无状态。
        b.代码示例
            ---
            // 并发控制示例
            package endpoint

            import (
                "context"
                "sync"
                "sync/atomic"
            )

            // 错误示例:使用共享状态
            var requestCount int  // 不安全

            func MakeEndpointBad(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    requestCount++  // 并发不安全
                    return svc.CreateUser(ctx, request)
                }
            }

            // 正确示例:使用原子操作
            var requestCountAtomic int64

            func MakeEndpointGood(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    atomic.AddInt64(&requestCountAtomic, 1)  // 并发安全
                    return svc.CreateUser(ctx, request)
                }
            }

            // 使用互斥锁保护共享状态
            type EndpointMetrics struct {
                mu           sync.RWMutex
                requestCount map[string]int
            }

            func (m *EndpointMetrics) Increment(endpoint string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.requestCount[endpoint]++
            }

            func (m *EndpointMetrics) Get(endpoint string) int {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.requestCount[endpoint]
            }

            // 使用Context传递请求数据
            func MakeEndpointWithContext(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    // 从Context获取请求ID,而不是使用全局变量
                    requestID := ctx.Value("request_id").(string)

                    req := request.(CreateUserRequest)
                    user, err := svc.CreateUser(ctx, req.Username, req.Email)

                    logger.Log("request_id", requestID, "user", user.ID)

                    if err != nil {
                        return CreateUserResponse{Err: err.Error()}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            ---

03.错误处理
    a.错误分类
        a.功能说明
            应该区分不同类型的错误,如业务错误、系统错误、网络错误等。业务错误应该返回给客户端,系统错误应该记录日志但不暴露细节。可以定义自定义错误类型,携���错误码、错误消息、堆栈信息等。使用errors.Is和errors.As判断错误类型,而不是字符串比较。错误处理应该一致,避免在不同地方使用不同的错误处理方式。
        b.代码示例
            ---
            // 错误分类示例
            package endpoint

            import (
                "errors"
                "fmt"
            )

            // 定义错误类型
            type ErrorType int

            const (
                ErrorTypeUnknown ErrorType = iota
                ErrorTypeBusiness
                ErrorTypeSystem
                ErrorTypeNetwork
            )

            // 自定义错误
            type ServiceError struct {
                Type    ErrorType
                Code    string
                Message string
                Err     error
            }

            func (e *ServiceError) Error() string {
                if e.Err != nil {
                    return fmt.Sprintf("%s: %v", e.Message, e.Err)
                }
                return e.Message
            }

            func (e *ServiceError) Unwrap() error {
                return e.Err
            }

            // 预定义错误
            var (
                ErrUserNotFound = &ServiceError{
                    Type:    ErrorTypeBusiness,
                    Code:    "USER_NOT_FOUND",
                    Message: "user not found",
                }

                ErrInvalidInput = &ServiceError{
                    Type:    ErrorTypeBusiness,
                    Code:    "INVALID_INPUT",
                    Message: "invalid input",
                }

                ErrDatabaseError = &ServiceError{
                    Type:    ErrorTypeSystem,
                    Code:    "DATABASE_ERROR",
                    Message: "database error",
                }
            )

            // Endpoint错误处理
            func MakeEndpointWithErrorHandling(svc UserService) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)

                    user, err := svc.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        // 判断错误类型
                        var svcErr *ServiceError
                        if errors.As(err, &svcErr) {
                            switch svcErr.Type {
                            case ErrorTypeBusiness:
                                // 业务错误返回给客户端
                                return CreateUserResponse{Err: svcErr.Message}, nil
                            case ErrorTypeSystem:
                                // 系统错误记录日志,返回通用错误
                                logger.Log("error", err)
                                return CreateUserResponse{Err: "internal server error"}, nil
                            }
                        }

                        // 未知错误
                        logger.Log("error", err)
                        return CreateUserResponse{Err: "unknown error"}, nil
                    }

                    return CreateUserResponse{User: user}, nil
                }
            }
            ---
    b.错误恢复
        a.功能说明
            Endpoint应该能够从错误中恢复,避免单个请求的错误影响整个服务。可以使用recover捕获panic,记录日志并返回错误响应。错误恢复应该在中间件层实现,Endpoint本身应该避免panic。对于可恢复的错误,应该尝试重试或降级处理。错误恢复机制应该记录详细的错误信息,便于问题排查。
        b.代码示例
            ---
            // 错误恢复示例
            package middleware

            import (
                "context"
                "fmt"
                "runtime/debug"
            )

            // RecoveryMiddleware 错误恢复中间件
            func RecoveryMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func() {
                            if r := recover(); r != nil {
                                // 记录panic信息和堆栈
                                logger.Log(
                                    "panic", r,
                                    "stack", string(debug.Stack()),
                                )

                                // 返回错误响应
                                err = fmt.Errorf("panic recovered: %v", r)
                                response = nil
                            }
                        }()

                        return next(ctx, request)
                    }
                }
            }

            // RetryMiddleware 重试中间件
            func RetryMiddleware(maxRetries int, shouldRetry func(error) bool) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var lastErr error

                        for i := 0; i <= maxRetries; i++ {
                            resp, err := next(ctx, request)
                            if err == nil {
                                return resp, nil
                            }

                            lastErr = err

                            // 判断是否应该重试
                            if !shouldRetry(err) {
                                return nil, err
                            }

                            // 最后一次不等待
                            if i < maxRetries {
                                select {
                        case <-time.After(time.Duration(i+1) * 100 * time.Millisecond):
                                case <-ctx.Done():
                                    return nil, ctx.Err()
                                }
                            }
                        }

                        return nil, fmt.Errorf("max retries exceeded: %w", lastErr)
                    }
                }
            }

            // FallbackMiddleware 降级中间件
            func FallbackMiddleware(fallback endpoint.Endpoint) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        resp, err := next(ctx, request)
                        if err != nil {
                            // 主端点失败,使用降级端点
                            logger.Log("msg", "using fallback", "error", err)
                            return fallback(ctx, request)
                        }
                        return resp, nil
                    }
                }
            }
            ---

4 传输层

4.1 HTTP传输

01.HTTP服务器
    a.路由配置
        a.功能说明
            HTTP传输层使用httptransport.NewServer创建HTTP处理器,配置路由将URL映射到Endpoint。支持RESTful风格的路由设计,使用HTTP方法区分操作类型。可以使用gorilla/mux等路由库实现复杂的路由规则,支持路径参数、查询参数、正则匹配等。路由配置应该清晰明确,遵循REST规范,便于API管理和文档生成。合理的路由设计可以提高API的可读性和可维护性。
        b.代码示例
            ---
            // HTTP路由配置
            package transport

            import (
                "net/http"
                "github.com/gorilla/mux"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            // MakeHTTPHandler 创建HTTP处理器
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                r := mux.NewRouter()
                options := []httptransport.ServerOption{
                    httptransport.ServerErrorEncoder(encodeError),
                    httptransport.ServerBefore(extractRequestID),
                }

                // 用户相关路由
                r.Methods("POST").Path("/users").Handler(httptransport.NewServer(
                    endpoints.CreateUser,
                    decodeCreateUserRequest,
                    encodeResponse,
                    options...,
                ))

                r.Methods("GET").Path("/users/{id}").Handler(httptransport.NewServer(
                    endpoints.GetUser,
                    decodeGetUserRequest,
                    encodeResponse,
                    options...,
                ))

                r.Methods("PUT").Path("/users/{id}").Handler(httptransport.NewServer(
                    endpoints.UpdateUser,
                    decodeUpdateUserRequest,
                    encodeResponse,
                    options...,
                ))

                r.Methods("DELETE").Path("/users/{id}").Handler(httptransport.NewServer(
                    endpoints.DeleteUser,
                    decodeDeleteUserRequest,
                    encodeNoContent,
                    options...,
                ))

                r.Methods("GET").Path("/users").Handler(httptransport.NewServer(
                    endpoints.ListUsers,
                    decodeListUsersRequest,
                    encodeResponse,
                    options...,
                ))

                // 健康检查
                r.Methods("GET").Path("/health").HandlerFunc(healthCheckHandler)

                return r
            }

            func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
                w.WriteHeader(http.StatusOK)
                w.Write([]byte("OK"))
            }
            ---
    b.编解码器
        a.功能说明
            编解码器负责HTTP请求响应的序列化和反序列化,支持JSON、XML、Protobuf等多种格式。解码器从HTTP请求中提取数据转换为请求对象,包括Body、URL参数、Header等。编码器将响应对象转换为HTTP响应,设置正确的Content-Type和状态码。可以自定义编解码器实现特殊格式支持。编解码器与业务逻辑分离,便于格式切换和测试。编解码器应该处理各种异常情况,返回清晰的错误信息。
        b.代码示例
            ---
            // HTTP编解码器
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
                "strconv"
                "github.com/gorilla/mux"
            )

            // decodeCreateUserRequest 解码创建用户请求
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req endpoint.CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            // decodeGetUserRequest 解码获取用户请求
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                vars := mux.Vars(r)
                id, ok := vars["id"]
                if !ok {
                    return nil, errors.New("missing user id")
                }
                return endpoint.GetUserRequest{ID: id}, nil
            }

            // decodeListUsersRequest 解码列表请求
            func decodeListUsersRequest(_ context.Context, r *http.Request) (interface{}, error) {
                query := r.URL.Query()

                offset, _ := strconv.Atoi(query.Get("offset"))
                limit, _ := strconv.Atoi(query.Get("limit"))
                if limit == 0 {
                    limit = 10
                }

                return endpoint.ListUsersRequest{
                    Offset: offset,
                    Limit:  limit,
                    Filter: query.Get("filter"),
                }, nil
            }

            // encodeResponse 标准JSON响应编码
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            // encodeNoContent 无内容响应编码
            func encodeNoContent(_ context.Context, w http.ResponseWriter, _ interface{}) error {
                w.WriteHeader(http.StatusNoContent)
                return nil
            }

            // encodeError 错误响应编码
            func encodeError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                code := http.StatusInternalServerError

                switch err {
                case endpoint.ErrNotFound:
                    code = http.StatusNotFound
                case endpoint.ErrInvalidInput:
                    code = http.StatusBadRequest
                }

                w.WriteHeader(code)
                json.NewEncoder(w).Encode(map[string]string{"error": err.Error()})
            }
            ---

02.服务器选项
    a.ServerBefore
        a.功能说明
            ServerBefore在请求处理前执行,用于从HTTP请求中提取元数据并注入Context。可以提取请求ID、认证信息、追踪ID等,传递给Endpoint和Service层。多个ServerBefore函数按顺序执行,每个函数都可以修改Context。ServerBefore是实现横切关注点的重要机制,如认证、日志、追踪等。应该保持ServerBefore函数的轻量级,避免执行耗时操作。
        b.代码示例
            ---
            // ServerBefore选项
            package transport

            import (
                "context"
                "net/http"
                "github.com/google/uuid"
            )

            type contextKey string

            const (
                ContextKeyRequestID contextKey = "request_id"
                ContextKeyUserID    contextKey = "user_id"
                ContextKeyToken     contextKey = "token"
            )

            // extractRequestID 提取或生成请求ID
            func extractRequestID(ctx context.Context, r *http.Request) context.Context {
                requestID := r.Header.Get("X-Request-ID")
                if requestID == "" {
                    requestID = uuid.New().String()
                }
                return context.WithValue(ctx, ContextKeyRequestID, requestID)
            }

            // extractAuthToken 提取认证Token
            func extractAuthToken(ctx context.Context, r *http.Request) context.Context {
                auth := r.Header.Get("Authorization")
                if auth != "" {
                    // 移除Bearer前缀
                    if len(auth) > 7 && auth[:7] == "Bearer " {
                        token := auth[7:]
                        return context.WithValue(ctx, ContextKeyToken, token)
                    }
                }
                return ctx
            }

            // extractUserID 从Token提取用户ID
            func extractUserID(validator TokenValidator) httptransport.RequestFunc {
                return func(ctx context.Context, r *http.Request) context.Context {
                    token, ok := ctx.Value(ContextKeyToken).(string)
                    if !ok || token == "" {
                        return ctx
                    }

                    claims, err := validator.ValidateToken(token)
                    if err != nil {
                        return ctx
                    }

                    if userID, ok := claims["user_id"].(string); ok {
                        return context.WithValue(ctx, ContextKeyUserID, userID)
                    }

                    return ctx
                }
            }

            // extractClientIP 提取客户端IP
            func extractClientIP(ctx context.Context, r *http.Request) context.Context {
                ip := r.Header.Get("X-Forwarded-For")
                if ip == "" {
                    ip = r.Header.Get("X-Real-IP")
                }
                if ip == "" {
                    ip = r.RemoteAddr
                }
                return context.WithValue(ctx, "client_ip", ip)
            }
            ---
    b.ServerAfter
        a.功能说明
            ServerAfter在响应发送前执行,用于设置响应头、记录日志、追踪等。可以从Context中提取信息并写入响应头,如请求ID、服务版本等。多个ServerAfter函数按顺序执行,每个函数都可以修改响应头。ServerAfter不能修改响应体,只能修改响应头。应该在ServerAfter中完成响应的最后处理,如CORS头、安全头等。
        b.代码示例
            ---
            // ServerAfter选��
            package transport

            import (
                "context"
                "net/http"
                "time"
            )

            // setResponseHeaders 设置响应头
            func setResponseHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                if requestID, ok := ctx.Value(ContextKeyRequestID).(string); ok {
                    w.Header().Set("X-Request-ID", requestID)
                }

                w.Header().Set("X-Service-Name", "user-service")
                w.Header().Set("X-Service-Version", "1.0.0")

                return ctx
            }

            // setCORSHeaders 设置CORS头
            func setCORSHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                w.Header().Set("Access-Control-Allow-Origin", "*")
                w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
                w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Request-ID")
                w.Header().Set("Access-Control-Max-Age", "3600")
                return ctx
            }

            // setSecurityHeaders 设置安全头
            func setSecurityHeaders(ctx context.Context, w http.ResponseWriter) context.Context {
                w.Header().Set("X-Content-Type-Options", "nosniff")
                w.Header().Set("X-Frame-Options", "DENY")
                w.Header().Set("X-XSS-Protection", "1; mode=block")
                w.Header().Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains")
                return ctx
            }

            // logResponse 记录响应日志
            func logResponse(logger log.Logger) httptransport.ServerResponseFunc {
                return func(ctx context.Context, w http.ResponseWriter) context.Context {
                    requestID, _ := ctx.Value(ContextKeyRequestID).(string)
                    startTime, _ := ctx.Value("start_time").(time.Time)

                    duration := time.Since(startTime)

                    logger.Log(
                        "request_id", requestID,
                        "duration_ms", duration.Milliseconds(),
                    )

                    return ctx
                }
            }

            // MakeHTTPHandlerWithOptions 创建带选项的处理器
            func MakeHTTPHandlerWithOptions(endpoints Endpoints, logger log.Logger) http.Handler {
                options := []httptransport.ServerOption{
                    httptransport.ServerBefore(
                        extractRequestID,
                        extractAuthToken,
                        recordStartTime,
                    ),
                    httptransport.ServerAfter(
                        setResponseHeaders,
                        setCORSHeaders,
                        setSecurityHeaders,
                        logResponse(logger),
                    ),
                    httptransport.ServerErrorEncoder(encodeError),
                }

                r := mux.NewRouter()
                r.Methods("POST").Path("/users").Handler(httptransport.NewServer(
                    endpoints.CreateUser,
                    decodeCreateUserRequest,
                    encodeResponse,
                    options...,
                ))

                return r
            }

            func recordStartTime(ctx context.Context, r *http.Request) context.Context {
                return context.WithValue(ctx, "start_time", time.Now())
            }
            ---

03.HTTP客户端
    a.客户端创建
        a.功能说明
            HTTP客户端使用httptransport.NewClient创建,封装HTTP请求的发送和响应的接收。客户端返回标准的Endpoint类型,可以像本地Endpoint一样使用。需要指定目标URL、HTTP方法、请求编码器、响应解码器等参数。客户端可以配置超时、重试、熔断等策略。使用客户端可以简化远程服务调用,隐藏HTTP通信的细节。
        b.代码示例
            ---
            // HTTP客户端创建
            package client

            import (
                "net/url"
                "strings"
                "time"
                "github.com/go-kit/kit/endpoint"
                httptransport "github.com/go-kit/kit/transport/http"
            )

            // NewHTTPClient 创建HTTP客户端
            func NewHTTPClient(instance string, logger log.Logger) (Service, error) {
                if !strings.HasPrefix(instance, "http") {
                    instance = "http://" + instance
                }

                u, err := url.Parse(instance)
                if err != nil {
                    return nil, err
                }

                // 配置HTTP客户端
                httpClient := &http.Client{
                    Timeout: 10 * time.Second,
                    Transport: &http.Transport{
                        MaxIdleConns:        100,
                        MaxIdleConnsPerHost: 10,
                        IdleConnTimeout:     90 * time.Second,
                    },
                }

                options := []httptransport.ClientOption{
                    httptransport.SetClient(httpClient),
                    httptransport.ClientBefore(setRequestHeaders),
                }

                // 创建用户端点
                createUserEndpoint := httptransport.NewClient(
                    "POST",
                    copyURL(u, "/users"),
                    encodeJSONRequest,
                    decodeCreateUserResponse,
                    options...,
                ).Endpoint()

                getUserEndpoint := httptransport.NewClient(
                    "GET",
                    copyURL(u, "/users"),
                    encodeGetUserRequest,
                    decodeGetUserResponse,
                    options...,
                ).Endpoint()

                updateUserEndpoint := httptransport.NewClient(
                    "PUT",
                    copyURL(u, "/users"),
                    encodeUpdateUserRequest,
                    decodeUpdateUserResponse,
                    options...,
                ).Endpoint()

                deleteUserEndpoint := httptransport.NewClient(
                    "DELETE",
                    copyURL(u, "/users"),
                    encodeDeleteUserRequest,
                    decodeDeleteUserResponse,
                    options...,
                ).Endpoint()

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                    UpdateUserEndpoint: updateUserEndpoint,
                    DeleteUserEndpoint: deleteUserEndpoint,
                }, nil
            }

            func copyURL(base *url.URL, path string) *url.URL {
                next := *base
                next.Path = path
                return &next
            }

            func setRequestHeaders(ctx context.Context, r *http.Request) context.Context {
                r.Header.Set("Content-Type", "application/json")
                r.Header.Set("User-Agent", "go-kit-client/1.0")
                return ctx
            }
            ---
    b.客户端选项
        a.功能说明
            客户端选项用于配置HTTP客户端的行为,如设置请求头、超时时间、重试策略等。ClientBefore在请求发送前执行,可以修改HTTP请求。ClientAfter在响应接收后执行,可以从响应中提取元数据。可以使用SetClient选项自定义http.Client,配置连接池、TLS等。合理配置客户端选项可以提高客户端的可靠性和性能。
        b.代码示例
            ---
            // HTTP客户端选项
            package client

            import (
                "context"
                "crypto/tls"
                "net/http"
                "time"
            )

            // ClientConfig 客户端配置
            type ClientConfig struct {
                Timeout         time.Duration
                MaxIdleConns    int
                TLSConfig       *tls.Config
                RequestTimeout  time.Duration
                RetryMax        int
                RetryWaitMin    time.Duration
                RetryWaitMax    time.Duration
            }

            // DefaultClientConfig 默认配置
            func DefaultClientConfig() ClientConfig {
                return ClientConfig{
                    Timeout:        30 * time.Second,
                    MaxIdleConns:   100,
                    RequestTimeout: 10 * time.Second,
                    RetryMax:       3,
                    RetryWaitMin:   100 * time.Millisecond,
                    RetryWaitMax:   1 * time.Second,
                }
            }

            // NewHTTPClientWithConfig 使用配置创建客户端
            func NewHTTPClientWithConfig(instance string, config ClientConfig) *http.Client {
                transport := &http.Transport{
                    MaxIdleConns:        config.MaxIdleConns,
                    MaxIdleConnsPerHost: 10,
                    IdleConnTimeout:     90 * time.Second,
                    TLSHandshakeTimeout: 10 * time.Second,
                }

                if config.TLSConfig != nil {
                    transport.TLSClientConfig = config.TLSConfig
                }

                return &http.Client{
                    Transport: transport,
                    Timeout:   config.Timeout,
                }
            }

            // setAuthHeader 设置认证头
            func setAuthHeader(token string) httptransport.RequestFunc {
                return func(ctx context.Context, r *http.Request) context.Context {
                    r.Header.Set("Authorization", "Bearer "+token)
                    return ctx
                }
            }

            // setRequestID 设置请求ID
            func setRequestID(ctx context.Context, r *http.Request) context.Context {
                if requestID, ok := ctx.Value("request_id").(string); ok {
                    r.Header.Set("X-Request-ID", requestID)
                }
                return ctx
            }

            // extractResponseHeaders 提取响应头
            func extractResponseHeaders(ctx context.Context, r *http.Response) context.Context {
                if requestID := r.Header.Get("X-Request-ID"); requestID != "" {
                    ctx = context.WithValue(ctx, "response_request_id", requestID)
                }
                return ctx
            }
            ---

4.2 gRPC传输

01.gRPC服务器
    a.服务定义
        a.功能说明
            gRPC使用Protocol Buffers定义服务接口,生成服务端和客户端代码。go-kit的grpctransport包提供了gRPC与Endpoint的集成。需要定义.proto文件描述服务接口,使用protoc编译生成Go代码。gRPC服务器实现生成的接口,将gRPC请求转换为Endpoint调用。gRPC支持流式RPC,适合高性能场景。
        b.代码示例
            ---
            // gRPC服务定义
            // user.proto
            syntax = "proto3";
            package pb;
            option go_package = "./pb";

            service UserService {
                rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
                rpc GetUser(GetUserRequest) returns (GetUserResponse);
                rpc ListUsers(ListUsersRequest) returns (stream User);
            }

            message CreateUserRequest {
                string username = 1;
                string email = 2;
            }

            message CreateUserResponse {
                User user = 1;
                string error = 2;
            }

            message GetUserRequest {
                string id = 1;
            }

            message GetUserResponse {
                User user = 1;
                string error = 2;
            }

            message User {
                string id = 1;
                string username = 2;
                string email = 3;
            }

            message ListUsersRequest {
                int32 offset = 1;
                int32 limit = 2;
            }
            ---
    b.服务实现
        a.功能说明
            gRPC服务器实现生成的接口,使用grpctransport.NewServer创建处理器。每个RPC方法对应一个Endpoint,通过解码器和编码器转换Protobuf消息。gRPC服务器支持拦截器,可以实现认证、日志、追踪等功能。服务实现应该保持简洁,只做协议转换,业务逻辑在Service层。
        b.代码示例
            ---
            // gRPC服务实现
            package transport

            import (
                "context"
                grpctransport "github.com/go-kit/kit/transport/grpc"
                "google.golang.org/grpc"
            )

            type grpcServer struct {
                createUser grpctransport.Handler
                getUser    grpctransport.Handler
                pb.UnimplementedUserServiceServer
            }

            // NewGRPCServer 创建gRPC服务器
            func NewGRPCServer(endpoints Endpoints) pb.UserServiceServer {
                return &grpcServer{
                    createUser: grpctransport.NewServer(
                        endpoints.CreateUser,
                        decodeGRPCCreateUserRequest,
                        encodeGRPCCreateUserResponse,
                    ),
                    getUser: grpctransport.NewServer(
                        endpoints.GetUser,
                        decodeGRPCGetUserRequest,
                        encodeGRPCGetUserResponse,
                    ),
                }
            }

            func (s *grpcServer) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
                _, resp, err := s.createUser.ServeGRPC(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*pb.CreateUserResponse), nil
            }

            func (s *grpcServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
                _, resp, err := s.getUser.ServeGRPC(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*pb.GetUserResponse), nil
            }

            // 启动gRPC服务器
            func RunGRPCServer(endpoints Endpoints, port string) error {
                listener, err := net.Listen("tcp", port)
                if err != nil {
                    return err
                }

                grpcServer := grpc.NewServer()
                pb.RegisterUserServiceServer(grpcServer, NewGRPCServer(endpoints))

                return grpcServer.Serve(listener)
            }
            ---

02.gRPC编解码
    a.请求解码
        a.功能说明
            gRPC请求解码器将Protobuf消息转换为Endpoint请求对象。解码器接收proto生成的消息类型,提取字段构造请求对象。解码过程应该处理字段验证,确保数据完整性。对于复杂消息,可以使用辅助函数简化转换逻辑。解码器应该保持简单,只做数据转换,不包含业务逻辑。
        b.代码示例
            ---
            // gRPC请求解码
            package transport

            import (
                "context"
            )

            // decodeGRPCCreateUserRequest 解码创建用户请求
            func decodeGRPCCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.CreateUserRequest)
                return endpoint.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            // decodeGRPCGetUserRequest 解码获取用户请求
            func decodeGRPCGetUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.GetUserRequest)
                return endpoint.GetUserRequest{
                    ID: req.Id,
                }, nil
            }

            // decodeGRPCListUsersRequest 解码列表请求
            func decodeGRPCListUsersRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.ListUsersRequest)
                return endpoint.ListUsersRequest{
                    Offset: int(req.Offset),
                    Limit:  int(req.Limit),
                }, nil
            }

            // decodeGRPCUpdateUserRequest 解码更新请求
            func decodeGRPCUpdateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*pb.UpdateUserRequest)
                return endpoint.UpdateUserRequest{
                    ID: req.Id,
                    Updates: endpoint.UserUpdates{
                        Username: req.Username,
                        Email:    req.Email,
                    },
                }, nil
            }
            ---
    b.响应编码
        a.功能说明
            gRPC响应编码器将Endpoint响应对象转换为Protobuf消息。编码器构造proto消息,填充字段并返回。应该处理错误情况,将错误信息编码到响应中。对于流式RPC,需要特殊处理,逐个发送消息。编码器应该确保消息格式正确,符合proto定义。
        b.代码示例
            ---
            // gRPC响应编码
            package transport

            import (
                "context"
            )

            // encodeGRPCCreateUserResponse 编码创建用户响应
            func encodeGRPCCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.CreateUserResponse)
                return &pb.CreateUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                    Error: resp.Err,
                }, nil
            }

            // encodeGRPCGetUserResponse 编码获取用户响应
            func encodeGRPCGetUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.GetUserResponse)
                if resp.Err != "" {
                    return &pb.GetUserResponse{
                        Error: resp.Err,
                    }, nil
                }
                return &pb.GetUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                }, nil
            }

            // encodeGRPCListUsersResponse 编码列表响应
            func encodeGRPCListUsersResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.ListUsersResponse)
                users := make([]*pb.User, len(resp.Users))
                for i, u := range resp.Users {
                    users[i] = &pb.User{
                        Id:       u.ID,
                        Username: u.Username,
                        Email:    u.Email,
                    }
                }
                return &pb.ListUsersResponse{
                    Users: users,
                    Total: int32(resp.Total),
                }, nil
            }
            ---

03.gRPC客户端
    a.客户端创建
        a.功能说明
            gRPC客户端使用grpctransport.NewClient创建,封装gRPC调用。客户端返回Endpoint类型,可以应用中间件。需要建立gRPC连接,配置连接选项如超时、重试等。客户端支持负载均衡和服务发现,可以连接多个服务实例。使用连接池可以提高性能,减少连接开销。
        b.代码示例
            ---
            // gRPC客户端创建
            package client

            import (
                "time"
                "google.golang.org/grpc"
                "google.golang.org/grpc/credentials/insecure"
                grpctransport "github.com/go-kit/kit/transport/grpc"
            )

            // NewGRPCClient 创建gRPC客户端
            func NewGRPCClient(conn *grpc.ClientConn) Service {
                options := []grpctransport.ClientOption{}

                createUserEndpoint := grpctransport.NewClient(
                    conn,
                    "pb.UserService",
                    "CreateUser",
                    encodeGRPCCreateUserRequest,
                    decodeGRPCCreateUserResponse,
                    &pb.CreateUserResponse{},
                    options...,
                ).Endpoint()

                getUserEndpoint := grpctransport.NewClient(
                    conn,
                    "pb.UserService",
                    "GetUser",
                    encodeGRPCGetUserRequest,
                    decodeGRPCGetUserResponse,
                    &pb.GetUserResponse{},
                    options...,
                ).Endpoint()

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                }
            }

            // NewGRPCConn 创建gRPC连接
            func NewGRPCConn(target string) (*grpc.ClientConn, error) {
                return grpc.Dial(
                    target,
                    grpc.WithTransportCredentials(insecure.NewCredentials()),
                    grpc.WithTimeout(10*time.Second),
                    grpc.WithBlock(),
                )
            }

            // 使用示例
            func ExampleGRPCClient() {
                conn, err := NewGRPCConn("localhost:8080")
                if err != nil {
                    log.Fatal(err)
                }
                defer conn.Close()

                client := NewGRPCClient(conn)
                resp, err := client.CreateUser(context.Background(), "john", "john@example.com")
                if err != nil {
                    log.Fatal(err)
                }
                fmt.Println(resp)
            }
            ---
    b.拦截器
        a.功能说明
            gRPC拦截器类似于HTTP中间件,在RPC调用前后执行。支持一元拦截器和流式拦截器,分别处理一元RPC和流式RPC。拦截器可以实现认证、日志、追踪、重试等功能。客户端和服务端都可以使用拦截器。拦截器链按顺序执行,可以组合多个拦截器。合理使用拦截器可以简化横切关注点的实现。
        b.代码示例
            ---
            // gRPC拦截器
            package interceptor

            import (
                "context"
                "time"
                "google.golang.org/grpc"
                "google.golang.org/grpc/metadata"
            )

            // LoggingInterceptor 日志拦截器
            func LoggingInterceptor(logger log.Logger) grpc.UnaryClientInterceptor {
                return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
                    start := time.Now()
                    err := invoker(ctx, method, req, reply, cc, opts...)
                    logger.Log(
                        "method", method,
                        "duration", time.Since(start),
                        "error", err,
                    )
                    return err
                }
            }

            // AuthInterceptor 认证拦截器
            func AuthInterceptor(token string) grpc.UnaryClientInterceptor {
                return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
                    md := metadata.New(map[string]string{
                        "authorization": "Bearer " + token,
                    })
                    ctx = metadata.NewOutgoingContext(ctx, md)
                    return invoker(ctx, method, req, reply, cc, opts...)
                }
            }

            // RetryInterceptor 重试拦截器
            func RetryInterceptor(maxRetries int) grpc.UnaryClientInterceptor {
                return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
                    var err error
                    for i := 0; i <= maxRetries; i++ {
                        err = invoker(ctx, method, req, reply, cc, opts...)
                        if err == nil {
                            return nil
                        }
                        if i < maxRetries {
                            time.Sleep(time.Duration(i+1) * 100 * time.Millisecond)
                        }
                    }
                    return err
                }
            }

            // 使用拦截器
            func NewGRPCConnWithInterceptors(target string, logger log.Logger, token string) (*grpc.ClientConn, error) {
                return grpc.Dial(
                    target,
                    grpc.WithTransportCredentials(insecure.NewCredentials()),
                    grpc.WithChainUnaryInterceptor(
                        LoggingInterceptor(logger),
                        AuthInterceptor(token),
                        RetryInterceptor(3),
                    ),
                )
            }
            ---

4.3 Thrift传输

01.Thrift集成
    a.服务定义
        a.功能说明
            Thrift是Facebook开源的跨语言RPC框架,使用IDL定义服务接口。go-kit支持Thrift传输,通过thrifttransport包集成。需要定义.thrift文件描述服务,使用thrift编译器生成Go代码。Thrift支持多种传输协议(TBinaryProtocol、TCompactProtocol)和传输方式(TSocket、TFramedTransport)。Thrift适合需要跨语言通信的场景。
        b.代码示例
            ---
            // Thrift服务定义
            // user.thrift
            namespace go user

            struct User {
                1: string id
                2: string username
                3: string email
            }

            struct CreateUserRequest {
                1: string username
                2: string email
            }

            struct CreateUserResponse {
                1: User user
                2: string error
            }

            service UserService {
                CreateUserResponse CreateUser(1: CreateUserRequest req)
                User GetUser(1: string id)
                list<User> ListUsers(1: i32 offset, 2: i32 limit)
            }
            ---
    b.服务实现
        a.功能说明
            Thrift服务器实现生成的接口,使用thrifttransport.NewServer创建处理器。每个Thrift方法对应一个Endpoint,通过编解码器转换Thrift结构体。Thrift服务器配置传输协议和传输方式,支持多种组合。服务实现应该保持简洁,只做协议转换。Thrift的二进制协议比JSON更高效,适合性能敏感场景。
        b.代码示例
            ---
            // Thrift服务实现
            package transport

            import (
                "context"
                "github.com/apache/thrift/lib/go/thrift"
                thrifttransport "github.com/go-kit/kit/transport/thrift"
            )

            type thriftServer struct {
                createUser thrifttransport.Handler
                getUser    thrifttransport.Handler
            }

            func NewThriftServer(endpoints Endpoints) *thriftServer {
                return &thriftServer{
                    createUser: thrifttransport.NewServer(
                        endpoints.CreateUser,
                        decodeThriftCreateUserRequest,
                        encodeThriftCreateUserResponse,
                    ),
                    getUser: thrifttransport.NewServer(
                        endpoints.GetUser,
                        decodeThriftGetUserRequest,
                        encodeThriftGetUserResponse,
                    ),
                }
            }

            func (s *thriftServer) CreateUser(ctx context.Context, req *user.CreateUserRequest) (*user.CreateUserResponse, error) {
                _, resp, err := s.createUser.ServeThrift(ctx, req)
                if err != nil {
                    return nil, err
                }
                return resp.(*user.CreateUserResponse), nil
            }

            func (s *thriftServer) GetUser(ctx context.Context, id string) (*user.User, error) {
                _, resp, err := s.getUser.ServeThrift(ctx, id)
                if err != nil {
                    return nil, err
                }
                return resp.(*user.User), nil
            }

            // 启动Thrift服务器
            func RunThriftServer(endpoints Endpoints, port string) error {
                processor := user.NewUserServiceProcessor(NewThriftServer(endpoints))
                transport, err := thrift.NewTServerSocket(port)
                if err != nil {
                    return err
                }

                server := thrift.NewTSimpleServer4(
                    processor,
                    transport,
                    thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory()),
                    thrift.NewTBinaryProtocolFactoryDefault(),
                )

                return server.Serve()
            }
            ---

02.编解码器
    a.请求解码
        a.功能说明
            Thrift请求解码器将Thrift结构体转换为Endpoint请求对象。解码器接收thrift生成的结构体,提取字段构造请求对象。Thrift的强类型特性使得解码过程更安全,减少类型错误。解码器应该处理必填字段验证,确保数据完整性。对于可选字段,应该提供合理的默认值。
        b.代码示例
            ---
            // Thrift请求解码
            package transport

            import "context"

            func decodeThriftCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*user.CreateUserRequest)
                return endpoint.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func decodeThriftGetUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                id := request.(string)
                return endpoint.GetUserRequest{
                    ID: id,
                }, nil
            }

            func decodeThriftListUsersRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*user.ListUsersRequest)
                return endpoint.ListUsersRequest{
                    Offset: int(req.Offset),
                    Limit:  int(req.Limit),
                }, nil
            }

            func decodeThriftUpdateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(*user.UpdateUserRequest)
                return endpoint.UpdateUserRequest{
                    ID: req.Id,
                    Updates: endpoint.UserUpdates{
                        Username: req.Username,
                        Email:    req.Email,
                    },
                }, nil
            }
            ---
    b.响应编码
        a.功能说明
            Thrift响应编码器将Endpoint���应对象转换为Thrift结构体。编码器构造thrift结构体,填充字段并返回。应该处理错误情况,将错误信息编码到响应中。Thrift的结构化错误处理比HTTP更规范,可以定义专门的异常类型。编码器应该确保所有必填字段都被正确设置。
        b.代码示例
            ---
            // Thrift响应编码
            package transport

            import "context"

            func encodeThriftCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.CreateUserResponse)
                return &user.CreateUserResponse{
                    User: &user.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                    Error: resp.Err,
                }, nil
            }

            func encodeThriftGetUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.GetUserResponse)
                if resp.Err != "" {
                    return nil, errors.New(resp.Err)
                }
                return &user.User{
                    Id:       resp.User.ID,
                    Username: resp.User.Username,
                    Email:    resp.User.Email,
                }, nil
            }

            func encodeThriftListUsersResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(endpoint.ListUsersResponse)
                users := make([]*user.User, len(resp.Users))
                for i, u := range resp.Users {
                    users[i] = &user.User{
                        Id:       u.ID,
                        Username: u.Username,
                        Email:    u.Email,
                    }
                }
                return users, nil
            }
            ---

03.Thrift客户端
    a.客户端创建
        a.功能说明
            Thrift客户端使用thrifttransport.NewClient创建,封装Thrift调用。客户端返回Endpoint类型,可以应用中间件。需要建立Thrift连接,配置传输协议和传输方式。Thrift客户端支持连接池,可以复用连接提高性能。客户端应该处理连接错误和超时,实现重试机制。
        b.代码示例
            ---
            // Thrift客户端创建
            package client

            import (
                "github.com/apache/thrift/lib/go/thrift"
                thrifttransport "github.com/go-kit/kit/transport/thrift"
            )

            func NewThriftClient(addr string) (Service, error) {
                transport, err := thrift.NewTSocket(addr)
                if err != nil {
                    return nil, err
                }

                transport = thrift.NewTFramedTransport(transport)
                protocol := thrift.NewTBinaryProtocolTransport(transport)

                if err := transport.Open(); err != nil {
                    return nil, err
                }

                client := user.NewUserServiceClientProtocol(transport, protocol, protocol)

                createUserEndpoint := thrifttransport.NewClient(
                    client,
                    "CreateUser",
                    encodeThriftCreateUserRequest,
                    decodeThriftCreateUserResponse,
                ).Endpoint()

                getUserEndpoint := thrifttransport.NewClient(
                    client,
                    "GetUser",
                    encodeThriftGetUserRequest,
                    decodeThriftGetUserResponse,
                ).Endpoint()

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                    GetUserEndpoint:    getUserEndpoint,
                }, nil
            }

            func encodeThriftCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
                req := request.(endpoint.CreateUserRequest)
                return &user.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func decodeThriftCreateUserResponse(_ context.Context, response interface{}) (interface{}, error) {
                resp := response.(*user.CreateUserResponse)
                return endpoint.CreateUserResponse{
                    User: endpoint.User{
                        ID:       resp.User.Id,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                    Err: resp.Error,
                }, nil
            }
            ---
    b.连接管理
        a.功能说明
            Thrift客户端需要管理连接生命周期,包括连接建立、保持、关闭。应该实现连接池,复用连接减少开销。连接池应该配置最大连接数、空闲超时等参数。需要处理连接断开和重连,实现自动恢复机制。连接管理应该是线程安全的,支持并发访问。合理的连接管理可以提高客户端的性能和可靠性。
        b.代码示例
            ---
            // Thrift连接管理
            package client

            import (
                "sync"
                "time"
            )

            type ThriftPool struct {
                addr        string
                maxConns    int
                idleTimeout time.Duration
                conns       chan *thrift.TTransport
                mu          sync.Mutex
            }

            func NewThriftPool(addr string, maxConns int, idleTimeout time.Duration) *ThriftPool {
                return &ThriftPool{
                    addr:        addr,
                    maxConns:    maxConns,
                    idleTimeout: idleTimeout,
                    conns:       make(chan *thrift.TTransport, maxConns),
                }
            }

            func (p *ThriftPool) Get() (*thrift.TTransport, error) {
                select {
                case conn := <-p.conns:
                    if conn.IsOpen() {
                        return conn, nil
                    }
                    conn.Close()
                default:
                }

                transport, err := thrift.NewTSocket(p.addr)
                if err != nil {
                    return nil, err
                }

                transport = thrift.NewTFramedTransport(transport)
                if err := transport.Open(); err != nil {
                    return nil, err
                }

                return &transport, nil
            }

            func (p *ThriftPool) Put(conn *thrift.TTransport) {
                if !conn.IsOpen() {
                    return
                }

                select {
                case p.conns <- conn:
                default:
                    conn.Close()
                }
            }

            func (p *ThriftPool) Close() {
                close(p.conns)
                for conn := range p.conns {
                    conn.Close()
                }
            }

            // 使用连接池
            func NewThriftClientWithPool(pool *ThriftPool) Service {
                createUserEndpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    conn, err := pool.Get()
                    if err != nil {
                        return nil, err
                    }
                    defer pool.Put(conn)

                    // 执行RPC调用
                    return callCreateUser(conn, request)
                }

                return Endpoints{
                    CreateUserEndpoint: createUserEndpoint,
                }
            }
            ---

4.4 自定义传输

``` 01.传输抽象 a.接口定义 a.功能说明 go-kit的Transport层是高度抽象的,可以实现自定义传输协议。只需实现Server和Client接口,提供编解码器即可。自定义传输适合特殊场景,如WebSocket、MQTT、AMQP等协议。传输抽象使得Endpoint可以无缝切换不同协议,业务逻辑不受影响。实现自定义传输需要理解go-kit的Transport模型,遵循统一的接口规范。 b.代码示例 --- // 自定义传输接口 package transport

        import "context"

        type Server interface {
            ServeHTTP(w http.ResponseWriter, r *http.Request)
        }

        type Handler interface {
            ServeTransport(ctx context.Context, request interface{}) (context.Context, interface{}, error)
        }

        type DecodeRequestFunc func(context.Context, interface{}) (interface{}, error)
        type EncodeResponseFunc func(context.Context, interface{}, interface{}) error

        type CustomServer struct {
            e            endpoint.Endpoint
            dec          DecodeRequestFunc
            enc          EncodeResponseFunc
            before       []RequestFunc
            after        []ServerResponseFunc
            errorEncoder ErrorEncoder
        }

        func NewCustomServer(
            e endpoint.Endpoint,
            dec DecodeRequestFunc,
            enc EncodeResponseFunc,
            options ...ServerOption,
        ) *CustomServer {
            s := &CustomServer{
                e:            e,
                dec:          dec,
                enc:          enc,
                errorEncoder: DefaultErrorEncoder,
            }
            for _, option := range options {
                option(s)
            }
            return s
        }

        func (s *CustomServer) ServeTransport(ctx context.Context, req interface{}) (context.Context, interface{}, error) {
            for _, f := range s.before {
                ctx = f(ctx, req)
            }

            request, err := s.dec(ctx, req)
            if err != nil {
                return ctx, nil, err
            }

            response, err := s.e(ctx, request)
            if err != nil {
                return ctx, nil, err
            }

            for _, f := range s.after {
                ctx = f(ctx, response)
            }

            return ctx, response, nil
        }
        ---
b.实现示例
    a.功能说明
        实现自定义传输需要创建Server和Client,处理协议特定的细节。Server负责接收请求,调用Endpoint,返回响应。Client负责发送请求,接收响应,转换为Endpoint调用。需要实现编解码器,处理协议的序列化和反序列化。自定义传输应该支持中间件,实现横切关注点。实现时应该参考go-kit内置传输的代码,遵循相同的模式。
    b.代码示例
        ---
        // WebSocket传输实现
        package transport

        import (
            "context"
            "github.com/gorilla/websocket"
        )

        type WebSocketServer struct {
            e       endpoint.Endpoint
            dec     DecodeRequestFunc
            enc     EncodeResponseFunc
            upgrader websocket.Upgrader
        }

        func NewWebSocketServer(
            e endpoint.Endpoint,
            dec DecodeRequestFunc,
            enc EncodeResponseFunc,
        ) *WebSocketServer {
            return &WebSocketServer{
                e:   e,
                dec: dec,
                enc: enc,
                upgrader: websocket.Upgrader{
                    CheckOrigin: func(r *http.Request) bool {
                        return true
                    },
                },
            }
        }

        func (s *WebSocketServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
            conn, err := s.upgrader.Upgrade(w, r, nil)
            if err != nil {
                return
            }
            defer conn.Close()

            for {
                _, message, err := conn.ReadMessage()
                if err != nil {
                    break
                }

                ctx := context.Background()
                request, err := s.dec(ctx, message)
                if err != nil {
                    continue
                }

                response, err := s.e(ctx, request)
                if err != nil {
                    continue
                }

                responseData, err := s.enc(ctx, response)
                if err != nil {
                    continue
                }

                conn.WriteMessage(websocket.TextMessage, responseData.([]byte))
            }
        }

        // WebSocket客户端
        type WebSocketClient struct {
            conn *websocket.Conn
            dec  DecodeResponseFunc
            enc  EncodeRequestFunc
        }

        func NewWebSocketClient(url string, dec DecodeResponseFunc, enc EncodeRequestFunc) (*WebSocketClient, error) {
            conn, _, err := websocket.DefaultDialer.Dial(url, nil)
            if err != nil {
                return nil, err
            }

            return &WebSocketClient{
                conn: conn,
                dec:  dec,
                enc:  enc,
            }, nil
        }

        func (c *WebSocketClient) Endpoint() endpoint.Endpoint {
            return func(ctx context.Context, request interface{}) (interface{}, error) {
                requestData, err := c.enc(ctx, request)
                if err != nil {
                    return nil, err
                }

                err = c.conn.WriteMessage(websocket.TextMessage, requestData.([]byte))
                if err != nil {
                    return nil, err
                }

                _, message, err := c.conn.ReadMessage()
                if err != nil {
                    return nil, err
                }

                return c.dec(ctx, message)
            }
        }
        ---

02.协议适配 a.协议转换 a.功能说明 协议适配器将不同协议的请求转换为统一的Endpoint调用。适配器处理协议特定的细节,如消息格式、连接管理、错误处理等。可以为同一个Endpoint提供多种协议支持,如同时支持HTTP和WebSocket。协议适配使得服务可以灵活地支持多种客户端,提高兼容性。��现协议适配需要深入理解各协议的特点和限制。 b.代码示例 --- // 协议适配器 package adapter

        import "context"

        type ProtocolAdapter interface {
            Adapt(ctx context.Context, request interface{}) (interface{}, error)
        }

        type HTTPToGRPCAdapter struct {
            grpcClient pb.UserServiceClient
        }

        func (a *HTTPToGRPCAdapter) Adapt(ctx context.Context, request interface{}) (interface{}, error) {
            httpReq := request.(HTTPRequest)

            grpcReq := &pb.CreateUserRequest{
                Username: httpReq.Username,
                Email:    httpReq.Email,
            }

            grpcResp, err := a.grpcClient.CreateUser(ctx, grpcReq)
            if err != nil {
                return nil, err
            }

            return HTTPResponse{
                User: User{
                    ID:       grpcResp.User.Id,
                    Username: grpcResp.User.Username,
                    Email:    grpcResp.User.Email,
                },
            }, nil
        }

        type MultiProtocolServer struct {
            endpoint endpoint.Endpoint
            adapters map[string]ProtocolAdapter
        }

        func NewMultiProtocolServer(e endpoint.Endpoint) *MultiProtocolServer {
            return &MultiProtocolServer{
                endpoint: e,
                adapters: make(map[string]ProtocolAdapter),
            }
        }

        func (s *MultiProtocolServer) RegisterAdapter(protocol string, adapter ProtocolAdapter) {
            s.adapters[protocol] = adapter
        }

        func (s *MultiProtocolServer) ServeProtocol(ctx context.Context, protocol string, request interface{}) (interface{}, error) {
            adapter, ok := s.adapters[protocol]
            if !ok {
                return s.endpoint(ctx, request)
            }

            adaptedRequest, err := adapter.Adapt(ctx, request)
            if err != nil {
                return nil, err
            }

            return s.endpoint(ctx, adaptedRequest)
        }
        ---
b.中间件支持
    a.功能说明
        自定义传输应该支持中间件,实现日志、监控、认证等功能。中间件应该与协议无关,可以在不同传输间复用。需要定义中间件接口,支持链式组合。中间件应该在传输层和Endpoint层之间,处理传输相关的横切关注点。合理使用中间件可以简化自定义传输的实现,提高代码复用性。
    b.代码示例
        ---
        // 传输中间件
        package transport

        import "context"

        type Middleware func(Handler) Handler

        type Handler func(ctx context.Context, request interface{}) (interface{}, error)

        func LoggingMiddleware(logger log.Logger) Middleware {
            return func(next Handler) Handler {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    logger.Log("msg", "handling request", "request", request)
                    response, err := next(ctx, request)
                    logger.Log("msg", "handled request", "response", response, "err", err)
                    return response, err
                }
            }
        }

        func AuthMiddleware(validator TokenValidator) Middleware {
            return func(next Handler) Handler {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    token, ok := ctx.Value("token").(string)
                    if !ok || token == "" {
                        return nil, ErrUnauthorized
                    }

                    if err := validator.Validate(token); err != nil {
                        return nil, ErrInvalidToken
                    }

                    return next(ctx, request)
                }
            }
        }

        func ChainMiddleware(middlewares ...Middleware) Middleware {
            return func(next Handler) Handler {
                for i := len(middlewares) - 1; i >= 0; i-- {
                    next = middlewares[i](next)
                }
                return next
            }
        }

        // 使用中间件
        func NewServerWithMiddleware(e endpoint.Endpoint, middlewares ...Middleware) Handler {
            handler := func(ctx context.Context, request interface{}) (interface{}, error) {
                return e(ctx, request)
            }

            for i := len(middlewares) - 1; i >= 0; i-- {
                handler = middlewares[i](handler)
            }

            return handler
        }
        ---

03.最佳实践 a.性能优化 a.功能说明 自定义传输应该注重性能优化,减少不必要的开销。使用连接池复用连接,减少建立连接的开销。使用缓冲区减少内存分配,提高吞吐量。合理设置超时时间,避免资源泄漏。使用异步处理提高并发能力。性能优化应该基于性能测试的结果,针对性地优化瓶颈。 b.代码示例 --- // 性能优化示例 package transport

        import (
            "sync"
            "time"
        )

        type ConnectionPool struct {
            factory  func() (interface{}, error)
            pool     chan interface{}
            maxConns int
            timeout  time.Duration
            mu       sync.Mutex
        }

        func NewConnectionPool(factory func() (interface{}, error), maxConns int, timeout time.Duration) *ConnectionPool {
            return &ConnectionPool{
                factory:  factory,
                pool:     make(chan interface{}, maxConns),
                maxConns: maxConns,
                timeout:  timeout,
            }
        }

        func (p *ConnectionPool) Get() (interface{}, error) {
            select {
            case conn := <-p.pool:
                return conn, nil
            case <-time.After(p.timeout):
                return nil, ErrTimeout
            default:
                return p.factory()
            }
        }

        func (p *ConnectionPool) Put(conn interface{}) {
            select {
            case p.pool <- conn:
            default:
                // Pool is full, discard connection
            }
        }

        // 缓冲区池
        var bufferPool = sync.Pool{
            New: func() interface{} {
                return make([]byte, 4096)
            },
        }

        func GetBuffer() []byte {
            return bufferPool.Get().([]byte)
        }

        func PutBuffer(buf []byte) {
            bufferPool.Put(buf)
        }

        // 异步处理
        type AsyncHandler struct {
            handler  Handler
            workers  int
            requests chan asyncRequest
        }

        type asyncRequest struct {
            ctx      context.Context
            request  interface{}
            response chan asyncResponse
        }

        type asyncResponse struct {
            response interface{}
            err      error
        }

        func NewAsyncHandler(handler Handler, workers int) *AsyncHandler {
            h := &AsyncHandler{
                handler:  handler,
                workers:  workers,
                requests: make(chan asyncRequest, workers*2),
            }

            for i := 0; i < workers; i++ {
                go h.worker()
            }

            return h
        }

        func (h *AsyncHandler) worker() {
            for req := range h.requests {
                response, err := h.handler(req.ctx, req.request)
                req.response <- asyncResponse{response, err}
            }
        }

        func (h *AsyncHandler) Handle(ctx context.Context, request interface{}) (interface{}, error) {
            respChan := make(chan asyncResponse, 1)
            h.requests <- asyncRequest{ctx, request, respChan}

            select {
            case resp := <-respChan:
                return resp.response, resp.err
            case <-ctx.Done():
                return nil, ctx.Err()
            }
        }
        ---
b.错误处理
    a.功能说明
        自定义传输应该妥善处理各种错误情况,包括网络错误、协议错误、超时错误等。应该定义清晰的错误类型,便于客户端处理。错误信息应该包含足够的上下文,便于问题排查。对于可恢复的错误,应该实现重试机制。对于不可恢复的错误,应该快速失败并返回明确的错误信息。错误处理应该考虑安全性,不暴露敏感信息。
    b.代码示例
        ---
        // 错误处理
        package transport

        import (
            "errors"
            "fmt"
        )

        type TransportError struct {
            Code    string
            Message string
            Err     error
        }

        func (e *TransportError) Error() string {
            if e.Err != nil {
                return fmt.Sprintf("%s: %s: %v", e.Code, e.Message, e.Err)
            }
            return fmt.Sprintf("%s: %s", e.Code, e.Message)
        }

        func (e *TransportError) Unwrap() error {
            return e.Err
        }

        var (
            ErrConnectionFailed = &TransportError{
                Code:    "CONNECTION_FAILED",
                Message: "failed to establish connection",
            }

            ErrTimeout = &TransportError{
                Code:    "TIMEOUT",
                Message: "request timeout",
            }

            ErrInvalidProtocol = &TransportError{
                Code:    "INVALID_PROTOCOL",
                Message: "invalid protocol",
            }
        )

        func HandleError(err error) error {
            var transportErr *TransportError
            if errors.As(err, &transportErr) {
                switch transportErr.Code {
                case "CONNECTION_FAILED", "TIMEOUT":
                    // Retryable errors
                    return fmt.Errorf("retryable error: %w", err)
                default:
                    // Non-retryable errors
                    return fmt.Errorf("fatal error: %w", err)
                }
            }

            return err
        }

        type ErrorHandler interface {
            HandleError(ctx context.Context, err error) error
        }

        type DefaultErrorHandler struct {
            logger log.Logger
        }

        func (h *DefaultErrorHandler) HandleError(ctx context.Context, err error) error {
            h.logger.Log("error", err)

            var transportErr *TransportError
            if errors.As(err, &transportErr) {
                return &TransportError{
                    Code:    transportErr.Code,
                    Message: "internal error",
                }
            }

            return &TransportError{
                Code:    "UNKNOWN_ERROR",
                Message: "unknown error occurred",
            }
        }
        ---

```

4.5 编解码器

01.JSON编解码
    a.JSON解码
        a.功能说明
            JSON是最常用的数据交换格式,go-kit默认支持JSON编解码。JSON解码器使用encoding/json包解析HTTP请求体,将JSON数据转换为Go结构体。解码器应该处理JSON格式错误,返回清晰的错误信息。可以使用json.Decoder的DisallowUnknownFields方法拒绝未知字段,提高安全性。对于大型JSON,应该使用流式解码减少内存占用。
        b.代码示例
            ---
            // JSON解码器
            package transport

            import (
                "context"
                "encoding/json"
                "errors"
                "io"
                "net/http"
            )

            func decodeJSONRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                decoder := json.NewDecoder(r.Body)
                decoder.DisallowUnknownFields()

                if err := decoder.Decode(&req); err != nil {
                    if err == io.EOF {
                        return nil, errors.New("empty request body")
                    }
                    return nil, fmt.Errorf("invalid JSON: %w", err)
                }

                return req, nil
            }

            func decodeJSONRequestWithValidation(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }

                if req.Username == "" {
                    return nil, errors.New("username is required")
                }
                if req.Email == "" {
                    return nil, errors.New("email is required")
                }

                return req, nil
            }

            func decodeJSONArray(_ context.Context, r *http.Request) (interface{}, error) {
                var items []Item
                if err := json.NewDecoder(r.Body).Decode(&items); err != nil {
                    return nil, err
                }
                return items, nil
            }
            ---
    b.JSON编码
        a.功能说明
            JSON编码器将Go结构体转换为JSON格式并写入HTTP响应。编码器使用encoding/json包序列化数据,设置Content-Type为application/json。可以使用json.Encoder的SetIndent方法格式化输出,便于调试。对于大型响应,应该使用流式编码提高性能。编码器应该处理循环引用和特殊类型,避免编码失败。
        b.代码示例
            ---
            // JSON编码器
            package transport

            import (
                "context"
                "encoding/json"
                "net/http"
            )

            func encodeJSONResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }

            func encodeJSONResponseWithStatus(status int) EncodeResponseFunc {
                return func(_ context.Context, w http.ResponseWriter, response interface{}) error {
                    w.Header().Set("Content-Type", "application/json; charset=utf-8")
                    w.WriteHeader(status)
                    return json.NewEncoder(w).Encode(response)
                }
            }

            func encodePrettyJSON(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                encoder := json.NewEncoder(w)
                encoder.SetIndent("", "  ")
                return encoder.Encode(response)
            }

            func encodeJSONError(_ context.Context, err error, w http.ResponseWriter) {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                w.WriteHeader(http.StatusInternalServerError)
                json.NewEncoder(w).Encode(map[string]string{
                    "error": err.Error(),
                })
            }
            ---

02.Protobuf编解码
    a.Protobuf解码
        a.功能说明
            Protobuf是高效的二进制序列化格式,适合性能敏感场景。Protobuf解码器使用proto.Unmarshal解析二进制数据,转换为proto生成的结构体。解码器应该验证消息完整性,确保所有必填字段都存在。Protobuf的强类型特性使得解码更安全,减少运行时错误。对于大型消息,Protobuf比JSON更高效,占用更少的带宽和内存。
        b.代码示例
            ---
            // Protobuf解码器
            package transport

            import (
                "context"
                "io/ioutil"
                "net/http"
                "google.golang.org/protobuf/proto"
            )

            func decodeProtobufRequest(_ context.Context, r *http.Request) (interface{}, error) {
                body, err := ioutil.ReadAll(r.Body)
                if err != nil {
                    return nil, err
                }

                var req pb.CreateUserRequest
                if err := proto.Unmarshal(body, &req); err != nil {
                    return nil, err
                }

                return endpoint.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }

            func decodeProtobufWithValidation(_ context.Context, r *http.Request) (interface{}, error) {
                body, err := ioutil.ReadAll(r.Body)
                if err != nil {
                    return nil, err
                }

                var req pb.CreateUserRequest
                if err := proto.Unmarshal(body, &req); err != nil {
                    return nil, err
                }

                if req.Username == "" {
                    return nil, errors.New("username is required")
                }

                return endpoint.CreateUserRequest{
                    Username: req.Username,
                    Email:    req.Email,
                }, nil
            }
            ---
    b.Protobuf编码
        a.功能说明
            Protobuf编码器将Go结构体转换为二进制格式并写入响应。编码器使用proto.Marshal序列化数据,设置Content-Type为application/x-protobuf。Protobuf编码比JSON更快,生成的数据更小。编码器应该确保所有必填字段都被设置,避免编码失败。对于流式数据,可以使用Protobuf的流式API提高性能。
        b.代码示例
            ---
            // Protobuf编码器
            package transport

            import (
                "context"
                "net/http"
                "google.golang.org/protobuf/proto"
            )

            func encodeProtobufResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                resp := response.(endpoint.CreateUserResponse)

                pbResp := &pb.CreateUserResponse{
                    User: &pb.User{
                        Id:       resp.User.ID,
                        Username: resp.User.Username,
                        Email:    resp.User.Email,
                    },
                    Error: resp.Err,
                }

                data, err := proto.Marshal(pbResp)
                if err != nil {
                    return err
                }

                w.Header().Set("Content-Type", "application/x-protobuf")
                w.Write(data)
                return nil
            }

            func encodeProtobufWithStatus(status int) EncodeResponseFunc {
                return func(_ context.Context, w http.ResponseWriter, response interface{}) error {
                    data, err := proto.Marshal(response.(proto.Message))
                    if err != nil {
                        return err
                    }

                    w.Header().Set("Content-Type", "application/x-protobuf")
                    w.WriteHeader(status)
                    w.Write(data)
                    return nil
                }
            }
            ---

03.自定义编解码
    a.编解码器接口
        a.功能说明
            可以实现自定��编解码器支持特殊格式,如XML、YAML、MessagePack等。编解码器需要实现DecodeRequestFunc和EncodeResponseFunc接口。自定义编解码器应该处理格式特定的细节,如命名空间、标签等。可以组合多个编解码器,根据Content-Type选择合适的编解码器。自定义编解码器使得go-kit可以支持任意数据格式。
        b.代码示例
            ---
            // 自定义编解码器
            package transport

            import (
                "context"
                "encoding/xml"
                "net/http"
                "gopkg.in/yaml.v2"
            )

            func decodeXMLRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := xml.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            func encodeXMLResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/xml; charset=utf-8")
                return xml.NewEncoder(w).Encode(response)
            }

            func decodeYAMLRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := yaml.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }

            func encodeYAMLResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/x-yaml; charset=utf-8")
                return yaml.NewEncoder(w).Encode(response)
            }

            type ContentTypeCodec struct {
                decoders map[string]DecodeRequestFunc
                encoders map[string]EncodeResponseFunc
            }

            func NewContentTypeCodec() *ContentTypeCodec {
                return &ContentTypeCodec{
                    decoders: make(map[string]DecodeRequestFunc),
                    encoders: make(map[string]EncodeResponseFunc),
                }
            }

            func (c *ContentTypeCodec) RegisterDecoder(contentType string, decoder DecodeRequestFunc) {
                c.decoders[contentType] = decoder
            }

            func (c *ContentTypeCodec) RegisterEncoder(contentType string, encoder EncodeResponseFunc) {
                c.encoders[contentType] = encoder
            }

            func (c *ContentTypeCodec) Decode(ctx context.Context, r *http.Request) (interface{}, error) {
                contentType := r.Header.Get("Content-Type")
                decoder, ok := c.decoders[contentType]
                if !ok {
                    return nil, fmt.Errorf("unsupported content type: %s", contentType)
                }
                return decoder(ctx, r)
            }

            func (c *ContentTypeCodec) Encode(ctx context.Context, w http.ResponseWriter, response interface{}) error {
                accept := w.Header().Get("Accept")
                encoder, ok := c.encoders[accept]
                if !ok {
                    encoder = c.encoders["application/json"]
                }
                return encoder(ctx, w, response)
            }
            ---
    b.编解码优化
        a.功能说明
            编解码器的性能直接影响服务的吞吐量和延迟。应该使用对象池减少内存分配,复用编解码器对象。对于大型数据,使用流式编解码避免一次性加载到内存。可以使用并行编解码提高多核利用率。编解码器应该避免不必要的数据拷贝,使用零拷贝技术。性能优化应该基于性能测试的结果,针对性地优化瓶颈。
        b.代码示例
            ---
            // 编解码优化
            package transport

            import (
                "bytes"
                "encoding/json"
                "sync"
            )

            var bufferPool = sync.Pool{
                New: func() interface{} {
                    return new(bytes.Buffer)
                },
            }

            func decodeJSONOptimized(_ context.Context, r *http.Request) (interface{}, error) {
                buf := bufferPool.Get().(*bytes.Buffer)
                defer func() {
                    buf.Reset()
                    bufferPool.Put(buf)
                }()

                if _, err := buf.ReadFrom(r.Body); err != nil {
                    return nil, err
                }

                var req CreateUserRequest
                if err := json.Unmarshal(buf.Bytes(), &req); err != nil {
                    return nil, err
                }

                return req, nil
            }

            var encoderPool = sync.Pool{
                New: func() interface{} {
                    return json.NewEncoder(nil)
                },
            }

            func encodeJSONOptimized(_ context.Context, w http.ResponseWriter, response interface{}) error {
                encoder := encoderPool.Get().(*json.Encoder)
                defer encoderPool.Put(encoder)

                encoder.Reset(w)
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return encoder.Encode(response)
            }

            type StreamDecoder struct {
                decoder *json.Decoder
            }

            func NewStreamDecoder(r io.Reader) *StreamDecoder {
                return &StreamDecoder{
                    decoder: json.NewDecoder(r),
                }
            }

            func (d *StreamDecoder) DecodeNext(v interface{}) error {
                return d.decoder.Decode(v)
            }

            func (d *StreamDecoder) More() bool {
                return d.decoder.More()
            }
            ---

4.6 传输中间件

01.HTTP中间件
    a.请求拦截
        a.功能说明
            HTTP传输中间件可以在请求处理前后执行额外逻辑,如认证、日志、限流等。中间件使用装饰器模式包装Handler,形成中间件链。每个中间件都可以访问和修改请求响应,或者提前终止请求。中间件应该保持单一职责,每个中间件只做一件事。可以组合多个中间件实现复杂功能。中间件的执行顺序很重要,应该合理安排。
        b.代码示例
            ---
            // HTTP请求拦截中间件
            package middleware

            import (
                "context"
                "net/http"
                "time"
            )

            // AuthMiddleware 认证中间件
            func AuthMiddleware(tokenValidator TokenValidator) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        token := r.Header.Get("Authorization")
                        if token == "" {
                            http.Error(w, "missing authorization", http.StatusUnauthorized)
                            return
                        }

                        claims, err := tokenValidator.Validate(token)
                        if err != nil {
                            http.Error(w, "invalid token", http.StatusUnauthorized)
                            return
                        }

                        ctx := context.WithValue(r.Context(), "user_id", claims.UserID)
                        next.ServeHTTP(w, r.WithContext(ctx))
                    })
                }
            }

            // RateLimitMiddleware 限流中间件
            func RateLimitMiddleware(limiter *rate.Limiter) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        if !limiter.Allow() {
                            http.Error(w, "rate limit exceeded", http.StatusTooManyRequests)
                            return
                        }
                        next.ServeHTTP(w, r)
                    })
                }
            }

            // TimeoutMiddleware 超时中间件
            func TimeoutMiddleware(timeout time.Duration) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        ctx, cancel := context.WithTimeout(r.Context(), timeout)
                        defer cancel()

                        done := make(chan struct{})
                        go func() {
                            next.ServeHTTP(w, r.WithContext(ctx))
                            close(done)
                        }()

                        select {
                        case <-done:
                            return
                        case <-ctx.Done():
                            http.Error(w, "request timeout", http.StatusRequestTimeout)
                        }
                    })
                }
            }
            ---
    b.响应处理
        a.功能说明
            响应处理中间件在响应发送前执行,可以修改响应头、压缩响应体、添加CORS头等。响应中间件可以实现统一的错误处理,将不同类型的错误转换为合适的HTTP状态码。可以添加响应时间、请求ID等元数据到响应头。响应中间件应该注意不要多次写入响应,避免冲突。使用ResponseWriter包装器可以捕获响应状态码和大小。
        b.代码示例
            ---
            // HTTP响应处理中间件
            package middleware

            import (
                "compress/gzip"
                "io"
                "net/http"
                "strings"
            )

            // CORSMiddleware CORS中间件
            func CORSMiddleware(allowOrigins []string) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        origin := r.Header.Get("Origin")
                        for _, allowed := range allowOrigins {
                            if origin == allowed || allowed == "*" {
                                w.Header().Set("Access-Control-Allow-Origin", origin)
                                w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
                                w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
                                break
                            }
                        }

                        if r.Method == "OPTIONS" {
                            w.WriteHeader(http.StatusOK)
                            return
                        }

                        next.ServeHTTP(w, r)
                    })
                }
            }

            // GzipMiddleware 压缩中间件
            type gzipResponseWriter struct {
                io.Writer
                http.ResponseWriter
            }

            func (w gzipResponseWriter) Write(b []byte) (int, error) {
                return w.Writer.Write(b)
            }

            func GzipMiddleware() func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
                            next.ServeHTTP(w, r)
                            return
                        }

                        w.Header().Set("Content-Encoding", "gzip")
                        gz := gzip.NewWriter(w)
                        defer gz.Close()

                        gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w}
                        next.ServeHTTP(gzw, r)
                    })
                }
            }

            // ResponseMetricsMiddleware 响应指标中间件
            type responseWriter struct {
                http.ResponseWriter
                statusCode int
                size       int
            }

            func (rw *responseWriter) WriteHeader(code int) {
                rw.statusCode = code
                rw.ResponseWriter.WriteHeader(code)
            }

            func (rw *responseWriter) Write(b []byte) (int, error) {
                size, err := rw.ResponseWriter.Write(b)
                rw.size += size
                return size, err
            }

            func ResponseMetricsMiddleware(logger log.Logger) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        rw := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK}
                        start := time.Now()

                        next.ServeHTTP(rw, r)

                        logger.Log(
                            "method", r.Method,
                            "path", r.URL.Path,
                            "status", rw.statusCode,
                            "size", rw.size,
                            "duration", time.Since(start),
                        )
                    })
                }
            }
            ---

02.gRPC拦截器
    a.一元拦截器
        a.功能说明
            gRPC一元拦截器用于拦截一元RPC调用,在调用前后执行额外逻辑。拦截器可以访问请求响应,修改Context,或者提前返回错误。支持客户端拦截器和服务端拦截器,分别在客户端和服务端执行。拦截器链按顺序执行,可以组合多个拦截器。一元拦截器适合实现认证、日志、追踪、重试等功能。拦截器应该保持轻量级,避免阻塞RPC调用。
        b.代码示例
            ---
            // gRPC一元拦截器
            package interceptor

            import (
                "context"
                "time"
                "google.golang.org/grpc"
                "google.golang.org/grpc/codes"
                "google.golang.org/grpc/metadata"
                "google.golang.org/grpc/status"
            )

            // UnaryServerLoggingInterceptor 服务端日志拦截器
            func UnaryServerLoggingInterceptor(logger log.Logger) grpc.UnaryServerInterceptor {
                return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
                    start := time.Now()

                    resp, err := handler(ctx, req)

                    logger.Log(
                        "method", info.FullMethod,
                        "duration", time.Since(start),
                        "error", err,
                    )

                    return resp, err
                }
            }

            // UnaryServerAuthInterceptor 服务端认证拦截器
            func UnaryServerAuthInterceptor(validator TokenValidator) grpc.UnaryServerInterceptor {
                return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
                    md, ok := metadata.FromIncomingContext(ctx)
                    if !ok {
                        return nil, status.Error(codes.Unauthenticated, "missing metadata")
                    }

                    tokens := md.Get("authorization")
                    if len(tokens) == 0 {
                        return nil, status.Error(codes.Unauthenticated, "missing token")
                    }

                    claims, err := validator.Validate(tokens[0])
                    if err != nil {
                        return nil, status.Error(codes.Unauthenticated, "invalid token")
                    }

                    ctx = context.WithValue(ctx, "user_id", claims.UserID)
                    return handler(ctx, req)
                }
            }

            // UnaryClientRetryInterceptor 客户端重试拦截器
            func UnaryClientRetryInterceptor(maxRetries int) grpc.UnaryClientInterceptor {
                return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
                    var lastErr error

                    for i := 0; i <= maxRetries; i++ {
                        err := invoker(ctx, method, req, reply, cc, opts...)
                        if err == nil {
                            return nil
                        }

                        lastErr = err

                        if st, ok := status.FromError(err); ok {
                            if st.Code() == codes.Unavailable || st.Code() == codes.DeadlineExceeded {
                                if i < maxRetries {
                                    time.Sleep(time.Duration(i+1) * 100 * time.Millisecond)
                                    continue
                                }
                            }
                        }

                        return err
                    }

                    return lastErr
                }
            }
            ---
    b.流式拦截器
        a.功能说明
            gRPC流式拦截器用于拦截流式RPC调用,包括客户端流、服务端流、双向流。流式拦截器需要包装Stream对象,拦截消息的发送和接收。可以在消息发送前后执行逻辑,如验证、转换、记录等。流式拦截器比一元拦截器更复杂,需要正确处理流的生命周期。支持客户端和服务端流式拦截器。流式拦截器适合实现流量控制、消息过滤、压缩等功能。
        b.代码示例
            ---
            // gRPC流式拦截器
            package interceptor

            import (
                "context"
                "google.golang.org/grpc"
            )

            // StreamServerLoggingInterceptor 服务端流式日志拦截器
            func StreamServerLoggingInterceptor(logger log.Logger) grpc.StreamServerInterceptor {
                return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
                    start := time.Now()

                    wrapped := &loggingServerStream{
                        ServerStream: ss,
                        logger:       logger,
                        method:       info.FullMethod,
                    }

                    err := handler(srv, wrapped)

                    logger.Log(
                        "method", info.FullMethod,
                        "duration", time.Since(start),
                        "messages_sent", wrapped.sentCount,
                        "messages_received", wrapped.recvCount,
                        "error", err,
                    )

                    return err
                }
            }

            type loggingServerStream struct {
                grpc.ServerStream
                logger    log.Logger
                method    string
                sentCount int
                recvCount int
            }

            func (s *loggingServerStream) SendMsg(m interface{}) error {
                err := s.ServerStream.SendMsg(m)
                if err == nil {
                    s.sentCount++
                }
                return err
            }

            func (s *loggingServerStream) RecvMsg(m interface{}) error {
                err := s.ServerStream.RecvMsg(m)
                if err == nil {
                    s.recvCount++
                }
                return err
            }

            // StreamClientInterceptor 客户端流式拦截器
            func StreamClientInterceptor(logger log.Logger) grpc.StreamClientInterceptor {
                return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
                    start := time.Now()

                    cs, err := streamer(ctx, desc, cc, method, opts...)
                    if err != nil {
                        return nil, err
                    }

                    wrapped := &loggingClientStream{
                        ClientStream: cs,
                        logger:       logger,
                        method:       method,
                        start:        start,
                    }

                    return wrapped, nil
                }
            }

            type loggingClientStream struct {
                grpc.ClientStream
                logger    log.Logger
                method    string
                start     time.Time
                sentCount int
                recvCount int
            }

            func (s *loggingClientStream) SendMsg(m interface{}) error {
                err := s.ClientStream.SendMsg(m)
                if err == nil {
                    s.sentCount++
                }
                return err
            }

            func (s *loggingClientStream) RecvMsg(m interface{}) error {
                err := s.ClientStream.RecvMsg(m)
                if err == nil {
                    s.recvCount++
                }
                return err
            }

            func (s *loggingClientStream) CloseSend() error {
                err := s.ClientStream.CloseSend()
                s.logger.Log(
                    "method", s.method,
                    "duration", time.Since(s.start),
                    "messages_sent", s.sentCount,
                    "messages_received", s.recvCount,
                )
                return err
            }
            ---

03.中间件链
    a.链式组合
        a.功能说明
            中间件链将多个中间件按顺序组合,形成处理管道。每个中间件都可以决定是否继续执行下一个中间件。中间件的执行顺序很重要,应该合理安排。通常认证在最前面,日志在最外层,业务逻辑在最里层。可以使用辅助函数简化中间件链的构建。中间件链应该是可配置的,可以根据需要启用或禁用某些中间件。合理的中间件链可以提高代码的可维护性和可测试性。
        b.代码示例
            ---
            // 中间件链组合
            package middleware

            import (
                "net/http"
                "github.com/go-kit/kit/endpoint"
            )

            // Chain 中间件链构建器
            type Chain struct {
                middlewares []func(http.Handler) http.Handler
            }

            func NewChain(middlewares ...func(http.Handler) http.Handler) *Chain {
                return &Chain{middlewares: middlewares}
            }

            func (c *Chain) Then(h http.Handler) http.Handler {
                for i := len(c.middlewares) - 1; i >= 0; i-- {
                    h = c.middlewares[i](h)
                }
                return h
            }

            func (c *Chain) Append(middlewares ...func(http.Handler) http.Handler) *Chain {
                newChain := &Chain{
                    middlewares: make([]func(http.Handler) http.Handler, 0, len(c.middlewares)+len(middlewares)),
                }
                newChain.middlewares = append(newChain.middlewares, c.middlewares...)
                newChain.middlewares = append(newChain.middlewares, middlewares...)
                return newChain
            }

            // 使用示例
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                chain := NewChain(
                    LoggingMiddleware(logger),
                    RecoveryMiddleware(logger),
                    CORSMiddleware([]string{"*"}),
                    RateLimitMiddleware(rate.NewLimiter(100, 200)),
                    AuthMiddleware(tokenValidator),
                )

                mux := http.NewServeMux()
                mux.Handle("/users", chain.Then(makeUserHandler(endpoints)))
                mux.Handle("/health", chain.Then(makeHealthHandler()))

                return mux
            }

            // EndpointMiddlewareChain Endpoint中间件链
            func EndpointMiddlewareChain(mws ...endpoint.Middleware) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    for i := len(mws) - 1; i >= 0; i-- {
                        next = mws[i](next)
                    }
                    return next
                }
            }

            // 使用示例
            func MakeEndpoint(svc Service, logger log.Logger) endpoint.Endpoint {
                var ep endpoint.Endpoint
                ep = MakeCreateUserEndpoint(svc)

                ep = EndpointMiddlewareChain(
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(duration),
                    RateLimitMiddleware(limiter),
                    CircuitBreakerMiddleware(breaker),
                )(ep)

                return ep
            }
            ---
    b.条件中间件
        a.功能说明
            条件中间件根据请求特征决定是否执行某些逻辑,实现灵活的处理策略。可以根据路径、方法、头部等条件选择性地应用中间件。条件中间件可以实现A/B测试、灰度发布、特性开关等功能。应该使用配置或规则引擎管理条件,避免硬编码。条件中间件可以提高系统的灵活性,但也增加了复杂度,应该谨慎使用。条件判断应该高效,避免影响性能。
        b.代码示例
            ---
            // 条件中间件
            package middleware

            import (
                "context"
                "net/http"
                "strings"
            )

            // ConditionalMiddleware 条件中间件包装器
            func ConditionalMiddleware(condition func(*http.Request) bool, middleware func(http.Handler) http.Handler) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    wrapped := middleware(next)
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        if condition(r) {
                            wrapped.ServeHTTP(w, r)
                        } else {
                            next.ServeHTTP(w, r)
                        }
                    })
                }
            }

            // PathPrefixCondition 路径前缀条件
            func PathPrefixCondition(prefix string) func(*http.Request) bool {
                return func(r *http.Request) bool {
                    return strings.HasPrefix(r.URL.Path, prefix)
                }
            }

            // MethodCondition HTTP方法条件
            func MethodCondition(methods ...string) func(*http.Request) bool {
                methodSet := make(map[string]bool)
                for _, m := range methods {
                    methodSet[m] = true
                }
                return func(r *http.Request) bool {
                    return methodSet[r.Method]
                }
            }

            // HeaderCondition 头部条件
            func HeaderCondition(key, value string) func(*http.Request) bool {
                return func(r *http.Request) bool {
                    return r.Header.Get(key) == value
                }
            }

            // 使用示例
            func MakeConditionalHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                mux := http.NewServeMux()

                // 只对API路径应用认证
                authMiddleware := ConditionalMiddleware(
                    PathPrefixCondition("/api/"),
                    AuthMiddleware(tokenValidator),
                )

                // 只对POST/PUT/DELETE应用CSRF保护
                csrfMiddleware := ConditionalMiddleware(
                    MethodCondition("POST", "PUT", "DELETE"),
                    CSRFMiddleware(csrfToken),
                )

                // 只对特定客户端启用新特性
                featureMiddleware := ConditionalMiddleware(
                    HeaderCondition("X-Feature-Flag", "enabled"),
                    NewFeatureMiddleware(),
                )

                chain := NewChain(
                    LoggingMiddleware(logger),
                    authMiddleware,
                    csrfMiddleware,
                    featureMiddleware,
                )

                mux.Handle("/", chain.Then(makeHandler(endpoints)))
                return mux
            }

            // EndpointConditionalMiddleware Endpoint条件中间件
            func EndpointConditionalMiddleware(condition func(context.Context, interface{}) bool, middleware endpoint.Middleware) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    wrapped := middleware(next)
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if condition(ctx, request) {
                            return wrapped(ctx, request)
                        }
                        return next(ctx, request)
                    }
                }
            }
            ---

5 中间件系统

5.1 中间件概念

01.中间件定义
    a.基本概念
        a.功能说明
            中间件是一个接收Endpoint并返回增强后Endpoint的函数,采用装饰器模式实现。中间件可以在Endpoint执行前后添加额外逻辑,如日志记录、性能监控、参数验证等。多个中间件可以链式组合,形成处理管道。中间件机制实现了横切关注点与业务逻辑的分离,提高了代码的可维护性和可复用性。中间件是go-kit架构的核心特性,使得功能扩展变得简单灵活。
        b.代码示例
            ---
            // 中间件基本定义
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
            )

            // Middleware 中间件类型定义
            type Middleware func(endpoint.Endpoint) endpoint.Endpoint

            // LoggingMiddleware 日志中间件
            func LoggingMiddleware(logger log.Logger) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            logger.Log(
                                "transport_error", err,
                                "took", time.Since(begin),
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // ApplyMiddleware 应用多个中间件
            func ApplyMiddleware(e endpoint.Endpoint, mw ...Middleware) endpoint.Endpoint {
                for i := len(mw) - 1; i >= 0; i-- {
                    e = mw[i](e)
                }
                return e
            }

            // ChainMiddleware 链式组合中间件
            func ChainMiddleware(outer Middleware, others ...Middleware) Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    for i := len(others) - 1; i >= 0; i-- {
                        next = others[i](next)
                    }
                    return outer(next)
                }
            }

            // 使用示例
            func MakeEndpoint(svc Service, logger log.Logger) endpoint.Endpoint {
                var ep endpoint.Endpoint
                ep = MakeCreateUserEndpoint(svc)
                ep = ApplyMiddleware(ep,
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(duration),
                    RateLimitMiddleware(limiter),
                )
                return ep
            }
            ---
    b.中间件类型
        a.功能说明
            go-kit支持Service层中间件和Endpoint层中间件两种类型。Service中间件包装Service接口,在业务方法执行前后添加逻辑。Endpoint中间件包装Endpoint函数,在请求处理前后添加逻辑。两种中间件适用于不同场景,Service中间件更接近业务逻辑,Endpoint中间件更接近传输层。Service中间件可以访问业务参数,Endpoint中间件处理通用的请求响应。合理选择中间件类型可以优化性能和功能。
        b.代码示例
            ---
            // Service层中间件
            package middleware

            import (
                "context"
                "time"
            )

            // ServiceMiddleware Service中间件类型
            type ServiceMiddleware func(Service) Service

            // ServiceLoggingMiddleware Service日志中间件
            func ServiceLoggingMiddleware(logger log.Logger) ServiceMiddleware {
                return func(next Service) Service {
                    return &loggingMiddleware{logger, next}
                }
            }

            type loggingMiddleware struct {
                logger log.Logger
                next   Service
            }

            func (mw loggingMiddleware) CreateUser(ctx context.Context, username, email string) (User, error) {
                defer func(begin time.Time) {
                    mw.logger.Log(
                        "method", "CreateUser",
                        "username", username,
                        "took", time.Since(begin),
                    )
                }(time.Now())
                return mw.next.CreateUser(ctx, username, email)
            }

            func (mw loggingMiddleware) GetUser(ctx context.Context, id string) (User, error) {
                defer func(begin time.Time) {
                    mw.logger.Log(
                        "method", "GetUser",
                        "id", id,
                        "took", time.Since(begin),
                    )
                }(time.Now())
                return mw.next.GetUser(ctx, id)
            }

            // Endpoint层中间件
            func EndpointLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            logger.Log(
                                "request", request,
                                "took", time.Since(begin),
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 组合使用
            func NewService(repo Repository, logger log.Logger) Service {
                var svc Service
                svc = NewBasicService(repo)
                svc = ServiceLoggingMiddleware(logger)(svc)
                return svc
            }
            ---

02.中间件模式
    a.装饰器模式
        a.功能说明
            中间件使用装饰器模式,通过包装原始Endpoint添加新功能。装饰器模式允许动态地给对象添加职责,比继承更灵活。每个中间件都是一个装饰器,可以独立开发和测试。装饰器可以任意组合,形成不同的功能链。装饰器模式符合开闭原则,对扩展开放,对修改关闭。中间件的装饰器实现使得功能扩展变得简单,不需要修改原有代码。
        b.代码示例
            ---
            // 装饰器模式实现
            package middleware

            import (
                "context"
                "fmt"
                "time"
            )

            // 基础Endpoint
            func BasicEndpoint(ctx context.Context, request interface{}) (interface{}, error) {
                return "response", nil
            }

            // 日志装饰器
            func LoggingDecorator(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        response, err := next(ctx, request)
                        logger.Log("msg", "called endpoint")
                        return response, err
                    }
                }
            }

            // 计时装饰器
            func TimingDecorator() endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        start := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(start)
                        fmt.Printf("Took: %v\n", duration)
                        return response, err
                    }
                }
            }

            // 错误处理装饰器
            func ErrorHandlingDecorator() endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func() {
                            if r := recover(); r != nil {
                                err = fmt.Errorf("panic recovered: %v", r)
                                response = nil
                            }
                        }()
                        return next(ctx, request)
                    }
                }
            }

            // 组合装饰器
            func DecoratedEndpoint(logger log.Logger) endpoint.Endpoint {
                ep := endpoint.Endpoint(BasicEndpoint)
                ep = ErrorHandlingDecorator()(ep)
                ep = TimingDecorator()(ep)
                ep = LoggingDecorator(logger)(ep)
                return ep
            }

            // 装饰器工厂
            type DecoratorFactory struct {
                decorators []endpoint.Middleware
            }

            func NewDecoratorFactory() *DecoratorFactory {
                return &DecoratorFactory{
                    decorators: make([]endpoint.Middleware, 0),
                }
            }

            func (f *DecoratorFactory) Add(decorator endpoint.Middleware) *DecoratorFactory {
                f.decorators = append(f.decorators, decorator)
                return f
            }

            func (f *DecoratorFactory) Decorate(ep endpoint.Endpoint) endpoint.Endpoint {
                for i := len(f.decorators) - 1; i >= 0; i-- {
                    ep = f.decorators[i](ep)
                }
                return ep
            }
            ---
    b.责任链模式
        a.功能说明
            中间件链形成责任链模式,每个中间件处理请求的一部分,然后传递给下一个中间件。责任链模式将请求的发送者和接收者解耦,多个对象都有机会处理请求。每个中间件可以决定是否继续传递请求,或者提前返回。责任链的顺序很重要,不同的顺序会产生不同的效果。责任链模式使得中间件的添加和删除变得容易,不影响其他中间件。中间件链的责任链实现提供了灵活的请求处理机制。
        b.代码示例
            ---
            // 责任链模式实现
            package middleware

            import (
                "context"
                "errors"
            )

            // Handler 处理器接口
            type Handler interface {
                Handle(ctx context.Context, request interface{}) (interface{}, error)
                SetNext(handler Handler)
            }

            // BaseHandler 基础处理器
            type BaseHandler struct {
                next Handler
            }

            func (h *BaseHandler) SetNext(handler Handler) {
                h.next = handler
            }

            // AuthHandler 认证处理器
            type AuthHandler struct {
                BaseHandler
                validator TokenValidator
            }

            func (h *AuthHandler) Handle(ctx context.Context, request interface{}) (interface{}, error) {
                token, ok := ctx.Value("token").(string)
                if !ok || token == "" {
                    return nil, errors.New("missing token")
                }

                if err := h.validator.Validate(token); err != nil {
                    return nil, errors.New("invalid token")
                }

                if h.next != nil {
                    return h.next.Handle(ctx, request)
                }
                return nil, nil
            }

            // ValidationHandler 验证处理器
            type ValidationHandler struct {
                BaseHandler
            }

            func (h *ValidationHandler) Handle(ctx context.Context, request interface{}) (interface{}, error) {
                if err := validateRequest(request); err != nil {
                    return nil, err
                }

                if h.next != nil {
                    return h.next.Handle(ctx, request)
                }
                return nil, nil
            }

            // BusinessHandler 业务处理器
            type BusinessHandler struct {
                BaseHandler
                service Service
            }

            func (h *BusinessHandler) Handle(ctx context.Context, request interface{}) (interface{}, error) {
                return h.service.Process(ctx, request)
            }

            // 构建责任链
            func BuildHandlerChain(validator TokenValidator, service Service) Handler {
                business := &BusinessHandler{service: service}
                validation := &ValidationHandler{}
                auth := &AuthHandler{validator: validator}

                auth.SetNext(validation)
                validation.SetNext(business)

                return auth
            }

            // 转换为Endpoint
            func HandlerToEndpoint(handler Handler) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    return handler.Handle(ctx, request)
                }
            }
            ---

03.中间件组合
    a.顺序组合
        a.功能说明
            中间件的执行顺序对最终效果有重要影响,需要合理安排。通常认证中间件在最前面,确保未认证请求被拒绝。日志中间件在最外层,记录完整的请求处理过程。限流和熔断中间件在业务逻辑之前,保护系统资源。指标收集中间件在外层,统计所有请求。错误处理中间件在最外层,捕获所有异常。合理的中间件顺序可以提高系统的性能和可靠性。
        b.代码示例
            ---
            // 中间件顺序组合
            package middleware

            import (
                "context"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/ratelimit"
                "golang.org/x/time/rate"
            )

            // MakeEndpointWithMiddleware 创建带中间件的Endpoint
            func MakeEndpointWithMiddleware(
                svc Service,
                logger log.Logger,
                duration metrics.Histogram,
                limiter *rate.Limiter,
            ) endpoint.Endpoint {
                var ep endpoint.Endpoint
                ep = MakeCreateUserEndpoint(svc)

                // 按照从内到外的顺序应用中间件
                // 1. 业务逻辑 (最内层)
                // 2. 参数验证
                ep = ValidationMiddleware()(ep)
                // 3. 限流保护
                ep = ratelimit.NewErroringLimiter(limiter)(ep)
                // 4. 熔断保护
                ep = CircuitBreakerMiddleware()(ep)
                // 5. 性能指标
                ep = InstrumentingMiddleware(duration)(ep)
                // 6. 日志记录
                ep = LoggingMiddleware(logger)(ep)
                // 7. 错误恢复 (最外层)
                ep = RecoveryMiddleware(logger)(ep)

                return ep
            }

            // MiddlewareChain 中间件链构建器
            type MiddlewareChain struct {
                middlewares []endpoint.Middleware
            }

            func NewMiddlewareChain() *MiddlewareChain {
                return &MiddlewareChain{
                    middlewares: make([]endpoint.Middleware, 0),
                }
            }

            func (c *MiddlewareChain) Append(mw endpoint.Middleware) *MiddlewareChain {
                c.middlewares = append(c.middlewares, mw)
                return c
            }

            func (c *MiddlewareChain) Then(ep endpoint.Endpoint) endpoint.Endpoint {
                for i := len(c.middlewares) - 1; i >= 0; i-- {
                    ep = c.middlewares[i](ep)
                }
                return ep
            }

            // 使用链式构建器
            func MakeEndpointWithChain(svc Service, logger log.Logger) endpoint.Endpoint {
                chain := NewMiddlewareChain().
                    Append(RecoveryMiddleware(logger)).
                    Append(LoggingMiddleware(logger)).
                    Append(InstrumentingMiddleware(duration)).
                    Append(CircuitBreakerMiddleware()).
                    Append(RateLimitMiddleware(limiter)).
                    Append(ValidationMiddleware())

                return chain.Then(MakeCreateUserEndpoint(svc))
            }

            // 预定义中间件组合
            func StandardMiddleware(logger log.Logger) []endpoint.Middleware {
                return []endpoint.Middleware{
                    RecoveryMiddleware(logger),
                    LoggingMiddleware(logger),
                    InstrumentingMiddleware(duration),
                }
            }

            func SecurityMiddleware() []endpoint.Middleware {
                return []endpoint.Middleware{
                    AuthenticationMiddleware(),
                    AuthorizationMiddleware(),
                    RateLimitMiddleware(limiter),
                }
            }
            ---
    b.条件组合
        a.功能说明
            条件组合允许根据运行时条件动态选择中间件,实现灵活的处理策略。可以根据请求类型、用户角色、环境配置等条件启用或禁用中间件。条件组合支持A/B测试、灰度发布、特性开关等场景。应该使用配置中心管理条件规则,避免硬编码。条件判断应该高效,避免影响性能。条件组合增加了系统的灵活性,但也增加了复杂度,需要谨慎使用。
        b.代码示例
            ---
            // 条件中间件组合
            package middleware

            import (
                "context"
            )

            // ConditionalMiddleware 条件中间件
            func ConditionalMiddleware(
                condition func(context.Context, interface{}) bool,
                middleware endpoint.Middleware,
            ) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    wrapped := middleware(next)
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if condition(ctx, request) {
                            return wrapped(ctx, request)
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 条件函数示例
            func IsAdminUser(ctx context.Context, request interface{}) bool {
                role, ok := ctx.Value("user_role").(string)
                return ok && role == "admin"
            }

            func IsProductionEnv(ctx context.Context, request interface{}) bool {
                env := ctx.Value("environment").(string)
                return env == "production"
            }

            func HasFeatureFlag(flag string) func(context.Context, interface{}) bool {
                return func(ctx context.Context, request interface{}) bool {
                    flags, ok := ctx.Value("feature_flags").(map[string]bool)
                    return ok && flags[flag]
                }
            }

            // 使用条件中间件
            func MakeConditionalEndpoint(svc Service, logger log.Logger) endpoint.Endpoint {
                ep := MakeCreateUserEndpoint(svc)

                // 只对管理员启用详细日志
                ep = ConditionalMiddleware(
                    IsAdminUser,
                    DetailedLoggingMiddleware(logger),
                )(ep)

                // 只在生产环境启用限流
                ep = ConditionalMiddleware(
                    IsProductionEnv,
                    RateLimitMiddleware(limiter),
                )(ep)

                // 根据特性开关启用新功能
                ep = ConditionalMiddleware(
                    HasFeatureFlag("new_validation"),
                    NewValidationMiddleware(),
                )(ep)

                return ep
            }

            // 动态中间件选择器
            type MiddlewareSelector struct {
                rules map[string]endpoint.Middleware
            }

            func NewMiddlewareSelector() *MiddlewareSelector {
                return &MiddlewareSelector{
                    rules: make(map[string]endpoint.Middleware),
                }
            }

            func (s *MiddlewareSelector) Register(name string, mw endpoint.Middleware) {
                s.rules[name] = mw
            }

            func (s *MiddlewareSelector) Select(ctx context.Context) endpoint.Middleware {
                strategy, ok := ctx.Value("middleware_strategy").(string)
                if !ok {
                    strategy = "default"
                }

                if mw, exists := s.rules[strategy]; exists {
                    return mw
                }

                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return next
                }
            }
            ---

5.2 日志中间件

01.基础日志
    a.请求日志
        a.功能说明
            请求日志中间件记录每个请求的基本信息,包括请求参数、响应结果、执行时间等。日志中间件应该在最外层,确保记录所有请求。可以配置日志级别,控制输出详细程度。日志应该包含请求ID,便于追踪。支持结构化日志,便于分析和检索。日志中间件不应该影响业务逻辑,即使日志失败也要继续执行。
        b.代码示例
            ---
            // 请求日志中间件
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/log"
            )

            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func(begin time.Time) {
                            logger.Log(
                                "request", request,
                                "response", response,
                                "err", err,
                                "took", time.Since(begin),
                            )
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 带请求ID的日志中间件
            func RequestIDLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        requestID := ctx.Value("request_id")
                        logger := log.With(logger, "request_id", requestID)

                        begin := time.Now()
                        response, err := next(ctx, request)

                        logger.Log(
                            "method", ctx.Value("method"),
                            "took", time.Since(begin),
                            "err", err,
                        )

                        return response, err
                    }
                }
            }

            // 分级日志中间件
            func LeveledLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        begin := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(begin)

                        if err != nil {
                            logger.Log("level", "error", "err", err, "took", duration)
                        } else if duration > 1*time.Second {
                            logger.Log("level", "warn", "msg", "slow request", "took", duration)
                        } else {
                            logger.Log("level", "info", "took", duration)
                        }

                        return response, err
                    }
                }
            }
            ---
    b.错误日志
        a.功能说明
            错误日志中间件专门记录错误信息,包括错误类型、错误堆栈、上下文信息等。错误日志应该包含足够的信息用于问题诊断。可以集成错误追踪系统,如Sentry。错误日志应该区分业务错误和系统错误。支持错误聚合和告警。错误日志不应该泄露敏感信息。
        b.代码示例
            ---
            // 错误日志中间件
            package middleware

            import (
                "context"
                "fmt"
                "runtime/debug"
            )

            func ErrorLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)

                        if err != nil {
                            logger.Log(
                                "level", "error",
                                "error", err,
                                "request", fmt.Sprintf("%+v", request),
                                "stack", string(debug.Stack()),
                            )
                        }

                        return response, err
                    }
                }
            }

            // 错误分类日志中间件
            func CategorizedErrorLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)

                        if err != nil {
                            category := categorizeError(err)
                            logger.Log(
                                "level", "error",
                                "category", category,
                                "error", err,
                                "user_id", ctx.Value("user_id"),
                            )
                        }

                        return response, err
                    }
                }
            }

            func categorizeError(err error) string {
                switch err.(type) {
                case *ValidationError:
                    return "validation"
                case *AuthenticationError:
                    return "authentication"
                case *AuthorizationError:
                    return "authorization"
                case *DatabaseError:
                    return "database"
                default:
                    return "unknown"
                }
            }

            // Panic恢复日志中间件
            func PanicLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
                        defer func() {
                            if r := recover(); r != nil {
                                logger.Log(
                                    "level", "critical",
                                    "panic", r,
                                    "stack", string(debug.Stack()),
                                    "request", request,
                                )
                                err = fmt.Errorf("panic recovered: %v", r)
                            }
                        }()
                        return next(ctx, request)
                    }
                }
            }
            ---

02.结构化日志
    a.字段日志
        a.功能说明
            结构化日志使用键值对格式,便于机器解析和分析。字段日志中间件添加标准字段,如时间戳、服务名、版本号等。支持自定义字段,记录业务相关信息。字段应该有统一的命名规范。结构化日志便于日志聚合和检索。可以与ELK、Splunk等日志系统集成。
        b.代码示例
            ---
            // 结构化日志中间件
            package middleware

            import (
                "context"
                "time"
            )

            func StructuredLoggingMiddleware(logger log.Logger, serviceName, version string) endpoint.Middleware {
                logger = log.With(logger,
                    "service", serviceName,
                    "version", version,
                )

                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        begin := time.Now()

                        contextLogger := log.With(logger,
                            "timestamp", begin.Format(time.RFC3339),
                            "request_id", ctx.Value("request_id"),
                            "user_id", ctx.Value("user_id"),
                            "method", ctx.Value("method"),
                        )

                        response, err := next(ctx, request)

                        contextLogger.Log(
                            "duration_ms", time.Since(begin).Milliseconds(),
                            "success", err == nil,
                            "error", err,
                        )

                        return response, err
                    }
                }
            }

            // 业务字段日志中间件
            type LogFields map[string]interface{}

            func BusinessLoggingMiddleware(logger log.Logger, extractor func(interface{}) LogFields) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        fields := extractor(request)

                        contextLogger := logger
                        for k, v := range fields {
                            contextLogger = log.With(contextLogger, k, v)
                        }

                        begin := time.Now()
                        response, err := next(ctx, request)

                        contextLogger.Log(
                            "took", time.Since(begin),
                            "err", err,
                        )

                        return response, err
                    }
                }
            }

            // 使用示例
            func extractUserFields(request interface{}) LogFields {
                if req, ok := request.(CreateUserRequest); ok {
                    return LogFields{
                        "username": req.Username,
                        "email": req.Email,
                        "action": "create_user",
                    }
                }
                return LogFields{}
            }
            ---
    b.上下文日志
        a.功能说明
            上下文日志从Context中提取信息并记录,如用户ID、会话ID、追踪ID等。上下文日志便于关联多个请求,追踪用户行为。应该在请求入口处设置上下文信息。上下文信息应该在整个调用链中传递。支持分布式追踪,关联跨服务的请求。上下文日志不应该包含敏感信息。
        b.代码示例
            ---
            // 上下文日志中间件
            package middleware

            import (
                "context"
            )

            type contextKey string

            const (
                RequestIDKey  contextKey = "request_id"
                UserIDKey     contextKey = "user_id"
                SessionIDKey  contextKey = "session_id"
                TraceIDKey    contextKey = "trace_id"
                SpanIDKey     contextKey = "span_id"
            )

            func ContextLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        contextLogger := enrichLoggerFromContext(logger, ctx)

                        begin := time.Now()
                        response, err := next(ctx, request)

                        contextLogger.Log(
                            "took", time.Since(begin),
                            "err", err,
                        )

                        return response, err
                    }
                }
            }

            func enrichLoggerFromContext(logger log.Logger, ctx context.Context) log.Logger {
                if requestID := ctx.Value(RequestIDKey); requestID != nil {
                    logger = log.With(logger, "request_id", requestID)
                }
                if userID := ctx.Value(UserIDKey); userID != nil {
                    logger = log.With(logger, "user_id", userID)
                }
                if sessionID := ctx.Value(SessionIDKey); sessionID != nil {
                    logger = log.With(logger, "session_id", sessionID)
                }
                if traceID := ctx.Value(TraceIDKey); traceID != nil {
                    logger = log.With(logger, "trace_id", traceID)
                }
                if spanID := ctx.Value(SpanIDKey); spanID != nil {
                    logger = log.With(logger, "span_id", spanID)
                }
                return logger
            }

            // 链路追踪日志中间件
            func TracingLoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        traceID := ctx.Value(TraceIDKey)
                        spanID := generateSpanID()

                        ctx = context.WithValue(ctx, SpanIDKey, spanID)

                        logger := log.With(logger,
                            "trace_id", traceID,
                            "span_id", spanID,
                        )

                        logger.Log("event", "span_start")
                        response, err := next(ctx, request)
                        logger.Log("event", "span_end", "err", err)

                        return response, err
                    }
                }
            }

            func generateSpanID() string {
                return fmt.Sprintf("%d", time.Now().UnixNano())
            }
            ---

03.日志采样
    a.采样策略
        a.功能说明
            日志采样减少日志量,降低存储和处理成本。采样策略包括固定比例采样、自适应采样、错误全采样等。高频请求可以降低采样率,低频请求保持高采样率。错误请求应该全部记录。采样决策应该在请求入口处做出,保证一致性。采样信息应该在上下文中传递。
        b.代码示例
            ---
            // 日志采样中间件
            package middleware

            import (
                "context"
                "math/rand"
            )

            // 固定比例采样
            func SamplingLoggingMiddleware(logger log.Logger, sampleRate float64) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        shouldSample := rand.Float64() < sampleRate

                        if !shouldSample {
                            return next(ctx, request)
                        }

                        begin := time.Now()
                        response, err := next(ctx, request)

                        logger.Log(
                            "sampled", true,
                            "took", time.Since(begin),
                            "err", err,
                        )

                        return response, err
                    }
                }
            }

            // 自适应采样
            type AdaptiveSampler struct {
                baseRate    float64
                errorRate   float64
                slowRate    float64
                slowThreshold time.Duration
            }

            func NewAdaptiveSampler(baseRate, errorRate, slowRate float64, slowThreshold time.Duration) *AdaptiveSampler {
                return &AdaptiveSampler{
                    baseRate:      baseRate,
                    errorRate:     errorRate,
                    slowRate:      slowRate,
                    slowThreshold: slowThreshold,
                }
            }

            func (s *AdaptiveSampler) ShouldSample(err error, duration time.Duration) bool {
                if err != nil {
                    return rand.Float64() < s.errorRate
                }
                if duration > s.slowThreshold {
                    return rand.Float64() < s.slowRate
                }
                return rand.Float64() < s.baseRate
            }

            func AdaptiveSamplingMiddleware(logger log.Logger, sampler *AdaptiveSampler) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        begin := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(begin)

                        if sampler.ShouldSample(err, duration) {
                            logger.Log(
                                "took", duration,
                                "err", err,
                                "sampled", true,
                            )
                        }

                        return response, err
                    }
                }
            }

            // 基于负载的采样
            type LoadBasedSampler struct {
                minRate float64
                maxRate float64
                loadFunc func() float64
            }

            func (s *LoadBasedSampler) GetSampleRate() float64 {
                load := s.loadFunc()
                if load < 0.5 {
                    return s.maxRate
                } else if load > 0.9 {
                    return s.minRate
                }
                return s.minRate + (s.maxRate-s.minRate)*(0.9-load)/0.4
            }

            func LoadBasedSamplingMiddleware(logger log.Logger, sampler *LoadBasedSampler) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        sampleRate := sampler.GetSampleRate()
                        shouldSample := rand.Float64() < sampleRate

                        begin := time.Now()
                        response, err := next(ctx, request)

                        if shouldSample {
                            logger.Log(
                                "sample_rate", sampleRate,
                                "took", time.Since(begin),
                                "err", err,
                            )
                        }

                        return response, err
                    }
                }
            }
            ---
    b.采样配置
        a.功能说明
            采样配置支持动态调整采样率,适应不同的运行环境。可以为不同的端点配置不同的采样率。支持基于规则的采样,如特定用户、特定时间段等。采样配置应该从配置中心读取,支持热更新。采样决策应该高效,避免影响性能。采样配置应该有合理的默认值。
        b.代码示例
            ---
            // 采样配置中间件
            package middleware

            import (
                "context"
                "sync"
            )

            type SamplingConfig struct {
                mu            sync.RWMutex
                defaultRate   float64
                endpointRates map[string]float64
                userRates     map[string]float64
            }

            func NewSamplingConfig(defaultRate float64) *SamplingConfig {
                return &SamplingConfig{
                    defaultRate:   defaultRate,
                    endpointRates: make(map[string]float64),
                    userRates:     make(map[string]float64),
                }
            }

            func (c *SamplingConfig) SetEndpointRate(endpoint string, rate float64) {
                c.mu.Lock()
                defer c.mu.Unlock()
                c.endpointRates[endpoint] = rate
            }

            func (c *SamplingConfig) SetUserRate(userID string, rate float64) {
                c.mu.Lock()
                defer c.mu.Unlock()
                c.userRates[userID] = rate
            }

            func (c *SamplingConfig) GetRate(ctx context.Context) float64 {
                c.mu.RLock()
                defer c.mu.RUnlock()

                if userID, ok := ctx.Value("user_id").(string); ok {
                    if rate, exists := c.userRates[userID]; exists {
                        return rate
                    }
                }

                if endpoint, ok := ctx.Value("endpoint").(string); ok {
                    if rate, exists := c.endpointRates[endpoint]; exists {
                        return rate
                    }
                }

                return c.defaultRate
            }

            func ConfigurableSamplingMiddleware(logger log.Logger, config *SamplingConfig) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        sampleRate := config.GetRate(ctx)
                        shouldSample := rand.Float64() < sampleRate

                        begin := time.Now()
                        response, err := next(ctx, request)

                        if shouldSample {
                            logger.Log(
                                "sample_rate", sampleRate,
                                "took", time.Since(begin),
                                "err", err,
                            )
                        }

                        return response, err
                    }
                }
            }

            // 规则采样中间件
            type SamplingRule struct {
                Condition func(context.Context, interface{}) bool
                Rate      float64
            }

            type RuleBasedSampler struct {
                rules       []SamplingRule
                defaultRate float64
            }

            func (s *RuleBasedSampler) GetRate(ctx context.Context, request interface{}) float64 {
                for _, rule := range s.rules {
                    if rule.Condition(ctx, request) {
                        return rule.Rate
                    }
                }
                return s.defaultRate
            }

            func RuleBasedSamplingMiddleware(logger log.Logger, sampler *RuleBasedSampler) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        sampleRate := sampler.GetRate(ctx, request)
                        shouldSample := rand.Float64() < sampleRate

                        begin := time.Now()
                        response, err := next(ctx, request)

                        if shouldSample {
                            logger.Log(
                                "took", time.Since(begin),
                                "err", err,
                            )
                        }

                        return response, err
                    }
                }
            }
            ---

5.3 监控中间件

01.性能指标
    a.延迟监控
        a.功能说明
            延迟监控中间件记录请求的响应时间,包括最小值、最大值、平均值、百分位数等。延迟指标是衡量系统性能的关键指标。应该区分不同端点的延迟,便于定位性能瓶颈。支持直方图统计,分析延迟分布。可以设置延迟阈值告警。延迟监控应该轻量级,避免影响性能。
        b.代码示例
            ---
            // 延迟监控中间件
            package middleware

            import (
                "context"
                "time"
                "github.com/go-kit/kit/endpoint"
                "github.com/go-kit/kit/metrics"
            )

            func LatencyMiddleware(histogram metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            histogram.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }

            // 分层延迟监控
            func LayeredLatencyMiddleware(histograms map[string]metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        endpoint := ctx.Value("endpoint").(string)
                        histogram := histograms[endpoint]

                        defer func(begin time.Time) {
                            duration := time.Since(begin)
                            histogram.Observe(duration.Seconds())

                            // 记录慢请求
                            if duration > 1*time.Second {
                                histogram.With("slow", "true").Observe(duration.Seconds())
                            }
                        }(time.Now())

                        return next(ctx, request)
                    }
                }
            }

            // 百分位延迟监控
            type PercentileTracker struct {
                durations []time.Duration
                mu        sync.Mutex
            }

            func (t *PercentileTracker) Record(d time.Duration) {
                t.mu.Lock()
                defer t.mu.Unlock()
                t.durations = append(t.durations, d)
                if len(t.durations) > 1000 {
                    t.durations = t.durations[1:]
                }
            }

            func (t *PercentileTracker) Percentile(p float64) time.Duration {
                t.mu.Lock()
                defer t.mu.Unlock()
                if len(t.durations) == 0 {
                    return 0
                }
                sorted := make([]time.Duration, len(t.durations))
                copy(sorted, t.durations)
                sort.Slice(sorted, func(i, j int) bool {
                    return sorted[i] < sorted[j]
                })
                idx := int(float64(len(sorted)) * p)
                return sorted[idx]
            }

            func PercentileLatencyMiddleware(tracker *PercentileTracker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        begin := time.Now()
                        response, err := next(ctx, request)
                        tracker.Record(time.Since(begin))
                        return response, err
                    }
                }
            }
            ---
    b.吞吐量监控
        a.功能说明
            吞吐量监控记录单位时间内处理的请求数量,反映系统的处理能力。吞吐量指标包括QPS、TPS等。应该区分成功请求和失败请求的吞吐量。支持实时统计和历史趋势分析。可以设置吞吐量阈值告警。吞吐量监控帮助评估系统容量和扩展需求。
        b.代码示例
            ---
            // 吞吐量监控中间件
            package middleware

            import (
                "context"
                "sync/atomic"
                "time"
            )

            type ThroughputCounter struct {
                total   uint64
                success uint64
                failure uint64
                window  time.Duration
            }

            func NewThroughputCounter(window time.Duration) *ThroughputCounter {
                return &ThroughputCounter{window: window}
            }

            func (c *ThroughputCounter) Increment(success bool) {
                atomic.AddUint64(&c.total, 1)
                if success {
                    atomic.AddUint64(&c.success, 1)
                } else {
                    atomic.AddUint64(&c.failure, 1)
                }
            }

            func (c *ThroughputCounter) QPS() float64 {
                total := atomic.LoadUint64(&c.total)
                return float64(total) / c.window.Seconds()
            }

            func ThroughputMiddleware(counter *ThroughputCounter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)
                        counter.Increment(err == nil)
                        return response, err
                    }
                }
            }

            // 滑动窗口吞吐量监控
            type SlidingWindowCounter struct {
                buckets    []uint64
                bucketSize time.Duration
                numBuckets int
                current    int
                mu         sync.Mutex
            }

            func NewSlidingWindowCounter(window time.Duration, numBuckets int) *SlidingWindowCounter {
                return &SlidingWindowCounter{
                    buckets:    make([]uint64, numBuckets),
                    bucketSize: window / time.Duration(numBuckets),
                    numBuckets: numBuckets,
                }
            }

            func (c *SlidingWindowCounter) Increment() {
                c.mu.Lock()
                defer c.mu.Unlock()
                c.buckets[c.current]++
            }

            func (c *SlidingWindowCounter) Rotate() {
                c.mu.Lock()
                defer c.mu.Unlock()
                c.current = (c.current + 1) % c.numBuckets
                c.buckets[c.current] = 0
            }

            func (c *SlidingWindowCounter) Total() uint64 {
                c.mu.Lock()
                defer c.mu.Unlock()
                var total uint64
                for _, count := range c.buckets {
                    total += count
                }
                return total
            }

            func SlidingWindowThroughputMiddleware(counter *SlidingWindowCounter) endpoint.Middleware {
                go func() {
                    ticker := time.NewTicker(counter.bucketSize)
                    for range ticker.C {
                        counter.Rotate()
                    }
                }()

                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        counter.Increment()
                        return next(ctx, request)
                    }
                }
            }
            ---

02.错误监控
    a.错误率统计
        a.功能说明
            错误率监控统计请求失败的比例,反映系统的稳定性。错误率指标包括总错误率、各类错误的占比等。应该区分不同类型的错误,如业务错误、系统错误、网络错误等。支持错误趋势分析和异常检测。可以设置错误率阈值告警。错误率监控帮助及时发现和定位问题。
        b.代码示例
            ---
            // 错误率监控中间件
            package middleware

            import (
                "context"
                "sync/atomic"
            )

            type ErrorRateCounter struct {
                total   uint64
                errors  uint64
                byType  map[string]*uint64
                mu      sync.RWMutex
            }

            func NewErrorRateCounter() *ErrorRateCounter {
                return &ErrorRateCounter{
                    byType: make(map[string]*uint64),
                }
            }

            func (c *ErrorRateCounter) Increment(err error) {
                atomic.AddUint64(&c.total, 1)
                if err != nil {
                    atomic.AddUint64(&c.errors, 1)

                    errType := getErrorType(err)
                    c.mu.Lock()
                    if _, exists := c.byType[errType]; !exists {
                        var count uint64
                        c.byType[errType] = &count
                    }
                    c.mu.Unlock()

                    c.mu.RLock()
                    atomic.AddUint64(c.byType[errType], 1)
                    c.mu.RUnlock()
                }
            }

            func (c *ErrorRateCounter) ErrorRate() float64 {
                total := atomic.LoadUint64(&c.total)
                if total == 0 {
                    return 0
                }
                errors := atomic.LoadUint64(&c.errors)
                return float64(errors) / float64(total)
            }

            func getErrorType(err error) string {
                switch err.(type) {
                case *ValidationError:
                    return "validation"
                case *AuthError:
                    return "auth"
                case *DatabaseError:
                    return "database"
                default:
                    return "unknown"
                }
            }

            func ErrorRateMiddleware(counter *ErrorRateCounter, gauge metrics.Gauge) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)
                        counter.Increment(err)
                        gauge.Set(counter.ErrorRate())
                        return response, err
                    }
                }
            }

            // 错误分类监控
            func CategorizedErrorMiddleware(counters map[string]metrics.Counter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)

                        if err != nil {
                            category := getErrorType(err)
                            if counter, exists := counters[category]; exists {
                                counter.Add(1)
                            }
                            counters["total_errors"].Add(1)
                        }

                        counters["total_requests"].Add(1)
                        return response, err
                    }
                }
            }
            ---
    b.错误追踪
        a.功能说明
            错误追踪记录错误的详细信息,��括错误堆栈、上下文、发生时间等。错误追踪帮助快速定位和修复问题。支持错误聚合,识别相同的错误。可以集成Sentry等错误追踪平台。应该记录足够的上下文信息,但不泄露敏感数据。错误追踪应该异步处理,避免影响请求性能。
        b.代码示例
            ---
            // 错误追踪中间件
            package middleware

            import (
                "context"
                "fmt"
                "runtime/debug"
                "time"
            )

            type ErrorTracker interface {
                Track(ctx context.Context, err error, stack []byte)
            }

            type ErrorEvent struct {
                Error     error
                Stack     string
                Timestamp time.Time
                RequestID string
                UserID    string
                Endpoint  string
            }

            type InMemoryErrorTracker struct {
                events []ErrorEvent
                mu     sync.Mutex
                maxSize int
            }

            func NewInMemoryErrorTracker(maxSize int) *InMemoryErrorTracker {
                return &InMemoryErrorTracker{
                    events:  make([]ErrorEvent, 0, maxSize),
                    maxSize: maxSize,
                }
            }

            func (t *InMemoryErrorTracker) Track(ctx context.Context, err error, stack []byte) {
                t.mu.Lock()
                defer t.mu.Unlock()

                event := ErrorEvent{
                    Error:     err,
                    Stack:     string(stack),
                    Timestamp: time.Now(),
                    RequestID: getStringFromContext(ctx, "request_id"),
                    UserID:    getStringFromContext(ctx, "user_id"),
                    Endpoint:  getStringFromContext(ctx, "endpoint"),
                }

                t.events = append(t.events, event)
                if len(t.events) > t.maxSize {
                    t.events = t.events[1:]
                }
            }

            func (t *InMemoryErrorTracker) GetRecentErrors(n int) []ErrorEvent {
                t.mu.Lock()
                defer t.mu.Unlock()

                if n > len(t.events) {
                    n = len(t.events)
                }
                return t.events[len(t.events)-n:]
            }

            func getStringFromContext(ctx context.Context, key string) string {
                if val := ctx.Value(key); val != nil {
                    return fmt.Sprintf("%v", val)
                }
                return ""
            }

            func ErrorTrackingMiddleware(tracker ErrorTracker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)

                        if err != nil {
                            go tracker.Track(ctx, err, debug.Stack())
                        }

                        return response, err
                    }
                }
            }

            // Sentry集成
            type SentryTracker struct {
                client *sentry.Client
            }

            func (t *SentryTracker) Track(ctx context.Context, err error, stack []byte) {
                t.client.CaptureException(err, &sentry.EventHint{
                    Context: ctx,
                }, &sentry.Scope{
                    Extra: map[string]interface{}{
                        "stack": string(stack),
                        "request_id": ctx.Value("request_id"),
                    },
                })
            }
            ---

03.资源监控
    a.并发监控
        a.功能说明
            并发监控跟踪当前正在处理的请求数量,反映系统的负载情况。并发指标帮助识别系统瓶颈和容量限制。可以设置最大并发数,保护系统资源。支持并发趋势分析,预测负载变化。并发监控应该轻量级,使用原子操作。可以结合限流中间件,控制并发数量。
        b.代码示例
            ---
            // 并发监控中间件
            package middleware

            import (
                "context"
                "sync/atomic"
            )

            type ConcurrencyMonitor struct {
                current uint64
                max     uint64
                gauge   metrics.Gauge
            }

            func NewConcurrencyMonitor(gauge metrics.Gauge) *ConcurrencyMonitor {
                return &ConcurrencyMonitor{gauge: gauge}
            }

            func (m *ConcurrencyMonitor) Increment() {
                current := atomic.AddUint64(&m.current, 1)
                m.gauge.Set(float64(current))

                // 更新最大值
                for {
                    max := atomic.LoadUint64(&m.max)
                    if current <= max {
                        break
                    }
                    if atomic.CompareAndSwapUint64(&m.max, max, current) {
                        break
                    }
                }
            }

            func (m *ConcurrencyMonitor) Decrement() {
                current := atomic.AddUint64(&m.current, ^uint64(0))
                m.gauge.Set(float64(current))
            }

            func (m *ConcurrencyMonitor) Current() uint64 {
                return atomic.LoadUint64(&m.current)
            }

            func (m *ConcurrencyMonitor) Max() uint64 {
                return atomic.LoadUint64(&m.max)
            }

            func ConcurrencyMiddleware(monitor *ConcurrencyMonitor) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        monitor.Increment()
                        defer monitor.Decrement()
                        return next(ctx, request)
                    }
                }
            }

            // 带限制的并发监控
            type BoundedConcurrencyMonitor struct {
                current uint64
                max     uint64
                limit   uint64
            }

            func NewBoundedConcurrencyMonitor(limit uint64) *BoundedConcurrencyMonitor {
                return &BoundedConcurrencyMonitor{limit: limit}
            }

            func (m *BoundedConcurrencyMonitor) TryIncrement() bool {
                for {
                    current := atomic.LoadUint64(&m.current)
                    if current >= m.limit {
                        return false
                    }
                    if atomic.CompareAndSwapUint64(&m.current, current, current+1) {
                        return true
                    }
                }
            }

            func (m *BoundedConcurrencyMonitor) Decrement() {
                atomic.AddUint64(&m.current, ^uint64(0))
            }

            func BoundedConcurrencyMiddleware(monitor *BoundedConcurrencyMonitor) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !monitor.TryIncrement() {
                            return nil, errors.New("too many concurrent requests")
                        }
                        defer monitor.Decrement()
                        return next(ctx, request)
                    }
                }
            }
            ---
    b.内存监控
        a.功能说明
            内存监控跟踪请求处理过程中的内存使用情况,帮助识别内存泄漏和优化内存使用。内存指标包括堆内存、栈内存、GC次数等。应该定期采样,避免频繁监控影响性能。可以设置内存阈值告警。内存监控结合性能分析工具,定位内存问题。支持内存趋势分析,预测内存需求。
        b.代码示例
            ---
            // 内存监控中间件
            package middleware

            import (
                "context"
                "runtime"
            )

            type MemoryMonitor struct {
                heapGauge   metrics.Gauge
                gcGauge     metrics.Gauge
                goroutineGauge metrics.Gauge
            }

            func NewMemoryMonitor(heapGauge, gcGauge, goroutineGauge metrics.Gauge) *MemoryMonitor {
                return &MemoryMonitor{
                    heapGauge:      heapGauge,
                    gcGauge:        gcGauge,
                    goroutineGauge: goroutineGauge,
                }
            }

            func (m *MemoryMonitor) Update() {
                var stats runtime.MemStats
                runtime.ReadMemStats(&stats)

                m.heapGauge.Set(float64(stats.HeapAlloc))
                m.gcGauge.Set(float64(stats.NumGC))
                m.goroutineGauge.Set(float64(runtime.NumGoroutine()))
            }

            func MemoryMonitoringMiddleware(monitor *MemoryMonitor, sampleRate float64) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if rand.Float64() < sampleRate {
                            monitor.Update()
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 请求级内存监控
            func RequestMemoryMiddleware(histogram metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var before runtime.MemStats
                        runtime.ReadMemStats(&before)

                        response, err := next(ctx, request)

                        var after runtime.MemStats
                        runtime.ReadMemStats(&after)

                        allocated := after.TotalAlloc - before.TotalAlloc
                        histogram.Observe(float64(allocated))

                        return response, err
                    }
                }
            }

            // 内存泄漏检测
            type MemoryLeakDetector struct {
                baseline uint64
                threshold float64
                alertFunc func(string)
            }

            func NewMemoryLeakDetector(threshold float64, alertFunc func(string)) *MemoryLeakDetector {
                var stats runtime.MemStats
                runtime.ReadMemStats(&stats)
                return &MemoryLeakDetector{
                    baseline:  stats.HeapAlloc,
                    threshold: threshold,
                    alertFunc: alertFunc,
                }
            }

            func (d *MemoryLeakDetector) Check() {
                var stats runtime.MemStats
                runtime.ReadMemStats(&stats)

                growth := float64(stats.HeapAlloc-d.baseline) / float64(d.baseline)
                if growth > d.threshold {
                    d.alertFunc(fmt.Sprintf("Memory leak detected: %.2f%% growth", growth*100))
                }
            }

            func MemoryLeakDetectionMiddleware(detector *MemoryLeakDetector, checkInterval time.Duration) endpoint.Middleware {
                go func() {
                    ticker := time.NewTicker(checkInterval)
                    for range ticker.C {
                        detector.Check()
                    }
                }()

                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return next
                }
            }
            ---

5.4 限流中间件

01.令牌桶算法
    a.基本实现
        a.功能说明
            令牌桶算法通过固定速率向桶中添加令牌,请求需要获取令牌才能执行。令牌桶支持突发流量,桶中可以积累一定数量的令牌。当桶满时,新产生的令牌会被丢弃。令牌桶算法平滑流量,避免瞬时过载。go-kit提供了基于golang.org/x/time/rate的令牌桶实现。令牌桶适合需要平滑限流的场景。
        b.代码示例
            ---
            // 令牌桶限流中间件
            package middleware

            import (
                "context"
                "golang.org/x/time/rate"
                "github.com/go-kit/kit/endpoint"
            )

            func TokenBucketMiddleware(limiter *rate.Limiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 等待式令牌桶
            func WaitingTokenBucketMiddleware(limiter *rate.Limiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if err := limiter.Wait(ctx); err != nil {
                            return nil, err
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 自定义令牌桶
            type CustomTokenBucket struct {
                tokens    float64
                capacity  float64
                rate      float64
                lastTime  time.Time
                mu        sync.Mutex
            }

            func NewCustomTokenBucket(capacity, rate float64) *CustomTokenBucket {
                return &CustomTokenBucket{
                    tokens:   capacity,
                    capacity: capacity,
                    rate:     rate,
                    lastTime: time.Now(),
                }
            }

            func (b *CustomTokenBucket) Allow() bool {
                b.mu.Lock()
                defer b.mu.Unlock()

                now := time.Now()
                elapsed := now.Sub(b.lastTime).Seconds()
                b.tokens = math.Min(b.capacity, b.tokens+elapsed*b.rate)
                b.lastTime = now

                if b.tokens >= 1 {
                    b.tokens--
                    return true
                }
                return false
            }

            func CustomTokenBucketMiddleware(bucket *CustomTokenBucket) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !bucket.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }
            ---
    b.动态调整
        a.功能说明
            动态限流根据系统负载自动调整限流阈值,实现自适应流量控制。可以根据CPU使用率、内存使用率、响应时间等指标动态调整。动态限流避免固定阈值的局限性,更好地适应流量变化。支持平滑调整,避免突变影响服务。动态限流需要监控系统指标,增加了复杂度。应该设置合理的调整策略和边界条件。
        b.代码示例
            ---
            // 动态限流中间件
            package middleware

            import (
                "context"
                "sync/atomic"
                "time"
            )

            type DynamicRateLimiter struct {
                limiter      *rate.Limiter
                minRate      float64
                maxRate      float64
                currentRate  uint64
                loadFunc     func() float64
                adjustPeriod time.Duration
            }

            func NewDynamicRateLimiter(minRate, maxRate float64, loadFunc func() float64) *DynamicRateLimiter {
                limiter := rate.NewLimiter(rate.Limit(maxRate), int(maxRate))
                drl := &DynamicRateLimiter{
                    limiter:      limiter,
                    minRate:      minRate,
                    maxRate:      maxRate,
                    loadFunc:     loadFunc,
                    adjustPeriod: 10 * time.Second,
                }
                atomic.StoreUint64(&drl.currentRate, uint64(maxRate))
                go drl.adjust()
                return drl
            }

            func (d *DynamicRateLimiter) adjust() {
                ticker := time.NewTicker(d.adjustPeriod)
                for range ticker.C {
                    load := d.loadFunc()
                    var newRate float64

                    if load < 0.5 {
                        newRate = d.maxRate
                    } else if load > 0.9 {
                        newRate = d.minRate
                    } else {
                        newRate = d.minRate + (d.maxRate-d.minRate)*(0.9-load)/0.4
                    }

                    d.limiter.SetLimit(rate.Limit(newRate))
                    atomic.StoreUint64(&d.currentRate, uint64(newRate))
                }
            }

            func (d *DynamicRateLimiter) Allow() bool {
                return d.limiter.Allow()
            }

            func DynamicRateLimitMiddleware(limiter *DynamicRateLimiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 基于响应时间的动态限流
            type LatencyBasedLimiter struct {
                limiter         *rate.Limiter
                targetLatency   time.Duration
                latencyTracker  *LatencyTracker
                adjustInterval  time.Duration
            }

            func NewLatencyBasedLimiter(initialRate float64, targetLatency time.Duration) *LatencyBasedLimiter {
                lbl := &LatencyBasedLimiter{
                    limiter:        rate.NewLimiter(rate.Limit(initialRate), int(initialRate)),
                    targetLatency:  targetLatency,
                    latencyTracker: NewLatencyTracker(),
                    adjustInterval: 5 * time.Second,
                }
                go lbl.adjust()
                return lbl
            }

            func (l *LatencyBasedLimiter) adjust() {
                ticker := time.NewTicker(l.adjustInterval)
                for range ticker.C {
                    avgLatency := l.latencyTracker.Average()
                    currentLimit := l.limiter.Limit()

                    if avgLatency > l.targetLatency {
                        newLimit := float64(currentLimit) * 0.9
                        l.limiter.SetLimit(rate.Limit(newLimit))
                    } else if avgLatency < l.targetLatency/2 {
                        newLimit := float64(currentLimit) * 1.1
                        l.limiter.SetLimit(rate.Limit(newLimit))
                    }
                }
            }
            ---

02.滑动窗口算法
    a.固定窗口
        a.功能说明
            固定窗口算法将时间划分为固定大小的窗口,统计每个窗口内的请求数。固定窗口实现简单,但存在边界问题,窗口切换时可能出现突发流量。固定窗口适合对精度要求不高的场景。可以使用计数器实现,性能开销小。窗口大小影响限流效果,需要根据业务特点选择。固定窗口无法平滑处理跨窗口的流量。
        b.代码示例
            ---
            // 固定窗口限流中间件
            package middleware

            import (
                "context"
                "sync"
                "time"
            )

            type FixedWindowLimiter struct {
                limit      int
                window     time.Duration
                counter    int
                windowStart time.Time
                mu         sync.Mutex
            }

            func NewFixedWindowLimiter(limit int, window time.Duration) *FixedWindowLimiter {
                return &FixedWindowLimiter{
                    limit:       limit,
                    window:      window,
                    windowStart: time.Now(),
                }
            }

            func (l *FixedWindowLimiter) Allow() bool {
                l.mu.Lock()
                defer l.mu.Unlock()

                now := time.Now()
                if now.Sub(l.windowStart) >= l.window {
                    l.counter = 0
                    l.windowStart = now
                }

                if l.counter < l.limit {
                    l.counter++
                    return true
                }
                return false
            }

            func FixedWindowMiddleware(limiter *FixedWindowLimiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 多窗口限流
            type MultiWindowLimiter struct {
                limiters map[time.Duration]*FixedWindowLimiter
                mu       sync.RWMutex
            }

            func NewMultiWindowLimiter() *MultiWindowLimiter {
                return &MultiWindowLimiter{
                    limiters: make(map[time.Duration]*FixedWindowLimiter),
                }
            }

            func (m *MultiWindowLimiter) AddWindow(window time.Duration, limit int) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.limiters[window] = NewFixedWindowLimiter(limit, window)
            }

            func (m *MultiWindowLimiter) Allow() bool {
                m.mu.RLock()
                defer m.mu.RUnlock()

                for _, limiter := range m.limiters {
                    if !limiter.Allow() {
                        return false
                    }
                }
                return true
            }

            func MultiWindowMiddleware(limiter *MultiWindowLimiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }
            ---
    b.滑动窗口
        a.功能说明
            滑动窗口算法将时间窗口细分为多个小窗口,统计滑动窗口内的请求总数。滑动窗口解决了固定窗口的边界问题,限流更加平滑。滑动窗口需要维护多个计数器,内存开销较大。窗口粒度影响精度和性能,需要权衡。滑动窗口适合对限流精度要求较高的场景。可以使用环形缓冲区优化内存使用。
        b.代码示例
            ---
            // 滑动窗口限流中间件
            package middleware

            import (
                "context"
                "sync"
                "time"
            )

            type SlidingWindowLimiter struct {
                limit      int
                window     time.Duration
                buckets    []int
                bucketSize time.Duration
                numBuckets int
                current    int
                lastRotate time.Time
                mu         sync.Mutex
            }

            func NewSlidingWindowLimiter(limit int, window time.Duration, numBuckets int) *SlidingWindowLimiter {
                return &SlidingWindowLimiter{
                    limit:      limit,
                    window:     window,
                    buckets:    make([]int, numBuckets),
                    bucketSize: window / time.Duration(numBuckets),
                    numBuckets: numBuckets,
                    lastRotate: time.Now(),
                }
            }

            func (l *SlidingWindowLimiter) rotate() {
                now := time.Now()
                elapsed := now.Sub(l.lastRotate)
                rotations := int(elapsed / l.bucketSize)

                if rotations > 0 {
                    if rotations >= l.numBuckets {
                        for i := range l.buckets {
                            l.buckets[i] = 0
                        }
                    } else {
                        for i := 0; i < rotations; i++ {
                            l.current = (l.current + 1) % l.numBuckets
                            l.buckets[l.current] = 0
                        }
                    }
                    l.lastRotate = now
                }
            }

            func (l *SlidingWindowLimiter) total() int {
                sum := 0
                for _, count := range l.buckets {
                    sum += count
                }
                return sum
            }

            func (l *SlidingWindowLimiter) Allow() bool {
                l.mu.Lock()
                defer l.mu.Unlock()

                l.rotate()

                if l.total() < l.limit {
                    l.buckets[l.current]++
                    return true
                }
                return false
            }

            func SlidingWindowMiddleware(limiter *SlidingWindowLimiter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !limiter.Allow() {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }
            ---

03.分布式限流
    a.Redis限流
        a.功能说明
            Redis限流使用Redis存储限流计数器,实现分布式限流。Redis限流支持多实例共享限流配额,适合分布式系统。可以使用Redis的INCR、EXPIRE命令实现简单限流。使用Lua脚本保证原子性,避免竞���条件。Redis限流依赖Redis可用性,需要考虑故障处理。可以使用Redis集群提高可用性和性能。
        b.代码示例
            ---
            // Redis限流中间件
            package middleware

            import (
                "context"
                "fmt"
                "time"
                "github.com/go-redis/redis/v8"
            )

            type RedisRateLimiter struct {
                client *redis.Client
                limit  int
                window time.Duration
                prefix string
            }

            func NewRedisRateLimiter(client *redis.Client, limit int, window time.Duration) *RedisRateLimiter {
                return &RedisRateLimiter{
                    client: client,
                    limit:  limit,
                    window: window,
                    prefix: "ratelimit:",
                }
            }

            func (r *RedisRateLimiter) Allow(ctx context.Context, key string) (bool, error) {
                redisKey := r.prefix + key

                script := `
                local current = redis.call('INCR', KEYS[1])
                if current == 1 then
                    redis.call('EXPIRE', KEYS[1], ARGV[1])
                end
                return current
                `

                result, err := r.client.Eval(ctx, script, []string{redisKey}, int(r.window.Seconds())).Result()
                if err != nil {
                    return false, err
                }

                count := result.(int64)
                return count <= int64(r.limit), nil
            }

            func RedisRateLimitMiddleware(limiter *RedisRateLimiter, keyFunc func(context.Context, interface{}) string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        key := keyFunc(ctx, request)
                        allowed, err := limiter.Allow(ctx, key)
                        if err != nil {
                            return nil, err
                        }
                        if !allowed {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // Redis滑动窗口限流
            type RedisSlidingWindowLimiter struct {
                client *redis.Client
                limit  int
                window time.Duration
                prefix string
            }

            func (r *RedisSlidingWindowLimiter) Allow(ctx context.Context, key string) (bool, error) {
                redisKey := r.prefix + key
                now := time.Now().UnixNano()
                windowStart := now - r.window.Nanoseconds()

                script := `
                redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, ARGV[1])
                local count = redis.call('ZCARD', KEYS[1])
                if count < tonumber(ARGV[3]) then
                    redis.call('ZADD', KEYS[1], ARGV[2], ARGV[2])
                    redis.call('EXPIRE', KEYS[1], ARGV[4])
                    return 1
                end
                return 0
                `

                result, err := r.client.Eval(ctx, script,
                    []string{redisKey},
                    windowStart, now, r.limit, int(r.window.Seconds())).Result()

                if err != nil {
                    return false, err
                }

                return result.(int64) == 1, nil
            }
            ---
    b.分布式协调
        a.功能说明
            分布式协调限流使用分布式锁或协调服务实现全局限流。可以使用etcd、Consul等协调服务存储限流状态。分布式协调保证多实例间的限流一致性。需要处理网络分区、节点故障等问题。可以使用租约机制实现故障恢复。分布式协调增加了系统复杂度,需要权衡收益。应该设置合理的超时和重试策略。
        b.代码示例
            ---
            // 分布式协调限流中间件
            package middleware

            import (
                "context"
                "fmt"
                "time"
                "go.etcd.io/etcd/client/v3"
                "go.etcd.io/etcd/client/v3/concurrency"
            )

            type EtcdRateLimiter struct {
                client  *clientv3.Client
                limit   int
                window  time.Duration
                prefix  string
            }

            func NewEtcdRateLimiter(client *clientv3.Client, limit int, window time.Duration) *EtcdRateLimiter {
                return &EtcdRateLimiter{
                    client: client,
                    limit:  limit,
                    window: window,
                    prefix: "/ratelimit/",
                }
            }

            func (e *EtcdRateLimiter) Allow(ctx context.Context, key string) (bool, error) {
                session, err := concurrency.NewSession(e.client)
                if err != nil {
                    return false, err
                }
                defer session.Close()

                mutex := concurrency.NewMutex(session, e.prefix+key+"/lock")
                if err := mutex.Lock(ctx); err != nil {
                    return false, err
                }
                defer mutex.Unlock(ctx)

                counterKey := e.prefix + key + "/counter"
                resp, err := e.client.Get(ctx, counterKey)
                if err != nil {
                    return false, err
                }

                var count int
                if len(resp.Kvs) > 0 {
                    fmt.Sscanf(string(resp.Kvs[0].Value), "%d", &count)
                }

                if count >= e.limit {
                    return false, nil
                }

                count++
                _, err = e.client.Put(ctx, counterKey, fmt.Sprintf("%d", count),
                    clientv3.WithLease(session.Lease()))

                return err == nil, err
            }

            func EtcdRateLimitMiddleware(limiter *EtcdRateLimiter, keyFunc func(context.Context) string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        key := keyFunc(ctx)
                        allowed, err := limiter.Allow(ctx, key)
                        if err != nil {
                            return nil, err
                        }
                        if !allowed {
                            return nil, ErrRateLimitExceeded
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 基于配额的分布式限流
            type QuotaBasedLimiter struct {
                client      *redis.Client
                totalQuota  int
                instances   int
                localQuota  int
                used        int
                mu          sync.Mutex
            }

            func NewQuotaBasedLimiter(client *redis.Client, totalQuota, instances int) *QuotaBasedLimiter {
                return &QuotaBasedLimiter{
                    client:     client,
                    totalQuota: totalQuota,
                    instances:  instances,
                    localQuota: totalQuota / instances,
                }
            }

            func (q *QuotaBasedLimiter) Allow(ctx context.Context) bool {
                q.mu.Lock()
                defer q.mu.Unlock()

                if q.used < q.localQuota {
                    q.used++
                    return true
                }

                // 尝试从全局配额获取
                script := `
                local quota = redis.call('GET', KEYS[1])
                if not quota then
                    redis.call('SET', KEYS[1], ARGV[1])
                    quota = ARGV[1]
                end
                if tonumber(quota) > 0 then
                    redis.call('DECR', KEYS[1])
                    return 1
                end
                return 0
                `

                result, err := q.client.Eval(ctx, script, []string{"global_quota"}, q.totalQuota).Result()
                if err != nil || result.(int64) == 0 {
                    return false
                }

                q.localQuota++
                q.used++
                return true
            }
            ---

5.5 熔断中间件

01.熔断器模式
    a.状态机实现
        a.功能说明
            熔断器通过状态机管理服务调用,包括关闭、打开、半开三种状态。关闭状态正常调用,打开状态直接返回错误,半开状态尝试恢复。熔断器根据错误率或连续失败次数触发状态转换。熔断器保护下游服务,避免级联故障。go-kit集成了sony/gobreaker等熔断器库。熔断器适合调用不稳定的外部服务。
        b.代码示例
            ---
            // 熔断器中间件
            package middleware

            import (
                "context"
                "errors"
                "sync"
                "time"
                "github.com/go-kit/kit/endpoint"
            )

            type State int

            const (
                StateClosed State = iota
                StateOpen
                StateHalfOpen
            )

            type CircuitBreaker struct {
                maxFailures  int
                timeout      time.Duration
                state        State
                failures     int
                lastFailTime time.Time
                mu           sync.Mutex
            }

            func NewCircuitBreaker(maxFailures int, timeout time.Duration) *CircuitBreaker {
                return &CircuitBreaker{
                    maxFailures: maxFailures,
                    timeout:     timeout,
                    state:       StateClosed,
                }
            }

            func (cb *CircuitBreaker) Call(fn func() error) error {
                cb.mu.Lock()
                defer cb.mu.Unlock()

                if cb.state == StateOpen {
                    if time.Since(cb.lastFailTime) > cb.timeout {
                        cb.state = StateHalfOpen
                    } else {
                        return errors.New("circuit breaker is open")
                    }
                }

                err := fn()

                if err != nil {
                    cb.failures++
                    cb.lastFailTime = time.Now()

                    if cb.failures >= cb.maxFailures {
                        cb.state = StateOpen
                    }
                    return err
                }

                if cb.state == StateHalfOpen {
                    cb.state = StateClosed
                }
                cb.failures = 0
                return nil
            }

            func CircuitBreakerMiddleware(cb *CircuitBreaker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var response interface{}
                        var err error

                        cbErr := cb.Call(func() error {
                            response, err = next(ctx, request)
                            return err
                        })

                        if cbErr != nil {
                            return nil, cbErr
                        }
                        return response, err
                    }
                }
            }
            ---
    b.gobreaker集成
        a.功能说明
            gobreaker是成熟的熔断器库,提供完整的熔断功能。支持自定义成功判断函数,灵活定义失败条件。提供状态变化回调,便于监控和告警。支持滑动窗口统计,更准确地计算错误率。gobreaker经过生产验证,稳定可靠。集成简单,配置灵活。
        b.代码示例
            ---
            // gobreaker集成中间件
            package middleware

            import (
                "context"
                "github.com/sony/gobreaker"
            )

            func GobreakerMiddleware(cb *gobreaker.CircuitBreaker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        result, err := cb.Execute(func() (interface{}, error) {
                            return next(ctx, request)
                        })
                        return result, err
                    }
                }
            }

            // 自定义配置
            func NewCustomCircuitBreaker(name string) *gobreaker.CircuitBreaker {
                settings := gobreaker.Settings{
                    Name:        name,
                    MaxRequests: 3,
                    Interval:    time.Minute,
                    Timeout:     30 * time.Second,
                    ReadyToTrip: func(counts gobreaker.Counts) bool {
                        failureRatio := float64(counts.TotalFailures) / float64(counts.Requests)
                        return counts.Requests >= 10 && failureRatio >= 0.5
                    },
                    OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {
                        log.Printf("Circuit breaker %s: %s -> %s", name, from, to)
                    },
                }
                return gobreaker.NewCircuitBreaker(settings)
            }

            // 多端点熔断器
            type MultiCircuitBreaker struct {
                breakers map[string]*gobreaker.CircuitBreaker
                mu       sync.RWMutex
            }

            func NewMultiCircuitBreaker() *MultiCircuitBreaker {
                return &MultiCircuitBreaker{
                    breakers: make(map[string]*gobreaker.CircuitBreaker),
                }
            }

            func (m *MultiCircuitBreaker) Get(name string) *gobreaker.CircuitBreaker {
                m.mu.RLock()
                cb, exists := m.breakers[name]
                m.mu.RUnlock()

                if !exists {
                    m.mu.Lock()
                    cb = NewCustomCircuitBreaker(name)
                    m.breakers[name] = cb
                    m.mu.Unlock()
                }

                return cb
            }

            func MultiCircuitBreakerMiddleware(mcb *MultiCircuitBreaker, nameFunc func(context.Context) string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        name := nameFunc(ctx)
                        cb := mcb.Get(name)
                        result, err := cb.Execute(func() (interface{}, error) {
                            return next(ctx, request)
                        })
                        return result, err
                    }
                }
            }
            ---

02.降级策略
    a.快速失败
        a.功能说明
            快速失败策略在熔断器打开时立即返回错误,不等待超时。快速失败减少资源占用,提高系统响应速度。适合对延迟敏感的场景。可以返回自定义错误信息,提示服务不可用。快速失败配合重试机制,提高成功率。应该记录失败日志,便于问题排查。
        b.代码示例
            ---
            // 快速失败中间件
            package middleware

            import (
                "context"
                "errors"
            )

            var ErrServiceUnavailable = errors.New("service unavailable")

            func FailFastMiddleware(cb *CircuitBreaker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if cb.IsOpen() {
                            return nil, ErrServiceUnavailable
                        }
                        return next(ctx, request)
                    }
                }
            }

            // 带降级响应的快速失败
            type FallbackFunc func(context.Context, interface{}) (interface{}, error)

            func FailFastWithFallbackMiddleware(cb *CircuitBreaker, fallback FallbackFunc) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if cb.IsOpen() {
                            return fallback(ctx, request)
                        }

                        response, err := next(ctx, request)
                        if err != nil {
                            return fallback(ctx, request)
                        }
                        return response, nil
                    }
                }
            }

            // 超时快速失败
            func TimeoutFailFastMiddleware(timeout time.Duration) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        ctx, cancel := context.WithTimeout(ctx, timeout)
                        defer cancel()

                        done := make(chan struct{})
                        var response interface{}
                        var err error

                        go func() {
                            response, err = next(ctx, request)
                            close(done)
                        }()

                        select {
                        case <-done:
                            return response, err
                        case <-ctx.Done():
                            return nil, errors.New("request timeout")
                        }
                    }
                }
            }
            ---
    b.降级响应
        a.功能说明
            降级响应在服务不可用时返回备用数据,保证基本功能可用。降级数据可以来自缓存、默认值或备用服务。降级策略应该根据业务重要性设计。降级响应应该标记降级状态,便于监控。降级可以是部分降级或完全降级。降级策略需要定期测试,确保有效性。
        b.代码示例
            ---
            // 降级响应中间件
            package middleware

            import (
                "context"
                "time"
            )

            type FallbackStrategy interface {
                Execute(ctx context.Context, request interface{}) (interface{}, error)
            }

            type CacheFallback struct {
                cache Cache
                ttl   time.Duration
            }

            func (f *CacheFallback) Execute(ctx context.Context, request interface{}) (interface{}, error) {
                key := generateCacheKey(request)
                if value, found := f.cache.Get(key); found {
                    return value, nil
                }
                return nil, errors.New("no cached data available")
            }

            type DefaultValueFallback struct {
                defaultValue interface{}
            }

            func (f *DefaultValueFallback) Execute(ctx context.Context, request interface{}) (interface{}, error) {
                return f.defaultValue, nil
            }

            func FallbackMiddleware(strategy FallbackStrategy) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)
                        if err != nil {
                            return strategy.Execute(ctx, request)
                        }
                        return response, nil
                    }
                }
            }

            // 多级降级
            type TieredFallback struct {
                strategies []FallbackStrategy
            }

            func (t *TieredFallback) Execute(ctx context.Context, request interface{}) (interface{}, error) {
                for _, strategy := range t.strategies {
                    if response, err := strategy.Execute(ctx, request); err == nil {
                        return response, nil
                    }
                }
                return nil, errors.New("all fallback strategies failed")
            }

            func TieredFallbackMiddleware(strategies ...FallbackStrategy) endpoint.Middleware {
                fallback := &TieredFallback{strategies: strategies}
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        response, err := next(ctx, request)
                        if err != nil {
                            return fallback.Execute(ctx, request)
                        }
                        return response, nil
                    }
                }
            }
            ---

03.自适应熔断
    a.动��阈值
        a.功能说明
            动态阈值根据系统状态自动调整熔断参数,实现自适应保护。可以根据错误率、响应时间、系统负载等指标动态调整。动态阈值避免固定阈值的局限性,更好地适应流量变化。支持平滑调整,避免频繁触发熔断。动态阈值需要监控多个指标,增加了复杂度。应该设置合理的调整策略和边界条件。
        b.代码示例
            ---
            // 动态阈值熔断中间件
            package middleware

            import (
                "context"
                "sync/atomic"
                "time"
            )

            type AdaptiveCircuitBreaker struct {
                minThreshold int
                maxThreshold int
                threshold    uint64
                window       time.Duration
                metrics      *MetricsCollector
            }

            func NewAdaptiveCircuitBreaker(minThreshold, maxThreshold int, window time.Duration) *AdaptiveCircuitBreaker {
                acb := &AdaptiveCircuitBreaker{
                    minThreshold: minThreshold,
                    maxThreshold: maxThreshold,
                    window:       window,
                    metrics:      NewMetricsCollector(),
                }
                atomic.StoreUint64(&acb.threshold, uint64(maxThreshold))
                go acb.adjust()
                return acb
            }

            func (acb *AdaptiveCircuitBreaker) adjust() {
                ticker := time.NewTicker(acb.window)
                for range ticker.C {
                    errorRate := acb.metrics.ErrorRate()
                    avgLatency := acb.metrics.AverageLatency()

                    var newThreshold int
                    if errorRate < 0.01 && avgLatency < 100*time.Millisecond {
                        newThreshold = acb.maxThreshold
                    } else if errorRate > 0.1 || avgLatency > 1*time.Second {
                        newThreshold = acb.minThreshold
                    } else {
                        current := atomic.LoadUint64(&acb.threshold)
                        newThreshold = int(current)
                    }

                    atomic.StoreUint64(&acb.threshold, uint64(newThreshold))
                }
            }

            func (acb *AdaptiveCircuitBreaker) ShouldTrip() bool {
                failures := acb.metrics.Failures()
                threshold := atomic.LoadUint64(&acb.threshold)
                return failures >= threshold
            }

            func AdaptiveCircuitBreakerMiddleware(acb *AdaptiveCircuitBreaker) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if acb.ShouldTrip() {
                            return nil, errors.New("circuit breaker tripped")
                        }

                        begin := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(begin)

                        acb.metrics.Record(err, duration)
                        return response, err
                    }
                }
            }
            ---
    b.智能恢复
        a.功能说明
            智能恢复策略根据服务健康状况逐步恢复流量,避免雪崩。可以使用指数退避、线性增长等策略。智能恢复监控恢复期间的成功率,动态调整恢复速度。支持自动回退,恢复失败时重新熔断。智能恢复减少人工干预,提高系统自愈能力。应该记录恢复过程,便于分析和优化。
        b.代码示例
            ---
            // 智能恢复中间件
            package middleware

            import (
                "context"
                "math"
                "sync/atomic"
            )

            type SmartRecovery struct {
                state           State
                failures        uint64
                successes       uint64
                recoveryAttempt uint64
                maxAttempts     int
                baseDelay       time.Duration
                lastAttempt     time.Time
                mu              sync.Mutex
            }

            func NewSmartRecovery(maxAttempts int, baseDelay time.Duration) *SmartRecovery {
                return &SmartRecovery{
                    state:       StateClosed,
                    maxAttempts: maxAttempts,
                    baseDelay:   baseDelay,
                }
            }

            func (sr *SmartRecovery) CanAttempt() bool {
                sr.mu.Lock()
                defer sr.mu.Unlock()

                if sr.state != StateOpen {
                    return true
                }

                attempt := atomic.LoadUint64(&sr.recoveryAttempt)
                if attempt >= uint64(sr.maxAttempts) {
                    return false
                }

                delay := time.Duration(math.Pow(2, float64(attempt))) * sr.baseDelay
                if time.Since(sr.lastAttempt) < delay {
                    return false
                }

                sr.lastAttempt = time.Now()
                atomic.AddUint64(&sr.recoveryAttempt, 1)
                return true
            }

            func (sr *SmartRecovery) RecordSuccess() {
                atomic.AddUint64(&sr.successes, 1)
                successes := atomic.LoadUint64(&sr.successes)

                if successes >= 3 {
                    sr.mu.Lock()
                    sr.state = StateClosed
                    atomic.StoreUint64(&sr.failures, 0)
                    atomic.StoreUint64(&sr.successes, 0)
                    atomic.StoreUint64(&sr.recoveryAttempt, 0)
                    sr.mu.Unlock()
                }
            }

            func (sr *SmartRecovery) RecordFailure() {
                atomic.AddUint64(&sr.failures, 1)
                atomic.StoreUint64(&sr.successes, 0)

                failures := atomic.LoadUint64(&sr.failures)
                if failures >= 3 {
                    sr.mu.Lock()
                    sr.state = StateOpen
                    sr.mu.Unlock()
                }
            }

            func SmartRecoveryMiddleware(sr *SmartRecovery) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !sr.CanAttempt() {
                            return nil, errors.New("circuit breaker open")
                        }

                        response, err := next(ctx, request)

                        if err != nil {
                            sr.RecordFailure()
                        } else {
                            sr.RecordSuccess()
                        }

                        return response, err
                    }
                }
            }
            ---

5.6 链路追踪

01.OpenTracing集成
    a.Tracer初始化
        a.功能说明
            OpenTracing是分布式追踪的标准API,提供厂商中立的追踪接口。Tracer负责创建和管理Span,记录请求的执行路径。支持多种后端实现,如Jaeger、Zipkin等。OpenTracing定义了统一的数据模型和API。集成简单,对业务代码侵入小。支持跨进程、跨服务的追踪。
        b.代码示例
            ---
            // OpenTracing集成中间件
            package middleware

            import (
                "context"
                "github.com/opentracing/opentracing-go"
                "github.com/opentracing/opentracing-go/ext"
                "github.com/go-kit/kit/endpoint"
            )

            func OpenTracingMiddleware(tracer opentracing.Tracer, operationName string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        var span opentracing.Span
                        if parentSpan := opentracing.SpanFromContext(ctx); parentSpan != nil {
                            span = tracer.StartSpan(operationName, opentracing.ChildOf(parentSpan.Context()))
                        } else {
                            span = tracer.StartSpan(operationName)
                        }
                        defer span.Finish()

                        ctx = opentracing.ContextWithSpan(ctx, span)
                        response, err := next(ctx, request)

                        if err != nil {
                            ext.Error.Set(span, true)
                            span.SetTag("error.message", err.Error())
                        }

                        return response, err
                    }
                }
            }

            // 带标签的追踪中间件
            func TracingWithTagsMiddleware(tracer opentracing.Tracer, operationName string, tags map[string]interface{}) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        span, ctx := opentracing.StartSpanFromContext(ctx, operationName)
                        defer span.Finish()

                        for key, value := range tags {
                            span.SetTag(key, value)
                        }

                        ext.Component.Set(span, "go-kit")
                        response, err := next(ctx, request)

                        if err != nil {
                            ext.Error.Set(span, true)
                            span.LogKV("event", "error", "message", err.Error())
                        }

                        return response, err
                    }
                }
            }
            ---
    b.Span管理
        a.功能说明
            Span表示一次操作的执行过程,包含操作名称、开始时间、结束时间等信息。Span可以嵌套,形成调用树。支持添加标签和日志,记录详细信息。Span应该在操作完成后及时关闭。可以通过Context传递Span,实现跨函数追踪。Span管理应该轻量级,避免影响性能。
        b.代码示例
            ---
            // Span管理中间件
            package middleware

            import (
                "context"
                "fmt"
            )

            func SpanManagementMiddleware(tracer opentracing.Tracer) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        span, ctx := opentracing.StartSpanFromContext(ctx, "endpoint.call")
                        defer span.Finish()

                        span.SetTag("request.type", fmt.Sprintf("%T", request))
                        span.LogKV("event", "request_received", "request", request)

                        response, err := next(ctx, request)

                        if err != nil {
                            span.SetTag("error", true)
                            span.LogKV("event", "error", "error.object", err)
                        } else {
                            span.LogKV("event", "request_completed", "response", response)
                        }

                        return response, err
                    }
                }
            }

            // 自定义Span中间件
            type SpanDecorator func(span opentracing.Span, ctx context.Context, request interface{})

            func CustomSpanMiddleware(tracer opentracing.Tracer, operationName string, decorator SpanDecorator) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        span, ctx := opentracing.StartSpanFromContext(ctx, operationName)
                        defer span.Finish()

                        if decorator != nil {
                            decorator(span, ctx, request)
                        }

                        return next(ctx, request)
                    }
                }
            }

            // 使用示例
            func UserIDDecorator(span opentracing.Span, ctx context.Context, request interface{}) {
                if userID := ctx.Value("user_id"); userID != nil {
                    span.SetTag("user.id", userID)
                }
            }
            ---

02.Jaeger集成
    a.Jaeger配置
        a.功能说明
            Jaeger是开源的分布式追踪系统,兼容OpenTracing标准。支持采样策略,控制追踪数据量。提供UI界面,可视化追踪数据。支持多种存储后端,如Cassandra、Elasticsearch等。Jaeger配置包括Agent地址、采样率、服务名等。支持动态配置,运行时调整参数。
        b.代码示例
            ---
            // Jaeger集成
            package tracing

            import (
                "io"
                "github.com/uber/jaeger-client-go"
                "github.com/uber/jaeger-client-go/config"
            )

            func InitJaeger(serviceName string) (opentracing.Tracer, io.Closer, error) {
                cfg := &config.Configuration{
                    ServiceName: serviceName,
                    Sampler: &config.SamplerConfig{
                        Type:  "const",
                        Param: 1,
                    },
                    Reporter: &config.ReporterConfig{
                        LogSpans:           true,
                        LocalAgentHostPort: "localhost:6831",
                    },
                }

                tracer, closer, err := cfg.NewTracer(
                    config.Logger(jaeger.StdLogger),
                )
                if err != nil {
                    return nil, nil, err
                }

                opentracing.SetGlobalTracer(tracer)
                return tracer, closer, nil
            }

            // 自定义采样策略
            func InitJaegerWithSampling(serviceName string, samplingRate float64) (opentracing.Tracer, io.Closer, error) {
                cfg := &config.Configuration{
                    ServiceName: serviceName,
                    Sampler: &config.SamplerConfig{
                        Type:  "probabilistic",
                        Param: samplingRate,
                    },
                    Reporter: &config.ReporterConfig{
                        LogSpans:            false,
                        BufferFlushInterval: 1 * time.Second,
                        LocalAgentHostPort:  "localhost:6831",
                    },
                }

                tracer, closer, err := cfg.NewTracer()
                return tracer, closer, err
            }

            // 远程采样配置
            func InitJaegerWithRemoteSampling(serviceName string) (opentracing.Tracer, io.Closer, error) {
                cfg := &config.Configuration{
                    ServiceName: serviceName,
                    Sampler: &config.SamplerConfig{
                        Type:              "remote",
                        Param:             1,
                        SamplingServerURL: "http://localhost:5778/sampling",
                    },
                    Reporter: &config.ReporterConfig{
                        LocalAgentHostPort: "localhost:6831",
                    },
                }

                return cfg.NewTracer()
            }
            ---
    b.追踪数据上报
        a.功能说明
            追踪数据上报将Span数据发送到Jaeger后端。支持批量上报,减少网络开销。可以配置缓冲区大小和刷新间隔。上报失败时支持重试机制。应该异步上报,避免阻塞业务逻辑。可以配置采样率,控制上报数据量。
        b.代码示例
            ---
            // 追踪数据上报配置
            package tracing

            import (
                "github.com/uber/jaeger-client-go"
                "github.com/uber/jaeger-client-go/config"
            )

            func InitJaegerReporter(serviceName string) (opentracing.Tracer, io.Closer, error) {
                cfg := &config.Configuration{
                    ServiceName: serviceName,
                    Sampler: &config.SamplerConfig{
                        Type:  "const",
                        Param: 1,
                    },
                    Reporter: &config.ReporterConfig{
                        QueueSize:           1000,
                        BufferFlushInterval: 1 * time.Second,
                        LocalAgentHostPort:  "localhost:6831",
                        CollectorEndpoint:   "http://localhost:14268/api/traces",
                    },
                }

                tracer, closer, err := cfg.NewTracer(
                    config.Logger(jaeger.StdLogger),
                    config.Metrics(jaeger.NewMetrics(jaeger.NewStdMeter(), nil)),
                )

                return tracer, closer, err
            }

            // 自定义Reporter
            type CustomReporter struct {
                reporter jaeger.Reporter
                logger   log.Logger
            }

            func (r *CustomReporter) Report(span *jaeger.Span) {
                r.logger.Log("span", span.OperationName(), "duration", span.Duration())
                r.reporter.Report(span)
            }

            func (r *CustomReporter) Close() error {
                return r.reporter.Close()
            }

            func InitWithCustomReporter(serviceName string, logger log.Logger) (opentracing.Tracer, io.Closer, error) {
                transport, err := jaeger.NewUDPTransport("localhost:6831", 0)
                if err != nil {
                    return nil, nil, err
                }

                reporter := jaeger.NewRemoteReporter(transport)
                customReporter := &CustomReporter{
                    reporter: reporter,
                    logger:   logger,
                }

                sampler := jaeger.NewConstSampler(true)
                tracer, closer := jaeger.NewTracer(
                    serviceName,
                    sampler,
                    customReporter,
                )

                return tracer, closer, nil
            }
            ---

03.分布式追踪
    a.跨服务追踪
        a.功能说明
            跨服务追踪记录请求在多个服务间的传播路径。通过HTTP头或gRPC元数据传递追踪上下文。每个服务创建子Span,形成完整的调用链。支持异步调用的追踪,如消息队列。跨服务追踪帮助定位性能瓶颈和故障点。应该统一追踪标准,确保兼容性。
        b.代码示例
            ---
            // 跨服务追踪中间件
            package middleware

            import (
                "context"
                "net/http"
                "github.com/opentracing/opentracing-go"
                "github.com/opentracing/opentracing-go/ext"
            )

            func HTTPClientTracingMiddleware(tracer opentracing.Tracer) func(*http.Request) {
                return func(req *http.Request) {
                    span := opentracing.SpanFromContext(req.Context())
                    if span == nil {
                        return
                    }

                    ext.SpanKindRPCClient.Set(span)
                    ext.HTTPUrl.Set(span, req.URL.String())
                    ext.HTTPMethod.Set(span, req.Method)

                    tracer.Inject(
                        span.Context(),
                        opentracing.HTTPHeaders,
                        opentracing.HTTPHeadersCarrier(req.Header),
                    )
                }
            }

            func HTTPServerTracingMiddleware(tracer opentracing.Tracer, operationName string) func(http.Handler) http.Handler {
                return func(next http.Handler) http.Handler {
                    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                        spanCtx, _ := tracer.Extract(
                            opentracing.HTTPHeaders,
                            opentracing.HTTPHeadersCarrier(r.Header),
                        )

                        span := tracer.StartSpan(operationName, ext.RPCServerOption(spanCtx))
                        defer span.Finish()

                        ext.HTTPMethod.Set(span, r.Method)
                        ext.HTTPUrl.Set(span, r.URL.String())

                        ctx := opentracing.ContextWithSpan(r.Context(), span)
                        next.ServeHTTP(w, r.WithContext(ctx))
                    })
                }
            }

            // gRPC追踪
            func GRPCClientTracingInterceptor(tracer opentracing.Tracer) grpc.UnaryClientInterceptor {
                return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
                    span, ctx := opentracing.StartSpanFromContext(ctx, method)
                    defer span.Finish()

                    ext.SpanKindRPCClient.Set(span)
                    ext.Component.Set(span, "grpc")

                    md := metadata.New(nil)
                    if err := tracer.Inject(span.Context(), opentracing.TextMap, metadataTextMap(md)); err != nil {
                        span.LogKV("event", "inject_failed", "error", err)
                    }

                    ctx = metadata.NewOutgoingContext(ctx, md)
                    return invoker(ctx, method, req, reply, cc, opts...)
                }
            }

            type metadataTextMap metadata.MD

            func (m metadataTextMap) Set(key, val string) {
                metadata.MD(m)[key] = append(metadata.MD(m)[key], val)
            }

            func (m metadataTextMap) ForeachKey(handler func(key, val string) error) error {
                for k, vals := range metadata.MD(m) {
                    for _, v := range vals {
                        if err := handler(k, v); err != nil {
                            return err
                        }
                    }
                }
                return nil
            }
            ---
    b.追踪可视化
        a.功能说明
            追踪可视化将追踪数据以图形方式展示,便于分析和理解。Jaeger UI提供时间线视图,显示Span的执行顺序和耗时。支持依赖关系图,展示服务间的调用关系。可以搜索和过滤追踪数据,快速定位问题。支持对比分析,比较不同请求的性能差异。追踪可视化是分布式系统调试的重要工具。
        b.代码示例
            ---
            // 追踪数据增强
            package tracing

            import (
                "context"
                "fmt"
            )

            func EnhancedTracingMiddleware(tracer opentracing.Tracer, serviceName string) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        span, ctx := opentracing.StartSpanFromContext(ctx, "endpoint")
                        defer span.Finish()

                        span.SetTag("service.name", serviceName)
                        span.SetTag("service.version", "1.0.0")
                        span.SetTag("request.type", fmt.Sprintf("%T", request))

                        if userID := ctx.Value("user_id"); userID != nil {
                            span.SetTag("user.id", userID)
                        }

                        if requestID := ctx.Value("request_id"); requestID != nil {
                            span.SetTag("request.id", requestID)
                        }

                        span.LogKV("event", "request_start")
                        response, err := next(ctx, request)
                        span.LogKV("event", "request_end")

                        if err != nil {
                            span.SetTag("error", true)
                            span.SetTag("error.type", fmt.Sprintf("%T", err))
                            span.LogKV("event", "error", "message", err.Error())
                        }

                        return response, err
                    }
                }
            }

            // 性能分析追踪
            func PerformanceTracingMiddleware(tracer opentracing.Tracer) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        span, ctx := opentracing.StartSpanFromContext(ctx, "performance")
                        defer span.Finish()

                        var m runtime.MemStats
                        runtime.ReadMemStats(&m)
                        span.SetTag("mem.alloc.before", m.Alloc)

                        start := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(start)

                        runtime.ReadMemStats(&m)
                        span.SetTag("mem.alloc.after", m.Alloc)
                        span.SetTag("duration.ms", duration.Milliseconds())

                        if duration > 1*time.Second {
                            span.SetTag("slow.request", true)
                        }

                        return response, err
                    }
                }
            }
            ---

5.7 自定义中间件

01.中间件开发
    a.基本结构
        a.功能说明
            自定义中间件遵循endpoint.Middleware类型定义,接收Endpoint返回Endpoint。中间件应该保持单一职责,只做一件事。支持配置参数,提高灵活性。中间件应该是无状态的或线程安全的。可以组合多个中间件实现复杂功能。中间件开发应该考虑性能影响。
        b.代码示例
            ---
            package middleware
            import ("context"; "time"; "github.com/go-kit/kit/endpoint")
            func CustomMiddleware(config Config) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        start := time.Now()
                        response, err := next(ctx, request)
                        duration := time.Since(start)
                        if duration > config.Threshold {
                            config.Logger.Log("slow_request", duration)
                        }
                        return response, err
                    }
                }
            }
            type Config struct {
                Threshold time.Duration
                Logger    log.Logger
            }
            func NewConfig(threshold time.Duration, logger log.Logger) Config {
                return Config{Threshold: threshold, Logger: logger}
            }
            ---
    b.参数注入
        a.功能说明
            参数注入通过闭包将配置传递给中间件,实现灵活配置。支持依赖注入,解耦中间件和具体实现。可以使用工厂函数创建中间件。参数应该在中间件创建时传入,避免运行时查找。支持可选参数,提供默认值。参数注入使中间件更易测试和复用。
        b.代码示例
            ---
            package middleware
            import "context"
            func InjectableMiddleware(logger log.Logger, metrics metrics.Counter) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        metrics.Add(1)
                        logger.Log("request", request)
                        response, err := next(ctx, request)
                        if err != nil {
                            logger.Log("error", err)
                        }
                        return response, err
                    }
                }
            }
            type MiddlewareFactory struct {
                logger  log.Logger
                metrics metrics.Counter
            }
            func (f *MiddlewareFactory) Create() endpoint.Middleware {
                return InjectableMiddleware(f.logger, f.metrics)
            }
            ---

02.中间件测试
    a.单元测试
        a.功能说明
            中间件单元测试验证中间件的功能正确性。使用mock Endpoint测试中间件行为。测试正常流程和异常流程。验证中间件对请求响应的影响。测试中间件的配置参数。单元测试应该覆盖所有分支。
        b.代码示例
            ---
            package middleware
            import ("context"; "errors"; "testing")
            func TestLoggingMiddleware(t *testing.T) {
                logger := &mockLogger{}
                mw := LoggingMiddleware(logger)
                endpoint := mw(func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                })
                response, err := endpoint(context.Background(), "request")
                if err != nil {
                    t.Errorf("unexpected error: %v", err)
                }
                if response != "response" {
                    t.Errorf("unexpected response: %v", response)
                }
                if !logger.called {
                    t.Error("logger not called")
                }
            }
            type mockLogger struct {
                called bool
            }
            func (m *mockLogger) Log(keyvals ...interface{}) error {
                m.called = true
                return nil
            }
            ---
    b.集成测试
        a.功能说明
            集成测试验证中间件在实际环境中的行为。测试中间件与其他组件的交互。验证中间件链的执行顺序。测试中间件的性能影响。使用真实的依赖或测试替身。集成测试确保中间件在生产环境中正常工作。
        b.代码示例
            ---
            package middleware
            import ("context"; "testing"; "time")
            func TestMiddlewareChain(t *testing.T) {
                logger := &mockLogger{}
                counter := &mockCounter{}
                endpoint := func(ctx context.Context, request interface{}) (interface{}, error) {
                    return "response", nil
                }
                endpoint = LoggingMiddleware(logger)(endpoint)
                endpoint = MetricsMiddleware(counter)(endpoint)
                endpoint = RateLimitMiddleware(rate.NewLimiter(10, 10))(endpoint)
                response, err := endpoint(context.Background(), "request")
                if err != nil {
                    t.Errorf("unexpected error: %v", err)
                }
                if !logger.called || !counter.called {
                    t.Error("middleware not executed")
                }
            }
            type mockCounter struct {
                called bool
            }
            func (m *mockCounter) Add(delta float64) {
                m.called = true
            }
            ---

03.中间件最佳实践
    a.设计原则
        a.功能说明
            中间件应该遵循单一职责原则,每个中间件只做一件事。保持中间件的独立性,避免相互依赖。中间件应该是可组合的,支持灵活组合。使用配置参数而不是硬编码。中间件应该对性能影响最小。提供清晰的文档和使用示例。
        b.代码示例
            ---
            package middleware
            import "context"
            func WellDesignedMiddleware(config MiddlewareConfig) endpoint.Middleware {
                if err := config.Validate(); err != nil {
                    panic(err)
                }
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        if !config.Enabled {
                            return next(ctx, request)
                        }
                        if err := config.PreProcess(ctx, request); err != nil {
                            return nil, err
                        }
                        response, err := next(ctx, request)
                        config.PostProcess(ctx, response, err)
                        return response, err
                    }
                }
            }
            type MiddlewareConfig struct {
                Enabled    bool
                PreProcess func(context.Context, interface{}) error
                PostProcess func(context.Context, interface{}, error)
            }
            func (c *MiddlewareConfig) Validate() error {
                if c.PreProcess == nil || c.PostProcess == nil {
                    return errors.New("invalid config")
                }
                return nil
            }
            ---
    b.性能优化
        a.功能说明
            中间件性能优化减少对请求处理的影响。避免在中间件中执行耗时操作。使用异步处理非关键逻辑。合理使用缓存减少重复计算。避免过度日志记录。使用对象池减少内存分配。性能优化应该基于实际测量结果。
        b.代码示例
            ---
            package middleware
            import ("context"; "sync")
            var bufferPool = sync.Pool{
                New: func() interface{} {
                    return make([]byte, 1024)
                },
            }
            func OptimizedMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        buf := bufferPool.Get().([]byte)
                        defer bufferPool.Put(buf)
                        response, err := next(ctx, request)
                        go func() {
                            logger.Log("request", request, "response", response)
                        }()
                        return response, err
                    }
                }
            }
            type CachedMiddleware struct {
                cache map[string]interface{}
                mu    sync.RWMutex
            }
            func (c *CachedMiddleware) Middleware() endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        key := generateKey(request)
                        c.mu.RLock()
                        if cached, found := c.cache[key]; found {
                            c.mu.RUnlock()
                            return cached, nil
                        }
                        c.mu.RUnlock()
                        response, err := next(ctx, request)
                        if err == nil {
                            c.mu.Lock()
                            c.cache[key] = response
                            c.mu.Unlock()
                        }
                        return response, err
                    }
                }
            }
            ---

6 服务发现

6.1 服务发现概念

01.服务注册
    a.基本实现
        a.功能说明
            服务注册是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。服务注册应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.服务查询
    a.实现方��
        a.功能说明
            服务查询提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。服务查询应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.健康检查
    a.核心功能
        a.功能说明
            健康检查是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。健康检查应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。健康检查应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

6.2 Consul集成

01.Consul客户端
    a.基本实现
        a.功能说明
            Consul客户端是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。Consul客户端应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.服务注册
    a.实现方��
        a.功能说明
            服务注册提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。服务注册应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.服务发现
    a.核心功能
        a.功能说明
            服务发现是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。服务发现应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。服务发现应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

6.3 Etcd集成

01.Etcd客户端
    a.基本实现
        a.功能说明
            Etcd客户端是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。Etcd客户端应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.服务注册
    a.实现方��
        a.功能说明
            服务注册提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。服务注册应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.服务发现
    a.核心功能
        a.功能说明
            服务发现是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。服务发现应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。服务发现应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

6.4 Eureka集成

01.Eureka客户端
    a.基本实现
        a.功能说明
            Eureka客户端是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。Eureka客户端应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.服务注册
    a.实现方��
        a.功能说明
            服务注册提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。服务注册应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.服务发现
    a.核心功能
        a.功能说明
            服务发现是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。服务发现应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。服务发现应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

6.5 负载均衡

01.负载均衡策略
    a.基本实现
        a.功能说明
            负载均衡策略是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。负载均衡策略应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.自定义负载均衡
    a.实现方��
        a.功能说明
            自定义负载均衡提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。自定义负载均衡应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.故障转移
    a.核心功能
        a.功能说明
            故障转移是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。故障转移应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。故障转移应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

6.6 健康检查

01.健康检查机制
    a.基本实现
        a.功能说明
            健康检查机制是服务发现的核心功能,提供服务的注册和管理能力。支持服务元数据存储,包括地址、端口、版本等信息。提供服务健康检查,自动剔除不健康实例。支持服务分组和标签,实现灵活的服务管理。健康检查机制应该高可用,避免单点故障。支持动态更新,实时反映服务状态变化。
        b.代码示例
            ---
            package sd
            import ("context"; "time")
            type Registrar interface {
                Register() error
                Deregister() error
            }
            type ServiceInstance struct {
                ID       string
                Name     string
                Address  string
                Port     int
                Metadata map[string]string
                Tags     []string
            }
            func NewServiceInstance(name, address string, port int) *ServiceInstance {
                return &ServiceInstance{
                    ID:       generateID(),
                    Name:     name,
                    Address:  address,
                    Port:     port,
                    Metadata: make(map[string]string),
                    Tags:     make([]string, 0),
                }
            }
            func (s *ServiceInstance) WithMetadata(key, value string) *ServiceInstance {
                s.Metadata[key] = value
                return s
            }
            func (s *ServiceInstance) WithTags(tags ...string) *ServiceInstance {
                s.Tags = append(s.Tags, tags...)
                return s
            }
            ---
    b.配置管理
        a.功能说明
            配置管理提供服务发现的参数配置,包括注册中心地址、超时时间、重试策略等。支持配置热更新,运行时调整参数。配置应该支持多环境,开发、测试、生产使用不同配置。提供配置验证,确保参数合法性。配置管理应该集中化,便于维护。支持配置加密,保护敏感信息。
        b.代码示例
            ---
            package sd
            import "time"
            type Config struct {
                Endpoints       []string
                Timeout         time.Duration
                RetryAttempts   int
                HealthCheckTTL  time.Duration
                DeregisterAfter time.Duration
            }
            func DefaultConfig() *Config {
                return &Config{
                    Endpoints:       []string{"localhost:8500"},
                    Timeout:         10 * time.Second,
                    RetryAttempts:   3,
                    HealthCheckTTL:  30 * time.Second,
                    DeregisterAfter: 1 * time.Minute,
                }
            }
            func (c *Config) Validate() error {
                if len(c.Endpoints) == 0 {
                    return errors.New("endpoints required")
                }
                if c.Timeout <= 0 {
                    return errors.New("invalid timeout")
                }
                return nil
            }
            func (c *Config) WithEndpoints(endpoints ...string) *Config {
                c.Endpoints = endpoints
                return c
            }
            ---

02.自定义健康检查
    a.实现方��
        a.功能说明
            自定义健康检查提供服务的具体实现方式,包括API调用、配置文件等。支持批量操作,提高效率。提供错误处理和重试机制。自定义健康检查应该是幂等的,重复调用不产生副作用。支持异步操作,避免阻塞。提供操作日志,便于审计和排查。
        b.代码示例
            ---
            package sd
            import "context"
            type Client struct {
                config *Config
                conn   Connection
            }
            func NewClient(config *Config) (*Client, error) {
                if err := config.Validate(); err != nil {
                    return nil, err
                }
                conn, err := connect(config.Endpoints)
                if err != nil {
                    return nil, err
                }
                return &Client{config: config, conn: conn}, nil
            }
            func (c *Client) Register(ctx context.Context, instance *ServiceInstance) error {
                for i := 0; i < c.config.RetryAttempts; i++ {
                    if err := c.conn.Register(ctx, instance); err == nil {
                        return nil
                    }
                    time.Sleep(time.Second * time.Duration(i+1))
                }
                return errors.New("register failed after retries")
            }
            func (c *Client) Deregister(ctx context.Context, instanceID string) error {
                return c.conn.Deregister(ctx, instanceID)
            }
            func (c *Client) Close() error {
                return c.conn.Close()
            }
            ---
    b.错误处理
        a.功能说明
            错误处理确保服务发现操作的可靠性。区分临时错误和永久错误,采取不同策略。临时错误支持重试,永久错误直接返回。提供详细的错误信息,便于问题定位。错误处理应该记录日志。支持错误回调,通知上层应用。错误处理不应该影响系统稳定性。
        b.代码示例
            ---
            package sd
            import "errors"
            type ErrorType int
            const (
                ErrorTypeTemporary ErrorType = iota
                ErrorTypePermanent
            )
            type SDError struct {
                Type    ErrorType
                Message string
                Cause   error
            }
            func (e *SDError) Error() string {
                return e.Message
            }
            func (e *SDError) Unwrap() error {
                return e.Cause
            }
            func HandleError(err error, retryFunc func() error) error {
                if err == nil {
                    return nil
                }
                sdErr, ok := err.(*SDError)
                if !ok {
                    return err
                }
                if sdErr.Type == ErrorTypeTemporary {
                    return retryFunc()
                }
                return sdErr
            }
            ---

03.健康状态管理
    a.核心功能
        a.功能说明
            健康状态管理是服务发现的关键功能,提供服务的核心能力。支持实时更新,快速响应变化。提供高性能查询,满足高并发需求。健康状态管理应该是可扩展的,支持自定义扩展。提供监控指标,便于性能分析。健康状态管理应该容错,部分失败不影响整体。
        b.代码示例
            ---
            package sd
            import ("context"; "sync")
            type Manager struct {
                instances map[string][]*ServiceInstance
                mu        sync.RWMutex
                watchers  []Watcher
            }
            func NewManager() *Manager {
                return &Manager{
                    instances: make(map[string][]*ServiceInstance),
                    watchers:  make([]Watcher, 0),
                }
            }
            func (m *Manager) Add(instance *ServiceInstance) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.instances[instance.Name] = append(m.instances[instance.Name], instance)
                m.notifyWatchers(instance.Name)
            }
            func (m *Manager) Remove(instanceID string) {
                m.mu.Lock()
                defer m.mu.Unlock()
                for name, instances := range m.instances {
                    for i, inst := range instances {
                        if inst.ID == instanceID {
                            m.instances[name] = append(instances[:i], instances[i+1:]...)
                            m.notifyWatchers(name)
                            return
                        }
                    }
                }
            }
            func (m *Manager) Get(serviceName string) []*ServiceInstance {
                m.mu.RLock()
                defer m.mu.RUnlock()
                return m.instances[serviceName]
            }
            func (m *Manager) Watch(watcher Watcher) {
                m.mu.Lock()
                defer m.mu.Unlock()
                m.watchers = append(m.watchers, watcher)
            }
            func (m *Manager) notifyWatchers(serviceName string) {
                for _, watcher := range m.watchers {
                    go watcher.OnChange(serviceName, m.instances[serviceName])
                }
            }
            type Watcher interface {
                OnChange(serviceName string, instances []*ServiceInstance)
            }
            ---
    b.最佳实践
        a.功能说明
            最佳实践总结服务发现的经验和建议。合理设置超时和重试参数。使用连接池提高性能。定期清理过期数据。监控服务发现的性能指标。做好容错和降级处理。定期测试故障场景。保持服务发现组件的版本更新。
        b.代码示例
            ---
            package sd
            import "time"
            type BestPractices struct {
                client        *Client
                healthChecker *HealthChecker
                cache         *Cache
            }
            func NewBestPractices(config *Config) (*BestPractices, error) {
                client, err := NewClient(config)
                if err != nil {
                    return nil, err
                }
                return &BestPractices{
                    client:        client,
                    healthChecker: NewHealthChecker(config.HealthCheckTTL),
                    cache:         NewCache(5 * time.Minute),
                }, nil
            }
            func (bp *BestPractices) RegisterWithHealthCheck(ctx context.Context, instance *ServiceInstance) error {
                if err := bp.client.Register(ctx, instance); err != nil {
                    return err
                }
                bp.healthChecker.Start(instance.ID, func() bool {
                    return checkHealth(instance)
                })
                return nil
            }
            func (bp *BestPractices) DiscoverWithCache(ctx context.Context, serviceName string) ([]*ServiceInstance, error) {
                if cached := bp.cache.Get(serviceName); cached != nil {
                    return cached.([]*ServiceInstance), nil
                }
                instances, err := bp.client.Discover(ctx, serviceName)
                if err != nil {
                    return nil, err
                }
                bp.cache.Set(serviceName, instances)
                return instances, nil
            }
            ---

7 实战应用

7.1 项目搭建

01.项目结构
    a.基本概念
        a.功能说明
            项目结构是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。项目结构应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。项目结构应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.依赖管理
    a.核心功能
        a.功能说明
            依赖管理提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。依赖管理应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.配置文件
    a.实践经验
        a.功能说明
            配置文件总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。配置文件应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。配置文件应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.2 配置管理

01.配置加载
    a.基本概念
        a.功能说明
            配置加载是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。配置加载应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。配置加载应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.环境配置
    a.核心功能
        a.功能说明
            环境配置提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。环境配置应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.动态配置
    a.实践经验
        a.功能说明
            动态配置总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。动态配置应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。动态配置应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.3 完整案例

01.用户服务
    a.基本概念
        a.功能说明
            用户服务是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。用户服务应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。用户服务应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.订单服务
    a.核心功能
        a.功能说明
            订单服务提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。订单服务应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.服务集成
    a.实践经验
        a.功能说明
            服务集成总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。服务集成应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。服务集成应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.4 性能调优

01.性能分析
    a.基本概念
        a.功能说明
            性能分析是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。性能分析应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。性能分析应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.优化策略
    a.核心功能
        a.功能说明
            优化策略提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。优化策略应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.压力测试
    a.实践经验
        a.功能说明
            压力测试总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。压力测试应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。压力测试应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.5 监控运维

01.监控系统
    a.基本概念
        a.功能说明
            监控系统是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。监控系统应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。监控系统应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.日志收集
    a.核心功能
        a.功能说明
            日志收集提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。日志收集应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.告警机制
    a.实践经验
        a.功能说明
            告警机制总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。告警机制应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。告警机制应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.6 常见问题

01.问题排查
    a.基本概念
        a.功能说明
            问题排查是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。问题排查应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。问题排查应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.错误处理
    a.核心功能
        a.功能说明
            错误处理提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。错误处理应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.调试技巧
    a.实践经验
        a.功能说明
            调试技巧总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。调试技巧应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。调试技巧应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

7.7 最佳实践

01.设计原则
    a.基本概念
        a.功能说明
            设计原则是实战应用的基础部分,提供项目的基本框架和结构。遵循go-kit的最佳实践,采用清晰的分层架构。设计原则应该易于理解和维护,便于团队协作。支持模块化设计,各模块职责清晰。提供完整的示例代码,便于学习和参考。设计原则应该考虑可扩展性,便于后续功能添加。
        b.代码示例
            ---
            package main
            import ("context"; "fmt"; "net/http"; "os"; "os/signal")
            func main() {
                var (
                    httpAddr = ":8080"
                    logger   = log.NewLogfmtLogger(os.Stderr)
                )
                var svc Service
                svc = NewBasicService()
                svc = LoggingMiddleware(logger)(svc)
                endpoints := MakeEndpoints(svc)
                endpoints = ApplyMiddleware(endpoints, logger)
                handler := MakeHTTPHandler(endpoints, logger)
                errs := make(chan error)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", httpAddr)
                    errs <- http.ListenAndServe(httpAddr, handler)
                }()
                logger.Log("exit", <-errs)
            }
            type Service interface {
                CreateUser(ctx context.Context, username, email string) (User, error)
                GetUser(ctx context.Context, id string) (User, error)
            }
            type basicService struct{}
            func NewBasicService() Service {
                return &basicService{}
            }
            func (s *basicService) CreateUser(ctx context.Context, username, email string) (User, error) {
                return User{ID: generateID(), Username: username, Email: email}, nil
            }
            func (s *basicService) GetUser(ctx context.Context, id string) (User, error) {
                return User{ID: id, Username: "user", Email: "user@example.com"}, nil
            }
            ---
    b.实现细节
        a.功能说明
            实现细节包括具体的代码实现和技术选型。使用标准库和成熟的第三方库。代码应该遵循Go语言规范,保持一致的风格。提供详细的注释,说明关键逻辑。实现应该考虑性能和资源使用。提供错误处理和日志记录。实现应该易于测试和调试。
        b.代码示例
            ---
            package service
            import "context"
            type Endpoints struct {
                CreateUserEndpoint endpoint.Endpoint
                GetUserEndpoint    endpoint.Endpoint
            }
            func MakeEndpoints(s Service) Endpoints {
                return Endpoints{
                    CreateUserEndpoint: MakeCreateUserEndpoint(s),
                    GetUserEndpoint:    MakeGetUserEndpoint(s),
                }
            }
            func MakeCreateUserEndpoint(s Service) endpoint.Endpoint {
                return func(ctx context.Context, request interface{}) (interface{}, error) {
                    req := request.(CreateUserRequest)
                    user, err := s.CreateUser(ctx, req.Username, req.Email)
                    if err != nil {
                        return CreateUserResponse{Err: err}, nil
                    }
                    return CreateUserResponse{User: user}, nil
                }
            }
            type CreateUserRequest struct {
                Username string `json:"username"`
                Email    string `json:"email"`
            }
            type CreateUserResponse struct {
                User User   `json:"user,omitempty"`
                Err  error  `json:"error,omitempty"`
            }
            ---

02.代码规范
    a.核心功能
        a.功能说明
            代码规范提供项目的核心功能实现,是系统的主要业务逻辑。功能应该完整且健壮,处理各种边界情况。提供清晰的API接口,便于调用。代码规范应该高性能,满足业务需求。支持并发处理,充分利用系统资源。提供完善的错误处理和日志记录。
        b.代码示例
            ---
            package transport
            import ("context"; "encoding/json"; "net/http")
            func MakeHTTPHandler(endpoints Endpoints, logger log.Logger) http.Handler {
                m := http.NewServeMux()
                m.Handle("/users", httptransport.NewServer(
                    endpoints.CreateUserEndpoint,
                    decodeCreateUserRequest,
                    encodeResponse,
                ))
                m.Handle("/users/", httptransport.NewServer(
                    endpoints.GetUserEndpoint,
                    decodeGetUserRequest,
                    encodeResponse,
                ))
                return m
            }
            func decodeCreateUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                var req CreateUserRequest
                if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
                    return nil, err
                }
                return req, nil
            }
            func decodeGetUserRequest(_ context.Context, r *http.Request) (interface{}, error) {
                id := r.URL.Path[len("/users/"):]
                return GetUserRequest{ID: id}, nil
            }
            func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
                return json.NewEncoder(w).Encode(response)
            }
            ---
    b.扩展功能
        a.功能说明
            扩展功能提供额外的增强特性,提升系统能力。扩展应该是可选的,不影响核心功能。支持插件化设计,便于功能扩展。扩展功能应该文档完善,便于使用。提供配置选项,灵活控制扩展行为。扩展应该经过充分测试,确保稳定性。
        b.代码示例
            ---
            package middleware
            import "context"
            func ApplyMiddleware(endpoints Endpoints, logger log.Logger) Endpoints {
                endpoints.CreateUserEndpoint = LoggingMiddleware(logger)(endpoints.CreateUserEndpoint)
                endpoints.CreateUserEndpoint = InstrumentingMiddleware(duration)(endpoints.CreateUserEndpoint)
                endpoints.GetUserEndpoint = LoggingMiddleware(logger)(endpoints.GetUserEndpoint)
                endpoints.GetUserEndpoint = InstrumentingMiddleware(duration)(endpoints.GetUserEndpoint)
                return endpoints
            }
            func LoggingMiddleware(logger log.Logger) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        logger.Log("msg", "calling endpoint")
                        defer logger.Log("msg", "called endpoint")
                        return next(ctx, request)
                    }
                }
            }
            func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
                return func(next endpoint.Endpoint) endpoint.Endpoint {
                    return func(ctx context.Context, request interface{}) (interface{}, error) {
                        defer func(begin time.Time) {
                            duration.Observe(time.Since(begin).Seconds())
                        }(time.Now())
                        return next(ctx, request)
                    }
                }
            }
            ---

03.部署策略
    a.实践经验
        a.功能说明
            部署策略总结项目实施的经验和教训,提供实用的指导建议。包括架构设计、技术选型、性能优化等方面。部署策略应该基于实际项目经验,具有参考价值。提供具体的案例和代码示例。部署策略应该持续更新,反映最新的实践。帮助开发者避免常见陷阱,提高开发效率。
        b.代码示例
            ---
            package main
            import ("context"; "time")
            type Config struct {
                HTTPAddr        string
                GRPCAddr        string
                ConsulAddr      string
                JaegerAddr      string
                LogLevel        string
                ShutdownTimeout time.Duration
            }
            func LoadConfig() (*Config, error) {
                return &Config{
                    HTTPAddr:        getEnv("HTTP_ADDR", ":8080"),
                    GRPCAddr:        getEnv("GRPC_ADDR", ":8081"),
                    ConsulAddr:      getEnv("CONSUL_ADDR", "localhost:8500"),
                    JaegerAddr:      getEnv("JAEGER_ADDR", "localhost:6831"),
                    LogLevel:        getEnv("LOG_LEVEL", "info"),
                    ShutdownTimeout: 30 * time.Second,
                }, nil
            }
            func getEnv(key, defaultValue string) string {
                if value := os.Getenv(key); value != "" {
                    return value
                }
                return defaultValue
            }
            func GracefulShutdown(server *http.Server, timeout time.Duration) error {
                ctx, cancel := context.WithTimeout(context.Background(), timeout)
                defer cancel()
                return server.Shutdown(ctx)
            }
            func Run() error {
                config, err := LoadConfig()
                if err != nil {
                    return err
                }
                logger := setupLogger(config.LogLevel)
                tracer, closer, err := setupTracing(config.JaegerAddr)
                if err != nil {
                    return err
                }
                defer closer.Close()
                svc := setupService(logger)
                endpoints := setupEndpoints(svc, logger, tracer)
                server := setupHTTPServer(config.HTTPAddr, endpoints, logger)
                errs := make(chan error, 1)
                go func() {
                    c := make(chan os.Signal, 1)
                    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
                    errs <- fmt.Errorf("%s", <-c)
                }()
                go func() {
                    logger.Log("transport", "HTTP", "addr", config.HTTPAddr)
                    errs <- server.ListenAndServe()
                }()
                logger.Log("exit", <-errs)
                return GracefulShutdown(server, config.ShutdownTimeout)
            }
            ---
    b.总结建议
        a.功能说明
            总结建议提供项目开发的关键要点和注意事项。强调重要的设计原则和最佳实践。提供问题解决的思路和方法。总结应该简洁明了,便于记忆和应用。包括性能优化、安全加固、运维部署等方面。帮助团队建立统一的开发规范。
        b.代码示例
            ---
            package best
            import "context"
            // 1. 使用接口定义服务
            type UserService interface {
                Create(ctx context.Context, user User) error
                Get(ctx context.Context, id string) (User, error)
            }
            // 2. 使用中间件增强功能
            func WithLogging(svc UserService, logger log.Logger) UserService {
                return &loggingMiddleware{next: svc, logger: logger}
            }
            // 3. 使用Context传递请求信息
            func (s *service) Create(ctx context.Context, user User) error {
                requestID := ctx.Value("request_id")
                s.logger.Log("request_id", requestID, "action", "create_user")
                return s.repo.Save(ctx, user)
            }
            // 4. 统一错误处理
            type AppError struct {
                Code    int
                Message string
                Cause   error
            }
            func (e *AppError) Error() string {
                return e.Message
            }
            // 5. 使用配置管理
            type ServiceConfig struct {
                Database DatabaseConfig
                Redis    RedisConfig
                HTTP     HTTPConfig
            }
            func LoadServiceConfig(path string) (*ServiceConfig, error) {
                data, err := ioutil.ReadFile(path)
                if err != nil {
                    return nil, err
                }
                var config ServiceConfig
                if err := yaml.Unmarshal(data, &config); err != nil {
                    return nil, err
                }
                return &config, nil
            }
            ---

'+_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 *) */