feat: add transcode

This commit is contained in:
langhuihui
2024-08-27 20:38:08 +08:00
parent 2261d75ac1
commit 1b61f86362
88 changed files with 1295 additions and 97 deletions

1
.gitignore vendored
View File

@@ -8,3 +8,4 @@ dump
record
bin
.DS_Store
.db

29
api.go
View File

@@ -147,18 +147,17 @@ func (s *Server) StreamInfo(ctx context.Context, req *pb.StreamSnapRequest) (res
}
func (s *Server) TaskTree(context.Context, *emptypb.Empty) (res *pb.TaskTreeResponse, err error) {
var fillData func(m task.IJob) *pb.TaskTreeResponse
fillData = func(m task.IJob) (res *pb.TaskTreeResponse) {
res = &pb.TaskTreeResponse{Id: m.GetTaskID(), State: uint32(m.GetState()), Blocked: m.Blocked(), Type: uint32(m.GetTaskType()), Owner: m.GetOwnerType(), StartTime: timestamppb.New(m.GetTask().StartTime), Description: maps.Collect(func(yield func(key, value string) bool) {
var fillData func(m task.ITask) *pb.TaskTreeResponse
fillData = func(m task.ITask) (res *pb.TaskTreeResponse) {
res = &pb.TaskTreeResponse{Id: m.GetTaskID(), State: uint32(m.GetState()), Type: uint32(m.GetTaskType()), Owner: m.GetOwnerType(), StartTime: timestamppb.New(m.GetTask().StartTime), Description: maps.Collect(func(yield func(key, value string) bool) {
for k, v := range m.GetTask().Description {
yield(k, fmt.Sprintf("%v", v))
yield(k, fmt.Sprintf("%+v", v))
}
})}
for t := range m.RangeSubTask {
if marcoTask, ok := t.(task.IJob); ok {
res.Children = append(res.Children, fillData(marcoTask))
} else {
res.Children = append(res.Children, &pb.TaskTreeResponse{Id: t.GetTaskID(), State: uint32(t.GetState()), Type: uint32(t.GetTaskType()), Owner: t.GetOwnerType(), StartTime: timestamppb.New(t.GetTask().StartTime)})
if job, ok := m.(task.IJob); ok {
res.Blocked = job.Blocked()
for t := range job.RangeSubTask {
res.Children = append(res.Children, fillData(t))
}
}
return
@@ -167,19 +166,19 @@ func (s *Server) TaskTree(context.Context, *emptypb.Empty) (res *pb.TaskTreeResp
return
}
func (s *Server) GetSubscribers(ctx context.Context, req *pb.SubscribersRequest) (res *pb.SubscribersResponse, err error) {
func (s *Server) GetSubscribers(context.Context, *pb.SubscribersRequest) (res *pb.SubscribersResponse, err error) {
s.Streams.Call(func() error {
var subscribers []*pb.SubscriberSnapShot
for subscriber := range s.Subscribers.Range {
meta, _ := json.Marshal(subscriber.Description)
snap := &pb.SubscriberSnapShot{
Id: uint32(subscriber.ID),
Id: subscriber.ID,
StartTime: timestamppb.New(subscriber.StartTime),
Meta: string(meta),
}
if ar := subscriber.AudioReader; ar != nil {
snap.AudioReader = &pb.RingReaderSnapShot{
Sequence: uint32(ar.Value.Sequence),
Sequence: ar.Value.Sequence,
Timestamp: ar.AbsTime,
Delay: ar.Delay,
State: int32(ar.State),
@@ -187,7 +186,7 @@ func (s *Server) GetSubscribers(ctx context.Context, req *pb.SubscribersRequest)
}
if vr := subscriber.VideoReader; vr != nil {
snap.VideoReader = &pb.RingReaderSnapShot{
Sequence: uint32(vr.Value.Sequence),
Sequence: vr.Value.Sequence,
Timestamp: vr.AbsTime,
Delay: vr.Delay,
State: int32(vr.State),
@@ -203,7 +202,7 @@ func (s *Server) GetSubscribers(ctx context.Context, req *pb.SubscribersRequest)
})
return
}
func (s *Server) AudioTrackSnap(ctx context.Context, req *pb.StreamSnapRequest) (res *pb.TrackSnapShotResponse, err error) {
func (s *Server) AudioTrackSnap(_ context.Context, req *pb.StreamSnapRequest) (res *pb.TrackSnapShotResponse, err error) {
s.Streams.Call(func() error {
if pub, ok := s.Streams.Get(req.StreamPath); ok && pub.HasAudioTrack() {
res = &pb.TrackSnapShotResponse{}
@@ -301,7 +300,7 @@ func (s *Server) VideoTrackSnap(ctx context.Context, req *pb.StreamSnapRequest)
if sub.VideoReader == nil {
continue
}
res.Reader[uint32(sub.ID)] = sub.VideoReader.Value.Sequence
res.Reader[sub.ID] = sub.VideoReader.Value.Sequence
}
pub.VideoTrack.Ring.Do(func(v *pkg.AVFrame) {
if v.TryRLock() {

View File

@@ -15,6 +15,7 @@ import (
_ "m7s.live/m7s/v5/plugin/rtmp"
_ "m7s.live/m7s/v5/plugin/rtsp"
_ "m7s.live/m7s/v5/plugin/stress"
_ "m7s.live/m7s/v5/plugin/transcode"
//_ "m7s.live/m7s/v5/plugin/vmlog"
_ "m7s.live/m7s/v5/plugin/webrtc"
)

View File

@@ -1,8 +1,8 @@
global:
loglevel: debug
flv:
onpub:
record:
enableregexp: true
# fragment: 10s
recordlist:
.+: record/$0
.+:
filepath: record/$0
fragment: 10s

View File

@@ -1,7 +1,7 @@
global:
loglevel: debug
mp4:
onpub:
record:
enableregexp: true
recordlist:
.+: record/$0.mp4
.+:
filepath: record/$0.mp4

View File

@@ -0,0 +1,9 @@
global:
loglevel: debug
transcode:
onpub:
transform:
.+:
output:
- target: rtmp://localhost/$0/h265
conf: -c:v h265

1
go.mod
View File

@@ -24,6 +24,7 @@ require (
github.com/pion/rtp v1.8.6
github.com/pion/sdp/v3 v3.0.9
github.com/pion/webrtc/v3 v3.2.12
github.com/pkg/errors v0.9.1
github.com/quic-go/quic-go v0.43.1
github.com/rs/zerolog v1.33.0
github.com/samber/slog-common v0.17.1

1
go.sum
View File

@@ -219,6 +219,7 @@ github.com/pion/turn/v2 v2.1.2/go.mod h1:1kjnPkBcex3dhCU2Am+AAmxDcGhLX3WnMfmkNpv
github.com/pion/webrtc/v3 v3.2.12 h1:pVqz5NdtTqyhKIhMcXR8bPp709kCf9blyAhDjoVRLvA=
github.com/pion/webrtc/v3 v3.2.12/go.mod h1:/Oz6K95CGWaN+3No+Z0NYvgOPOr3aY8UyTlMm/dec3A=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=

View File

@@ -339,3 +339,9 @@ func (config *Config) assign(k string, v any) (target reflect.Value) {
}
return
}
func Parse(target any, conf map[string]any) {
var c Config
c.Parse(target)
c.ParseModifyFile(conf)
}

View File

@@ -54,9 +54,12 @@ type (
Append bool `desc:"是否追加录制"` // 是否追加录制
}
Transform struct {
Input any
Output []struct {
Target string `desc:"转码目标"` // 转码目标
Conf any
}
}
OnPublish struct {
Push map[Regexp]Push
Record map[Regexp]Record

View File

@@ -3,7 +3,6 @@ package pkg
import (
"fmt"
"log/slog"
"m7s.live/m7s/v5/pkg/task"
"m7s.live/m7s/v5/pkg/util"
"sync"
"time"
@@ -140,7 +139,7 @@ func (rb *RingWriter) Step() (normal bool) {
isIDR := rb.Value.IDR
next := rb.Next()
if isIDR {
rb.SLogger.Log(nil, task.TraceLevel, "add idr")
rb.SLogger.Debug("add idr")
rb.PushIDR()
}
if rb.IDRingList.Len() > 0 {
@@ -154,12 +153,12 @@ func (rb *RingWriter) Step() (normal bool) {
}
} else if next == oldIDR.Value {
if nextOld := oldIDR.Next(); nextOld != nil && rb.durationFrom(nextOld.Value) > rb.BufferRange[0] {
rb.SLogger.Log(nil, task.TraceLevel, "remove old idr")
rb.SLogger.Debug("remove old idr")
rb.Lock()
rb.IDRingList.Remove(oldIDR)
rb.Unlock()
} else {
rb.SLogger.Log(nil, task.TraceLevel, "not enough buffer")
rb.SLogger.Debug("not enough buffer")
rb.glow(5)
next = rb.Next()
}

208
pkg/task/job.go Normal file
View File

@@ -0,0 +1,208 @@
package task
import (
"context"
"errors"
"log/slog"
"reflect"
"slices"
"sync"
"sync/atomic"
"m7s.live/m7s/v5/pkg/util"
)
var idG atomic.Uint32
func GetNextTaskID() uint32 {
return idG.Add(1)
}
// Job include tasks
type Job struct {
Task
addSub chan ITask
children []ITask
lazyRun sync.Once
childrenDisposed chan struct{}
childDisposeListeners []func(ITask)
blocked bool
}
func (*Job) GetTaskType() TaskType {
return TASK_TYPE_JOB
}
func (mt *Job) getJob() *Job {
return mt
}
func (mt *Job) Blocked() bool {
return mt.blocked
}
func (mt *Job) waitChildrenDispose() {
close(mt.addSub)
<-mt.childrenDisposed
}
func (mt *Job) OnChildDispose(listener func(ITask)) {
mt.childDisposeListeners = append(mt.childDisposeListeners, listener)
}
func (mt *Job) onDescendantsDispose(descendants ITask) {
for _, listener := range mt.childDisposeListeners {
listener(descendants)
}
if mt.parent != nil {
mt.parent.onDescendantsDispose(descendants)
}
}
func (mt *Job) onChildDispose(child ITask) {
if child.getParent() == mt {
mt.onDescendantsDispose(child)
child.dispose()
}
}
func (mt *Job) dispose() {
if mt.childrenDisposed != nil {
mt.OnBeforeDispose(mt.waitChildrenDispose)
}
mt.Task.dispose()
}
func (mt *Job) RangeSubTask(callback func(task ITask) bool) {
for _, task := range mt.children {
callback(task)
}
}
func (mt *Job) AddTaskLazy(t IJob) {
task := t.GetTask()
task.parent = mt
task.handler = t
}
func (mt *Job) AddTask(t ITask, opt ...any) (task *Task) {
mt.lazyRun.Do(func() {
if mt.parent != nil && mt.Context == nil {
mt.parent.AddTask(mt.handler)
}
mt.childrenDisposed = make(chan struct{})
mt.addSub = make(chan ITask, 10)
go mt.run()
})
if task = t.GetTask(); task.Context == nil {
task.parentCtx = mt.Context
for _, o := range opt {
switch v := o.(type) {
case context.Context:
task.parentCtx = v
case Description:
task.Description = v
case RetryConfig:
task.retry = v
case *slog.Logger:
task.Logger = v
}
}
if task.parentCtx == nil {
panic("context is nil")
}
task.parent = mt
task.level = mt.level + 1
if task.ID == 0 {
task.ID = GetNextTaskID()
}
task.Context, task.CancelCauseFunc = context.WithCancelCause(task.parentCtx)
task.startup = util.NewPromise(task.Context)
task.shutdown = util.NewPromise(context.Background())
task.handler = t
if task.Logger == nil {
task.Logger = mt.Logger
}
}
if mt.IsStopped() {
task.startup.Reject(mt.StopReason())
return
}
mt.addSub <- t
return
}
func (mt *Job) Call(callback func() error) {
mt.Post(callback).WaitStarted()
}
func (mt *Job) Post(callback func() error) *Task {
task := CreateTaskByCallBack(callback, nil)
return mt.AddTask(task)
}
func (mt *Job) addChild(task ITask) int {
mt.children = append(mt.children, task)
return len(mt.children) - 1
}
func (mt *Job) removeChild(index int) {
defer mt.onChildDispose(mt.children[index])
mt.children = slices.Delete(mt.children, index, index+1)
}
func (mt *Job) run() {
cases := []reflect.SelectCase{{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(mt.addSub)}}
defer func() {
err := recover()
if err != nil {
if mt.Logger != nil {
mt.Logger.Error("job panic", "err", err)
}
mt.Stop(errors.Join(err.(error), ErrPanic))
}
stopReason := mt.StopReason()
for _, task := range mt.children {
task.Stop(stopReason)
mt.onChildDispose(task)
}
mt.children = nil
close(mt.childrenDisposed)
}()
for {
mt.blocked = false
if chosen, rev, ok := reflect.Select(cases); chosen == 0 {
mt.blocked = true
if !ok {
return
}
if task := rev.Interface().(ITask); task.getParent() == mt {
index := mt.addChild(task)
if err := task.start(); err == nil {
cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(task.GetSignal())})
} else {
task.Stop(err)
mt.removeChild(index)
}
} else {
mt.addChild(task)
cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(task.GetSignal())})
}
} else {
taskIndex := chosen - 1
task := mt.children[taskIndex]
switch tt := task.(type) {
case IChannelTask:
tt.Tick(rev.Interface())
}
if !ok {
mt.removeChild(taskIndex)
cases = slices.Delete(cases, chosen, chosen+1)
}
}
if !mt.handler.keepalive() && len(mt.children) == 0 {
mt.Stop(ErrAutoStop)
}
}
}

View File

@@ -20,8 +20,7 @@ var (
ErrRetryRunOut = errors.New("retry out")
ErrTaskComplete = errors.New("complete")
ErrExit = errors.New("exit")
EmptyStart = func() error { return nil }
EmptyDispose = func() {}
ErrPanic = errors.New("panic")
)
const (
@@ -259,43 +258,25 @@ func (task *Task) start() (err error) {
if task.Logger != nil {
task.Debug("task start", "taskId", task.ID, "taskType", task.GetTaskType(), "ownerType", task.GetOwnerType())
}
hasRun := false
for {
task.state = TASK_STATE_STARTING
if v, ok := task.handler.(TaskStarter); ok {
err = v.Start()
}
task.state = TASK_STATE_STARTED
if err == nil {
task.state = TASK_STATE_STARTED
task.ResetRetryCount()
if runHandler, ok := task.handler.(TaskBlock); ok {
hasRun = true
task.state = TASK_STATE_RUNNING
err = runHandler.Run()
if err == nil {
err = ErrTaskComplete
task.Stop(err)
task.dispose()
return ErrTaskComplete
}
}
}
if task.IsStopped() {
return task.StopReason()
}
task.needRetry, err = task.checkRetry(err)
if task.needRetry {
task.Stop(err)
task.dispose()
} else {
break
}
task.needRetry, err = task.checkRetry(err)
}
task.startup.Fulfill(err)
if err != nil {
if hasRun {
task.Stop(err)
task.dispose()
}
return
}
for _, listener := range task.afterStartListeners {
@@ -309,10 +290,16 @@ func (task *Task) start() (err error) {
}
func (task *Task) dispose() {
if task.state < TASK_STATE_STARTED {
return
}
task.state = TASK_STATE_DISPOSING
reason := task.StopReason()
if task.Logger != nil {
task.Debug("task dispose", "reason", reason, "taskId", task.ID, "taskType", task.GetTaskType(), "ownerType", task.GetOwnerType())
taskType, ownerType := task.GetTaskType(), task.GetOwnerType()
yargs := []any{"reason", reason, "taskId", task.ID, "taskType", taskType, "ownerType", ownerType}
task.Debug("task dispose", yargs...)
defer task.Debug("task disposed", yargs...)
}
for _, listener := range task.beforeDisposeListeners {
listener()
@@ -325,9 +312,6 @@ func (task *Task) dispose() {
listener()
}
task.state = TASK_STATE_DISPOSED
if task.Logger != nil {
task.Debug("task disposed", "reason", reason, "taskId", task.ID, "taskType", task.GetTaskType(), "ownerType", task.GetOwnerType())
}
if !errors.Is(reason, ErrTaskComplete) && task.needRetry {
task.Context, task.CancelCauseFunc = context.WithCancelCause(task.parentCtx)
task.startup = util.NewPromise(task.Context)

13
pkg/task/work.go Normal file
View File

@@ -0,0 +1,13 @@
package task
type Work struct {
Job
}
func (m *Work) keepalive() bool {
return true
}
func (*Work) GetTaskType() TaskType {
return TASK_TYPE_Work
}

View File

@@ -2,6 +2,7 @@ package util
import (
"io"
"net"
"net/textproto"
"strings"
)
@@ -35,6 +36,29 @@ func NewBufReaderWithBufLen(reader io.Reader, bufLen int) (r *BufReader) {
//fmt.Println("NewBufReaderWithBufLen", uintptr(unsafe.Pointer(r.allocator)))
return
}
func NewBufReaderBuffersChan(feedChan chan net.Buffers) (r *BufReader) {
r = &BufReader{
Allocator: NewScalableMemoryAllocator(defaultBufSize),
BufLen: defaultBufSize,
feedData: func() error {
data, ok := <-feedChan
if !ok {
return io.EOF
}
for _, buf := range data {
n := len(buf)
r.buf.Size += n
r.buf.Length += n
}
r.buf.Buffers = append(r.buf.Buffers, data...)
return nil
},
}
r.buf.Memory = &Memory{}
return
}
func NewBufReaderChan(feedChan chan []byte) (r *BufReader) {
r = &BufReader{
Allocator: NewScalableMemoryAllocator(defaultBufSize),
@@ -54,6 +78,7 @@ func NewBufReaderChan(feedChan chan []byte) (r *BufReader) {
r.buf.Memory = &Memory{}
return
}
func NewBufReader(reader io.Reader) (r *BufReader) {
return NewBufReaderWithBufLen(reader, defaultBufSize)
}
@@ -144,6 +169,11 @@ func (r *BufReader) ReadRange(n int, yield func([]byte)) (err error) {
return
}
func (r *BufReader) Read(to []byte) (n int, err error) {
err = r.ReadNto(len(to), to)
return
}
func (r *BufReader) ReadNto(n int, to []byte) (err error) {
l := 0
return r.ReadRange(n, func(buf []byte) {

View File

@@ -0,0 +1 @@
import{m as s}from"./vendor-ec30964e.js";import{_ as n}from"./index-fa77b114.js";const _=""+new URL("404-54dd6499.svg",import.meta.url).href;const t=e=>(Vue.pushScopeId("data-v-bed2e9f0"),e=e(),Vue.popScopeId(),e),r={class:"flex flex-col justify-center page-container"},a=t(()=>Vue.createElementVNode("div",{class:"text-center"},[Vue.createElementVNode("img",{src:_,alt:""})],-1)),d={class:"text-center"},p=t(()=>Vue.createElementVNode("h1",{class:"text-base text-gray-500"},"抱歉,你访问的页面不存在",-1)),i=Vue.createTextVNode("回到首页"),l=Vue.defineComponent({setup(e){const o=s();function u(){o.push("/")}return(m,V)=>{const c=Vue.resolveComponent("n-button");return Vue.openBlock(),Vue.createElementBlock("div",r,[a,Vue.createElementVNode("div",d,[p,Vue.createVNode(c,{type:"info",onClick:u},{default:Vue.withCtx(()=>[i]),_:1})])])}}}),x=n(l,[["__scopeId","data-v-bed2e9f0"]]);export{x as default};

View File

@@ -0,0 +1,115 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-24,.cls-25,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#67c8ff;}.cls-14{fill:#8cd7ff;}.cls-15{fill:#b0e7ff;}.cls-16{fill:#728cb9;}.cls-17{fill:#7798b9;}.cls-18{fill:#a4c0d9;}.cls-19{fill:#ebfcff;}.cls-20{fill:#ffb056;}.cls-21{fill:#257fba;}.cls-22{fill:#398eed;}.cls-23{fill:#ffeed2;}.cls-24{stroke:#e49056;stroke-width:0.26px;}.cls-25{stroke:#4986d9;stroke-width:0.1px;}.cls-26{fill:#e55c5c;opacity:0.2;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>404</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M182.43,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a6.39,6.39,0,0,1,.22.78c0,.06,0,.12,0,.19a8.08,8.08,0,0,1,.14.9V175c0,.31,0,.63,0,1V164.28c0-.28,0-.55,0-.82v-.14h0c0-.26-.06-.51-.11-.75l0-.14c0-.06,0-.13,0-.19L184,162c-.05-.17-.1-.33-.16-.49v0h0c-.06-.16-.12-.31-.19-.46s-.09-.17-.13-.25a.93.93,0,0,0-.05-.1.59.59,0,0,1,0-.08,3.74,3.74,0,0,0-.27-.42l-.08-.1-.12-.15c-.05-.06-.1-.13-.16-.19a3,3,0,0,0-.25-.25l-.09-.09A4.06,4.06,0,0,0,182,159l-.11-.07-.12-.07-.18-.12-.5-.23c-.26-.11-.53-.22-.81-.32a2.46,2.46,0,0,1-.29-.09l-.54-.16h0l-.65-.16-.34-.09c-.32-.06-.65-.13-1-.18h0c-.36-.06-.73-.11-1.12-.15l-.39,0-.8-.07H175l-.74,0-.4,0-1.26,0h-2.95v11.49h2.95c.43,0,.85,0,1.26,0l.4,0,.8,0,.79.07.4,0,1.12.16h0l1,.19.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,182.43,170.83Z"/>
<rect class="cls-13" x="122.87" y="157.13" width="29.56" height="11.49"/>
<path class="cls-13"
d="M169.61,106.86q0-.52,0-1c0-.08,0-.15,0-.23s0-.35,0-.52a2.51,2.51,0,0,0,0-.27c0-.25-.06-.49-.1-.73a3.31,3.31,0,0,0,0-.33,1.89,1.89,0,0,1-.05-.23l-.12-.52c0-.11,0-.23-.07-.34a2.41,2.41,0,0,1-.08-.25c0-.14-.08-.27-.13-.4a2,2,0,0,0-.08-.26c0-.12-.09-.23-.14-.35s-.08-.21-.13-.31l0-.15c-.08-.18-.18-.34-.26-.51a1.74,1.74,0,0,1-.1-.19.08.08,0,0,1,0,0c-.14-.25-.3-.49-.46-.72l0,0c-.09-.13-.19-.24-.28-.36s-.2-.25-.3-.36,0,0,0,0l-.45-.43-.26-.24a6.42,6.42,0,0,0-.65-.48l-.13-.1h0l-.46-.27a1.63,1.63,0,0,0-.19-.09l-.52-.25c-.14-.06-.29-.13-.44-.18s-.37-.14-.57-.2l-.31-.1a.58.58,0,0,0-.14,0c-.32-.09-.65-.16-1-.22l-.2,0h-.05c-.4-.06-.83-.11-1.26-.14h0c-.39,0-.79,0-1.2,0H159l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0a3,3,0,0,0-.43.09.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.08,0-.14.1-.53.38-.12.09-.27.23a53.11,53.11,0,0,0-5.87,6.55l-36.44,45.8-2.55,3.17c-.68.86-1.34,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56l.39-.31c.17-.14.35-.26.53-.39a1.64,1.64,0,0,0,.22-.14l.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09h.26c.19,0,.38,0,.57,0,.42,0,.83,0,1.23,0a12.44,12.44,0,0,1,1.26.14l.25,0q.51.09,1,.21l.45.14c.2.06.39.12.57.19l.44.19.52.24c.22.12.44.24.65.37h0l.13.1a6.42,6.42,0,0,1,.65.48c.09.07.17.16.26.24s.31.28.45.43.21.26.32.39.19.23.28.36a7.45,7.45,0,0,1,.5.78l.1.19c.11.21.22.43.31.65s.09.22.13.32a6.32,6.32,0,0,1,.22.61c.05.13.09.26.13.4l.15.59.12.52.09.56c0,.24.08.48.1.73s.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V107.13A2.44,2.44,0,0,0,169.61,106.86Z"/>
<path class="cls-13"
d="M247,164.23c-1,5.13-2.63,9.07-5,11.83a11.68,11.68,0,0,1-.85.87c-.09.09-.18.16-.27.24a6.66,6.66,0,0,1-.59.49c-.19.14-.37.28-.56.4s-.39.27-.6.39l-.38.21c-.28.15-.57.3-.86.43l-.2.08a10,10,0,0,1-1.13.4l-.29.09c-.32.08-.64.16-1,.22L235,180c-.43.07-.87.14-1.32.18h-.23c-.43,0-.87.05-1.33.05s-.9,0-1.34-.05l-.7-.08-.77-.1-.21,0c-.39-.08-.78-.17-1.16-.27s-.48-.16-.72-.25l-.55-.19c-.24-.1-.46-.21-.7-.33s-.33-.14-.48-.23l-.21-.13a8.63,8.63,0,0,1-.82-.51c-.21-.15-.41-.31-.61-.47l-.43-.34c-.21-.19-.41-.39-.6-.59s-.27-.25-.39-.39a12.06,12.06,0,0,1-.77-.94l-.17-.22c-.23-.32-.47-.66-.69-1a1,1,0,0,0-.1-.17c-.2-.34-.4-.69-.59-1a1.62,1.62,0,0,1-.1-.18c-.2-.39-.39-.8-.58-1.22l-.13-.31c-.17-.4-.34-.81-.49-1.24l-.06-.14c-.17-.47-.33-1-.48-1.47l-.12-.43c-.12-.39-.22-.79-.33-1.2,0-.15-.07-.31-.11-.46-.13-.55-.26-1.11-.37-1.68s-.23-1.25-.33-1.9l0-.14c-.1-.61-.19-1.25-.27-1.9,0-.17,0-.34-.07-.51-.07-.57-.13-1.14-.19-1.73,0-.12,0-.23,0-.35l-.09-1c0-.49-.09-1-.13-1.48s0-.75-.07-1.12-.06-1-.09-1.51,0-.81-.05-1.21,0-1-.07-1.55l0-1.3,0-1.61c0-.85,0-1.7,0-2.57v11.48c0,.75,0,1.49,0,2.21,0,.13,0,.24,0,.36,0,.55,0,1.08,0,1.61s0,.88,0,1.3,0,1,.07,1.56,0,.82.05,1.21l.09,1.5c0,.38,0,.76.07,1.12,0,.51.09,1,.13,1.49,0,.29.05.6.08.89,0,0,0,.09,0,.13s0,.23,0,.35c.06.59.12,1.16.19,1.72,0,.18.05.35.07.52.08.65.17,1.28.27,1.9l0,.14c.06.41.13.82.2,1.21,0,.23.09.46.13.68.11.58.24,1.14.37,1.69,0,.15.07.3.11.46s.09.37.14.55.12.43.19.65l.12.43c.15.48.3,1,.46,1.42,0,0,0,0,0,0l.06.14c.15.43.32.84.49,1.24l.13.31.11.26c.15.33.31.65.47,1a1.62,1.62,0,0,0,.1.18c.09.18.19.36.29.54l.3.5.1.17c.18.28.36.56.54.82l.16.2.16.22c.25.33.5.64.77.94l.06.06c.1.12.22.22.33.33s.39.4.6.58.29.23.43.35.4.32.61.47l.07.06q.38.24.75.45l.21.13h0l.46.22c.23.11.46.23.7.33l.55.19c.24.08.47.17.72.24l0,0c.37.1.74.18,1.12.25l.21,0,.2,0c.18,0,.38,0,.57.06s.46.07.7.08l.15,0c.39,0,.78,0,1.19,0h.26c.36,0,.72,0,1.07-.06h.26c.38,0,.76-.08,1.13-.14l.16,0,.32-.07.52-.1.45-.13.29-.08.18-.05c.31-.1.6-.2.89-.32l.06,0,.2-.09.62-.28c.09,0,.16-.1.24-.14l.38-.21c.1-.07.21-.12.31-.18l.29-.21.56-.4.24-.18.35-.31.27-.24a11.84,11.84,0,0,0,.85-.88c2.39-2.75,4-6.69,5-11.82a113.49,113.49,0,0,0,1.44-20.15V144.08A113.42,113.42,0,0,1,247,164.23Z"/>
<path class="cls-13"
d="M267.31,143.7c0-.12,0-.23,0-.34,0-.49,0-1,0-1.43s0-.69,0-1c0-.5,0-1-.06-1.46,0-.31,0-.62,0-.92,0-.54-.06-1.08-.1-1.61,0-.23,0-.46,0-.68-.06-.75-.12-1.49-.19-2.22v0c-.06-.63-.13-1.25-.2-1.87,0-.19-.05-.37-.07-.56-.06-.43-.11-.86-.17-1.29,0-.22-.07-.43-.1-.65-.06-.39-.12-.78-.19-1.17,0-.21-.07-.42-.1-.62l-.06-.35c0-.14-.06-.27-.08-.41l-.33-1.63c-.05-.21-.09-.42-.14-.63-.16-.71-.33-1.41-.51-2.08h0c-.16-.6-.33-1.19-.51-1.76l-.18-.56c-.12-.38-.25-.77-.38-1.14,0-.07,0-.14-.07-.21s-.13-.32-.19-.49l-.3-.8c-.09-.23-.19-.46-.29-.69s-.21-.51-.32-.76c0-.08-.07-.17-.11-.25-.13-.29-.27-.58-.4-.86-.34-.68-.7-1.34-1.06-2-.05-.08-.09-.17-.13-.25l-.18-.29c-.2-.34-.4-.68-.6-1s-.23-.38-.35-.56c-.23-.36-.47-.72-.72-1.07-.07-.11-.14-.22-.22-.33l0-.06q-.56-.77-1.14-1.5l-.3-.37c-.3-.36-.61-.72-.92-1.07-.06-.07-.13-.16-.2-.23l-.17-.17c-.44-.49-.9-1-1.37-1.41l-1-.92-.32-.27-.74-.61-.37-.28q-.4-.31-.81-.6l-.29-.21-.1-.07-.42-.27c-.26-.18-.53-.35-.8-.52l-.56-.33-.78-.45-.18-.1-.29-.15c-.42-.21-.83-.42-1.26-.62l-.48-.22c-.57-.25-1.14-.49-1.73-.71s-.91-.33-1.37-.48l-.46-.14-.74-.22-.17,0c-.49-.14-1-.26-1.49-.37l-.24-.06c-.59-.13-1.18-.24-1.79-.34l-.12,0-.57-.08-1-.13-.75-.08-1-.09-.25,0-.79,0-.52,0c-.54,0-1.08,0-1.63,0h-.91c-.35,0-.7,0-1.05,0l-.47,0-1.41.1h-.07c-.45.05-.9.09-1.34.15l-.41.06-.91.13-.13,0-.41.07-.69.13-.55.11-.67.15-.19,0-.37.1-.61.15-.56.16-.59.18-.21.06-.33.12-.59.2-.53.19-.57.22-.24.09-.27.12-.62.26-.48.22-.61.3-.28.13a1.51,1.51,0,0,1-.18.09l-.76.42-.36.19c-.37.21-.73.43-1.09.65l0,0c-.58.36-1.13.75-1.67,1.15-.17.11-.32.24-.48.36s-.45.33-.66.51-.32.28-.48.41l-.55.48c-.37.33-.73.68-1.08,1l-.44.43c-.48.5-1,1-1.4,1.56l-.17.22c-.39.47-.77,1-1.13,1.47-.14.19-.27.39-.4.58-.28.41-.56.82-.82,1.24l-.41.67c-.26.44-.51.89-.76,1.35l-.33.62c-.34.68-.67,1.36-1,2.07A55.46,55.46,0,0,0,198,128.9a127.46,127.46,0,0,0-1.1,17.57V158a127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127c.31-.71.64-1.4,1-2.07l.33-.62c.25-.46.5-.91.76-1.35l.41-.67c.26-.42.54-.84.82-1.24.13-.2.26-.4.4-.59.36-.5.74-1,1.13-1.46l.17-.22c.45-.54.92-1.06,1.4-1.56l.44-.44q.52-.53,1.08-1l.55-.48c.37-.32.75-.62,1.14-.92.16-.12.31-.25.48-.37.55-.4,1.12-.8,1.7-1.17.36-.22.72-.44,1.09-.65l.36-.2.76-.41.46-.23.61-.29.48-.22.62-.27.51-.2.57-.22.53-.2.59-.2.54-.17.59-.18.56-.16.61-.15.56-.14.66-.15.56-.11.68-.13.55-.1.91-.13.41-.05c.44-.06.89-.11,1.34-.15h.07c.46,0,.93-.08,1.41-.1l.47,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.52,0,1,.06c.33,0,.65.06,1,.09l.75.07,1,.14.69.1c.61.1,1.2.21,1.79.34l.24,0,1.49.37.91.27.46.14c.46.15.92.31,1.37.48s1.16.46,1.73.71l.48.22c.43.2.84.4,1.26.62l.47.25q.39.21.78.45c.19.11.38.21.56.33s.54.34.8.51l.52.35.29.21c.27.19.55.39.81.6l.36.28c.26.2.5.4.75.61l.32.27c.34.3.68.6,1,.92s.93.92,1.37,1.4l.37.41c.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.14,1.5l.26.39c.25.35.49.71.72,1.07l.35.55.6,1,.31.54c.36.65.72,1.31,1.06,2l.51,1.11c.11.25.22.5.32.76s.2.45.29.69l.3.8c.09.23.18.46.26.7s.26.75.38,1.14l.18.56c.18.57.35,1.16.51,1.76h0c.18.67.35,1.37.51,2.07.05.21.09.43.14.64.11.53.22,1.08.33,1.63,0,.25.09.5.14.75s.07.42.1.63c.07.39.13.77.19,1.17,0,.21.07.43.1.65.06.42.11.85.17,1.29,0,.19.05.37.07.56.07.62.14,1.25.21,1.9s.13,1.46.19,2.21c0,.23,0,.46,0,.69,0,.53.07,1.07.1,1.61,0,.3,0,.61,0,.91,0,.49.05,1,.06,1.46s0,.68,0,1,0,1,0,1.43c0,.67,0,1.34,0,2h0V145.37C267.32,144.81,267.32,144.25,267.31,143.7Z"/>
<path class="cls-13"
d="M356.8,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a5.92,5.92,0,0,1,.22.78,1.06,1.06,0,0,1,0,.19,8.46,8.46,0,0,1,.14.9.49.49,0,0,0,0,.12c0,.31,0,.64,0,1V164.28c0-.29,0-.57,0-.84a.49.49,0,0,1,0-.12h0c0-.25-.06-.5-.1-.74,0,0,0-.1,0-.15a1.29,1.29,0,0,0,0-.19c0-.09,0-.19-.06-.27s-.1-.35-.16-.51h0c-.06-.16-.12-.32-.19-.47s-.09-.17-.13-.25l-.05-.1s0-.05,0-.08-.17-.28-.26-.42l-.09-.1-.12-.15-.16-.2-.25-.24-.09-.09a4.06,4.06,0,0,0-.46-.36l-.11-.07-.12-.07-.19-.12-.49-.23c-.26-.11-.53-.22-.81-.31l-.29-.1-.54-.16h0l-.65-.16-.34-.08-1-.19h-.09c-.36-.06-.74-.11-1.12-.15l-.38,0-.82-.07h-.05l-.73,0-.41,0-1.26,0h-3v11.49h3c.43,0,.85,0,1.26,0l.4,0,.79,0,.82.07.38,0,1.12.16h.09l1,.18.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,356.8,170.83Z"/>
<rect class="cls-13" x="297.24" y="157.13" width="29.56" height="11.49"/>
<path class="cls-13"
d="M344,106.86c0-.35,0-.69,0-1,0-.08,0-.15,0-.23s0-.35,0-.52,0-.18,0-.27c0-.25-.06-.49-.1-.73s0-.23-.05-.33a1.89,1.89,0,0,0-.05-.23c0-.18-.07-.35-.11-.52s-.05-.23-.08-.34a1.83,1.83,0,0,0-.08-.25l-.12-.4c0-.09-.05-.18-.08-.26s-.09-.23-.14-.35-.08-.21-.13-.31l-.06-.15c-.08-.18-.17-.34-.26-.51a1.74,1.74,0,0,0-.1-.19.08.08,0,0,0,0,0q-.21-.37-.45-.72l0,0c-.09-.12-.19-.24-.29-.35s-.19-.26-.29-.37l0,0a6.14,6.14,0,0,0-.45-.43l-.25-.24a7.62,7.62,0,0,0-.64-.48l-.14-.1h0l-.46-.27a1.11,1.11,0,0,0-.19-.09c-.16-.09-.34-.17-.51-.25s-.29-.13-.44-.18l-.57-.2-.31-.1-.14,0a9.78,9.78,0,0,0-1-.22l-.2,0h0c-.41-.06-.83-.11-1.27-.14h0c-.38,0-.78,0-1.19,0h-.14l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0c-.15,0-.29,0-.43.09a.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.07,0-.14.11a4.7,4.7,0,0,0-.53.38l-.12.08-.28.24a53,53,0,0,0-5.88,6.55l-36.43,45.8c-1,1.25-1.86,2.31-2.54,3.17s-1.36,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56l.4-.32.53-.38.21-.14.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09H333c.19,0,.37,0,.57,0,.42,0,.83,0,1.22,0a12.65,12.65,0,0,1,1.27.14l.25,0q.51.09,1,.21l.45.14c.19.06.39.12.57.19l.44.19.51.24c.23.12.45.24.65.37h0l.15.1a7.62,7.62,0,0,1,.64.48c.09.07.17.16.26.24s.3.28.44.43a3.89,3.89,0,0,1,.32.39c.1.12.2.23.29.36a6.07,6.07,0,0,1,.49.78,1.14,1.14,0,0,1,.1.19c.11.21.22.43.32.65s.09.21.13.32.15.4.22.61l.12.39c.06.2.11.4.16.6s.08.34.11.52.07.37.1.56.07.48.1.73.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V106.86Z"/>
<path class="cls-14"
d="M181.06,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.61,5.45c-1.74,1.15-4.36,1.72-7.84,1.72h-4.19v12q0,5-2.34,7.39a9.16,9.16,0,0,1-12.48-.07c-1.58-1.65-2.37-4.1-2.37-7.32v-12H117.92q-6.53,0-9.79-2.78a9.36,9.36,0,0,1-3.27-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56,8.12,8.12,0,0,1,5.54-2q10.44,0,10.45,11.25v50h2.95A22.17,22.17,0,0,1,181.06,170Zm-28.63-1.35V131.09l-29.56,37.53h29.56"/>
<path class="cls-14"
d="M262.1,126.69q5.22,10.67,5.22,30.17A104.74,104.74,0,0,1,266,175.07a40.85,40.85,0,0,1-5.09,13.83,32.76,32.76,0,0,1-12.1,11.76,33.29,33.29,0,0,1-16.5,4.13,32.86,32.86,0,0,1-18.73-5.55,34.11,34.11,0,0,1-12.48-15.38A54.59,54.59,0,0,1,197.92,172a93.33,93.33,0,0,1-1-14,127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127a30.81,30.81,0,0,1,11.79-14.18q7.73-4.87,18.46-4.88a36.2,36.2,0,0,1,12.85,2.17,29.45,29.45,0,0,1,10.14,6.33A36.1,36.1,0,0,1,262.1,126.69Zm-15.06,49a113.49,113.49,0,0,0,1.44-20.15A101.2,101.2,0,0,0,247,136.22c-1-5-2.7-8.81-5.08-11.37S236.2,121,232,121q-9.07,0-12.61,8.59t-3.54,26.48a107,107,0,0,0,1.51,19.9q1.51,7.76,5.09,11.73a12.37,12.37,0,0,0,9.69,4q6.33,0,9.9-4.14c2.39-2.75,4-6.69,5-11.82"/>
<path class="cls-14"
d="M355.43,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.62,5.45q-2.61,1.73-7.83,1.72H344v12q0,5-2.33,7.39a8.29,8.29,0,0,1-6.26,2.42,8.19,8.19,0,0,1-6.22-2.49c-1.58-1.65-2.37-4.1-2.37-7.32v-12H292.29q-6.54,0-9.8-2.78a9.42,9.42,0,0,1-3.26-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56,8.1,8.1,0,0,1,5.54-2q10.44,0,10.44,11.25v50h3A22.17,22.17,0,0,1,355.43,170Zm-28.63-1.35V131.09l-29.56,37.53H326.8"/>
<path class="cls-15"
d="M270.46,172.17c.07,1.42-.5,2.61-1.28,2.64s-1.46-1.08-1.53-2.5.5-2.6,1.28-2.64S270.39,170.75,270.46,172.17Z"/>
<path class="cls-16"
d="M285.58,170.34c.33,0,.62.46.65,1.06s-.21,1.1-.54,1.12l-.88.09c.12-.19.17-.36,0-.48-.38-.34-.75-.34-1-.08s-.17.57-.48.71h0l-3.26.34-.61.07a3.68,3.68,0,0,0,.19-1.45,3.76,3.76,0,0,0-.33-1.42h2c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13c1,0,.41-.65.47-.93h.29Z"/>
<path class="cls-17"
d="M279.17,171.65a3.49,3.49,0,0,1-1.1,2.61l-8.67,1.23c.89-.21,1.53-1.64,1.44-3.34S270,169.06,269,169l8.79.38A2.92,2.92,0,0,1,279.17,171.65Z"/>
<path class="cls-18"
d="M279.37,170.3a3.76,3.76,0,0,1,.33,1.42,3.68,3.68,0,0,1-.19,1.45c-.21.6-.57,1-1,1l-.43.06a3.49,3.49,0,0,0,1.1-2.61,2.92,2.92,0,0,0-1.34-2.3l.44,0C278.7,169.35,279.1,169.71,279.37,170.3Z"/>
<path class="cls-18"
d="M269.18,174.81c.78,0,1.35-1.22,1.28-2.64s-.75-2.54-1.53-2.5-1.35,1.22-1.28,2.64S268.41,174.85,269.18,174.81Zm1.66-2.66c.09,1.7-.55,3.13-1.44,3.34h0l-.17,0c-1,0-1.86-1.38-2-3.19s.64-3.31,1.63-3.36H269C270,169.06,270.76,170.44,270.84,172.15Z"/>
<path d="M303,176a1.14,1.14,0,0,0,.33.71,2.75,2.75,0,0,1-.88-.39A4.37,4.37,0,0,0,303,176Z"/>
<path d="M298.64,166.65l.12.16A5.6,5.6,0,0,0,297,169a4.63,4.63,0,0,1-2.06-1.52C296.92,168,297.5,166.05,298.64,166.65Z"/>
<path d="M306.62,169.68c-.86-3.88-3.84-4.21-3.84-4.21s-3.07-.47-4.14,1.18l.12.16A5.6,5.6,0,0,0,297,169a6.88,6.88,0,0,0,1.35.43c1.8.34,4.18.13,4.85,1.15s.22,2.66-.91,4.16c-.59.8-.28,1.31.16,1.62A4.37,4.37,0,0,0,303,176a.46.46,0,0,1,.28-.48,1.61,1.61,0,0,1,.49-.11,2.5,2.5,0,0,0,1.34-.39C305.68,174.58,307.49,173.56,306.62,169.68Z"/>
<path class="cls-19"
d="M320.54,231.08c0,.63.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85s7.18-.51,7.81-1.12.32-2.83.06-4.08a23.55,23.55,0,0,1-.41-4.38,16,16,0,0,0,.17-1.74c-.06-.35-1.59-1.62-1.59-1.62.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36S320.49,230.45,320.54,231.08Z"/>
<path class="cls-20"
d="M319.7,230c.26,1.25.57,3.47-.06,4.08s-7.81,1.12-7.81,1.12,0-.92,0-1.3,4.06-1.18,4.2-2-.47-2.2-1.23-2.16c-.38,0-.48-.26-.49-.57a7.35,7.35,0,0,1,.07-.78c0-.24.95,1,1.35.77s.86-3.75-.28-4.77a1.05,1.05,0,0,0-.86-.28s-.8-.86-.69-1.18.63-.81,1-.31,1.46-.07,1.88-.22a4.57,4.57,0,0,1,1.13-.14s1.53,1.27,1.59,1.62a16,16,0,0,1-.17,1.74A23.55,23.55,0,0,0,319.7,230Z"/>
<path class="cls-21"
d="M313.73,229.3l.17,3L295,235.55a3.15,3.15,0,0,1-3.64-2.68l-2.74-20.29,9.2,2.1-.35,12.89,16-3v.18Z"/>
<path class="cls-22"
d="M288.06,204.33c.51.45,9.48,2.36,15.15,2.31h0l-.77,5.1a3.62,3.62,0,0,1-4.4,3l-.24,0-9.2-2.1-8.66-2,1.86,19-2.31.39-4.45.75-.33.06L272.81,204a2.71,2.71,0,0,1,3.39-2.81Z"/>
<path class="cls-20"
d="M305.83,192.12h0a23,23,0,0,0,.05,2.76l-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51c.16,3,.39,6.37.53,7.94a11,11,0,0,1-3.37.43c-5.67.05-14.64-1.86-15.15-2.31s1.25-9.1,2.52-15.42a14.92,14.92,0,0,1-2.92,1.4,5.36,5.36,0,0,1-1.91-2.19,6.93,6.93,0,0,1-.7-4.55,2,2,0,0,1,.24-.6c1.44-1.05,5.18-2.8,7.2-4.19a8.25,8.25,0,0,1,4.06-1.22c-.17.32-.75,3,.87,3.44s5-.87,5-3.08a6.18,6.18,0,0,1,3.22.52c1.77,1,4.07,6.39,5.89,11.34-.32,1.08-2.22,1.88-4,2.19A8.16,8.16,0,0,1,305.83,192.12Z"/>
<polygon class="cls-23"
points="279.49 229.99 279.48 231.93 275.27 232.85 275.04 231.33 275.04 230.74 279.49 229.99"/>
<path class="cls-23"
d="M314.38,228.43a7.35,7.35,0,0,0-.07.78h0l-.58.09-.27-4.55,2-.32c1.14,1,.61,4.6.28,4.77S314.38,228.19,314.38,228.43Z"/>
<path class="cls-23"
d="M314,197.18c-.52-1.65-1.43-4.45-2.51-7.4-.32,1.08-2.22,1.88-4,2.19l1.08,2.83-2.68.08-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51,6.84.35A1.11,1.11,0,0,0,314,197.18Z"/>
<path class="cls-23"
d="M302.38,177.92c0,2.21-3.34,3.52-5,3.08s-1-3.12-.87-3.44a14.35,14.35,0,0,1,1.51,0c.17-.09.3-.54.3-.91a3.83,3.83,0,0,0,1.12.27,5.52,5.52,0,0,0,3-.59c-.32.56-.81,1.15-.74,1.48C301.73,177.92,302,177.93,302.38,177.92Z"/>
<path class="cls-23"
d="M303.19,170.55c.67,1,.22,2.66-.91,4.16-.59.8-.28,1.31.16,1.62a5.52,5.52,0,0,1-3,.59,3.83,3.83,0,0,1-1.12-.27c-1.65-.71-2.29-2.23-2.05-4.86a9.18,9.18,0,0,1,1-2.68,3.91,3.91,0,0,0,1,.29C300.14,169.74,302.52,169.53,303.19,170.55Z"/>
<path class="cls-23"
d="M285.29,170.34h0c0-.29-.74-1.21-1.47-1.51a6.8,6.8,0,0,0-2.48,0c-.34,0-.84,1.33-.9,1.48h.9c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13C285.8,171.29,285.23,170.62,285.29,170.34Z"/>
<path class="cls-23"
d="M283.87,172.05c.22-.26.59-.26,1,.08.14.12.09.29,0,.48l-1.42.15C283.7,172.62,283.64,172.31,283.87,172.05Z"/>
<path class="cls-23"
d="M283.38,172.76h0l1.42-.15c-.21.34-.64.74-.7,1.06-.09.49-1.08.75-1.52,1.35l-.48,10.24,2.94-1.69a6.93,6.93,0,0,0,.7,4.55L279.2,191a1,1,0,0,1-1.41-1.07l2.2-15.22c.12-1,.13-1.61.13-1.61Z"/>
<path class="cls-24" d="M303,187.14l1.72,4.81a3.36,3.36,0,0,0,1.11.17"/>
<path class="cls-25"
d="M317.87,222.3c.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36.66,4.23.71,4.86.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85"/>
<ellipse class="cls-23" cx="303.14" cy="173.18" rx="1.32" ry="0.91"
transform="translate(13 367.35) rotate(-63.53)"/>
<ellipse class="cls-26" cx="303.14" cy="173.18" rx="0.77" ry="0.53"
transform="translate(13 367.35) rotate(-63.53)"/>
<path class="cls-19"
d="M262.55,235.72a.72.72,0,0,1-.12-1.21c-.17.18.05.37.48.39a36.08,36.08,0,0,0,11.77-.55c1-.08,3.65.2,5.06.15,1.16-.05,1.62-.47,1.73-.86a1,1,0,0,1,.17,1.64c-.6.61-4.14.52-4.82.51s-7.56,0-8.57.12A26.72,26.72,0,0,1,262.55,235.72Z"/>
<path class="cls-20"
d="M280.69,231.61a8.33,8.33,0,0,1,.81,1.8.91.91,0,0,1,0,.23c-.11.39-.57.81-1.73.86-1.41.05-4-.23-5.06-.15a36.08,36.08,0,0,1-11.77.55c-.43,0-.65-.21-.48-.39a33.2,33.2,0,0,1,4.91-1.81,12.78,12.78,0,0,0,6.17-2.66,3.77,3.77,0,0,1,.75,0c.87.08,1.61.44,1.58.78s-.47.82.46.92a3.33,3.33,0,0,0,2.36-.58c.33-.37.34-.67,1-.56.18,0,.33,0,.46,0,.39,0,.58,0,.7.17S280.52,231.25,280.69,231.61Z"/>
<path class="cls-25"
d="M262.43,234.51a.72.72,0,0,0,.12,1.21,26.72,26.72,0,0,0,5.7.19c1-.17,7.9-.13,8.57-.12s4.22.1,4.82-.51a1,1,0,0,0-.17-1.64h0"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -0,0 +1 @@
.page-container[data-v-bed2e9f0]{width:100%;border-radius:4px;padding:50px 0;height:100vh}.page-container .text-center h1[data-v-bed2e9f0]{color:#666;padding:20px 0}.page-container img[data-v-bed2e9f0]{width:350px;margin:0 auto}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.table-toolbar-inner-popover-title{padding:3px 0}.table-toolbar-right-icon{margin-left:12px;font-size:16px;color:var(--text-color);cursor:pointer}.table-toolbar-right-icon :hover{color:#1890ff}.table-toolbar-inner-checkbox{display:flex;align-items:center;padding:10px 14px}.table-toolbar-inner-checkbox:hover{background:#e6f7ff}.table-toolbar-inner-checkbox .drag-icon{display:inline-flex;margin-right:8px;cursor:move}.table-toolbar-inner-checkbox .fixed-item{display:flex;align-items:center;justify-content:flex-end;margin-left:auto}.table-toolbar-inner-checkbox .ant-checkbox-wrapper{flex:1}.table-toolbar-inner-checkbox .ant-checkbox-wrapper:hover{color:#1890ff!important}.table-toolbar-inner-checkbox-dark:hover{background:hsla(0,0%,100%,.08)}.toolbar-popover .n-popover__content{padding:0}.editable-cell-content{position:relative;overflow-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.editable-cell-content-comp{flex:1}.editable-cell-content .edit-icon{font-size:14px;display:none;width:20px;cursor:pointer}.editable-cell-content:hover .edit-icon{display:inline-block}.editable-cell-action{display:flex;align-items:center;justify-content:center}.table-toolbar[data-v-66ecc5ca]{display:flex;justify-content:space-between;padding:0 0 16px}.table-toolbar-left[data-v-66ecc5ca]{display:flex;align-items:center;justify-content:flex-start;flex:1}.table-toolbar-left-title[data-v-66ecc5ca]{display:flex;align-items:center;justify-content:flex-start;font-size:16px;font-weight:600}.table-toolbar-right[data-v-66ecc5ca]{display:flex;justify-content:flex-end;flex:1}.table-toolbar-right-icon[data-v-66ecc5ca]{margin-left:12px;font-size:16px;cursor:pointer;color:var(--text-color)}.table-toolbar-right-icon[data-v-66ecc5ca] :hover{color:#1890ff}.table-toolbar-inner-popover-title[data-v-66ecc5ca]{padding:2px 0}

View File

@@ -0,0 +1 @@
.thing-cell[data-v-21fc9a7e]{margin:0 12px 12px;padding:15px}.thing-cell[data-v-21fc9a7e]:hover{background:#f0faff;cursor:pointer}.thing-cell-on[data-v-21fc9a7e]{background:#f0faff}.thing-cell-on[data-v-21fc9a7e] .n-thing-main .n-thing-header .n-thing-header__title{color:#2d8cf0}

View File

@@ -0,0 +1 @@
import{q as k,t as F,_ as w,u as y}from"./index-fa77b114.js";import{m as v,l as B}from"./vendor-ec30964e.js";const N=Vue.createTextVNode("绑定"),A=Vue.defineComponent({setup(g){const f=v(),o=B(),l={mail:{required:!0,message:"请输入邮箱",trigger:"blur"},password:{required:!0,message:"请输入密码",trigger:"blur"}},c=Vue.ref(null),i=naive.useMessage(),t=Vue.reactive({mail:"",password:""});function C(){c.value.validate(V=>{V?i.error("绑定失败,请联系管理员"):k().then(u=>{const n=u.data.openid,{mail:e,password:m}=t;F({mail:e,password:m,openid:n}).then(()=>{var r;i.info("绑定成功");const a=decodeURIComponent(((r=o.query)==null?void 0:r.redirect)||"/");f.replace(a)})})})}return(V,u)=>{const n=Vue.resolveComponent("n-input"),e=Vue.resolveComponent("n-form-item"),m=Vue.resolveComponent("n-button"),p=Vue.resolveComponent("n-space"),a=Vue.resolveComponent("n-form"),r=Vue.resolveComponent("n-grid-item"),_=Vue.resolveComponent("n-grid");return Vue.openBlock(),Vue.createBlock(_,{cols:"2 s:2 m:2 l:3 xl:3 2xl:3",responsive:"screen"},{default:Vue.withCtx(()=>[Vue.createVNode(r,null,{default:Vue.withCtx(()=>[Vue.createVNode(a,{"label-width":80,model:Vue.unref(t),rules:l,ref_key:"formRef",ref:c},{default:Vue.withCtx(()=>[Vue.createVNode(e,{label:"邮箱",path:"mail"},{default:Vue.withCtx(()=>[Vue.createVNode(n,{value:Vue.unref(t).mail,"onUpdate:value":u[0]||(u[0]=s=>Vue.unref(t).mail=s),placeholder:"请输入邮箱"},null,8,["value"])]),_:1}),Vue.createVNode(e,{label:"密码",path:"password"},{default:Vue.withCtx(()=>[Vue.createVNode(n,{placeholder:"请输入密码",value:Vue.unref(t).password,"onUpdate:value":u[1]||(u[1]=s=>Vue.unref(t).password=s)},null,8,["value"])]),_:1}),Vue.createElementVNode("div",null,[Vue.createVNode(p,null,{default:Vue.withCtx(()=>[Vue.createVNode(m,{type:"primary",onClick:C},{default:Vue.withCtx(()=>[N]),_:1})]),_:1})])]),_:1},8,["model"])]),_:1})]),_:1})}}});const E=Vue.defineComponent({setup(g){const f=[{name:"绑定旧账号",key:1},{name:"退出登录",key:3}],o=Vue.ref(1),l=Vue.ref("绑定旧账号"),c=naive.useMessage(),i=y(),t=naive.useDialog(),C=v(),V=B();function u(){t.info({title:"提示",content:"您确定要退出登录吗",positiveText:"确定",negativeText:"取消",onPositiveClick:()=>{i.logout().then(()=>{c.success("成功退出登录"),localStorage.removeItem("TABS-ROUTES"),C.replace({name:"Login",query:{redirect:V.fullPath}})})},onNegativeClick:()=>{}})}function n(e){e.key==3?u():(o.value=e.key,l.value=e.name)}return(e,m)=>{const p=Vue.resolveComponent("n-thing"),a=Vue.resolveComponent("n-list-item"),r=Vue.resolveComponent("n-list"),_=Vue.resolveComponent("n-grid-item"),s=Vue.resolveComponent("PM2"),h=Vue.resolveComponent("n-card"),x=Vue.resolveComponent("n-grid");return Vue.openBlock(),Vue.createBlock(x,{"x-gap":24},{default:Vue.withCtx(()=>[Vue.createVNode(_,{span:"6"},{default:Vue.withCtx(()=>[Vue.createVNode(r,null,{default:Vue.withCtx(()=>[Vue.createVNode(a,null,{default:Vue.withCtx(()=>[(Vue.openBlock(),Vue.createElementBlock(Vue.Fragment,null,Vue.renderList(f,d=>Vue.createVNode(p,{class:Vue.normalizeClass(["thing-cell",{"thing-cell-on":o.value===d.key}]),key:d.key,onClick:D=>n(d)},{header:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(d.name),1)]),_:2},1032,["class","onClick"])),64))]),_:1})]),_:1})]),_:1}),Vue.createVNode(_,{span:"18"},{default:Vue.withCtx(()=>[Vue.createVNode(h,{bordered:!1,size:"small",title:l.value,class:"proCard"},{default:Vue.withCtx(()=>[o.value===1?(Vue.openBlock(),Vue.createBlock(A,{key:0})):Vue.createCommentVNode("",!0),o.value===2?(Vue.openBlock(),Vue.createBlock(s,{key:1})):Vue.createCommentVNode("",!0)]),_:1},8,["title"])]),_:1})]),_:1})}}}),S=w(E,[["__scopeId","data-v-21fc9a7e"]]);export{S as default};

Binary file not shown.

View File

@@ -0,0 +1 @@
import{b as r}from"./index-f65e7484.js";import{d as n,l as i}from"./vendor-ec30964e.js";const a=n({id:"plugin-config",state:()=>({}),getters:{},actions:{async getConfig(e,t="global"){return this[e]||(this[e]={}),this[e][t]?this[e][t]:r(e,t,!0).then(u=>this[e][t]=u)}}}),p=Vue.defineComponent({props:{name:null,value:{type:Boolean}},emits:["update:value"],setup(e,{emit:t}){const u=e;return a().getConfig(i().params.id,u.name).catch(()=>t("update:value",!0)),(l,c)=>{const o=Vue.resolveComponent("n-alert");return e.value?(Vue.openBlock(),Vue.createBlock(o,{key:0,title:"当前功能受限",type:"error"},{default:Vue.withCtx(()=>[Vue.createTextVNode(" 当前实例未安装插件:"+Vue.toDisplayString(e.name),1)]),_:1})):Vue.createCommentVNode("",!0)}}});export{p as _};

View File

@@ -0,0 +1 @@
import{l as x}from"./vendor-ec30964e.js";import{l as y,n as b}from"./index-f65e7484.js";import{K as g,L as c,N as $,O as L,Q as w,U as A,V as N,W as E,X as S}from"./installCanvasRenderer-cb1ba546.js";import{Y as d}from"./index-01aec832.js";import{_ as k}from"./index-fa77b114.js";import{i as I,a as T}from"./install-c0cf116b.js";const z={class:"events"},B={class:"events"},C={class:"events"},F=Vue.defineComponent({setup(M){g([$,I,T,L,w,A,N,E,S]);const f=x(),n=f.params.id,o=f.params.stream,i={trigger:"axis",axisPointer:{type:"line",animation:!1,axis:"x",label:{show:!0,formatter:({value:s})=>new Date(s).toLocaleTimeString(),backgroundColor:"rgba(50,50,50,0.7)"}}},r={showSymbol:!1,smooth:!0,type:"line",lineStyle:{width:1}},_=Vue.ref(0),l={type:"time",min:_,splitLine:{show:!1}},u=[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter"}],m=Vue.reactive({title:{text:o,left:"1%"},dataZoom:u,tooltip:i,xAxis:l,yAxis:[{name:"码率kbps",type:"value"},{name:"event",type:"value",min:0,max:100,show:!1,splitNumber:2,splitLine:{show:!1}}],series:[]}),v=Vue.reactive({tooltip:i,xAxis:l,dataZoom:u,yAxis:{name:"帧率fps",type:"value"},series:[]}),V=Vue.reactive({tooltip:i,xAxis:l,dataZoom:u,yAxis:{name:"缓冲大小",type:"value"},series:[]});return y(n,o+"/stream.yaml").then(s=>{const a=d.parse(s);_.value=a[0].time,m.series.push({yAxisIndex:1,type:"scatter",data:a.map(e=>[e.time,100]),labelLayout:{moveOverlap:"shiftY"},tooltip:{trigger:"item",formatter:({data:e})=>`${e.event}<br/>${new Date(e.time).toLocaleTimeString()}`},markLine:{lineStyle:{type:"dashed"},data:a.map(e=>[{coord:[e.time,0],symbol:"none"},{coord:[e.time,90],symbol:"circle",name:e.event}])}})}),b(n,o).then(s=>{d.parse(s).forEach((e,O)=>{y(n,o+`/track/${e}.yaml`).then(h=>{const p=d.parse(h);m.series.push({yAxisIndex:0,name:e,...r,data:p.map(t=>({value:[t.time,t.bps>>10]}))}),v.series.push({name:e,...r,data:p.map(t=>({value:[t.time,t.fps]}))}),V.series.push({name:e,...r,data:p.map(t=>({value:[t.time,t.rb]}))})})})}),(s,a)=>(Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createElementVNode("div",z,[Vue.createVNode(Vue.unref(c),{class:"chart",option:Vue.unref(m),autoresize:""},null,8,["option"])]),Vue.createElementVNode("div",B,[Vue.createVNode(Vue.unref(c),{class:"chart",option:Vue.unref(v),autoresize:""},null,8,["option"])]),Vue.createElementVNode("div",C,[Vue.createVNode(Vue.unref(c),{class:"chart",option:Vue.unref(V),autoresize:""},null,8,["option"])])]))}}),Q=k(F,[["__scopeId","data-v-8e73e23e"]]);export{Q as default};

View File

@@ -0,0 +1 @@
.events[data-v-8e73e23e]{width:100%;height:300px}

View File

@@ -0,0 +1,3 @@
import{l as p}from"./vendor-ec30964e.js";import{s as i}from"./index-fa77b114.js";const V=Vue.defineComponent({setup(c){const{id:l,logName:u}=p().params,o=Vue.ref([]),t=Vue.ref("");i({url:"/logrotate/api/get/"+u,method:"post",headers:{m7sid:l}}).then(e=>{o.value=e.content.split(`
`)});const r=Vue.computed(()=>o.value.filter(e=>e.includes(t.value)).join(`
`));return(e,n)=>{const s=Vue.resolveComponent("n-input");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(s,{type:"text",value:t.value,"onUpdate:value":n[0]||(n[0]=a=>t.value=a),placeholder:"Filter logs"},null,8,["value"]),Vue.createElementVNode("pre",null,Vue.toDisplayString(Vue.unref(r)),1)])}}});export{V as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.view-account[data-v-841a25ca]{display:flex;flex-direction:column;height:100vh;overflow:auto}.view-account-container[data-v-841a25ca]{flex:1;padding:32px 0;width:384px;margin:0 auto}.view-account-top[data-v-841a25ca]{padding:32px 0;text-align:center}.view-account-top-logo[data-v-841a25ca]{display:flex;align-items:center;justify-content:center;height:64px;line-height:64px;overflow:hidden;white-space:nowrap}.view-account-top-logo img[data-v-841a25ca]{width:auto;height:32px}.view-account-top-logo .title[data-v-841a25ca]{font-size:18px;margin-bottom:0;margin-left:5px}.view-account-top-desc[data-v-841a25ca]{font-size:14px;color:#808695}.view-account-other[data-v-841a25ca]{width:100%}.view-account .default-color[data-v-841a25ca],.view-account .default-color .ant-checkbox-wrapper[data-v-841a25ca]{color:#515a6e}@media (min-width: 768px){.view-account[data-v-841a25ca]{background-image:url(./login-bg-7b57ab51.svg);background-repeat:no-repeat;background-position:50%;background-size:100%}.page-account-container[data-v-841a25ca]{padding:32px 0 24px}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.n-gradient-text[data-v-541c4362]{font-size:24px}

View File

@@ -0,0 +1 @@
import{_ as y}from"./check-e4858b5e.js";import{p as s}from"./index-f65e7484.js";import{l as g}from"./vendor-ec30964e.js";import"./index-fa77b114.js";const x={style:{padding:"24px",display:"flex"}},E=Vue.createTextVNode("查看内存信息"),w=Vue.createTextVNode("下载内存信息"),F=Vue.createTextVNode("查看CPU信息"),N=Vue.createTextVNode("下载CPU信息"),k=Vue.createElementVNode("div",{style:{"font-size":"12px"}},"CPU数据采集时长区间: 199 秒, 不填默认5秒",-1),B={style:{padding:"24px 24px 24px 24px"}},P=["innerHTML"],U=["src"],T=Vue.defineComponent({setup(L){const{id:p,path:f}=g().params,m=Vue.ref(!1),c=Vue.ref(""),V=Vue.ref(null),v=Vue.ref(null),i=Vue.ref("");f?c.value="":s(p,"/debug/pprof/").then(t=>{c.value=t.replace(/href="(.+)"/g,`href="${location.href}/$1"`).replace(/href='(.+)'/g,`href="${location.href}/$1"`)});const _=()=>{s(p,"/debug/pprof/heap").then(t=>{console.log("res.data.port is "+t.data.port),c.value="",i.value="http://console.monibuca.com"+t.data.port})},h=()=>{var t=V.value||5;s(p,"/debug/pprof/profile?seconds="+t).then(e=>{console.log("res.data.port is "+e.data.port),c.value="",i.value="http://console.monibuca.com"+e.data.port})},C=()=>{s(p,"d/debug/pprof/heap").then(t=>{for(var e=atob(t.data.file),o=new Uint8Array(e.length),n=0;n<e.length;n++)o[n]=e.charCodeAt(n);var u=new Blob([o],{type:"application/octet-stream"}),l=URL.createObjectURL(u),r=document.createElement("a");r.href=l,r.download="mempprof",r.click(),URL.revokeObjectURL(l)})},b=()=>{var t=v.value||5;s(p,"d/debug/pprof/profile?seconds="+t).then(e=>{for(var o=atob(e.data.file),n=new Uint8Array(o.length),u=0;u<o.length;u++)n[u]=o.charCodeAt(u);var l=new Blob([n],{type:"application/octet-stream"}),r=URL.createObjectURL(l),d=document.createElement("a");d.href=r,d.download="cpupprof",d.click(),URL.revokeObjectURL(r)})};return(t,e)=>{const o=Vue.resolveComponent("n-button"),n=Vue.resolveComponent("n-button-group"),u=Vue.resolveComponent("n-input-number"),l=Vue.resolveComponent("n-input-group"),r=Vue.resolveComponent("n-space"),d=Vue.resolveComponent("n-layout");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(d,null,{default:Vue.withCtx(()=>[Vue.createElementVNode("div",x,[Vue.createVNode(n,null,{default:Vue.withCtx(()=>[Vue.createVNode(o,{type:"primary",style:{"margin-bottom":"30px","margin-right":"20px"},onClick:e[0]||(e[0]=a=>_())},{default:Vue.withCtx(()=>[E]),_:1}),Vue.createVNode(o,{type:"primary",secondary:"",style:{"margin-bottom":"30px","margin-right":"20px"},onClick:e[1]||(e[1]=a=>C())},{default:Vue.withCtx(()=>[w]),_:1})]),_:1}),Vue.createVNode(r,{vertical:"",style:{display:"inline-flex","margin-right":"20px"}},{default:Vue.withCtx(()=>[Vue.createVNode(l,null,{default:Vue.withCtx(()=>[Vue.createVNode(u,{"show-button":!1,style:{width:"180px"},value:V.value,"onUpdate:value":e[2]||(e[2]=a=>V.value=a),min:1,max:99,placeholder:"请输入CPU数据采集时长"},null,8,["value"]),Vue.createVNode(o,{type:"primary",onClick:e[3]||(e[3]=a=>h())},{default:Vue.withCtx(()=>[F]),_:1}),Vue.createVNode(o,{type:"primary",secondary:"",onClick:e[4]||(e[4]=a=>b())},{default:Vue.withCtx(()=>[N]),_:1})]),_:1}),k]),_:1})]),Vue.createElementVNode("div",B,[Vue.createVNode(y,{name:"Debug",value:m.value,"onUpdate:value":e[5]||(e[5]=a=>m.value=a)},null,8,["value"]),m.value?Vue.createCommentVNode("",!0):(Vue.openBlock(),Vue.createElementBlock("div",{key:0,innerHTML:c.value},null,8,P)),i.value?(Vue.openBlock(),Vue.createElementBlock("iframe",{key:1,src:i.value,width:"100%",height:"800"},null,8,U)):Vue.createCommentVNode("",!0)])]),_:1})])}}});export{T as default};

View File

@@ -0,0 +1 @@
.btn[data-v-3d86ca19]{width:100px}

View File

@@ -0,0 +1 @@
.top[data-v-4b5c61c2]{display:flex}.n-gradient-text[data-v-4b5c61c2]{font-size:24px}

View File

@@ -0,0 +1 @@
import{_ as B,i as C,r as v,b as F}from"./index-fa77b114.js";import{K as E}from"./vendor-ec30964e.js";const i=u=>(Vue.pushScopeId("data-v-841a25ca"),u=u(),Vue.popScopeId(),u),h={class:"view-account"},D=i(()=>Vue.createElementVNode("div",{class:"view-account-header"},null,-1)),g={class:"view-account-container"},N=i(()=>Vue.createElementVNode("div",{class:"view-account-top"},[Vue.createElementVNode("div",{class:"view-account-top-logo"},[Vue.createElementVNode("img",{src:F,alt:""}),Vue.createElementVNode("h2",{class:"title"},"Monibuca")])],-1)),w={class:"view-account-form"},x={class:"view-account-top-desc"},b=Vue.defineComponent({setup(u){const{t:n}=C.global,s=Vue.ref(),c=naive.useMessage(),d=Vue.ref(!1),t=Vue.reactive({mail:""}),V={mail:{required:!0,message:n("请输入邮箱"),trigger:"blur"}},_=e=>{e.preventDefault(),s.value.validate(async o=>{if(o)c.error(n("重置密码失败,请稍后再试"));else{const{mail:a}=t;v({mail:a}).then(()=>{c.info(n("重置密码成功,请登录邮箱查看重置密码,并进行激活"))})}})};return(e,o)=>{const a=Vue.resolveComponent("n-icon"),r=Vue.resolveComponent("n-input"),l=Vue.resolveComponent("n-form-item"),m=Vue.resolveComponent("n-button"),p=Vue.resolveComponent("n-form");return Vue.openBlock(),Vue.createElementBlock("div",h,[D,Vue.createElementVNode("div",g,[N,Vue.createElementVNode("div",w,[Vue.createVNode(p,{ref_key:"formRef",ref:s,"label-placement":"left",size:"large",model:Vue.unref(t),rules:V},{default:Vue.withCtx(()=>[Vue.createVNode(l,{path:"mail"},{default:Vue.withCtx(()=>[Vue.createVNode(r,{value:Vue.unref(t).mail,"onUpdate:value":o[0]||(o[0]=f=>Vue.unref(t).mail=f),placeholder:e.$t("请输入邮箱")},{prefix:Vue.withCtx(()=>[Vue.createVNode(a,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(E))]),_:1})]),_:1},8,["value","placeholder"])]),_:1}),Vue.createVNode(l,null,{default:Vue.withCtx(()=>[Vue.createVNode(m,{type:"primary",onClick:_,size:"large",loading:d.value,block:""},{default:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(e.$t("重置密码")),1)]),_:1},8,["loading"])]),_:1}),Vue.createElementVNode("div",x,Vue.toDisplayString(e.$t("点击重置密码后,请到绑定邮箱中查看重置密码,并点击链接进行激活")),1)]),_:1},8,["model"])])])])}}}),S=B(b,[["__scopeId","data-v-841a25ca"]]);export{S as default};

View File

@@ -0,0 +1 @@
.title[data-v-74a4cd9b]{font-size:20px;font-weight:500;margin-bottom:20px}.page[data-v-74a4cd9b]{position:relative}.page .action[data-v-74a4cd9b]{position:sticky;top:120px}.page .jsonEditor[data-v-74a4cd9b]{width:55vw;min-height:80vh}.page .pre[data-v-74a4cd9b]{width:70vw;height:80vh}

View File

@@ -0,0 +1 @@
import{s,_ as F,a as h}from"./index-fa77b114.js";import{m as w,l as E}from"./vendor-ec30964e.js";function f(u){return s({url:"/api/wx/isSubscribe",method:"POST",data:u})}function S(){return s({url:"/api/wx/config",method:"GET"})}function B(u){return s({url:"/api/wx/qrcode",method:"POST",data:u})}const r=u=>(Vue.pushScopeId("data-v-ffa39570"),u=u(),Vue.popScopeId(),u),I={class:"view-account"},x=r(()=>Vue.createElementVNode("div",{class:"view-account-header"},null,-1)),y={class:"view-account-container"},C={class:"view-account-top"},N={class:"view-account-top-logo"},k={class:"view-account-top-desc"},b={class:"erweima"},A=r(()=>Vue.createElementVNode("div",null,"微信扫码关注官方微信公众号【不卡科技】即可快速登录",-1)),P=["src"],T=Vue.defineComponent({setup(u){const i=naive.useMessage(),n=Vue.ref(""),c=Vue.ref(""),d=w(),l=E(),m=e=>new Promise(o=>{const t=setTimeout(()=>{clearTimeout(t),o()},e)}),p=()=>new Promise((e,o)=>{f({myId:sessionStorage.getItem("myId")}).then(t=>{e(t)})}),a=async()=>{var e;try{const o=await p();if(console.log("是否关注",o),o&&o.data){i.success("登录成功");const t=decodeURIComponent(((e=l.query)==null?void 0:e.redirect)||"/");d.replace(t)}else await m(5e3),a()}catch(o){throw"报错"+o}},_=()=>new Promise(async e=>{const o=await S();console.log("token信息对象11: ",o);const t=o,v=["openLocation","updateTimelineShareData","chooseImage","getLocation","onMenuShareQZone","getNetworkType"];wx.config({debug:!0,appId:t.appId,timestamp:t.timestamp,nonceStr:t.nonceStr,signature:t.signature,jsApiList:v}),e()}),V=()=>{let e=sessionStorage.getItem("myId");e||(e=parseInt(Math.random()*1e6),e<1&&(e=666666)),sessionStorage.setItem("myId",e),console.log("开始获取--"),B({expire_seconds:604800,action_name:"QR_SCENE",action_info:{scene:{scene_id:e}}}).then(t=>{c.value=t.ticket,n.value=`https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=${c.value}`})};Vue.onMounted(async()=>{await _(),V(),a()});const g=h();return(e,o)=>{const t=Vue.resolveComponent("svg-icon");return Vue.openBlock(),Vue.createElementBlock("div",I,[x,Vue.createElementVNode("div",y,[Vue.createElementVNode("div",C,[Vue.createElementVNode("div",N,[Vue.createVNode(t,{name:"logo",width:"256px"})]),Vue.createElementVNode("div",k," 实例管理平台"+Vue.toDisplayString(Vue.unref(g).isSaas?"(在线版)":"(私有化体验版)"),1)]),Vue.createElementVNode("div",b,[A,n.value?(Vue.openBlock(),Vue.createElementBlock("img",{key:0,src:n.value,class:"iframe-box"},null,8,P)):Vue.createCommentVNode("",!0)])])])}}}),D=F(T,[["__scopeId","data-v-ffa39570"]]);export{D as default};

View File

@@ -0,0 +1 @@
import{j as C,k as c}from"./index-f65e7484.js";import{T as v,B as x}from"./TableAction-09488a2a.js";import{i as F,c as b}from"./index-fa77b114.js";import{l as k}from"./vendor-ec30964e.js";const N=Vue.createTextVNode(" 全文搜索 "),D=Vue.createTextVNode(" 实时跟踪 "),I=Vue.defineComponent({setup(B){const{t:n}=F.global,a=Vue.ref(""),l=Vue.ref(""),s=Vue.ref(!0),o=k().params.id,i=Vue.ref([]),p=Vue.computed(()=>a.value?i.value.filter(e=>e.name.indexOf(a.value)!=-1):i.value);function d(e,t=""){const u={"":"K",K:"M",M:"G",G:null};return e>1024&&u[t]?d(e/1024,u[t]):(e||0).toFixed(2).replace(".00","")+t+"B"}const V=[{title:()=>Vue.h("div",[n("名称"),Vue.h(naive.NInput,{placeholder:n("按名称过滤"),size:"small",style:{width:"80%",marginLeft:"10px"},onUpdateValue(e){a.value=e}})]),key:"name",width:100},{title:n("大小"),width:100,render(e){return Vue.h("text",d(+e.size))}}];C(o).then(e=>{i.value=(e==null?void 0:e.files)||[],s.value=!1});async function m(e){b.push({name:"instance_log_detail",params:{id:o,logName:e.name}})}async function f(e){const t=await c(o,!0,!1);window.open(`${t}/logrotate/api/download?file=${encodeURI(e.name)}`)}async function y(){const e=await c(o,!0,!1);window.open(`${e}/logrotate/api/find?query=${l.value}`)}async function _(){const e=await c(o,!0,!1);window.open(`${e}/logrotate/api/tail`)}const w=Vue.reactive({width:220,title:n("操作"),key:"action",render(e){return Vue.h(v,{style:"button",actions:[{label:n("打开"),type:"primary",icon:"ic:outline-delete-outline",onClick:m.bind(null,e)},{label:n("下载"),type:"primary",icon:"ic:outline-delete-outline",onClick:f.bind(null,e)}]})}});return(e,t)=>{const u=Vue.resolveComponent("n-button"),g=Vue.resolveComponent("n-layout-content"),h=Vue.resolveComponent("n-layout");return Vue.openBlock(),Vue.createBlock(h,null,{default:Vue.withCtx(()=>[Vue.createVNode(g,{"content-style":"padding: 24px;"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(x),{title:e.$t("日志文件列表"),class:"table",loading:s.value,"row-class-name":"row",columns:V,dataSource:Vue.unref(p),pagination:{simple:!0},actionColumn:Vue.unref(w),"row-key":r=>r.name,"scroll-x":1090},{toolbar:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(naive.NInput),{value:l.value,"onUpdate:value":t[0]||(t[0]=r=>l.value=r),style:{"margin-right":"10px"}},null,8,["value"]),Vue.createVNode(u,{"attr-type":"button",onClick:y,style:{"margin-right":"10px"}},{default:Vue.withCtx(()=>[N]),_:1}),Vue.createVNode(u,{"attr-type":"button",onClick:_},{default:Vue.withCtx(()=>[D]),_:1})]),_:1},8,["title","loading","dataSource","actionColumn","row-key"])]),_:1})]),_:1})}}});export{I as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as s}from"./index-89b1a529.js";import{t as r}from"./index-f65e7484.js";import{l}from"./vendor-ec30964e.js";import"./index-fa77b114.js";const f=Vue.defineComponent({setup(c){l().params.id;const t=Vue.ref(),i=["init","starting","started","running","going","disposing","disposed"];function n(e){return{key:e.id,label:`${e.description?JSON.stringify(e.description):""}`,children:e.children&&e.children.length?e.children.map(n):void 0,prefix:()=>Vue.h(naive.NSpace,{},[Vue.h(naive.NTag,{type:"info",size:"small"},e.id),Vue.h(naive.NTag,{type:"success",size:"small"},e.owner),Vue.h(naive.NTag,{type:"warning",size:"small"},i[e.state]),...e.blocked?[Vue.h(naive.NTag,{type:"error",size:"small"},"block")]:[],Vue.h(naive.NTime,{time:new Date(e.startTime),type:"relative"})])}}async function a(){const e=await r();t.value=n(e).children}return(e,u)=>{const o=Vue.resolveComponent("n-tree");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(Vue.unref(s),{onTick:a}),Vue.createVNode(o,{"default-expand-all":"","show-line":"",data:t.value},null,8,["data"])])}}});export{f as default};

View File

@@ -0,0 +1 @@
import{_ as y}from"./check-e4858b5e.js";import{d as C}from"./index-f65e7484.js";import{m as D,l as N}from"./vendor-ec30964e.js";import{Y as k}from"./index-01aec832.js";import{_ as g}from"./index-fa77b114.js";const h={key:0,class:"query-bar"},w=Vue.createTextVNode("今天"),x=Vue.createTextVNode("昨天"),B=Vue.createTextVNode("查询"),F=Vue.defineComponent({setup(E){const n=Vue.ref(!1),l=D(),i=N().params.id,o=Vue.ref(""),u=Vue.ref([Date.now(),Date.now()]),r=Vue.ref([]);function s(){u.value=[Date.now(),Date.now()]}function d(){u.value=[Date.now()-24*3600*1e3,Date.now()-24*3600*1e3]}function c(e){return new Date(e-new Date().getTimezoneOffset()*6e4).toISOString().replace(/\.[^\.]+Z/,"")}const p=()=>{C(i,o.value,u.value.join("-")).then(e=>{e=k.parse(e),e?r.value=e:r.value=[]})},m=[{title:"流名称",key:"path"},{title:"流创建时间",key:"time",render(e){return Vue.h("span",{},new Date(e.time).toLocaleString())}},{title:"操作",key:"action",render(e){return Vue.h(naive.NButton,{strong:!0,tertiary:!0,size:"small",onClick:()=>V(e)},{default:()=>"详情"})}}];function V(e){l.push({name:"monitor-detail",params:{stream:e.path+"/"+c(e.time)}})}return(e,t)=>{const _=Vue.resolveComponent("n-input"),v=Vue.resolveComponent("n-date-picker"),f=Vue.resolveComponent("n-data-table");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(y,{name:"Monitor",value:n.value,"onUpdate:value":t[0]||(t[0]=a=>n.value=a)},null,8,["value"]),n.value?Vue.createCommentVNode("",!0):(Vue.openBlock(),Vue.createElementBlock("div",h,[Vue.createVNode(_,{class:"input-field",placeholder:"输入流名称",value:o.value,"onUpdate:value":t[1]||(t[1]=a=>o.value=a),clearable:""},null,8,["value"]),Vue.createVNode(Vue.unref(naive.NButton),{onClick:s},{default:Vue.withCtx(()=>[w]),_:1}),Vue.createVNode(Vue.unref(naive.NButton),{onClick:d},{default:Vue.withCtx(()=>[x]),_:1}),Vue.createVNode(v,{class:"input-field",placeholder:"选择日期范围",value:u.value,"onUpdate:value":t[2]||(t[2]=a=>u.value=a),type:"daterange","range-separator":"至",format:"yyyy-MM-dd",clearable:""},null,8,["value"]),Vue.createVNode(Vue.unref(naive.NButton),{type:"primary",onClick:p},{default:Vue.withCtx(()=>[B]),_:1})])),Vue.createVNode(f,{columns:m,data:r.value,pagination:{pageSize:10,showSizePicker:!0},bordered:!1},null,8,["data"])])}}}),M=g(F,[["__scopeId","data-v-54f3aa7d"]]);export{M as default};

View File

@@ -0,0 +1 @@
import{_ as F,i as E,u as N,a as y,P as S}from"./index-fa77b114.js";import{m as k,l as x,K as b,N as A}from"./vendor-ec30964e.js";const D=""+new URL("../guide.png",import.meta.url).href;const R=n=>(Vue.pushScopeId("data-v-4051bd7c"),n=n(),Vue.popScopeId(),n),I={class:"view-account"},P=R(()=>Vue.createElementVNode("div",{class:"view-account-header"},null,-1)),$={class:"view-account-container"},U={class:"view-account-top"},z={class:"view-account-top-logo"},q={class:"view-account-top-desc"},O={class:"view-account-form"},j={class:"flex view-account-other"},L={class:"flex-initial",style:{"margin-left":"auto"}},M={key:0,src:D,width:"300"},T=Vue.defineComponent({setup(n){const{t:c}=E.global,_=Vue.ref(),l=naive.useMessage(),s=Vue.ref(!1),u=Vue.reactive({mail:"",password:"",isCaptcha:!0}),v={mail:{required:!0,message:c("请输入邮箱"),trigger:"blur"},password:{required:!0,message:c("请输入密码"),trigger:"blur"}},C=N(),i=y(),d=k(),h=x(),f=()=>{_.value.validate(async e=>{var t;if(e)l.error("请填写完整信息,并且进行验证码校验");else{const{mail:V,password:a}=u;s.value=!0;const r={mail:V,password:a};try{const o=await C.login(r);if(l.destroyAll(),o.code==0){const p=decodeURIComponent(((t=h.query)==null?void 0:t.redirect)||"/");l.success(c("登录成功")),d.replace(p)}}catch{s.value=!1}finally{s.value=!1}}})};function w(){d.push({name:S.BASE_REGISTER_NAME})}function g(){d.push({name:"root_password"})}return document.onkeydown=function(e){e.key=="Enter"&&f()},(e,t)=>{const V=Vue.resolveComponent("svg-icon"),a=Vue.resolveComponent("n-icon"),r=Vue.resolveComponent("n-input"),o=Vue.resolveComponent("n-form-item"),p=Vue.resolveComponent("n-button"),B=Vue.resolveComponent("n-form");return Vue.openBlock(),Vue.createElementBlock("div",I,[P,Vue.createElementVNode("div",$,[Vue.createElementVNode("div",U,[Vue.createElementVNode("div",z,[Vue.createVNode(V,{name:"logo",width:"256px"})]),Vue.createElementVNode("div",q,Vue.toDisplayString(Vue.unref(i).isSaas?e.$t("实例管理平台"):"实例管理平台(私有化体验版)"),1)]),Vue.createElementVNode("div",O,[Vue.createVNode(B,{ref_key:"formRef",ref:_,"label-placement":"left",size:"large",model:Vue.unref(u),rules:v},{default:Vue.withCtx(()=>[Vue.createVNode(o,{path:"mail"},{default:Vue.withCtx(()=>[Vue.createVNode(r,{value:Vue.unref(u).mail,"onUpdate:value":t[0]||(t[0]=m=>Vue.unref(u).mail=m),placeholder:e.$t("请输入账号")},{prefix:Vue.withCtx(()=>[Vue.createVNode(a,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(b))]),_:1})]),_:1},8,["value","placeholder"])]),_:1}),Vue.createVNode(o,{path:"password"},{default:Vue.withCtx(()=>[Vue.createVNode(r,{value:Vue.unref(u).password,"onUpdate:value":t[1]||(t[1]=m=>Vue.unref(u).password=m),type:"password",showPasswordOn:"click",placeholder:e.$t("请输入密码")},{prefix:Vue.withCtx(()=>[Vue.createVNode(a,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(A))]),_:1})]),_:1},8,["value","placeholder"])]),_:1}),Vue.createVNode(o,null,{default:Vue.withCtx(()=>[Vue.createVNode(p,{type:"primary",onClick:f,size:"large",loading:s.value,block:""},{default:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(e.$t("登录")),1)]),_:1},8,["loading"])]),_:1}),Vue.unref(i).isSaas?(Vue.openBlock(),Vue.createBlock(o,{key:0,class:"default-color"},{default:Vue.withCtx(()=>[Vue.createElementVNode("div",j,[Vue.createElementVNode("div",L,[Vue.createElementVNode("a",{onClick:w},Vue.toDisplayString(e.$t("注册账号")),1),Vue.createElementVNode("a",{style:{"margin-left":"20px"},onClick:g},Vue.toDisplayString(e.$t("忘记密码")),1)])])]),_:1})):Vue.createCommentVNode("",!0)]),_:1},8,["model"])])]),Vue.unref(i).isSaas?(Vue.openBlock(),Vue.createElementBlock("img",M)):Vue.createCommentVNode("",!0)])}}}),H=F(T,[["__scopeId","data-v-4051bd7c"]]);export{H as default};

View File

@@ -0,0 +1 @@
import{i as V}from"./index-fa77b114.js";import{O as _}from"./vendor-ec30964e.js";const f={class:"page"},b={class:"btn"},S=Vue.defineComponent({props:{esURL:String},emits:["tick"],setup(c,{emit:l}){const v=c,{t:d}=V.global,u=localStorage.getItem("interval"),t=Vue.ref(Math.min(4,u?Number(u):4)),s=Vue.ref(!0);let e;Vue.ref([{label:d("关闭"),value:0},{label:"1s",value:1},{label:"2s",value:2},{label:"5s",value:5},{label:"10s",value:10}]);let r;const o=()=>clearInterval(r);return Vue.watchEffect(()=>{s.value?(o(),localStorage.setItem("interval",String(t.value)),t.value&&(r=setInterval(()=>l("tick"),[0,1,2,5,10][t.value]*1e3)),e==null||e.close()):(o(),e=new EventSource(v.esURL),e.onmessage=n=>{l("tick",JSON.parse(n.data))})}),Vue.onMounted(()=>{l("tick"),Vue.onUnmounted(o)}),_(()=>{e==null||e.close()}),(n,a)=>{const m=Vue.resolveComponent("n-slider"),p=Vue.resolveComponent("n-button");return Vue.openBlock(),Vue.createElementBlock("div",f,[Vue.createVNode(m,{value:t.value,"onUpdate:value":a[0]||(a[0]=i=>t.value=i),min:0,max:4,marks:{0:n.$t("关闭"),1:"1s",2:"2s",3:"5s",4:"10s"},step:"mark",style:{width:"150px"}},null,8,["value","marks"]),Vue.createElementVNode("div",b,[Vue.createVNode(p,{disabled:!s.value,size:"small",onClick:a[1]||(a[1]=i=>l("tick"))},{default:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(n.$t("立即刷新")),1)]),_:1},8,["disabled"])])])}}});export{S as _};

View File

@@ -0,0 +1 @@
.view-account[data-v-4051bd7c]{display:flex;flex-direction:column;height:100vh;overflow:auto}.view-account>img[data-v-4051bd7c]{margin:auto}.view-account-container[data-v-4051bd7c]{flex:1;padding:32px 0;width:384px;margin:0 auto}.view-account-top[data-v-4051bd7c]{padding:32px 0;text-align:center}.view-account-top-logo[data-v-4051bd7c]{display:flex;align-items:center;justify-content:center;overflow:hidden;white-space:nowrap}.view-account-top-logo img[data-v-4051bd7c]{width:auto;height:auto}.view-account-top-logo .title[data-v-4051bd7c]{font-size:18px;margin-bottom:0;margin-left:5px}.view-account-top-desc[data-v-4051bd7c]{font-size:24px;color:#808695}.view-account-other[data-v-4051bd7c]{width:100%}.view-account .default-color[data-v-4051bd7c]{color:#515a6e}.view-account .default-color .flex-initial a[data-v-4051bd7c]{cursor:pointer}.view-account .default-color .ant-checkbox-wrapper[data-v-4051bd7c]{color:#515a6e}@media (min-width: 768px){.view-account[data-v-4051bd7c]{background-image:url(./login-bg-7b57ab51.svg);background-repeat:no-repeat;background-position:50%;background-size:100%}.page-account-container[data-v-4051bd7c]{padding:32px 0 24px}}

View File

@@ -0,0 +1 @@
.query-bar[data-v-54f3aa7d]{display:flex;align-items:left;justify-content:space-between;padding:16px;background-color:#f7f7f7}.input-field[data-v-54f3aa7d]{width:400px}

View File

@@ -0,0 +1 @@
.jsonEditor[data-v-2df35383]{min-height:80vh}.pre[data-v-2df35383]{width:auto}

View File

@@ -0,0 +1 @@
import{l as u,m as a}from"./vendor-ec30964e.js";const c=Vue.defineComponent({name:"Redirect",setup(){const t=u(),o=a();return Vue.onBeforeMount(()=>{const{params:r,query:n}=t,{path:e}=r;o.replace({path:"/"+(Array.isArray(e)?e.join("/"):e),query:n})}),()=>Vue.createVNode(naive.NEmpty,null,null)}});export{c as default};

View File

@@ -0,0 +1 @@
import{l as D,Q as U}from"./vendor-ec30964e.js";import{o as P,q as B,r as A,u as g,v as E}from"./index-f65e7484.js";import{_ as H}from"./index-89b1a529.js";import"./index-fa77b114.js";const L=Vue.defineComponent({setup(M){const n=naive.useMessage(),{id:a}=D().params,o=Vue.reactive({streamPath:"live/test",pushCount:0,remoteHost:"localhost",protocol:"rtmp"}),l=Vue.reactive({pullCount:0,remoteURL:"localhost/live/test",protocol:"rtmp"}),_=[{label:"rtmp://",value:"rtmp"},{label:"rtsp://",value:"rtsp"}],x=[{label:"rtmp",value:"rtmp"},{label:"rtsp",value:"rtsp"},{label:"http-flv",value:"hdl"}],d=Vue.ref(0),c=Vue.ref(0),s=Vue.ref(1e3),p=Vue.ref(1e3);function N(){g(a).then(e=>n.info(e)).catch(e=>n.error(e))}function F(){E(a).then(e=>n.info(e)).catch(e=>n.error(e))}U([o,l],()=>{o.pushCount?P(a,o).then(e=>n.info(e)).catch(e=>n.error(e)):N(),l.pullCount?B(a,l).then(e=>n.info(e)).catch(e=>n.error(e)):F()},{debounce:1e3});function w(){A(a).then(e=>{d.value=e.pushCount,c.value=e.pullCount})}return(e,u)=>{const V=Vue.resolveComponent("n-input"),r=Vue.resolveComponent("n-form-item"),m=Vue.resolveComponent("n-select"),i=Vue.resolveComponent("n-input-group"),v=Vue.resolveComponent("n-input-number"),f=Vue.resolveComponent("n-form"),C=Vue.resolveComponent("n-slider"),h=Vue.resolveComponent("n-card"),b=Vue.resolveComponent("n-space");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(Vue.unref(H),{onTick:w}),Vue.createVNode(b,null,{default:Vue.withCtx(()=>[Vue.createVNode(h,{title:"推送测试"},{"header-extra":Vue.withCtx(()=>[Vue.createTextVNode(" 正在推送数量: "+Vue.toDisplayString(d.value),1)]),action:Vue.withCtx(()=>[Vue.createVNode(C,{value:Vue.unref(o).pushCount,"onUpdate:value":u[4]||(u[4]=t=>Vue.unref(o).pushCount=t),max:s.value},null,8,["value","max"])]),default:Vue.withCtx(()=>[Vue.createVNode(f,{model:Vue.unref(o)},{default:Vue.withCtx(()=>[Vue.createVNode(r,{label:"本地流",path:"streamPath"},{default:Vue.withCtx(()=>[Vue.createVNode(V,{value:Vue.unref(o).streamPath,"onUpdate:value":u[0]||(u[0]=t=>Vue.unref(o).streamPath=t),placeholder:"输入流路径"},null,8,["value"])]),_:1}),Vue.createVNode(r,{label:"目标机器",path:"remoteHost"},{default:Vue.withCtx(()=>[Vue.createVNode(i,null,{default:Vue.withCtx(()=>[Vue.createVNode(m,{value:Vue.unref(o).protocol,"onUpdate:value":u[1]||(u[1]=t=>Vue.unref(o).protocol=t),options:_,style:{width:"120px"}},null,8,["value"]),Vue.createVNode(V,{value:Vue.unref(o).remoteHost,"onUpdate:value":u[2]||(u[2]=t=>Vue.unref(o).remoteHost=t),placeholder:"输入目标机器"},null,8,["value"])]),_:1})]),_:1}),Vue.createVNode(r,{label:"最大数量",path:"pushMaxCount"},{default:Vue.withCtx(()=>[Vue.createVNode(v,{value:s.value,"onUpdate:value":u[3]||(u[3]=t=>s.value=t),placeholder:"输入数量"},null,8,["value"])]),_:1})]),_:1},8,["model"])]),_:1}),Vue.createVNode(h,{title:"拉流测试"},{"header-extra":Vue.withCtx(()=>[Vue.createTextVNode(" 正在拉取数量: "+Vue.toDisplayString(c.value),1)]),action:Vue.withCtx(()=>[Vue.createVNode(C,{value:Vue.unref(l).pullCount,"onUpdate:value":u[8]||(u[8]=t=>Vue.unref(l).pullCount=t),max:p.value},null,8,["value","max"])]),default:Vue.withCtx(()=>[Vue.createVNode(f,{model:Vue.unref(l)},{default:Vue.withCtx(()=>[Vue.createVNode(r,{label:"远程地址",path:"remoteHost"},{default:Vue.withCtx(()=>[Vue.createVNode(i,null,{default:Vue.withCtx(()=>[Vue.createVNode(m,{value:Vue.unref(l).protocol,"onUpdate:value":u[5]||(u[5]=t=>Vue.unref(l).protocol=t),options:x,style:{width:"120px"}},null,8,["value"]),Vue.createVNode(V,{value:Vue.unref(l).remoteURL,"onUpdate:value":u[6]||(u[6]=t=>Vue.unref(l).remoteURL=t),placeholder:"输入远程地址"},null,8,["value"])]),_:1})]),_:1}),Vue.createVNode(r,{label:"最大数量",path:"pullMaxCount"},{default:Vue.withCtx(()=>[Vue.createVNode(v,{value:p.value,"onUpdate:value":u[7]||(u[7]=t=>p.value=t),placeholder:"输入数量"},null,8,["value"])]),_:1})]),_:1},8,["model"])]),_:1})]),_:1})])}}});export{L as default};

View File

@@ -0,0 +1 @@
import{l as V,m as k}from"./vendor-ec30964e.js";import{T as y,B as w}from"./TableAction-09488a2a.js";import{_ as v}from"./index-89b1a529.js";import{i as c,_ as x}from"./index-fa77b114.js";import{d as $}from"./index-f65e7484.js";const{t:n}=c.global;function u(t){return t=t<<3,t>1024*1024?(t/1024/1024).toFixed(2)+" mb/s":t>1024?(t/1024).toFixed(2)+" kb/s":t.toString()+" b/s"}const C=[{title:"StreamPath",key:"path",width:100},{title:n("类型"),key:"type",width:40},{title:n("订阅者"),key:"subscribers",width:50},{title:n("开始时间"),key:"startTime",width:50,render(t){return Vue.h(naive.NTime,{time:new Date(t.startTime),type:"relative"})}},{title:n("状态"),width:30,key:"state"},{title:n("音频"),key:"audio",width:100,render(t){const e=t.audioTrack;return Vue.h("text",e?`${e.codec},${e.fps}f/s,${e.sampleRate}Hz,${u(e.bps)}`:"无")}},{title:n("视频"),key:"video",width:100,render(t){const e=t.videoTrack;return Vue.h("text",e?`${e.codec},${e.fps}f/s,${e.width}x${e.height},${u(e.bps)}`:"无")}}];const b=Vue.defineComponent({setup(t){const{t:e}=c.global,s=V(),l=k(),{params:d}=s,r=d.id,i=Vue.ref([]),m=Vue.reactive({width:100,title:e("操作"),key:"action",fixed:"right",render(o){return Vue.h(y,{style:"button",actions:[{label:e("详情"),type:"primary",onClick:()=>l.push(`./detail/${r}/${o.path}`)}]})}});async function f(o){const a=await $(r);i.value=a.list}function p(o){console.log(o)}return(o,a)=>{const _=Vue.resolveComponent("n-card");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(Vue.unref(v),{onTick:f}),Vue.createVNode(_,{bordered:!1,class:"proCard"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(w),{title:o.$t("流列表"),columns:Vue.unref(C),dataSource:i.value,pagination:!1,"row-key":h=>h.id,actionColumn:Vue.unref(m),"onUpdate:checkedRowKeys":p,"scroll-x":1090},null,8,["title","columns","dataSource","row-key","actionColumn"])]),_:1})])}}}),D=x(b,[["__scopeId","data-v-4b5c61c2"]]);export{D as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.view-account[data-v-b6411e00]{display:flex;flex-direction:column;height:100vh;overflow:auto}.view-account-container[data-v-b6411e00]{flex:1;padding:32px 0;width:384px;margin:0 auto}.view-account-top[data-v-b6411e00]{padding:32px 0;text-align:center}.view-account-top-logo[data-v-b6411e00]{display:flex;align-items:center;justify-content:center;height:64px;line-height:64px;overflow:hidden;white-space:nowrap}.view-account-top-logo img[data-v-b6411e00]{width:auto;height:32px}.view-account-top-logo .title[data-v-b6411e00]{font-size:18px;margin-bottom:0;margin-left:5px}.view-account-top-desc[data-v-b6411e00]{font-size:14px;color:#808695}.view-account-other[data-v-b6411e00]{width:100%}.view-account .default-color[data-v-b6411e00],.view-account .default-color .ant-checkbox-wrapper[data-v-b6411e00]{color:#515a6e}@media (min-width: 768px){.view-account[data-v-b6411e00]{background-image:url(./login-bg-7b57ab51.svg);background-repeat:no-repeat;background-position:50%;background-size:100%}.page-account-container[data-v-b6411e00]{padding:32px 0 24px}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as x,i as A,P as b,u as D,g as S,b as I}from"./index-fa77b114.js";import{m as R,l as k,K as B,N as $}from"./vendor-ec30964e.js";const E=c=>(Vue.pushScopeId("data-v-b6411e00"),c=c(),Vue.popScopeId(),c),z={class:"view-account"},P=E(()=>Vue.createElementVNode("div",{class:"view-account-header"},null,-1)),T={class:"view-account-container"},U={class:"view-account-top"},q=E(()=>Vue.createElementVNode("div",{class:"view-account-top-logo"},[Vue.createElementVNode("img",{src:I,alt:""}),Vue.createElementVNode("h2",{class:"title"},"Monibuca")],-1)),M={class:"view-account-top-desc"},O={class:"view-account-form"},G=Vue.defineComponent({setup(c){const{t:a}=A.global,V=Vue.ref(!1),p=Vue.ref(a("发送邮箱验证码")),i=Vue.ref(60),_=Vue.ref(),r=naive.useMessage(),f=Vue.ref(!1),h=b.BASE_REGISTER_NAME,e=Vue.reactive({password:"",mail:"",verifycode:""}),w={mail:{required:!0,message:a("请输入邮箱"),trigger:"blur"},password:{required:!0,message:a("请输入密码"),trigger:"blur"},verifycode:{required:!0,message:a("请邮箱验证码"),trigger:"blur"}},F=D(),v=R(),C=k(),g=t=>{t.preventDefault(),_.value.validate(async u=>{var s;if(u)r.error("请填写正确信息");else{const{verifycode:l,password:n,mail:d}=e;r.loading("注册中..."),f.value=!0;const m={verifycode:l,password:n,mail:d};try{const o=await F.register(m);if(r.destroyAll(),o.code==0){const y=decodeURIComponent(((s=C.query)==null?void 0:s.redirect)||"/");r.success("注册成功,即将进入系统"),C.name===h?v.replace("/"):v.replace(y)}else r.info(o.msg||"登录失败")}finally{f.value=!1}}})};function N(){if(!e.mail)r.info(a("请输入邮箱验证码"));else{const t={mail:e.mail};S(t).then(()=>{r.info(a("验证码发送成功,请注意查收"));const u=setInterval(()=>{V.value=!0,p.value=`(${i.value}秒)后重新发送`,i.value--,i.value<0&&(clearInterval(u),p.value=a("发送邮箱验证码"),V.value=!1,i.value=10)},1e3)})}}return(t,u)=>{const s=Vue.resolveComponent("n-icon"),l=Vue.resolveComponent("n-input"),n=Vue.resolveComponent("n-form-item"),d=Vue.resolveComponent("n-button"),m=Vue.resolveComponent("n-form");return Vue.openBlock(),Vue.createElementBlock("div",z,[P,Vue.createElementVNode("div",T,[Vue.createElementVNode("div",U,[q,Vue.createElementVNode("div",M,Vue.toDisplayString(t.$t("实例管理平台")),1)]),Vue.createElementVNode("div",O,[Vue.createVNode(m,{ref_key:"formRef",ref:_,"label-placement":"left",size:"large",model:Vue.unref(e),rules:w},{default:Vue.withCtx(()=>[Vue.createVNode(n,{path:"mail"},{default:Vue.withCtx(()=>[Vue.createVNode(l,{value:Vue.unref(e).mail,"onUpdate:value":u[0]||(u[0]=o=>Vue.unref(e).mail=o),placeholder:t.$t("请输入邮箱帐号")},{prefix:Vue.withCtx(()=>[Vue.createVNode(s,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(B))]),_:1})]),_:1},8,["value","placeholder"])]),_:1}),Vue.createVNode(n,{path:"verifycode"},{default:Vue.withCtx(()=>[Vue.createVNode(l,{value:Vue.unref(e).verifycode,"onUpdate:value":u[1]||(u[1]=o=>Vue.unref(e).verifycode=o),placeholder:t.$t("请输入邮箱验证码")},{prefix:Vue.withCtx(()=>[Vue.createVNode(s,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(B))]),_:1})]),_:1},8,["value","placeholder"]),Vue.createVNode(d,{type:"success",onClick:N,disabled:V.value},{default:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(p.value),1)]),_:1},8,["disabled"])]),_:1}),Vue.createVNode(n,{path:"password"},{default:Vue.withCtx(()=>[Vue.createVNode(l,{value:Vue.unref(e).password,"onUpdate:value":u[2]||(u[2]=o=>Vue.unref(e).password=o),type:"password",showPasswordOn:"click",placeholder:t.$t("请输入密码")},{prefix:Vue.withCtx(()=>[Vue.createVNode(s,{size:"18",color:"#808695"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref($))]),_:1})]),_:1},8,["value","placeholder"])]),_:1}),Vue.createVNode(n,null,{default:Vue.withCtx(()=>[Vue.createVNode(d,{type:"primary",onClick:g,size:"large",loading:f.value,block:""},{default:Vue.withCtx(()=>[Vue.createTextVNode(Vue.toDisplayString(t.$t("注册")),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])])])}}}),j=x(G,[["__scopeId","data-v-b6411e00"]]);export{j as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.view-account[data-v-ffa39570]{display:flex;flex-direction:column;height:100vh;overflow:auto}.view-account>img[data-v-ffa39570]{margin:auto}.view-account-container[data-v-ffa39570]{flex:1;padding:32px 0;margin:0 auto}.view-account-container .box1[data-v-ffa39570]{display:flex;flex-direction:column;justify-content:center;align-items:center;margin-right:50px}.view-account-container .erweima[data-v-ffa39570]{display:flex;flex-direction:column;justify-content:center;align-items:center}.view-account-container .erweima .iframe-box[data-v-ffa39570]{height:300px}.view-account-top[data-v-ffa39570]{padding:32px 0;text-align:center}.view-account-top-logo[data-v-ffa39570]{display:flex;align-items:center;justify-content:center;overflow:hidden;white-space:nowrap}.view-account-top-logo img[data-v-ffa39570]{width:auto;height:auto}.view-account-top-logo .title[data-v-ffa39570]{font-size:18px;margin-bottom:0;margin-left:5px}.view-account-top-desc[data-v-ffa39570]{font-size:24px;color:#808695}.view-account-other[data-v-ffa39570]{width:100%}.view-account .default-color[data-v-ffa39570]{color:#515a6e}.view-account .default-color .flex-initial a[data-v-ffa39570]{cursor:pointer}.view-account .default-color .ant-checkbox-wrapper[data-v-ffa39570]{color:#515a6e}@media (min-width: 768px){.view-account[data-v-ffa39570]{background-image:url(./login-bg-7b57ab51.svg);background-repeat:no-repeat;background-position:50%;background-size:100%}.page-account-container[data-v-ffa39570]{padding:32px 0 24px}}

View File

@@ -0,0 +1 @@
.canvas-container{width:100%}.canvas-container .canvas{width:100%;display:block;height:100%;image-rendering:-webkit-crisp-edges;image-rendering:pixelated;image-rendering:crisp-edges}.top[data-v-4ab69993]{display:flex}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{m as _,l as V}from"./vendor-ec30964e.js";import{T as y,B as g}from"./TableAction-09488a2a.js";import{g as h}from"./index-f65e7484.js";import{_ as C}from"./index-fa77b114.js";const v=[{title:"名称",render(n){return n.enable===!1?Vue.h("div",[Vue.h("text",n.name),Vue.h(naive.NTag,{type:"primary"},"禁用")]):Vue.h("text",n.name)},width:100},{title:"版本",key:"version",width:200}];const k=Vue.defineComponent({setup(n){const a=_(),c=V(),{params:o}=c,i=naive.useMessage(),s=Vue.ref(),u=Vue.ref([]),r=Vue.reactive({width:220,title:"操作",key:"action",render(e){return Vue.h(y,{style:"button",actions:[{label:"配置",type:"primary",icon:"ic:outline-delete-outline",onClick:l.bind(null,e)}],select:t=>{i.info(`您点击了,${t} 按钮`)}})}});function l(e){const t=e.name;a.push({name:"instance_config",params:o,query:{name:t}})}async function d(){u.value=(await h(o.id)).plugins}d();function m(e){console.log(e)}return(e,t)=>{const f=Vue.resolveComponent("n-card");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(f,{bordered:!1,class:"proCard"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(g),{title:"插件列表",columns:Vue.unref(v),dataSource:u.value,"row-key":p=>p.id,pagination:!1,ref_key:"actionRef",ref:s,actionColumn:Vue.unref(r),"onUpdate:checkedRowKeys":m,"scroll-x":1090},null,8,["columns","dataSource","row-key","actionColumn"])]),_:1})])}}}),F=C(k,[["__scopeId","data-v-541c4362"]]);export{F as default};

View File

@@ -0,0 +1 @@
.page{padding:10px 0 15px;display:flex;align-items:center}.page .btn{margin-left:20px;margin-bottom:10px}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{s as e,o as c}from"./index-fa77b114.js";function m(t){return e({url:"/api/instance/list",method:"post",data:t})}function h(t){return e({url:"/api/instance/add",method:"post",data:t})}function f(t){return e({url:"/api/instance/update",method:"post",data:t})}function g(t){return e({url:"/api/instance/del",method:"post",data:t})}function S(t){return new EventSource(c+"/api/summary/sse?m7sid="+t)}function $(t){return e({url:"/api/stream/list",method:"post",headers:{m7sid:t}})}function P(t,s){return e({url:`/api/subscribers/${s}`,method:"post",headers:{m7sid:t}})}function l(t){return e({url:"/api/sysinfo"})}function b(t,s){return e({url:`/api/stream/info/${s}`,method:"post",headers:{m7sid:t}})}function y(t,s){const r=`/api/stream/annexb/${s}`;return e({url:r,responseType:"arraybuffer"})}function k(t,s,r){const n=`/api/${r}track/snap/${s}`;return e({url:n})}function I(t,s="global",r=!1){return e({url:`/api/config/${r?"json":"get"}/${s}`,method:"post",headers:{m7sid:t}})}async function M(t,s,r,n="http"){const{localIP:a}=await l(),{ip:o}=await e({url:"/api/instance/detail",method:"post",data:{id:t}}),u=await e({url:"/api/config/json/global",method:"post",headers:{m7sid:t}}),{listenaddr:i,listenaddrtls:p}=u.http;return`${n}${r?"s":""}://${s?a:o}${r?p:i}`}function T(t,s,r="global"){return e({url:`/api/config/modify/${r}`,method:"post",headers:{m7sid:t},data:s})}function L(t){return e({url:"/api/plugins",method:"post",headers:{m7sid:t}})}function w(t){return e({url:"/logrotate/api/list",method:"post",headers:{m7sid:t}})}function x(t,s){return e({url:"/monitor/api/list/track?"+new URLSearchParams({streamPath:s}),method:"post",headers:{m7sid:t}})}function C(t,s){return e({url:"/monitor/"+s,method:"post",headers:{m7sid:t}})}function H(t,s){return e({url:"/api/startDebug",method:"post",headers:{m7sid:t,path:s}})}function O(t,s){return e({url:`/stress/api/pull/${s.protocol}/${s.pullCount}`,method:"post",headers:{m7sid:t,"M7s-Method":"POST"},data:{remoteURL:s.remoteURL}})}function j(t,s){return e({url:`/stress/api/push/${s.protocol}/${s.pushCount}`,method:"post",headers:{m7sid:t,"M7s-Method":"POST"},data:{remoteHost:s.remoteHost,streamPath:s.streamPath}})}function v(t){return e({url:"/stress/api/stop/push",method:"post",headers:{m7sid:t,"M7s-Method":"POST"}})}function R(t){return e({url:"/stress/api/stop/pull",method:"post",headers:{m7sid:t,"M7s-Method":"POST"}})}function U(t){return e({url:"/stress/api/count",method:"post",headers:{m7sid:t}})}function A(t){return e({url:"/api/task/tree"})}function D(t){return e({url:"/monitor/api/session/list"})}function E(t,s){return e({url:"/monitor/api/search/task",method:"post",data:s})}export{f as A,S as a,I as b,D as c,$ as d,b as e,y as f,l as g,k as h,P as i,w as j,M as k,C as l,T as m,x as n,j as o,H as p,O as q,U as r,E as s,A as t,v as u,R as v,L as w,m as x,g as y,h as z};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,127 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1361px"
height="609px" viewBox="0 0 1361 609" version="1.1">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 21</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8"
transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367"
rx="21.7830479" ry="21.766008"/>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601"
rx="5.2173913" ry="5.21330997"/>
<path
d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z"
id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"/>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6"
stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7"
stroke-width="0.702678964" opacity="0.7" stroke-linecap="round"
stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9"
stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round"
stroke-dasharray="1.405357899873153,2.108036953469981"/>
<g id="Group-17"
transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)"
fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653"
ry="9.12768076"/>
<path
d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z"
id="Oval-4"
transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "/>
</g>
</g>
<g id="Group-14"
transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439"
rx="29.1176471" ry="29.1402439"/>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439"
rx="21.5686275" ry="21.5853659"/>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341"
rx="23.7254902" ry="23.7439024"/>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439"
rx="10.7843137" ry="10.7926829"/>
<path
d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z"
id="Oval-2" fill="#BACAD9"/>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)"
fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824"
ry="6.47560976"/>
<path
d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z"
id="Oval-2-Copy-2"
transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "/>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706"
ry="1.61890244"/>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098"
rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488"
rx="2.15686275" ry="2.15853659"/>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6"
opacity="0.8"/>
</g>
<g id="Group-10" opacity="0.799999952"
transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32"
rx="11.1864407" ry="11.2941176"/>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627"
ry="8.55614973"/>
<path
d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z"
id="Oval-7"/>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6"
stroke-width="0.941176471"/>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186"
cy="3.29411765" rx="3.26271186" ry="3.29411765"/>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017"
ry="2.82352941"/>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6"
stroke-width="0.941176471"/>
</g>
<g id="Group-19" opacity="0.33"
transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17"
transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)"
fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"/>
<path
d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z"
id="Oval-4"
transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "/>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"/>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9"
stroke-width="1.16666667"/>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9"
stroke-width="1.16666667"/>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667"
points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"/>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7"
stroke-width="1.16666667" opacity="0.6"/>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9"
stroke-width="1.16666667"/>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6"
stroke-width="1.16666667"/>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"/>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"/>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25"
r="8.75"/>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333"
cy="30.3333333" r="5.83333333"/>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"/>
</g>
</g>
</g>
</g>
<div xmlns="" id="divScriptsUsed" style="display: none"/>
<script xmlns="" id="globalVarsDetection"
src="chrome-extension://cmkdbmfndkfgebldhnkbfhlneefdaaip/js/wrs_env.js"/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="52px" height="45px"
viewBox="0 0 52 45" enable-background="new 0 0 52 45" xml:space="preserve"> <image id="image0"
width="52"
height="45"
x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAAtCAMAAADWf7iKAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAkFBMVEX+/v78/Pz6+vr39/f0
9PTx8fHv7+/u7u729vbHyc1ESVsxNkgwNkg7QFFscH3T1NfGyMwxN0k9QlPa3N5vdID4+Pjz8/Pr
6+s6QVLw8PDm5ubk5OTy8vLj4+Pt7e3u8PPw8vXu8PTn5+fw8fXs7Oz5+fnp6ene3t7b29vc3Nzf
39/q6ur7+/vo6Oj9/f3///855aJlAAAAAWJLR0QvI9QgEQAAAAd0SU1FB+UHAxEtKCKzaD0AAAC8
SURBVEjH7dbLGoIgEIbhEUHI6JyYgmWWnTzd/92FTzcws2vBt38f2P0DELGYi0SiSgSPWQTeqEW6
1MhW643yiqntDkvm9gfFIBYpxWh9FBmYHP23X6dcQVHSjNYlB2mpyDqQFRVVDs7/ji41rYACCiig
gHBIWiqyxo/alYga7ufzRkR35YeaaGrX+pOgeFTPF673x3Yi7ueDxcluKDE1Qy5N1o8AY98qbgQm
Z+Yrx5sJxqhnrEXF2PzM9AV+UvDCWyYgmAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wNy0wM1Qw
OTo0NTo0MCswODowMOjZqbAAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDctMDNUMDk6NDU6NDAr
MDg6MDCZhBEMAAAAIHRFWHRzb2Z0d2FyZQBodHRwczovL2ltYWdlbWFnaWNrLm9yZ7zPHZ0AAAAY
dEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVp
Z2h0ADQ1+dH7kAAAABZ0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA1MoYBn/8AAAAZdEVYdFRodW1i
OjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTYyNTI3Njc0MKmy
pv8AAAASdEVYdFRodW1iOjpTaXplADEzMzJCQoe7yB0AAABGdEVYdFRodW1iOjpVUkkAZmlsZTov
Ly9hcHAvdG1wL2ltYWdlbGMvaW1ndmlldzJfOV8xNjIzOTEyMDA2MDA1NDY4Ml8yMl9bMF2ZTW7W
AAAAAElFTkSuQmCC"></image>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
<title>Group 5 Copy 5</title>
<desc>Created with Sketch.</desc>
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox"
id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix"
in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox"
id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix"
in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="-1" y="0" width="49"
height="10"></rect>
<rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16"
height="44"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
<title>Group 5</title>
<desc>Created with Sketch.</desc>
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox"
id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix"
in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox"
id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix"
in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" transform="translate(-1254.000000, -136.000000)">
<g id="Group-8" transform="translate(1167.000000, 0.000000)">
<g id="Group-5" filter="url(#filter-1)" transform="translate(89.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-18" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="16"
height="44"></rect>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="-1" y="0" width="49"
height="10"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
import{_ as N}from"./index-89b1a529.js";import"./index-fa77b114.js";import"./vendor-ec30964e.js";const k=Vue.createTextVNode("推摄像头"),S=Vue.createTextVNode(" 推桌面"),D=Vue.createTextVNode("关闭"),T=["srcObject"],P=Vue.defineComponent({setup(b){const V=Vue.ref(""),l=Vue.ref(""),p=Vue.ref("live/test"),r=Vue.ref([]),c=Vue.ref(),m=naive.useMessage(),f=Vue.ref(""),v=Vue.ref("http://localhost:8080");navigator.mediaDevices.enumerateDevices().then(n=>{n.forEach(e=>{console.log(e.kind+": "+e.label+" id = "+e.deviceId,e),e.kind=="videoinput"&&r.value.push({label:e.label,value:e.deviceId})}),r.value.length>0&&(l.value=r.value[0].value)});async function C(){const n=await navigator.mediaDevices.getUserMedia({video:{deviceId:l.value},audio:!0});_(n)}async function w(){const n=await navigator.mediaDevices.getDisplayMedia();_(n)}let s;function h(){s==null||s()}let o;Vue.onUnmounted(h);function g(){o==null||o.getStats().then(n=>{let e="";n.forEach(a=>{e+=`${a.type} ${a.id} ${a.timestamp}
`,Object.keys(a).forEach(t=>{t!=="type"&&t!=="id"&&t!=="timestamp"&&(e+=` ${t}: ${a[t]}
`)})}),f.value=e})}async function _(n){try{c.value=n,o=new RTCPeerConnection,o.oniceconnectionstatechange=()=>{var t;console.log("oniceconnectionstatechange",o.iceConnectionState),m.info(o.iceConnectionState),o.iceConnectionState==="disconnected"&&((t=c.value)==null||t.getTracks().forEach(u=>u.stop()),c.value=void 0)},o.onicecandidate=t=>{console.log("onicecandidate",t.candidate)},n.getTracks().forEach(t=>{o.addTrack(t,n)});const e=await o.createOffer();await o.setLocalDescription(e);const a=await fetch(`${v.value}/webrtc/push/${p.value}`,{method:"POST",mode:"cors",cache:"no-cache",credentials:"include",redirect:"follow",referrerPolicy:"no-referrer",headers:{"Content-Type":"application/sdp"},body:e.sdp});V.value=await a.text(),await o.setRemoteDescription(new RTCSessionDescription({type:"answer",sdp:V.value})),s=()=>{var t;o.close(),(t=c.value)==null||t.getTracks().forEach(u=>u.stop()),c.value=void 0}}catch(e){m.error(e.message)}}return(n,e)=>{const a=Vue.resolveComponent("n-input"),t=Vue.resolveComponent("n-select"),u=Vue.resolveComponent("n-button"),d=Vue.resolveComponent("n-space"),y=Vue.resolveComponent("n-card"),x=Vue.resolveComponent("n-split");return Vue.openBlock(),Vue.createBlock(d,{vertical:""},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(N),{onTick:g}),Vue.createVNode(d,null,{default:Vue.withCtx(()=>[Vue.createVNode(y,null,{default:Vue.withCtx(()=>[Vue.createVNode(d,{vertical:""},{default:Vue.withCtx(()=>[Vue.createVNode(a,{value:v.value,"onUpdate:value":e[0]||(e[0]=i=>v.value=i)},null,8,["value"]),Vue.createVNode(t,{value:l.value,"onUpdate:value":e[1]||(e[1]=i=>l.value=i),options:r.value},null,8,["value","options"]),Vue.createVNode(a,{value:p.value,"onUpdate:value":e[2]||(e[2]=i=>p.value=i)},null,8,["value"]),Vue.createVNode(d,null,{default:Vue.withCtx(()=>[Vue.createVNode(u,{onClick:C,type:"primary"},{default:Vue.withCtx(()=>[k]),_:1}),Vue.createVNode(u,{onClick:w,type:"primary"},{default:Vue.withCtx(()=>[S]),_:1}),Vue.createVNode(u,{onClick:h,type:"error"},{default:Vue.withCtx(()=>[D]),_:1})]),_:1})]),_:1})]),_:1}),Vue.createElementVNode("video",{id:"video",width:"640",height:"480",autoplay:"",muted:"",srcObject:c.value},null,8,T)]),_:1}),Vue.createVNode(x,{direction:"horizontal",max:.75,min:.25},{1:Vue.withCtx(()=>[Vue.createElementVNode("pre",null,Vue.toDisplayString(V.value),1)]),2:Vue.withCtx(()=>[Vue.createElementVNode("pre",null,Vue.toDisplayString(f.value),1)]),_:1},8,["max","min"])]),_:1})}}});export{P as default};

View File

@@ -0,0 +1 @@
.top[data-v-6d0a1b16]{display:flex}.n-gradient-text[data-v-6d0a1b16]{font-size:24px}

View File

@@ -0,0 +1 @@
import{l as p}from"./vendor-ec30964e.js";import{B as m}from"./TableAction-09488a2a.js";import{_}from"./index-89b1a529.js";import{i as h}from"./index-f65e7484.js";import{_ as F,i as V}from"./index-fa77b114.js";const f=Vue.defineComponent({setup(w){const{t:u}=V.global,i=p(),{params:r}=i,o=r.id,a=Vue.ref([]),n=[{title:"ID",key:"id",width:100},{title:u("开始时间"),key:"startTime",width:100,render:t=>Vue.h(naive.NTime,{time:new Date(t.startTime),type:"relative"})},{title:u("音频状态"),width:80,render:t=>{var e;return Vue.h("span",(e=t.audioReader)==null?void 0:e.state)}},{title:u("音频序号"),width:100,render:t=>{var e;return Vue.h("span",(e=t.audioReader)==null?void 0:e.sequence)}},{title:u("音频时间戳"),width:100,render:t=>{var e;return Vue.h("span",(e=t.audioReader)==null?void 0:e.timestamp)}},{title:u("音频延迟"),width:80,render:t=>{var e;return Vue.h("span",(e=t.audioReader)==null?void 0:e.delay)}},{title:u("视频状态"),width:80,render:t=>{var e;return Vue.h("span",(e=t.videoReader)==null?void 0:e.state)}},{title:u("视频序号"),width:100,render:t=>{var e;return Vue.h("span",(e=t.videoReader)==null?void 0:e.sequence)}},{title:u("视频时间戳"),width:100,render:t=>{var e;return Vue.h("span",(e=t.videoReader)==null?void 0:e.timestamp)}},{title:u("视频延迟"),width:80,render:t=>{var e;return Vue.h("span",(e=t.videoReader)==null?void 0:e.delay)}},{title:u("元信息"),key:"meta"}];async function s(t){const e=await h(o,r.streamPath.join("/"));a.value=e.list}function d(t){console.log(t)}return(t,e)=>{const c=Vue.resolveComponent("n-card");return Vue.openBlock(),Vue.createElementBlock("div",null,[Vue.createVNode(Vue.unref(_),{onTick:s}),Vue.createVNode(c,{bordered:!1,class:"proCard"},{default:Vue.withCtx(()=>[Vue.createVNode(Vue.unref(m),{title:t.$t("订阅者列表"),columns:n,dataSource:a.value,pagination:!1,"row-key":l=>l.id,"onUpdate:checkedRowKeys":d,"scroll-x":1090},null,8,["title","dataSource","row-key"])]),_:1})])}}}),C=F(f,[["__scopeId","data-v-6d0a1b16"]]);export{C as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.events[data-v-b65839ec]{width:100%;height:300px}.memorys[data-v-b65839ec]{width:100%;height:150px}.top[data-v-b65839ec]{display:flex}[data-v-b65839ec] .red td{color:#ff0000bf!important}.n-gradient-text[data-v-b65839ec]{font-size:24px}

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@@ -12,5 +12,4 @@ var (
type TranscodePlugin struct {
m7s.Plugin
Rules []transcode.TransRule
}

View File

@@ -0,0 +1,47 @@
package transcode
import (
"m7s.live/m7s/v5/pkg/task"
"os"
"os/exec"
)
type CommandTask struct {
task.Task
logFileName string
logFile *os.File
Cmd *exec.Cmd
}
func (ct *CommandTask) Start() (err error) {
ct.Description = task.Description{
"cmd": ct.Cmd.String(),
}
if ct.logFileName != "" {
ct.Description["log"] = ct.logFileName
ct.logFile, err = os.OpenFile(ct.logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
ct.Error("Could not create transcode log", "err", err)
return err
}
// 将命令的标准输出和标准错误输出重定向到日志文件
ct.Cmd.Stdout = ct.logFile
ct.Cmd.Stderr = ct.logFile
} else {
// 将命令的标准输出和标准错误输出重定向到操作系统的标准输出和标准错误输出
ct.Cmd.Stdout = os.Stdout
ct.Cmd.Stderr = os.Stderr
}
ct.Info("start exec", "cmd", ct.Cmd.String())
err = ct.Cmd.Start()
ct.Description["pid"] = ct.Cmd.Process.Pid
return
}
func (ct *CommandTask) Dispose() {
_ = ct.Cmd.Process.Kill()
if ct.logFile != nil {
_ = ct.logFile.Close()
}
}

View File

@@ -0,0 +1,35 @@
package transcode
import (
"m7s.live/m7s/v5/pkg/task"
"m7s.live/m7s/v5/pkg/util"
flv "m7s.live/m7s/v5/plugin/flv/pkg"
"net"
)
type PipeInput struct {
task.Task
rBuf chan net.Buffers
*util.BufReader
flv.Live
}
func (p *PipeInput) Start() (err error) {
p.rBuf = make(chan net.Buffers, 100)
p.BufReader = util.NewBufReaderBuffersChan(p.rBuf)
p.rBuf <- net.Buffers{flv.FLVHead}
p.WriteFlvTag = func(flv net.Buffers) (err error) {
select {
case p.rBuf <- flv:
default:
p.Warn("pipe input buffer full")
}
return
}
return
}
func (p *PipeInput) Dispose() {
close(p.rBuf)
p.BufReader.Recycle()
}

View File

@@ -1,6 +1,17 @@
package transcode
import "m7s.live/m7s/v5"
import (
"fmt"
"m7s.live/m7s/v5"
"m7s.live/m7s/v5/pkg/config"
"m7s.live/m7s/v5/pkg/task"
"m7s.live/m7s/v5/pkg/util"
flv "m7s.live/m7s/v5/plugin/flv/pkg"
"net"
"os/exec"
"strings"
"time"
)
// / 定义传输模式的常量
const (
@@ -33,17 +44,82 @@ type (
)
func NewTransform() m7s.ITransformer {
return &Transformer{}
ret := &Transformer{}
ret.WriteFlvTag = func(flv net.Buffers) (err error) {
select {
case ret.rBuf <- flv:
default:
ret.Warn("pipe input buffer full")
}
return
}
return ret
}
type Transformer struct {
m7s.DefaultTransformer
TransRule
rBuf chan net.Buffers
*util.BufReader
flv.Live
}
func (t *Transformer) Start() (err error) {
err = t.TransformJob.Subscribe()
if err == nil {
}
if err != nil {
return
}
if t.TransformJob.Config.Input != nil {
switch v := t.TransformJob.Config.Input.(type) {
case map[string]any:
config.Parse(&t.TransRule.From, v)
case string:
t.From.Args = v
}
}
args := append([]string{"-f", "flv"}, strings.Fields(t.From.Args)...)
if t.From.Codec != "" {
args = append(args, "-c:v", t.From.Codec)
}
args = append(args, "-i", "pipe:0")
t.To = make([]EncodeConfig, len(t.TransformJob.Config.Output))
for i, to := range t.TransformJob.Config.Output {
var enc EncodeConfig
if to.Conf != nil {
switch v := to.Conf.(type) {
case map[string]any:
config.Parse(&enc, v)
case string:
enc.Args = v
}
}
t.To[i] = enc
args = append(args, strings.Fields(enc.Args)...)
if strings.HasPrefix(to.Target, "rtmp://") {
args = append(args, "-f", "flv", to.Target)
} else if strings.HasPrefix(to.Target, "rtsp://") {
args = append(args, "-f", "rtsp", to.Target)
} else {
args = append(args, to.Target)
}
}
t.Description = task.Description{
"cmd": args,
"config": t.TransRule,
}
t.rBuf = make(chan net.Buffers, 100)
t.BufReader = util.NewBufReaderBuffersChan(t.rBuf)
t.Subscriber = t.TransformJob.Subscriber
var cmdTask CommandTask
cmdTask.logFileName = fmt.Sprintf("logs/transcode_%s_%s.log", strings.ReplaceAll(t.TransformJob.StreamPath, "/", "_"), time.Now().Format("20060102150405"))
cmdTask.Cmd = exec.CommandContext(t, "ffmpeg", args...)
cmdTask.Cmd.Stdin = t.BufReader
t.AddTask(&cmdTask)
return
}
func (t *Transformer) Dispose() {
close(t.rBuf)
t.BufReader.Recycle()
}

View File

@@ -197,8 +197,11 @@ func (p *Publisher) Start() (err error) {
if plugin.Meta.Transformer != nil {
for r, tranConf := range onPublish.Transform {
if group := r.FindStringSubmatch(p.StreamPath); group != nil {
for j, to := range tranConf.Output {
for i, g := range group {
tranConf.Target = strings.Replace(tranConf.Target, fmt.Sprintf("$%d", i), g, -1)
to.Target = strings.Replace(to.Target, fmt.Sprintf("$%d", i), g, -1)
}
tranConf.Output[j] = to
}
plugin.Transform(p.StreamPath, tranConf)
}

View File

@@ -203,7 +203,7 @@ func (s *Server) Start() (err error) {
if httpConf.ListenAddr != "" {
s.stopOnError(httpConf.CreateHTTPWork(s.Logger))
}
var tcpTask *config.ListenTCPWork
var grpcServer *GRPCServer
if tcpConf.ListenAddr != "" {
var opts []grpc.ServerOption
s.grpcServer = grpc.NewServer(opts...)
@@ -218,8 +218,8 @@ func (s *Server) Start() (err error) {
s.Error("register handler faild", "error", err)
return
}
tcpTask = tcpConf.CreateTCPWork(s.Logger, nil)
if err = s.AddTask(tcpTask).WaitStarted(); err != nil {
grpcServer = &GRPCServer{s: s, tcpTask: tcpConf.CreateTCPWork(s.Logger, nil)}
if err = s.AddTask(grpcServer.tcpTask).WaitStarted(); err != nil {
s.Error("failed to listen", "error", err)
return
}
@@ -232,8 +232,8 @@ func (s *Server) Start() (err error) {
for _, plugin := range plugins {
plugin.Init(s, cg[strings.ToLower(plugin.Name)])
}
if tcpTask != nil {
s.AddTask(&GRPCServer{s: s, tcpTask: tcpTask}, s.Logger)
if grpcServer != nil {
s.AddTask(grpcServer, s.Logger)
}
s.Streams.OnStart(func() {
s.Streams.AddTask(&CheckSubWaitTimeout{s: s})

View File

@@ -100,9 +100,16 @@ func (s *Subscriber) Start() (err error) {
}
}
for reg, conf := range plugin.GetCommonConf().OnSub.Transform {
// TODO:
if plugin.Meta.Transformer != nil {
if reg.MatchString(s.StreamPath) {
if group := reg.FindStringSubmatch(s.StreamPath); group != nil {
for j, c := range conf.Output {
for i, value := range group {
c.Target = strings.Replace(c.Target, fmt.Sprintf("$%d", i), value, -1)
}
conf.Output[j] = c
}
}
plugin.handler.Transform(s.StreamPath, conf)
}
}
@@ -306,6 +313,9 @@ func (handler *SubscribeHandler[A, V]) Start() (err error) {
if err == nil {
videoFrame = &vr.Value
err = s.Err()
} else if errors.Is(err, ErrDiscard) {
s.VideoReader = nil
break
} else {
s.Stop(err)
}
@@ -362,6 +372,9 @@ func (handler *SubscribeHandler[A, V]) Start() (err error) {
}
audioFrame = &ar.Value
err = s.Err()
} else if errors.Is(err, ErrDiscard) {
s.AudioReader = nil
break
} else {
s.Stop(err)
}

View File

@@ -15,14 +15,14 @@ type (
TransformJob struct {
task.Job
StreamPath string // 对应本地流
Target string // 对应目标流
Config config.Transform // 对应目标流
Plugin *Plugin
Publisher *Publisher
Subscriber *Subscriber
transformer ITransformer
}
DefaultTransformer struct {
task.Task
task.Job
TransformJob TransformJob
}
)
@@ -31,16 +31,8 @@ func (r *DefaultTransformer) GetTransformJob() *TransformJob {
return &r.TransformJob
}
func (r *DefaultTransformer) Start() (err error) {
err = r.TransformJob.Subscribe()
if err == nil {
err = r.TransformJob.Publish()
}
return
}
func (p *TransformJob) GetKey() string {
return p.Target
return p.StreamPath
}
func (p *TransformJob) Subscribe() (err error) {
@@ -48,20 +40,19 @@ func (p *TransformJob) Subscribe() (err error) {
return
}
func (p *TransformJob) Publish() (err error) {
p.Publisher, err = p.Plugin.Publish(p.transformer, p.Target)
func (p *TransformJob) Publish(streamPath string) (err error) {
p.Publisher, err = p.Plugin.Publish(p.transformer, streamPath)
return
}
func (p *TransformJob) Init(transformer ITransformer, plugin *Plugin, streamPath string, conf config.Transform) *TransformJob {
p.Plugin = plugin
p.Target = conf.Target
p.Config = conf
p.StreamPath = streamPath
p.transformer = transformer
p.Description = map[string]any{
"streamPath": streamPath,
"target": conf.Target,
"conf": conf.Conf,
"conf": conf,
}
plugin.Server.Transforms.Add(p, plugin.Logger.With("streamPath", streamPath))
return p