From 5daca2eb464cc67fa3cf119c77b41e438a217be9 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 21 Apr 2021 18:51:58 +0200 Subject: [PATCH 01/19] feat: implement html output --- pkg/cmd/scan.go | 14 +++ pkg/cmd/scan/output/assets/index.tmpl | 101 +++++++++++++++++++++ pkg/cmd/scan/output/assets/style.css | 6 ++ pkg/cmd/scan/output/html.go | 110 +++++++++++++++++++++++ pkg/cmd/scan/output/html_test.go | 70 +++++++++++++++ pkg/cmd/scan/output/output.go | 4 + pkg/cmd/scan/output/testdata/output.html | 0 7 files changed, 305 insertions(+) create mode 100644 pkg/cmd/scan/output/assets/index.tmpl create mode 100644 pkg/cmd/scan/output/assets/style.css create mode 100644 pkg/cmd/scan/output/html.go create mode 100644 pkg/cmd/scan/output/html_test.go create mode 100644 pkg/cmd/scan/output/testdata/output.html diff --git a/pkg/cmd/scan.go b/pkg/cmd/scan.go index 9816fcc8..2125f88b 100644 --- a/pkg/cmd/scan.go +++ b/pkg/cmd/scan.go @@ -362,6 +362,20 @@ func parseOutputFlag(out string) (*output.OutputConfig, error) { ) } options["path"] = opts[0] + case output.HTMLOutputType: + if len(opts) != 1 || opts[0] == "" { + return nil, errors.Wrapf( + cmderrors.NewUsageError( + fmt.Sprintf( + "\nMust be of kind: %s", + output.Example(output.HTMLOutputType), + ), + ), + "Invalid html output '%s'", + out, + ) + } + options["path"] = opts[0] } return &output.OutputConfig{ diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl new file mode 100644 index 00000000..d14628f9 --- /dev/null +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -0,0 +1,101 @@ + + + Driftctl scan report + + + + +

Driftctl scan report

+Coverage {{.Coverage}}% +{{.ScanDate}} +
+ +
+

Managed resources ({{ len .Managed }})

+{{ if (eq (len .Managed) 0) }} +

There's nothing to see there...

+{{end}} +{{range $val := .Managed}} +
+

{{$val.TerraformId}}

+ {{$val.TerraformType}} +
+{{end}} + +

Unmanaged resources ({{ len .Unmanaged }})

+{{ if (eq (len .Unmanaged) 0) }} +

There's nothing to see there...

+{{end}} +{{range $val := .Unmanaged}} +
+

{{$val.TerraformId}}

+ {{$val.TerraformType}} +
+{{end}} + +

Changed resources ({{ len .Differences }})

+{{ if (eq (len .Differences) 0) }} +

There's nothing to see there...

+{{end}} +{{range $diff := .Differences}} +
+

{{$diff.Res.TerraformId}}

+ {{$diff.Res.TerraformType}} +
+ {{range $change := $diff.Changelog}} +
{{ formatChange $change }}
+ {{end}} +
+
+{{end}} + +

Missing resources ({{ len .Deleted }})

+{{ if (eq (len .Deleted) 0) }} +

There's nothing to see there...

+{{end}} +{{range $val := .Deleted}} +
+

{{$val.TerraformId}}

+ {{$val.TerraformType}} +
+{{end}} + +

Alerts ({{ len .Alerts }})

+{{ if (eq (len .Alerts) 0) }} +

There's nothing to see there...

+{{end}} +{{range $key, $val := .Alerts}} +
+

{{$key}}

+ {{$val}} +
+{{end}} + + + \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css new file mode 100644 index 00000000..8b2495a6 --- /dev/null +++ b/pkg/cmd/scan/output/assets/style.css @@ -0,0 +1,6 @@ +* { +} + +div { + display: block; +} \ No newline at end of file diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go new file mode 100644 index 00000000..496faf60 --- /dev/null +++ b/pkg/cmd/scan/output/html.go @@ -0,0 +1,110 @@ +package output + +import ( + "embed" + "fmt" + "html/template" + "os" + "strings" + "time" + + "github.com/cloudskiff/driftctl/pkg/alerter" + "github.com/cloudskiff/driftctl/pkg/analyser" + "github.com/cloudskiff/driftctl/pkg/resource" + "github.com/r3labs/diff/v2" +) + +const HTMLOutputType = "html" +const HTMLOutputExample = "html://PATH/TO/FILE.html" + +// assets holds our static web content. +//go:embed assets/* +var assets embed.FS + +type HTML struct { + path string +} + +func NewHTML(path string) *HTML { + return &HTML{path} +} + +func (c *HTML) Write(analysis *analyser.Analysis) error { + type TemplateParams struct { + ScanDate string + Coverage int + Summary analyser.Summary + Managed []resource.Resource + Unmanaged []resource.Resource + Differences []analyser.Difference + Deleted []resource.Resource + Alerts alerter.Alerts + Stylesheet template.CSS + } + + file := os.Stdout + if !isStdOut(c.path) { + f, err := os.OpenFile(c.path, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0600) + if err != nil { + return err + } + defer f.Close() + file = f + } + + tmplFile, err := assets.ReadFile("assets/index.tmpl") + if err != nil { + return err + } + + styleFile, err := assets.ReadFile("assets/style.css") + if err != nil { + return err + } + + funcMap := template.FuncMap{ + "formatChange": func(ch analyser.Change) string { + prefix := "" + suffix := "" + + switch ch.Type { + case diff.CREATE: + prefix = "+" + case diff.UPDATE: + prefix = "~" + case diff.DELETE: + prefix = "-" + } + + if ch.Computed { + suffix = "(computed)" + } + + return fmt.Sprintf("%s %s: %s => %s %s", prefix, strings.Join(ch.Path, "."), prettify(ch.From), prettify(ch.To), suffix) + }, + } + + tmpl, err := template.New("main").Funcs(funcMap).Parse(string(tmplFile)) + if err != nil { + return err + } + + data := &TemplateParams{ + ScanDate: time.Now().Format("Jan 02, 2006"), + Summary: analysis.Summary(), + Coverage: analysis.Coverage(), + Managed: analysis.Managed(), + Unmanaged: analysis.Unmanaged(), + Differences: analysis.Differences(), + Deleted: analysis.Deleted(), + Alerts: analysis.Alerts(), + Stylesheet: template.CSS(styleFile), + } + + err = tmpl.Execute(file, data) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go new file mode 100644 index 00000000..f1041f38 --- /dev/null +++ b/pkg/cmd/scan/output/html_test.go @@ -0,0 +1,70 @@ +package output + +import ( + "io/ioutil" + "path" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/cloudskiff/driftctl/pkg/analyser" + "github.com/cloudskiff/driftctl/test/goldenfile" +) + +func TestHTML_Write(t *testing.T) { + type args struct { + analysis *analyser.Analysis + } + tests := []struct { + name string + goldenfile string + args args + err error + }{ + { + name: "test html output", + goldenfile: "output.html", + args: args{ + analysis: fakeAnalysis(), + }, + err: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir := t.TempDir() + tempFile, err := ioutil.TempFile(tempDir, "result") + + if err != nil { + t.Fatal(err) + } + c := NewHTML(tempFile.Name()) + + err = c.Write(tt.args.analysis) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) + } + + result, err := ioutil.ReadFile(tempFile.Name()) + if err != nil { + t.Fatal(err) + } + + expectedFilePath := path.Join("./testdata/", tt.goldenfile) + if *goldenfile.Update == tt.goldenfile { + if err := ioutil.WriteFile(expectedFilePath, result, 0600); err != nil { + t.Fatal(err) + } + } + + expected, err := ioutil.ReadFile(expectedFilePath) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, string(expected), string(result)) + }) + } +} diff --git a/pkg/cmd/scan/output/output.go b/pkg/cmd/scan/output/output.go index 1d960f8f..2b8a50cf 100644 --- a/pkg/cmd/scan/output/output.go +++ b/pkg/cmd/scan/output/output.go @@ -14,11 +14,13 @@ type Output interface { var supportedOutputTypes = []string{ ConsoleOutputType, JSONOutputType, + HTMLOutputType, } var supportedOutputExample = map[string]string{ ConsoleOutputType: ConsoleOutputExample, JSONOutputType: JSONOutputExample, + HTMLOutputType: HTMLOutputExample, } func SupportedOutputs() []string { @@ -55,6 +57,8 @@ func GetOutput(config OutputConfig, quiet bool) Output { return NewJSON(config.Options["path"]) case ConsoleOutputType: fallthrough + case HTMLOutputType: + return NewHTML(config.Options["path"]) default: return NewConsole() } diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html new file mode 100644 index 00000000..e69de29b From 4b9af2b57bed54531679999dbe2050853d09e2eb Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 22 Apr 2021 18:21:00 +0200 Subject: [PATCH 02/19] refactor: add filtering to html output --- pkg/cmd/scan/output/assets/index.tmpl | 194 +++++++++++------- pkg/cmd/scan/output/assets/index.vue.tmpl | 189 +++++++++++++++++ pkg/cmd/scan/output/assets/style.css | 7 +- pkg/cmd/scan/output/assets/vue.global.prod.js | 1 + pkg/cmd/scan/output/html.go | 30 +++ pkg/cmd/scan/output/html_test.go | 12 +- pkg/cmd/scan/output/output_test.go | 12 ++ pkg/cmd/scan/output/testdata/output.html | 160 +++++++++++++++ 8 files changed, 523 insertions(+), 82 deletions(-) create mode 100644 pkg/cmd/scan/output/assets/index.vue.tmpl create mode 100644 pkg/cmd/scan/output/assets/vue.global.prod.js diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index d14628f9..10859710 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -1,3 +1,4 @@ + Driftctl scan report @@ -5,97 +6,136 @@ -

Driftctl scan report

-Coverage {{.Coverage}}% -{{.ScanDate}} -
- -
-

Managed resources ({{ len .Managed }})

-{{ if (eq (len .Managed) 0) }} -

There's nothing to see there...

-{{end}} -{{range $val := .Managed}} -
-

{{$val.TerraformId}}

- {{$val.TerraformType}} -
-{{end}} -

Unmanaged resources ({{ len .Unmanaged }})

-{{ if (eq (len .Unmanaged) 0) }} -

There's nothing to see there...

-{{end}} -{{range $val := .Unmanaged}} -
-

{{$val.TerraformId}}

- {{$val.TerraformType}} -
-{{end}} +
+

Driftctl scan report {{ if (eq .Coverage 100) }}✅{{else}}❌{{end}}

+ Coverage 8% + Apr 21, 2021 +
+
+ + +
-

Changed resources ({{ len .Differences }})

-{{ if (eq (len .Differences) 0) }} +

Managed resources ({{len .Managed}})

+ + {{ if (eq (len .Managed) 0) }}

There's nothing to see there...

-{{end}} -{{range $diff := .Differences}} -
-

{{$diff.Res.TerraformId}}

- {{$diff.Res.TerraformType}} + {{end}} + {{range $res := .Managed}} +
+ {{$res.TerraformId}} + {{$res.TerraformType}} +
+ {{end}} + +

Unmanaged resources ({{len .Unmanaged}})

+ + {{ if (eq (len .Unmanaged) 0) }} +

There's nothing to see there...

+ {{end}} + {{range $res := .Unmanaged}} +
+ {{$res.TerraformId}} + {{$res.TerraformType}} +
+ {{end}} + +

Changed resources ({{len .Differences}})

+ + {{ if (eq (len .Differences) 0) }} +

There's nothing to see there...

+ {{end}} + {{range $diff := .Differences}} +
+ {{$diff.Res.TerraformId}} + {{$diff.Res.TerraformType}}
{{range $change := $diff.Changelog}} -
{{ formatChange $change }}
+
{{ formatChange $change }}
{{end}}
-{{end}} + {{end}} -

Missing resources ({{ len .Deleted }})

-{{ if (eq (len .Deleted) 0) }} -

There's nothing to see there...

-{{end}} -{{range $val := .Deleted}} -
-

{{$val.TerraformId}}

- {{$val.TerraformType}} -
-{{end}} +

Missing resources ({{len .Deleted}})

-

Alerts ({{ len .Alerts }})

-{{ if (eq (len .Alerts) 0) }} + {{ if (eq (len .Deleted) 0) }}

There's nothing to see there...

-{{end}} -{{range $key, $val := .Alerts}} -
-

{{$key}}

- {{$val}} + {{end}} + {{range $res := .Deleted}} +
+ {{$res.TerraformId}} + {{$res.TerraformType}}
-{{end}} + {{end}} + +

Alerts ({{len .Alerts}})

+ + {{ if (eq (len .Alerts) 0) }} +

There's nothing to see there...

+ {{end}} + {{range $type, $messages := .Alerts}} +
+ {{ $type }} +
+ {{range $msg := $messages}} +
- {{ $msg }}
+ {{end}} +
+
+ {{end}} +
- \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/index.vue.tmpl b/pkg/cmd/scan/output/assets/index.vue.tmpl new file mode 100644 index 00000000..6cae5210 --- /dev/null +++ b/pkg/cmd/scan/output/assets/index.vue.tmpl @@ -0,0 +1,189 @@ + + + + Driftctl scan report + + + + + + +
+

Driftctl scan report

+ Coverage 8% + Apr 21, 2021 +
+
+ + +
+ +

Managed resources ({{Managed.length}})

+ +
+

{{ res.id }}

+ {{ res.type }} +
+

There's nothing to see there...

+ +

Unmanaged resources ({{Unmanaged.length}})

+ +
+

{{ res.id }}

+ {{ res.type }} +
+

There's nothing to see there...

+ +

Changed resources ({{Changed.length}})

+ +
+

{{ ch.res.id }}

+ {{ ch.res.type }} +
+
{{ formatDifference(diff) }}
+
+
+

There's nothing to see there...

+ +

Missing resources ({{Missing.length}})

+ +
+

{{ res.id }}

+ {{ res.type }} +
+

There's nothing to see there...

+ +

Alerts ({{alerts.length}})

+ +
+

{{ alert.type }}

+
+
{{ msg }}
+
+
+

There's nothing to see there...

+
+ + + \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index 8b2495a6..9093da7b 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -1,6 +1,11 @@ -* { +body { + font-family: sans-serif; } div { display: block; +} + +.hide { + display: none; } \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/vue.global.prod.js b/pkg/cmd/scan/output/assets/vue.global.prod.js new file mode 100644 index 00000000..b174652e --- /dev/null +++ b/pkg/cmd/scan/output/assets/vue.global.prod.js @@ -0,0 +1 @@ +var Vue=function(e){"use strict";function t(e,t){const n=Object.create(null),o=e.split(",");for(let r=0;r!!n[e.toLowerCase()]:e=>!!n[e]}const n=t("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"),o=t("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function r(e){if(T(e)){const t={};for(let n=0;n{if(e){const n=e.split(i);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function c(e){let t="";if(A(e))t=e;else if(T(e))for(let n=0;nf(e,t)))}const h=(e,t)=>N(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:E(t)?{[`Set(${t.size})`]:[...t.values()]}:!I(t)||T(t)||P(t)?t:String(t),m={},g=[],v=()=>{},y=()=>!1,b=/^on[^a-z]/,_=e=>b.test(e),x=e=>e.startsWith("onUpdate:"),S=Object.assign,C=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},k=Object.prototype.hasOwnProperty,w=(e,t)=>k.call(e,t),T=Array.isArray,N=e=>"[object Map]"===R(e),E=e=>"[object Set]"===R(e),$=e=>e instanceof Date,F=e=>"function"==typeof e,A=e=>"string"==typeof e,M=e=>"symbol"==typeof e,I=e=>null!==e&&"object"==typeof e,O=e=>I(e)&&F(e.then)&&F(e.catch),B=Object.prototype.toString,R=e=>B.call(e),P=e=>"[object Object]"===R(e),V=e=>A(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,L=t(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),j=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},U=/-(\w)/g,H=j((e=>e.replace(U,((e,t)=>t?t.toUpperCase():"")))),D=/\B([A-Z])/g,z=j((e=>e.replace(D,"-$1").toLowerCase())),W=j((e=>e.charAt(0).toUpperCase()+e.slice(1))),K=j((e=>e?`on${W(e)}`:"")),G=(e,t)=>e!==t&&(e==e||t==t),q=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Z=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Q=new WeakMap,X=[];let Y;const ee=Symbol(""),te=Symbol("");function ne(e,t=m){(function(e){return e&&!0===e._isEffect})(e)&&(e=e.raw);const n=function(e,t){const n=function(){if(!n.active)return t.scheduler?void 0:e();if(!X.includes(n)){se(n);try{return le.push(ie),ie=!0,X.push(n),Y=n,e()}finally{X.pop(),ae(),Y=X[X.length-1]}}};return n.id=re++,n.allowRecurse=!!t.allowRecurse,n._isEffect=!0,n.active=!0,n.raw=e,n.deps=[],n.options=t,n}(e,t);return t.lazy||n(),n}function oe(e){e.active&&(se(e),e.options.onStop&&e.options.onStop(),e.active=!1)}let re=0;function se(e){const{deps:t}=e;if(t.length){for(let n=0;n{e&&e.forEach((e=>{(e!==Y||e.allowRecurse)&&l.add(e)}))};if("clear"===t)i.forEach(c);else if("length"===n&&T(e))i.forEach(((e,t)=>{("length"===t||t>=o)&&c(e)}));else switch(void 0!==n&&c(i.get(n)),t){case"add":T(e)?V(n)&&c(i.get("length")):(c(i.get(ee)),N(e)&&c(i.get(te)));break;case"delete":T(e)||(c(i.get(ee)),N(e)&&c(i.get(te)));break;case"set":N(e)&&c(i.get(ee))}l.forEach((e=>{e.options.scheduler?e.options.scheduler(e):e()}))}const fe=t("__proto__,__v_isRef,__isVue"),de=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(M)),he=be(),me=be(!1,!0),ge=be(!0),ve=be(!0,!0),ye={};function be(e=!1,t=!1){return function(n,o,r){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_raw"===o&&r===(e?t?Qe:Ze:t?Je:qe).get(n))return n;const s=T(n);if(!e&&s&&w(ye,o))return Reflect.get(ye,o,r);const i=Reflect.get(n,o,r);if(M(o)?de.has(o):fe(o))return i;if(e||ue(n,0,o),t)return i;if(ct(i)){return!s||!V(o)?i.value:i}return I(i)?e?tt(i):Ye(i):i}}["includes","indexOf","lastIndexOf"].forEach((e=>{const t=Array.prototype[e];ye[e]=function(...e){const n=it(this);for(let t=0,r=this.length;t{const t=Array.prototype[e];ye[e]=function(...e){ce();const n=t.apply(this,e);return ae(),n}}));function _e(e=!1){return function(t,n,o,r){let s=t[n];if(!e&&(o=it(o),s=it(s),!T(t)&&ct(s)&&!ct(o)))return s.value=o,!0;const i=T(t)&&V(n)?Number(n)!0,deleteProperty:(e,t)=>!0},Ce=S({},xe,{get:me,set:_e(!0)}),ke=S({},Se,{get:ve}),we=e=>I(e)?Ye(e):e,Te=e=>I(e)?tt(e):e,Ne=e=>e,Ee=e=>Reflect.getPrototypeOf(e);function $e(e,t,n=!1,o=!1){const r=it(e=e.__v_raw),s=it(t);t!==s&&!n&&ue(r,0,t),!n&&ue(r,0,s);const{has:i}=Ee(r),l=o?Ne:n?Te:we;return i.call(r,t)?l(e.get(t)):i.call(r,s)?l(e.get(s)):void 0}function Fe(e,t=!1){const n=this.__v_raw,o=it(n),r=it(e);return e!==r&&!t&&ue(o,0,e),!t&&ue(o,0,r),e===r?n.has(e):n.has(e)||n.has(r)}function Ae(e,t=!1){return e=e.__v_raw,!t&&ue(it(e),0,ee),Reflect.get(e,"size",e)}function Me(e){e=it(e);const t=it(this);return Ee(t).has.call(t,e)||(t.add(e),pe(t,"add",e,e)),this}function Ie(e,t){t=it(t);const n=it(this),{has:o,get:r}=Ee(n);let s=o.call(n,e);s||(e=it(e),s=o.call(n,e));const i=r.call(n,e);return n.set(e,t),s?G(t,i)&&pe(n,"set",e,t):pe(n,"add",e,t),this}function Oe(e){const t=it(this),{has:n,get:o}=Ee(t);let r=n.call(t,e);r||(e=it(e),r=n.call(t,e)),o&&o.call(t,e);const s=t.delete(e);return r&&pe(t,"delete",e,void 0),s}function Be(){const e=it(this),t=0!==e.size,n=e.clear();return t&&pe(e,"clear",void 0,void 0),n}function Re(e,t){return function(n,o){const r=this,s=r.__v_raw,i=it(s),l=t?Ne:e?Te:we;return!e&&ue(i,0,ee),s.forEach(((e,t)=>n.call(o,l(e),l(t),r)))}}function Pe(e,t,n){return function(...o){const r=this.__v_raw,s=it(r),i=N(s),l="entries"===e||e===Symbol.iterator&&i,c="keys"===e&&i,a=r[e](...o),u=n?Ne:t?Te:we;return!t&&ue(s,0,c?te:ee),{next(){const{value:e,done:t}=a.next();return t?{value:e,done:t}:{value:l?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function Ve(e){return function(...t){return"delete"!==e&&this}}const Le={get(e){return $e(this,e)},get size(){return Ae(this)},has:Fe,add:Me,set:Ie,delete:Oe,clear:Be,forEach:Re(!1,!1)},je={get(e){return $e(this,e,!1,!0)},get size(){return Ae(this)},has:Fe,add:Me,set:Ie,delete:Oe,clear:Be,forEach:Re(!1,!0)},Ue={get(e){return $e(this,e,!0)},get size(){return Ae(this,!0)},has(e){return Fe.call(this,e,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Re(!0,!1)},He={get(e){return $e(this,e,!0,!0)},get size(){return Ae(this,!0)},has(e){return Fe.call(this,e,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Re(!0,!0)};function De(e,t){const n=t?e?He:je:e?Ue:Le;return(t,o,r)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get(w(n,o)&&o in t?n:t,o,r)}["keys","values","entries",Symbol.iterator].forEach((e=>{Le[e]=Pe(e,!1,!1),Ue[e]=Pe(e,!0,!1),je[e]=Pe(e,!1,!0),He[e]=Pe(e,!0,!0)}));const ze={get:De(!1,!1)},We={get:De(!1,!0)},Ke={get:De(!0,!1)},Ge={get:De(!0,!0)},qe=new WeakMap,Je=new WeakMap,Ze=new WeakMap,Qe=new WeakMap;function Xe(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((e=>R(e).slice(8,-1))(e))}function Ye(e){return e&&e.__v_isReadonly?e:nt(e,!1,xe,ze,qe)}function et(e){return nt(e,!1,Ce,We,Je)}function tt(e){return nt(e,!0,Se,Ke,Ze)}function nt(e,t,n,o,r){if(!I(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=r.get(e);if(s)return s;const i=Xe(e);if(0===i)return e;const l=new Proxy(e,2===i?o:n);return r.set(e,l),l}function ot(e){return rt(e)?ot(e.__v_raw):!(!e||!e.__v_isReactive)}function rt(e){return!(!e||!e.__v_isReadonly)}function st(e){return ot(e)||rt(e)}function it(e){return e&&it(e.__v_raw)||e}const lt=e=>I(e)?Ye(e):e;function ct(e){return Boolean(e&&!0===e.__v_isRef)}function at(e){return pt(e)}class ut{constructor(e,t=!1){this._rawValue=e,this._shallow=t,this.__v_isRef=!0,this._value=t?e:lt(e)}get value(){return ue(it(this),0,"value"),this._value}set value(e){G(it(e),this._rawValue)&&(this._rawValue=e,this._value=this._shallow?e:lt(e),pe(it(this),"set","value",e))}}function pt(e,t=!1){return ct(e)?e:new ut(e,t)}function ft(e){return ct(e)?e.value:e}const dt={get:(e,t,n)=>ft(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return ct(r)&&!ct(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function ht(e){return ot(e)?e:new Proxy(e,dt)}class mt{constructor(e){this.__v_isRef=!0;const{get:t,set:n}=e((()=>ue(this,0,"value")),(()=>pe(this,"set","value")));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}class gt{constructor(e,t){this._object=e,this._key=t,this.__v_isRef=!0}get value(){return this._object[this._key]}set value(e){this._object[this._key]=e}}function vt(e,t){return ct(e[t])?e[t]:new gt(e,t)}class yt{constructor(e,t,n){this._setter=t,this._dirty=!0,this.__v_isRef=!0,this.effect=ne(e,{lazy:!0,scheduler:()=>{this._dirty||(this._dirty=!0,pe(it(this),"set","value"))}}),this.__v_isReadonly=n}get value(){const e=it(this);return e._dirty&&(e._value=this.effect(),e._dirty=!1),ue(e,0,"value"),e._value}set value(e){this._setter(e)}}const bt=[];function _t(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...xt(n,e[n]))})),n.length>3&&t.push(" ..."),t}function xt(e,t,n){return A(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:ct(t)?(t=xt(e,it(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):F(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=it(t),n?t:[`${e}=`,t])}function St(e,t,n,o){let r;try{r=o?e(...o):e()}catch(s){kt(s,t,n)}return r}function Ct(e,t,n,o){if(F(e)){const r=St(e,t,n,o);return r&&O(r)&&r.catch((e=>{kt(e,t,n)})),r}const r=[];for(let s=0;s>>1;Wt(Nt[e])-1?Nt.splice(t,0,e):Nt.push(e),jt()}}function jt(){wt||Tt||(Tt=!0,Rt=Bt.then(Kt))}function Ut(e,t,n,o){T(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?o+1:o)||n.push(e),jt()}function Ht(e){Ut(e,It,Mt,Ot)}function Dt(e,t=null){if($t.length){for(Pt=t,Ft=[...new Set($t)],$t.length=0,At=0;AtWt(e)-Wt(t))),Ot=0;Otnull==e.id?1/0:e.id;function Kt(e){Tt=!1,wt=!0,Dt(e),Nt.sort(((e,t)=>Wt(e)-Wt(t)));try{for(Et=0;Ete.trim())):t&&(r=n.map(Z))}let l,c=o[l=K(t)]||o[l=K(H(t))];!c&&s&&(c=o[l=K(z(t))]),c&&Ct(c,e,6,r);const a=o[l+"Once"];if(a){if(e.emitted){if(e.emitted[l])return}else(e.emitted={})[l]=!0;Ct(a,e,6,r)}}function qt(e,t,n=!1){if(!t.deopt&&void 0!==e.__emits)return e.__emits;const o=e.emits;let r={},s=!1;if(!F(e)){const o=e=>{const n=qt(e,t,!0);n&&(s=!0,S(r,n))};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}return o||s?(T(o)?o.forEach((e=>r[e]=null)):S(r,o),e.__emits=r):e.__emits=null}function Jt(e,t){return!(!e||!_(t))&&(t=t.slice(2).replace(/Once$/,""),w(e,t[0].toLowerCase()+t.slice(1))||w(e,z(t))||w(e,t))}let Zt=0;const Qt=e=>Zt+=e;function Xt(e){return e.some((e=>!Ko(e)||e.type!==Vo&&!(e.type===Ro&&!Xt(e.children))))?e:null}let Yt=null,en=null;function tn(e){const t=Yt;return Yt=e,en=e&&e.type.__scopeId||null,t}function nn(e,t=Yt){if(!t)return e;const n=(...n)=>{Zt||Ho(!0);const o=tn(t),r=e(...n);return tn(o),Zt||Do(),r};return n._c=!0,n}function on(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:s,propsOptions:[i],slots:l,attrs:c,emit:a,render:u,renderCache:p,data:f,setupState:d,ctx:h}=e;let m;const g=tn(e);try{let e;if(4&n.shapeFlag){const t=r||o;m=er(u.call(t,t,p,s,d,f,h)),e=c}else{const n=t;0,m=er(n(s,n.length>1?{attrs:c,slots:l,emit:a}:null)),e=t.props?c:sn(c)}let g=m;if(!1!==t.inheritAttrs&&e){const t=Object.keys(e),{shapeFlag:n}=g;t.length&&(1&n||6&n)&&(i&&t.some(x)&&(e=ln(e,i)),g=Xo(g,e))}n.dirs&&(g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&(g.transition=n.transition),m=g}catch(v){jo.length=0,kt(v,e,1),m=Qo(Vo)}return tn(g),m}function rn(e){let t;for(let n=0;n{let t;for(const n in e)("class"===n||"style"===n||_(n))&&((t||(t={}))[n]=e[n]);return t},ln=(e,t)=>{const n={};for(const o in e)x(o)&&o.slice(9)in t||(n[o]=e[o]);return n};function cn(e,t,n){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let r=0;r0?(a(null,e.ssFallback,t,n,o,null,s,i),hn(f,e.ssFallback)):f.resolve()}(t,n,o,r,s,i,l,c,a):function(e,t,n,o,r,s,i,l,{p:c,um:a,o:{createElement:u}}){const p=t.suspense=e.suspense;p.vnode=t,t.el=e.el;const f=t.ssContent,d=t.ssFallback,{activeBranch:h,pendingBranch:m,isInFallback:g,isHydrating:v}=p;if(m)p.pendingBranch=f,Go(f,m)?(c(m,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0?p.resolve():g&&(c(h,d,n,o,r,null,s,i,l),hn(p,d))):(p.pendingId++,v?(p.isHydrating=!1,p.activeBranch=m):a(m,r,p),p.deps=0,p.effects.length=0,p.hiddenContainer=u("div"),g?(c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0?p.resolve():(c(h,d,n,o,r,null,s,i,l),hn(p,d))):h&&Go(f,h)?(c(h,f,n,o,r,p,s,i,l),p.resolve(!0)):(c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0&&p.resolve()));else if(h&&Go(f,h))c(h,f,n,o,r,p,s,i,l),hn(p,f);else{const e=t.props&&t.props.onPending;if(F(e)&&e(),p.pendingBranch=f,p.pendingId++,c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0)p.resolve();else{const{timeout:e,pendingId:t}=p;e>0?setTimeout((()=>{p.pendingId===t&&p.fallback(d)}),e):0===e&&p.fallback(d)}}}(e,t,n,o,r,i,l,c,a)},hydrate:function(e,t,n,o,r,s,i,l,c){const a=t.suspense=pn(t,o,n,e.parentNode,document.createElement("div"),null,r,s,i,l,!0),u=c(e,a.pendingBranch=t.ssContent,n,a,s,i);0===a.deps&&a.resolve();return u},create:pn};function pn(e,t,n,o,r,s,i,l,c,a,u=!1){const{p:p,m:f,um:d,n:h,o:{parentNode:m,remove:g}}=a,v=Z(e.props&&e.props.timeout),y={vnode:e,parent:t,parentComponent:n,isSVG:i,container:o,hiddenContainer:r,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof v?v:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:o,pendingId:r,effects:s,parentComponent:i,container:l}=y;if(y.isHydrating)y.isHydrating=!1;else if(!e){const e=n&&o.transition&&"out-in"===o.transition.mode;e&&(n.transition.afterLeave=()=>{r===y.pendingId&&f(o,l,t,0)});let{anchor:t}=y;n&&(t=h(n),d(n,i,y,!0)),e||f(o,l,t,0)}hn(y,o),y.pendingBranch=null,y.isInFallback=!1;let c=y.parent,a=!1;for(;c;){if(c.pendingBranch){c.effects.push(...s),a=!0;break}c=c.parent}a||Ht(s),y.effects=[];const u=t.props&&t.props.onResolve;F(u)&&u()},fallback(e){if(!y.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:o,container:r,isSVG:s}=y,i=t.props&&t.props.onFallback;F(i)&&i();const a=h(n),u=()=>{y.isInFallback&&(p(null,e,r,a,o,null,s,l,c),hn(y,e))},f=e.transition&&"out-in"===e.transition.mode;f&&(n.transition.afterLeave=u),d(n,o,null,!0),y.isInFallback=!0,f||u()},move(e,t,n){y.activeBranch&&f(y.activeBranch,e,t,n),y.container=e},next:()=>y.activeBranch&&h(y.activeBranch),registerDep(e,t){const n=!!y.pendingBranch;n&&y.deps++;const o=e.vnode.el;e.asyncDep.catch((t=>{kt(t,e,0)})).then((r=>{if(e.isUnmounted||y.isUnmounted||y.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:s}=e;Tr(e,r),o&&(s.el=o);const l=!o&&e.subTree.el;t(e,s,m(o||e.subTree.el),o?null:h(e.subTree),y,i,c),l&&g(l),an(e,s.el),n&&0==--y.deps&&y.resolve()}))},unmount(e,t){y.isUnmounted=!0,y.activeBranch&&d(y.activeBranch,n,e,t),y.pendingBranch&&d(y.pendingBranch,n,e,t)}};return y}function fn(e){if(F(e)&&(e=e()),T(e)){e=rn(e)}return er(e)}function dn(e,t){t&&t.pendingBranch?T(e)?t.effects.push(...e):t.effects.push(e):Ht(e)}function hn(e,t){e.activeBranch=t;const{vnode:n,parentComponent:o}=e,r=n.el=t.el;o&&o.subTree===n&&(o.vnode.el=r,an(o,r))}function mn(e,t,n,o){const[r,s]=e.propsOptions;if(t)for(const i in t){const s=t[i];if(L(i))continue;let l;r&&w(r,l=H(i))?n[l]=s:Jt(e.emitsOptions,i)||(o[i]=s)}if(s){const t=it(n);for(let o=0;o{i=!0;const[n,o]=vn(e,t,!0);S(r,n),o&&s.push(...o)};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}if(!o&&!i)return e.__props=g;if(T(o))for(let l=0;l-1,n[1]=o<0||t-1||w(n,"default"))&&s.push(e)}}}return e.__props=[r,s]}function yn(e){return"$"!==e[0]}function bn(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function _n(e,t){return bn(e)===bn(t)}function xn(e,t){return T(t)?t.findIndex((t=>_n(t,e))):F(t)&&_n(t,e)?0:-1}function Sn(e,t,n=_r,o=!1){if(n){const r=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;ce(),Sr(n);const r=Ct(t,n,e,o);return Sr(null),ae(),r});return o?r.unshift(s):r.push(s),s}}const Cn=e=>(t,n=_r)=>!wr&&Sn(e,t,n),kn=Cn("bm"),wn=Cn("m"),Tn=Cn("bu"),Nn=Cn("u"),En=Cn("bum"),$n=Cn("um"),Fn=Cn("rtg"),An=Cn("rtc"),Mn=(e,t=_r)=>{Sn("ec",e,t)};function In(e,t){return Rn(e,null,t)}const On={};function Bn(e,t,n){return Rn(e,t,n)}function Rn(e,t,{immediate:n,deep:o,flush:r,onTrack:s,onTrigger:i}=m,l=_r){let c,a,u=!1;if(ct(e)?(c=()=>e.value,u=!!e._shallow):ot(e)?(c=()=>e,o=!0):c=T(e)?()=>e.map((e=>ct(e)?e.value:ot(e)?Vn(e):F(e)?St(e,l,2,[l&&l.proxy]):void 0)):F(e)?t?()=>St(e,l,2,[l&&l.proxy]):()=>{if(!l||!l.isUnmounted)return a&&a(),Ct(e,l,3,[p])}:v,t&&o){const e=c;c=()=>Vn(e())}let p=e=>{a=g.options.onStop=()=>{St(e,l,4)}},f=T(e)?[]:On;const d=()=>{if(g.active)if(t){const e=g();(o||u||G(e,f))&&(a&&a(),Ct(t,l,3,[e,f===On?void 0:f,p]),f=e)}else g()};let h;d.allowRecurse=!!t,h="sync"===r?d:"post"===r?()=>_o(d,l&&l.suspense):()=>{!l||l.isMounted?function(e){Ut(e,Ft,$t,At)}(d):d()};const g=ne(c,{lazy:!0,onTrack:s,onTrigger:i,scheduler:h});return Fr(g,l),t?n?d():f=g():"post"===r?_o(g,l&&l.suspense):g(),()=>{oe(g),l&&C(l.effects,g)}}function Pn(e,t,n){const o=this.proxy;return Rn(A(e)?()=>o[e]:e.bind(o),t.bind(o),n,this)}function Vn(e,t=new Set){if(!I(e)||t.has(e))return e;if(t.add(e),ct(e))Vn(e.value,t);else if(T(e))for(let n=0;n{Vn(e,t)}));else for(const n in e)Vn(e[n],t);return e}function Ln(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return wn((()=>{e.isMounted=!0})),En((()=>{e.isUnmounting=!0})),e}const jn=[Function,Array],Un={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:jn,onEnter:jn,onAfterEnter:jn,onEnterCancelled:jn,onBeforeLeave:jn,onLeave:jn,onAfterLeave:jn,onLeaveCancelled:jn,onBeforeAppear:jn,onAppear:jn,onAfterAppear:jn,onAppearCancelled:jn},setup(e,{slots:t}){const n=xr(),o=Ln();let r;return()=>{const s=t.default&&Gn(t.default(),!0);if(!s||!s.length)return;const i=it(e),{mode:l}=i,c=s[0];if(o.isLeaving)return zn(c);const a=Wn(c);if(!a)return zn(c);const u=Dn(a,i,o,n);Kn(a,u);const p=n.subTree,f=p&&Wn(p);let d=!1;const{getTransitionKey:h}=a.type;if(h){const e=h();void 0===r?r=e:e!==r&&(r=e,d=!0)}if(f&&f.type!==Vo&&(!Go(a,f)||d)){const e=Dn(f,i,o,n);if(Kn(f,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},zn(c);"in-out"===l&&a.type!==Vo&&(e.delayLeave=(e,t,n)=>{Hn(o,f)[String(f.key)]=f,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=n})}return c}}};function Hn(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function Dn(e,t,n,o){const{appear:r,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:u,onBeforeLeave:p,onLeave:f,onAfterLeave:d,onLeaveCancelled:h,onBeforeAppear:m,onAppear:g,onAfterAppear:v,onAppearCancelled:y}=t,b=String(e.key),_=Hn(n,e),x=(e,t)=>{e&&Ct(e,o,9,t)},S={mode:s,persisted:i,beforeEnter(t){let o=l;if(!n.isMounted){if(!r)return;o=m||l}t._leaveCb&&t._leaveCb(!0);const s=_[b];s&&Go(e,s)&&s.el._leaveCb&&s.el._leaveCb(),x(o,[t])},enter(e){let t=c,o=a,s=u;if(!n.isMounted){if(!r)return;t=g||c,o=v||a,s=y||u}let i=!1;const l=e._enterCb=t=>{i||(i=!0,x(t?s:o,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,l),t.length<=1&&l()):l()},leave(t,o){const r=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return o();x(p,[t]);let s=!1;const i=t._leaveCb=n=>{s||(s=!0,o(),x(n?h:d,[t]),t._leaveCb=void 0,_[r]===e&&delete _[r])};_[r]=e,f?(f(t,i),f.length<=1&&i()):i()},clone:e=>Dn(e,t,n,o)};return S}function zn(e){if(qn(e))return(e=Xo(e)).children=null,e}function Wn(e){return qn(e)?e.children?e.children[0]:void 0:e}function Kn(e,t){6&e.shapeFlag&&e.component?Kn(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Gn(e,t=!1){let n=[],o=0;for(let r=0;r1)for(let r=0;re.type.__isKeepAlive,Jn={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=xr(),o=n.ctx;if(!o.renderer)return t.default;const r=new Map,s=new Set;let i=null;const l=n.suspense,{renderer:{p:c,m:a,um:u,o:{createElement:p}}}=o,f=p("div");function d(e){to(e),u(e,n,l)}function h(e){r.forEach(((t,n)=>{const o=Mr(t.type);!o||e&&e(o)||m(n)}))}function m(e){const t=r.get(e);i&&t.type===i.type?i&&to(i):d(t),r.delete(e),s.delete(e)}o.activate=(e,t,n,o,r)=>{const s=e.component;a(e,t,n,0,l),c(s.vnode,e,t,n,s,l,o,e.slotScopeIds,r),_o((()=>{s.isDeactivated=!1,s.a&&q(s.a);const t=e.props&&e.props.onVnodeMounted;t&&wo(t,s.parent,e)}),l)},o.deactivate=e=>{const t=e.component;a(e,f,null,1,l),_o((()=>{t.da&&q(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&wo(n,t.parent,e),t.isDeactivated=!0}),l)},Bn((()=>[e.include,e.exclude]),(([e,t])=>{e&&h((t=>Zn(e,t))),t&&h((e=>!Zn(t,e)))}),{flush:"post",deep:!0});let g=null;const v=()=>{null!=g&&r.set(g,no(n.subTree))};return wn(v),Nn(v),En((()=>{r.forEach((e=>{const{subTree:t,suspense:o}=n,r=no(t);if(e.type!==r.type)d(e);else{to(r);const e=r.component.da;e&&_o(e,o)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),o=n[0];if(n.length>1)return i=null,n;if(!(Ko(o)&&(4&o.shapeFlag||128&o.shapeFlag)))return i=null,o;let l=no(o);const c=l.type,a=Mr(c),{include:u,exclude:p,max:f}=e;if(u&&(!a||!Zn(u,a))||p&&a&&Zn(p,a))return i=l,o;const d=null==l.key?c:l.key,h=r.get(d);return l.el&&(l=Xo(l),128&o.shapeFlag&&(o.ssContent=l)),g=d,h?(l.el=h.el,l.component=h.component,l.transition&&Kn(l,l.transition),l.shapeFlag|=512,s.delete(d),s.add(d)):(s.add(d),f&&s.size>parseInt(f,10)&&m(s.values().next().value)),l.shapeFlag|=256,i=l,o}}};function Zn(e,t){return T(e)?e.some((e=>Zn(e,t))):A(e)?e.split(",").indexOf(t)>-1:!!e.test&&e.test(t)}function Qn(e,t){Yn(e,"a",t)}function Xn(e,t){Yn(e,"da",t)}function Yn(e,t,n=_r){const o=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}e()});if(Sn(t,o,n),n){let e=n.parent;for(;e&&e.parent;)qn(e.parent.vnode)&&eo(o,t,n,e),e=e.parent}}function eo(e,t,n,o){const r=Sn(t,e,o,!0);$n((()=>{C(o[t],r)}),n)}function to(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function no(e){return 128&e.shapeFlag?e.ssContent:e}const oo=e=>"_"===e[0]||"$stable"===e,ro=e=>T(e)?e.map(er):[er(e)],so=(e,t,n)=>nn((e=>ro(t(e))),n),io=(e,t)=>{const n=e._ctx;for(const o in e){if(oo(o))continue;const r=e[o];if(F(r))t[o]=so(0,r,n);else if(null!=r){const e=ro(r);t[o]=()=>e}}},lo=(e,t)=>{const n=ro(t);e.slots.default=()=>n};function co(e,t,n,o){const r=e.dirs,s=t&&t.dirs;for(let i=0;i(s.has(e)||(e&&F(e.install)?(s.add(e),e.install(l,...t)):F(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(r.mixins.includes(e)||(r.mixins.push(e),(e.props||e.emits)&&(r.deopt=!0)),l),component:(e,t)=>t?(r.components[e]=t,l):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,l):r.directives[e],mount(s,c,a){if(!i){const u=Qo(n,o);return u.appContext=r,c&&t?t(u,s):e(u,s,a),i=!0,l._container=s,s.__vue_app__=l,u.component.proxy}},unmount(){i&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,l)};return l}}let fo=!1;const ho=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,mo=e=>8===e.nodeType;function go(e){const{mt:t,p:n,o:{patchProp:o,nextSibling:r,parentNode:s,remove:i,insert:l,createComment:c}}=e,a=(n,o,i,l,c,m=!1)=>{const g=mo(n)&&"["===n.data,v=()=>d(n,o,i,l,c,g),{type:y,ref:b,shapeFlag:_}=o,x=n.nodeType;o.el=n;let S=null;switch(y){case Po:3!==x?S=v():(n.data!==o.children&&(fo=!0,n.data=o.children),S=r(n));break;case Vo:S=8!==x||g?v():r(n);break;case Lo:if(1===x){S=n;const e=!o.children.length;for(let t=0;t{t(o,e,null,i,l,ho(e),m)},u=o.type.__asyncLoader;u?u().then(a):a(),S=g?h(n):r(n)}else 64&_?S=8!==x?v():o.type.hydrate(n,o,i,l,c,m,e,p):128&_&&(S=o.type.hydrate(n,o,i,l,ho(s(n)),c,m,e,a))}return null!=b&&xo(b,null,l,o),S},u=(e,t,n,r,s,l)=>{l=l||!!t.dynamicChildren;const{props:c,patchFlag:a,shapeFlag:u,dirs:f}=t;if(-1!==a){if(f&&co(t,null,n,"created"),c)if(!l||16&a||32&a)for(const t in c)!L(t)&&_(t)&&o(e,t,null,c[t]);else c.onClick&&o(e,"onClick",null,c.onClick);let d;if((d=c&&c.onVnodeBeforeMount)&&wo(d,n,t),f&&co(t,null,n,"beforeMount"),((d=c&&c.onVnodeMounted)||f)&&dn((()=>{d&&wo(d,n,t),f&&co(t,null,n,"mounted")}),r),16&u&&(!c||!c.innerHTML&&!c.textContent)){let o=p(e.firstChild,t,e,n,r,s,l);for(;o;){fo=!0;const e=o;o=o.nextSibling,i(e)}}else 8&u&&e.textContent!==t.children&&(fo=!0,e.textContent=t.children)}return e.nextSibling},p=(e,t,o,r,s,i,l)=>{l=l||!!t.dynamicChildren;const c=t.children,u=c.length;for(let p=0;p{const{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);const f=s(e),d=p(r(e),t,f,n,o,i,a);return d&&mo(d)&&"]"===d.data?r(t.anchor=d):(fo=!0,l(t.anchor=c("]"),f,d),d)},d=(e,t,o,l,c,a)=>{if(fo=!0,t.el=null,a){const t=h(e);for(;;){const n=r(e);if(!n||n===t)break;i(n)}}const u=r(e),p=s(e);return i(e),n(null,t,p,u,o,l,ho(p),c),u},h=e=>{let t=0;for(;e;)if((e=r(e))&&mo(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return r(e);t--}return e};return[(e,t)=>{fo=!1,a(t.firstChild,e,null,null,null),zt(),fo&&console.error("Hydration completed but contains mismatches.")},a]}function vo(e){return F(e)?{setup:e,name:e.name}:e}function yo(e,{vnode:{ref:t,props:n,children:o}}){const r=Qo(e,n,o);return r.ref=t,r}const bo={scheduler:Lt,allowRecurse:!0},_o=dn,xo=(e,t,n,o)=>{if(T(e))return void e.forEach(((e,r)=>xo(e,t&&(T(t)?t[r]:t),n,o)));let r;if(o){if(o.type.__asyncLoader)return;r=4&o.shapeFlag?o.component.exposed||o.component.proxy:o.el}else r=null;const{i:s,r:i}=e,l=t&&t.r,c=s.refs===m?s.refs={}:s.refs,a=s.setupState;if(null!=l&&l!==i&&(A(l)?(c[l]=null,w(a,l)&&(a[l]=null)):ct(l)&&(l.value=null)),A(i)){const e=()=>{c[i]=r,w(a,i)&&(a[i]=r)};r?(e.id=-1,_o(e,n)):e()}else if(ct(i)){const e=()=>{i.value=r};r?(e.id=-1,_o(e,n)):e()}else F(i)&&St(i,s,12,[r,c])};function So(e){return ko(e)}function Co(e){return ko(e,go)}function ko(e,t){const{insert:n,remove:o,patchProp:r,forcePatchProp:s,createElement:i,createText:l,createComment:c,setText:a,setElementText:u,parentNode:p,nextSibling:f,setScopeId:d=v,cloneNode:h,insertStaticContent:y}=e,b=(e,t,n,o=null,r=null,s=null,i=!1,l=null,c=!1)=>{e&&!Go(e,t)&&(o=Y(e),K(e,r,s,!0),e=null),-2===t.patchFlag&&(c=!1,t.dynamicChildren=null);const{type:a,ref:u,shapeFlag:p}=t;switch(a){case Po:_(e,t,n,o);break;case Vo:x(e,t,n,o);break;case Lo:null==e&&C(t,n,o,i);break;case Ro:M(e,t,n,o,r,s,i,l,c);break;default:1&p?k(e,t,n,o,r,s,i,l,c):6&p?I(e,t,n,o,r,s,i,l,c):(64&p||128&p)&&a.process(e,t,n,o,r,s,i,l,c,te)}null!=u&&r&&xo(u,e&&e.ref,s,t)},_=(e,t,o,r)=>{if(null==e)n(t.el=l(t.children),o,r);else{const n=t.el=e.el;t.children!==e.children&&a(n,t.children)}},x=(e,t,o,r)=>{null==e?n(t.el=c(t.children||""),o,r):t.el=e.el},C=(e,t,n,o)=>{[e.el,e.anchor]=y(e.children,t,n,o)},k=(e,t,n,o,r,s,i,l,c)=>{i=i||"svg"===t.type,null==e?T(t,n,o,r,s,i,l,c):$(e,t,r,s,i,l,c)},T=(e,t,o,s,l,c,a,p)=>{let f,d;const{type:m,props:g,shapeFlag:v,transition:y,patchFlag:b,dirs:_}=e;if(e.el&&void 0!==h&&-1===b)f=e.el=h(e.el);else{if(f=e.el=i(e.type,c,g&&g.is,g),8&v?u(f,e.children):16&v&&E(e.children,f,null,s,l,c&&"foreignObject"!==m,a,p||!!e.dynamicChildren),_&&co(e,null,s,"created"),g){for(const t in g)L(t)||r(f,t,null,g[t],c,e.children,s,l,X);(d=g.onVnodeBeforeMount)&&wo(d,s,e)}N(f,e,e.scopeId,a,s)}_&&co(e,null,s,"beforeMount");const x=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;x&&y.beforeEnter(f),n(f,t,o),((d=g&&g.onVnodeMounted)||x||_)&&_o((()=>{d&&wo(d,s,e),x&&y.enter(f),_&&co(e,null,s,"mounted")}),l)},N=(e,t,n,o,r)=>{if(n&&d(e,n),o)for(let s=0;s{for(let a=c;a{const a=t.el=e.el;let{patchFlag:p,dynamicChildren:f,dirs:d}=t;p|=16&e.patchFlag;const h=e.props||m,g=t.props||m;let v;if((v=g.onVnodeBeforeUpdate)&&wo(v,n,t,e),d&&co(t,e,n,"beforeUpdate"),p>0){if(16&p)A(a,t,h,g,n,o,i);else if(2&p&&h.class!==g.class&&r(a,"class",null,g.class,i),4&p&&r(a,"style",h.style,g.style,i),8&p){const l=t.dynamicProps;for(let t=0;t{v&&wo(v,n,t,e),d&&co(t,e,n,"updated")}),o)},F=(e,t,n,o,r,s,i)=>{for(let l=0;l{if(n!==o){for(const a in o){if(L(a))continue;const u=o[a],p=n[a];(u!==p||s&&s(e,a))&&r(e,a,p,u,c,t.children,i,l,X)}if(n!==m)for(const s in n)L(s)||s in o||r(e,s,n[s],null,c,t.children,i,l,X)}},M=(e,t,o,r,s,i,c,a,u)=>{const p=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:d,dynamicChildren:h,slotScopeIds:m}=t;d>0&&(u=!0),m&&(a=a?a.concat(m):m),null==e?(n(p,o,r),n(f,o,r),E(t.children,o,f,s,i,c,a,u)):d>0&&64&d&&h&&e.dynamicChildren?(F(e.dynamicChildren,h,o,s,i,c,a),(null!=t.key||s&&t===s.subTree)&&To(e,t,!0)):j(e,t,o,f,s,i,c,a,u)},I=(e,t,n,o,r,s,i,l,c)=>{t.slotScopeIds=l,null==e?512&t.shapeFlag?r.ctx.activate(t,n,o,i,c):B(t,n,o,r,s,i,c):R(e,t,c)},B=(e,t,n,o,r,s,i)=>{const l=e.component=function(e,t,n){const o=e.type,r=(t?t.appContext:e.appContext)||yr,s={uid:br++,vnode:e,type:o,parent:t,appContext:r,root:null,next:null,subTree:null,update:null,render:null,proxy:null,exposed:null,withProxy:null,effects:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:vn(o,r),emitsOptions:qt(o,r),emit:null,emitted:null,propsDefaults:m,ctx:m,data:m,props:m,attrs:m,slots:m,refs:m,setupState:m,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=Gt.bind(null,s),s}(e,o,r);if(qn(e)&&(l.ctx.renderer=te),function(e,t=!1){wr=t;const{props:n,children:o}=e.vnode,r=Cr(e);(function(e,t,n,o=!1){const r={},s={};J(s,qo,1),e.propsDefaults=Object.create(null),mn(e,t,r,s),e.props=n?o?r:et(r):e.type.props?r:s,e.attrs=s})(e,n,r,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=t,J(t,"_",n)):io(t,e.slots={})}else e.slots={},t&&lo(e,t);J(e.slots,qo,1)})(e,o);const s=r?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,gr);const{setup:o}=n;if(o){const n=e.setupContext=o.length>1?$r(e):null;_r=e,ce();const r=St(o,e,0,[e.props,n]);if(ae(),_r=null,O(r)){if(t)return r.then((t=>{Tr(e,t)})).catch((t=>{kt(t,e,0)}));e.asyncDep=r}else Tr(e,r)}else Er(e)}(e,t):void 0;wr=!1}(l),l.asyncDep){if(r&&r.registerDep(l,P),!e.el){const e=l.subTree=Qo(Vo);x(null,e,t,n)}}else P(l,e,t,n,r,s,i)},R=(e,t,n)=>{const o=t.component=e.component;if(function(e,t,n){const{props:o,children:r,component:s}=e,{props:i,children:l,patchFlag:c}=t,a=s.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&c>=0))return!(!r&&!l||l&&l.$stable)||o!==i&&(o?!i||cn(o,i,a):!!i);if(1024&c)return!0;if(16&c)return o?cn(o,i,a):!!i;if(8&c){const e=t.dynamicProps;for(let t=0;tEt&&Nt.splice(t,1)}(o.update),o.update()}else t.component=e.component,t.el=e.el,o.vnode=t},P=(e,t,n,o,r,s,i)=>{e.update=ne((function(){if(e.isMounted){let t,{next:n,bu:o,u:l,parent:c,vnode:a}=e,u=n;n?(n.el=a.el,V(e,n,i)):n=a,o&&q(o),(t=n.props&&n.props.onVnodeBeforeUpdate)&&wo(t,c,n,a);const f=on(e),d=e.subTree;e.subTree=f,b(d,f,p(d.el),Y(d),e,r,s),n.el=f.el,null===u&&an(e,f.el),l&&_o(l,r),(t=n.props&&n.props.onVnodeUpdated)&&_o((()=>{wo(t,c,n,a)}),r)}else{let i;const{el:l,props:c}=t,{bm:a,m:u,parent:p}=e;a&&q(a),(i=c&&c.onVnodeBeforeMount)&&wo(i,p,t);const f=e.subTree=on(e);if(l&&se?se(t.el,f,e,r,null):(b(null,f,n,o,e,r,s),t.el=f.el),u&&_o(u,r),i=c&&c.onVnodeMounted){const e=t;_o((()=>{wo(i,p,e)}),r)}const{a:d}=e;d&&256&t.shapeFlag&&_o(d,r),e.isMounted=!0,t=n=o=null}}),bo)},V=(e,t,n)=>{t.component=e;const o=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,o){const{props:r,attrs:s,vnode:{patchFlag:i}}=e,l=it(r),[c]=e.propsOptions;if(!(o||i>0)||16&i){let o;mn(e,t,r,s);for(const s in l)t&&(w(t,s)||(o=z(s))!==s&&w(t,o))||(c?!n||void 0===n[s]&&void 0===n[o]||(r[s]=gn(c,t||m,s,void 0,e)):delete r[s]);if(s!==l)for(const e in s)t&&w(t,e)||delete s[e]}else if(8&i){const n=e.vnode.dynamicProps;for(let o=0;o{const{vnode:o,slots:r}=e;let s=!0,i=m;if(32&o.shapeFlag){const e=t._;e?n&&1===e?s=!1:(S(r,t),n||1!==e||delete r._):(s=!t.$stable,io(t,r)),i=t}else t&&(lo(e,t),i={default:1});if(s)for(const l in r)oo(l)||l in i||delete r[l]})(e,t.children,n),ce(),Dt(void 0,e.update),ae()},j=(e,t,n,o,r,s,i,l,c=!1)=>{const a=e&&e.children,p=e?e.shapeFlag:0,f=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void D(a,f,n,o,r,s,i,l,c);if(256&d)return void U(a,f,n,o,r,s,i,l,c)}8&h?(16&p&&X(a,r,s),f!==a&&u(n,f)):16&p?16&h?D(a,f,n,o,r,s,i,l,c):X(a,r,s,!0):(8&p&&u(n,""),16&h&&E(f,n,o,r,s,i,l,c))},U=(e,t,n,o,r,s,i,l,c)=>{const a=(e=e||g).length,u=(t=t||g).length,p=Math.min(a,u);let f;for(f=0;fu?X(e,r,s,!0,!1,p):E(t,n,o,r,s,i,l,c,p)},D=(e,t,n,o,r,s,i,l,c)=>{let a=0;const u=t.length;let p=e.length-1,f=u-1;for(;a<=p&&a<=f;){const o=e[a],u=t[a]=c?tr(t[a]):er(t[a]);if(!Go(o,u))break;b(o,u,n,null,r,s,i,l,c),a++}for(;a<=p&&a<=f;){const o=e[p],a=t[f]=c?tr(t[f]):er(t[f]);if(!Go(o,a))break;b(o,a,n,null,r,s,i,l,c),p--,f--}if(a>p){if(a<=f){const e=f+1,p=ef)for(;a<=p;)K(e[a],r,s,!0),a++;else{const d=a,h=a,m=new Map;for(a=h;a<=f;a++){const e=t[a]=c?tr(t[a]):er(t[a]);null!=e.key&&m.set(e.key,a)}let v,y=0;const _=f-h+1;let x=!1,S=0;const C=new Array(_);for(a=0;a<_;a++)C[a]=0;for(a=d;a<=p;a++){const o=e[a];if(y>=_){K(o,r,s,!0);continue}let u;if(null!=o.key)u=m.get(o.key);else for(v=h;v<=f;v++)if(0===C[v-h]&&Go(o,t[v])){u=v;break}void 0===u?K(o,r,s,!0):(C[u-h]=a+1,u>=S?S=u:x=!0,b(o,t[u],n,null,r,s,i,l,c),y++)}const k=x?function(e){const t=e.slice(),n=[0];let o,r,s,i,l;const c=e.length;for(o=0;o0&&(t[o]=n[s-1]),n[s]=o)}}s=n.length,i=n[s-1];for(;s-- >0;)n[s]=i,i=t[i];return n}(C):g;for(v=k.length-1,a=_-1;a>=0;a--){const e=h+a,p=t[e],f=e+1{const{el:i,type:l,transition:c,children:a,shapeFlag:u}=e;if(6&u)return void W(e.component.subTree,t,o,r);if(128&u)return void e.suspense.move(t,o,r);if(64&u)return void l.move(e,t,o,te);if(l===Ro){n(i,t,o);for(let e=0;e{let s;for(;e&&e!==t;)s=f(e),n(e,o,r),e=s;n(t,o,r)})(e,t,o);if(2!==r&&1&u&&c)if(0===r)c.beforeEnter(i),n(i,t,o),_o((()=>c.enter(i)),s);else{const{leave:e,delayLeave:r,afterLeave:s}=c,l=()=>n(i,t,o),a=()=>{e(i,(()=>{l(),s&&s()}))};r?r(i,l,a):a()}else n(i,t,o)},K=(e,t,n,o=!1,r=!1)=>{const{type:s,props:i,ref:l,children:c,dynamicChildren:a,shapeFlag:u,patchFlag:p,dirs:f}=e;if(null!=l&&xo(l,null,n,null),256&u)return void t.ctx.deactivate(e);const d=1&u&&f;let h;if((h=i&&i.onVnodeBeforeUnmount)&&wo(h,t,e),6&u)Q(e.component,n,o);else{if(128&u)return void e.suspense.unmount(n,o);d&&co(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,r,te,o):a&&(s!==Ro||p>0&&64&p)?X(a,t,n,!1,!0):(s===Ro&&(128&p||256&p)||!r&&16&u)&&X(c,t,n),o&&G(e)}((h=i&&i.onVnodeUnmounted)||d)&&_o((()=>{h&&wo(h,t,e),d&&co(e,null,t,"unmounted")}),n)},G=e=>{const{type:t,el:n,anchor:r,transition:s}=e;if(t===Ro)return void Z(n,r);if(t===Lo)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=f(e),o(e),e=n;o(t)})(e);const i=()=>{o(n),s&&!s.persisted&&s.afterLeave&&s.afterLeave()};if(1&e.shapeFlag&&s&&!s.persisted){const{leave:t,delayLeave:o}=s,r=()=>t(n,i);o?o(e.el,i,r):r()}else i()},Z=(e,t)=>{let n;for(;e!==t;)n=f(e),o(e),e=n;o(t)},Q=(e,t,n)=>{const{bum:o,effects:r,update:s,subTree:i,um:l}=e;if(o&&q(o),r)for(let c=0;c{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},X=(e,t,n,o=!1,r=!1,s=0)=>{for(let i=s;i6&e.shapeFlag?Y(e.component.subTree):128&e.shapeFlag?e.suspense.next():f(e.anchor||e.el),ee=(e,t,n)=>{null==e?t._vnode&&K(t._vnode,null,null,!0):b(t._vnode||null,e,t,null,null,null,n),zt(),t._vnode=e},te={p:b,um:K,m:W,r:G,mt:B,mc:E,pc:j,pbc:F,n:Y,o:e};let re,se;return t&&([re,se]=t(te)),{render:ee,hydrate:re,createApp:po(ee,re)}}function wo(e,t,n,o=null){Ct(e,t,7,[n,o])}function To(e,t,n=!1){const o=e.children,r=t.children;if(T(o)&&T(r))for(let s=0;se&&(e.disabled||""===e.disabled),Eo=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,$o=(e,t)=>{const n=e&&e.to;if(A(n)){if(t){return t(n)}return null}return n};function Fo(e,t,n,{o:{insert:o},m:r},s=2){0===s&&o(e.targetAnchor,t,n);const{el:i,anchor:l,shapeFlag:c,children:a,props:u}=e,p=2===s;if(p&&o(i,t,n),(!p||No(u))&&16&c)for(let f=0;f{16&v&&u(y,e,t,r,s,i,l,c)};g?b(n,a):p&&b(p,f)}else{t.el=e.el;const o=t.anchor=e.anchor,u=t.target=e.target,d=t.targetAnchor=e.targetAnchor,m=No(e.props),v=m?n:u,y=m?o:d;if(i=i||Eo(u),t.dynamicChildren?(f(e.dynamicChildren,t.dynamicChildren,v,r,s,i,l),To(e,t,!0)):c||p(e,t,v,y,r,s,i,l,!1),g)m||Fo(t,n,o,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=$o(t.props,h);e&&Fo(t,e,null,a,0)}else m&&Fo(t,u,d,a,1)}},remove(e,t,n,o,{um:r,o:{remove:s}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:u,target:p,props:f}=e;if(p&&s(u),(i||!No(f))&&(s(a),16&l))for(let d=0;d0&&Uo&&Uo.push(s),s}function Ko(e){return!!e&&!0===e.__v_isVNode}function Go(e,t){return e.type===t.type&&e.key===t.key}const qo="__vInternal",Jo=({key:e})=>null!=e?e:null,Zo=({ref:e})=>null!=e?A(e)||ct(e)||F(e)?{i:Yt,r:e}:e:null,Qo=function(e,t=null,n=null,o=0,s=null,i=!1){e&&e!==Io||(e=Vo);if(Ko(e)){const o=Xo(e,t,!0);return n&&nr(o,n),o}l=e,F(l)&&"__vccOpts"in l&&(e=e.__vccOpts);var l;if(t){(st(t)||qo in t)&&(t=S({},t));let{class:e,style:n}=t;e&&!A(e)&&(t.class=c(e)),I(n)&&(st(n)&&!T(n)&&(n=S({},n)),t.style=r(n))}const a=A(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:I(e)?4:F(e)?2:0,u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Jo(t),ref:t&&Zo(t),scopeId:en,slotScopeIds:null,children:null,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:o,dynamicProps:s,dynamicChildren:null,appContext:null};if(nr(u,n),128&a){const{content:e,fallback:t}=function(e){const{shapeFlag:t,children:n}=e;let o,r;return 32&t?(o=fn(n.default),r=fn(n.fallback)):(o=fn(n),r=er(null)),{content:o,fallback:r}}(u);u.ssContent=e,u.ssFallback=t}zo>0&&!i&&Uo&&(o>0||6&a)&&32!==o&&Uo.push(u);return u};function Xo(e,t,n=!1){const{props:o,ref:r,patchFlag:s,children:i}=e,l=t?or(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Jo(l),ref:t&&t.ref?n&&r?T(r)?r.concat(Zo(t)):[r,Zo(t)]:Zo(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ro?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xo(e.ssContent),ssFallback:e.ssFallback&&Xo(e.ssFallback),el:e.el,anchor:e.anchor}}function Yo(e=" ",t=0){return Qo(Po,null,e,t)}function er(e){return null==e||"boolean"==typeof e?Qo(Vo):T(e)?Qo(Ro,null,e):"object"==typeof e?null===e.el?e:Xo(e):Qo(Po,null,String(e))}function tr(e){return null===e.el?e:Xo(e)}function nr(e,t){let n=0;const{shapeFlag:o}=e;if(null==t)t=null;else if(T(t))n=16;else if("object"==typeof t){if(1&o||64&o){const n=t.default;return void(n&&(n._c&&Qt(1),nr(e,n()),n._c&&Qt(-1)))}{n=32;const o=t._;o||qo in t?3===o&&Yt&&(1024&Yt.vnode.patchFlag?(t._=2,e.patchFlag|=1024):t._=1):t._ctx=Yt}}else F(t)?(t={default:t,_ctx:Yt},n=32):(t=String(t),64&o?(n=16,t=[Yo(t)]):n=8);e.children=t,e.shapeFlag|=n}function or(...e){const t=S({},e[0]);for(let n=1;n1)return n&&F(t)?t():t}}let ir=!0;function lr(e,t,n=[],o=[],r=[],s=!1){const{mixins:i,extends:l,data:c,computed:a,methods:u,watch:p,provide:f,inject:d,components:h,directives:g,beforeMount:y,mounted:b,beforeUpdate:_,updated:x,activated:C,deactivated:k,beforeUnmount:w,unmounted:N,render:E,renderTracked:$,renderTriggered:A,errorCaptured:M,expose:O}=t,B=e.proxy,R=e.ctx,P=e.appContext.mixins;if(s&&E&&e.render===v&&(e.render=E),s||(ir=!1,cr("beforeCreate","bc",t,e,P),ir=!0,ur(e,P,n,o,r)),l&&lr(e,l,n,o,r,!0),i&&ur(e,i,n,o,r),d)if(T(d))for(let m=0;mpr(e,t,B))),c&&pr(e,c,B)),a)for(const m in a){const e=a[m],t=Or({get:F(e)?e.bind(B,B):F(e.get)?e.get.bind(B,B):v,set:!F(e)&&F(e.set)?e.set.bind(B):v});Object.defineProperty(R,m,{enumerable:!0,configurable:!0,get:()=>t.value,set:e=>t.value=e})}if(p&&o.push(p),!s&&o.length&&o.forEach((e=>{for(const t in e)fr(e[t],R,B,t)})),f&&r.push(f),!s&&r.length&&r.forEach((e=>{const t=F(e)?e.call(B):e;Reflect.ownKeys(t).forEach((e=>{rr(e,t[e])}))})),s&&(h&&S(e.components||(e.components=S({},e.type.components)),h),g&&S(e.directives||(e.directives=S({},e.type.directives)),g)),s||cr("created","c",t,e,P),y&&kn(y.bind(B)),b&&wn(b.bind(B)),_&&Tn(_.bind(B)),x&&Nn(x.bind(B)),C&&Qn(C.bind(B)),k&&Xn(k.bind(B)),M&&Mn(M.bind(B)),$&&An($.bind(B)),A&&Fn(A.bind(B)),w&&En(w.bind(B)),N&&$n(N.bind(B)),T(O)&&!s)if(O.length){const t=e.exposed||(e.exposed=ht({}));O.forEach((e=>{t[e]=vt(B,e)}))}else e.exposed||(e.exposed=m)}function cr(e,t,n,o,r){for(let s=0;s{let t=e;for(let e=0;en[o];if(A(e)){const n=t[e];F(n)&&Bn(r,n)}else if(F(e))Bn(r,e.bind(n));else if(I(e))if(T(e))e.forEach((e=>fr(e,t,n,o)));else{const o=F(e.handler)?e.handler.bind(n):t[e.handler];F(o)&&Bn(r,o,e)}}function dr(e,t,n){const o=n.appContext.config.optionMergeStrategies,{mixins:r,extends:s}=t;s&&dr(e,s,n),r&&r.forEach((t=>dr(e,t,n)));for(const i in t)e[i]=o&&w(o,i)?o[i](e[i],t[i],n.proxy,i):t[i]}const hr=e=>e?Cr(e)?e.exposed?e.exposed:e.proxy:hr(e.parent):null,mr=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$emit:e=>e.emit,$options:e=>function(e){const t=e.type,{__merged:n,mixins:o,extends:r}=t;if(n)return n;const s=e.appContext.mixins;if(!s.length&&!o&&!r)return t;const i={};return s.forEach((t=>dr(i,t,e))),dr(i,t,e),t.__merged=i}(e),$forceUpdate:e=>()=>Lt(e.update),$nextTick:e=>Vt.bind(e.proxy),$watch:e=>Pn.bind(e)}),gr={get({_:e},t){const{ctx:n,setupState:o,data:r,props:s,accessCache:i,type:l,appContext:c}=e;if("__v_skip"===t)return!0;let a;if("$"!==t[0]){const l=i[t];if(void 0!==l)switch(l){case 0:return o[t];case 1:return r[t];case 3:return n[t];case 2:return s[t]}else{if(o!==m&&w(o,t))return i[t]=0,o[t];if(r!==m&&w(r,t))return i[t]=1,r[t];if((a=e.propsOptions[0])&&w(a,t))return i[t]=2,s[t];if(n!==m&&w(n,t))return i[t]=3,n[t];ir&&(i[t]=4)}}const u=mr[t];let p,f;return u?("$attrs"===t&&ue(e,0,t),u(e)):(p=l.__cssModules)&&(p=p[t])?p:n!==m&&w(n,t)?(i[t]=3,n[t]):(f=c.config.globalProperties,w(f,t)?f[t]:void 0)},set({_:e},t,n){const{data:o,setupState:r,ctx:s}=e;if(r!==m&&w(r,t))r[t]=n;else if(o!==m&&w(o,t))o[t]=n;else if(w(e.props,t))return!1;return("$"!==t[0]||!(t.slice(1)in e))&&(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,propsOptions:s}},i){let l;return void 0!==n[i]||e!==m&&w(e,i)||t!==m&&w(t,i)||(l=s[0])&&w(l,i)||w(o,i)||w(mr,i)||w(r.config.globalProperties,i)}},vr=S({},gr,{get(e,t){if(t!==Symbol.unscopables)return gr.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!n(t)}),yr=ao();let br=0;let _r=null;const xr=()=>_r||Yt,Sr=e=>{_r=e};function Cr(e){return 4&e.vnode.shapeFlag}let kr,wr=!1;function Tr(e,t,n){F(t)?e.render=t:I(t)&&(e.setupState=ht(t)),Er(e)}function Nr(e){kr=e}function Er(e,t){const n=e.type;e.render||(kr&&n.template&&!n.render&&(n.render=kr(n.template,{isCustomElement:e.appContext.config.isCustomElement,delimiters:n.delimiters})),e.render=n.render||v,e.render._rc&&(e.withProxy=new Proxy(e.ctx,vr))),_r=e,ce(),lr(e,n),ae(),_r=null}function $r(e){const t=t=>{e.exposed=ht(t)};return{attrs:e.attrs,slots:e.slots,emit:e.emit,expose:t}}function Fr(e,t=_r){t&&(t.effects||(t.effects=[])).push(e)}const Ar=/(?:^|[-_])(\w)/g;function Mr(e){return F(e)&&e.displayName||e.name}function Ir(e,t,n=!1){let o=Mr(t);if(!o&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(o=e[1])}if(!o&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};o=n(e.components||e.parent.type.components)||n(e.appContext.components)}return o?o.replace(Ar,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}function Or(e){const t=function(e){let t,n;return F(e)?(t=e,n=v):(t=e.get,n=e.set),new yt(t,n,F(e)||!e.set)}(e);return Fr(t.effect),t}function Br(e,t,n){const o=arguments.length;return 2===o?I(t)&&!T(t)?Ko(t)?Qo(e,null,[t]):Qo(e,t):Qo(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):3===o&&Ko(n)&&(n=[n]),Qo(e,t,n))}const Rr=Symbol("");const Pr="3.0.11",Vr="http://www.w3.org/2000/svg",Lr="undefined"!=typeof document?document:null;let jr,Ur;const Hr={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t?Lr.createElementNS(Vr,e):Lr.createElement(e,n?{is:n}:void 0);return"select"===e&&o&&null!=o.multiple&&r.setAttribute("multiple",o.multiple),r},createText:e=>Lr.createTextNode(e),createComment:e=>Lr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Lr.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,o){const r=o?Ur||(Ur=Lr.createElementNS(Vr,"svg")):jr||(jr=Lr.createElement("div"));r.innerHTML=e;const s=r.firstChild;let i=s,l=i;for(;i;)l=i,Hr.insert(i,t,n),i=r.firstChild;return[s,l]}};const Dr=/\s*!important$/;function zr(e,t,n){if(T(n))n.forEach((n=>zr(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const o=function(e,t){const n=Kr[t];if(n)return n;let o=H(t);if("filter"!==o&&o in e)return Kr[t]=o;o=W(o);for(let r=0;rdocument.createEvent("Event").timeStamp&&(qr=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);Jr=!!(e&&Number(e[1])<=53)}let Zr=0;const Qr=Promise.resolve(),Xr=()=>{Zr=0};function Yr(e,t,n,o){e.addEventListener(t,n,o)}function es(e,t,n,o,r=null){const s=e._vei||(e._vei={}),i=s[t];if(o&&i)i.value=o;else{const[n,l]=function(e){let t;if(ts.test(e)){let n;for(t={};n=e.match(ts);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[z(e.slice(2)),t]}(t);if(o){Yr(e,n,s[t]=function(e,t){const n=e=>{const o=e.timeStamp||qr();(Jr||o>=n.attached-1)&&Ct(function(e,t){if(T(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=(()=>Zr||(Qr.then(Xr),Zr=qr()))(),n}(o,r),l)}else i&&(!function(e,t,n,o){e.removeEventListener(t,n,o)}(e,n,i,l),s[t]=void 0)}}const ts=/(?:Once|Passive|Capture)$/;const ns=/^on[a-z]/;function os(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{os(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el){const n=e.el.style;for(const e in t)n.setProperty(`--${e}`,t[e])}else e.type===Ro&&e.children.forEach((e=>os(e,t)))}const rs="transition",ss="animation",is=(e,{slots:t})=>Br(Un,as(e),t);is.displayName="Transition";const ls={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},cs=is.props=S({},Un.props,ls);function as(e){let{name:t="v",type:n,css:o=!0,duration:r,enterFromClass:s=`${t}-enter-from`,enterActiveClass:i=`${t}-enter-active`,enterToClass:l=`${t}-enter-to`,appearFromClass:c=s,appearActiveClass:a=i,appearToClass:u=l,leaveFromClass:p=`${t}-leave-from`,leaveActiveClass:f=`${t}-leave-active`,leaveToClass:d=`${t}-leave-to`}=e;const h={};for(const S in e)S in ls||(h[S]=e[S]);if(!o)return h;const m=function(e){if(null==e)return null;if(I(e))return[us(e.enter),us(e.leave)];{const t=us(e);return[t,t]}}(r),g=m&&m[0],v=m&&m[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:_,onLeave:x,onLeaveCancelled:C,onBeforeAppear:k=y,onAppear:w=b,onAppearCancelled:T=_}=h,N=(e,t,n)=>{fs(e,t?u:l),fs(e,t?a:i),n&&n()},E=(e,t)=>{fs(e,d),fs(e,f),t&&t()},$=e=>(t,o)=>{const r=e?w:b,i=()=>N(t,e,o);r&&r(t,i),ds((()=>{fs(t,e?c:s),ps(t,e?u:l),r&&r.length>1||ms(t,n,g,i)}))};return S(h,{onBeforeEnter(e){y&&y(e),ps(e,s),ps(e,i)},onBeforeAppear(e){k&&k(e),ps(e,c),ps(e,a)},onEnter:$(!1),onAppear:$(!0),onLeave(e,t){const o=()=>E(e,t);ps(e,p),bs(),ps(e,f),ds((()=>{fs(e,p),ps(e,d),x&&x.length>1||ms(e,n,v,o)})),x&&x(e,o)},onEnterCancelled(e){N(e,!1),_&&_(e)},onAppearCancelled(e){N(e,!0),T&&T(e)},onLeaveCancelled(e){E(e),C&&C(e)}})}function us(e){return Z(e)}function ps(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function fs(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ds(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let hs=0;function ms(e,t,n,o){const r=e._endId=++hs,s=()=>{r===e._endId&&o()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:c}=gs(e,t);if(!i)return o();const a=i+"end";let u=0;const p=()=>{e.removeEventListener(a,f),s()},f=t=>{t.target===e&&++u>=c&&p()};setTimeout((()=>{u(n[e]||"").split(", "),r=o("transitionDelay"),s=o("transitionDuration"),i=vs(r,s),l=o("animationDelay"),c=o("animationDuration"),a=vs(l,c);let u=null,p=0,f=0;t===rs?i>0&&(u=rs,p=i,f=s.length):t===ss?a>0&&(u=ss,p=a,f=c.length):(p=Math.max(i,a),u=p>0?i>a?rs:ss:null,f=u?u===rs?s.length:c.length:0);return{type:u,timeout:p,propCount:f,hasTransform:u===rs&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function vs(e,t){for(;e.lengthys(t)+ys(e[n]))))}function ys(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function bs(){return document.body.offsetHeight}const _s=new WeakMap,xs=new WeakMap,Ss={name:"TransitionGroup",props:S({},cs,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=xr(),o=Ln();let r,s;return Nn((()=>{if(!r.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const o=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&o.classList.remove(e)))}));n.split(/\s+/).forEach((e=>e&&o.classList.add(e))),o.style.display="none";const r=1===t.nodeType?t:t.parentNode;r.appendChild(o);const{hasTransform:s}=gs(o);return r.removeChild(o),s}(r[0].el,n.vnode.el,t))return;r.forEach(Cs),r.forEach(ks);const o=r.filter(ws);bs(),o.forEach((e=>{const n=e.el,o=n.style;ps(n,t),o.transform=o.webkitTransform=o.transitionDuration="";const r=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",r),n._moveCb=null,fs(n,t))};n.addEventListener("transitionend",r)}))})),()=>{const i=it(e),l=as(i),c=i.tag||Ro;r=s,s=t.default?Gn(t.default()):[];for(let e=0;e{const t=e.props["onUpdate:modelValue"];return T(t)?e=>q(t,e):t};function Ns(e){e.target.composing=!0}function Es(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}(t,"input"))}const $s={created(e,{modifiers:{lazy:t,trim:n,number:o}},r){e._assign=Ts(r);const s=o||"number"===e.type;Yr(e,t?"change":"input",(t=>{if(t.target.composing)return;let o=e.value;n?o=o.trim():s&&(o=Z(o)),e._assign(o)})),n&&Yr(e,"change",(()=>{e.value=e.value.trim()})),t||(Yr(e,"compositionstart",Ns),Yr(e,"compositionend",Es),Yr(e,"change",Es))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{trim:n,number:o}},r){if(e._assign=Ts(r),e.composing)return;if(document.activeElement===e){if(n&&e.value.trim()===t)return;if((o||"number"===e.type)&&Z(e.value)===t)return}const s=null==t?"":t;e.value!==s&&(e.value=s)}},Fs={created(e,t,n){e._assign=Ts(n),Yr(e,"change",(()=>{const t=e._modelValue,n=Bs(e),o=e.checked,r=e._assign;if(T(t)){const e=d(t,n),s=-1!==e;if(o&&!s)r(t.concat(n));else if(!o&&s){const n=[...t];n.splice(e,1),r(n)}}else if(E(t)){const e=new Set(t);o?e.add(n):e.delete(n),r(e)}else r(Rs(e,o))}))},mounted:As,beforeUpdate(e,t,n){e._assign=Ts(n),As(e,t,n)}};function As(e,{value:t,oldValue:n},o){e._modelValue=t,T(t)?e.checked=d(t,o.props.value)>-1:E(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=f(t,Rs(e,!0)))}const Ms={created(e,{value:t},n){e.checked=f(t,n.props.value),e._assign=Ts(n),Yr(e,"change",(()=>{e._assign(Bs(e))}))},beforeUpdate(e,{value:t,oldValue:n},o){e._assign=Ts(o),t!==n&&(e.checked=f(t,o.props.value))}},Is={created(e,{value:t,modifiers:{number:n}},o){const r=E(t);Yr(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?Z(Bs(e)):Bs(e)));e._assign(e.multiple?r?new Set(t):t:t[0])})),e._assign=Ts(o)},mounted(e,{value:t}){Os(e,t)},beforeUpdate(e,t,n){e._assign=Ts(n)},updated(e,{value:t}){Os(e,t)}};function Os(e,t){const n=e.multiple;if(!n||T(t)||E(t)){for(let o=0,r=e.options.length;o-1:t.has(s);else if(f(Bs(r),t))return void(e.selectedIndex=o)}n||(e.selectedIndex=-1)}}function Bs(e){return"_value"in e?e._value:e.value}function Rs(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Ps={created(e,t,n){Vs(e,t,n,null,"created")},mounted(e,t,n){Vs(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){Vs(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){Vs(e,t,n,o,"updated")}};function Vs(e,t,n,o,r){let s;switch(e.tagName){case"SELECT":s=Is;break;case"TEXTAREA":s=$s;break;default:switch(n.props&&n.props.type){case"checkbox":s=Fs;break;case"radio":s=Ms;break;default:s=$s}}const i=s[r];i&&i(e,t,n,o)}const Ls=["ctrl","shift","alt","meta"],js={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Ls.some((n=>e[`${n}Key`]&&!t.includes(n)))},Us={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Hs={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Ds(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Ds(e,!0),o.enter(e)):o.leave(e,(()=>{Ds(e,!1)})):Ds(e,t))},beforeUnmount(e,{value:t}){Ds(e,t)}};function Ds(e,t){e.style.display=t?e._vod:"none"}const zs=S({patchProp:(e,t,n,r,s=!1,i,l,c,a)=>{switch(t){case"class":!function(e,t,n){if(null==t&&(t=""),n)e.setAttribute("class",t);else{const n=e._vtc;n&&(t=(t?[t,...n]:[...n]).join(" ")),e.className=t}}(e,r,s);break;case"style":!function(e,t,n){const o=e.style;if(n)if(A(n)){if(t!==n){const t=o.display;o.cssText=n,"_vod"in e&&(o.display=t)}}else{for(const e in n)zr(o,e,n[e]);if(t&&!A(t))for(const e in t)null==n[e]&&zr(o,e,"")}else e.removeAttribute("style")}(e,n,r);break;default:_(t)?x(t)||es(e,t,0,r,l):function(e,t,n,o){if(o)return"innerHTML"===t||!!(t in e&&ns.test(t)&&F(n));if("spellcheck"===t||"draggable"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if(ns.test(t)&&A(n))return!1;return t in e}(e,t,r,s)?function(e,t,n,o,r,s,i){if("innerHTML"===t||"textContent"===t)return o&&i(o,r,s),void(e[t]=null==n?"":n);if("value"!==t||"PROGRESS"===e.tagName){if(""===n||null==n){const o=typeof e[t];if(""===n&&"boolean"===o)return void(e[t]=!0);if(null==n&&"string"===o)return e[t]="",void e.removeAttribute(t);if("number"===o)return e[t]=0,void e.removeAttribute(t)}try{e[t]=n}catch(l){}}else{e._value=n;const t=null==n?"":n;e.value!==t&&(e.value=t)}}(e,t,r,i,l,c,a):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(Gr,t.slice(6,t.length)):e.setAttributeNS(Gr,t,n);else{const r=o(t);null==n||r&&!1===n?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},forcePatchProp:(e,t)=>"value"===t},Hr);let Ws,Ks=!1;function Gs(){return Ws||(Ws=So(zs))}function qs(){return Ws=Ks?Ws:Co(zs),Ks=!0,Ws}function Js(e){if(A(e)){return document.querySelector(e)}return e}function Zs(e){throw e}function Qs(e,t,n,o){const r=new SyntaxError(String(e));return r.code=e,r.loc=t,r}const Xs=Symbol(""),Ys=Symbol(""),ei=Symbol(""),ti=Symbol(""),ni=Symbol(""),oi=Symbol(""),ri=Symbol(""),si=Symbol(""),ii=Symbol(""),li=Symbol(""),ci=Symbol(""),ai=Symbol(""),ui=Symbol(""),pi=Symbol(""),fi=Symbol(""),di=Symbol(""),hi=Symbol(""),mi=Symbol(""),gi=Symbol(""),vi=Symbol(""),yi=Symbol(""),bi=Symbol(""),_i=Symbol(""),xi=Symbol(""),Si=Symbol(""),Ci=Symbol(""),ki=Symbol(""),wi=Symbol(""),Ti=Symbol(""),Ni=Symbol(""),Ei=Symbol(""),$i={[Xs]:"Fragment",[Ys]:"Teleport",[ei]:"Suspense",[ti]:"KeepAlive",[ni]:"BaseTransition",[oi]:"openBlock",[ri]:"createBlock",[si]:"createVNode",[ii]:"createCommentVNode",[li]:"createTextVNode",[ci]:"createStaticVNode",[ai]:"resolveComponent",[ui]:"resolveDynamicComponent",[pi]:"resolveDirective",[fi]:"withDirectives",[di]:"renderList",[hi]:"renderSlot",[mi]:"createSlots",[gi]:"toDisplayString",[vi]:"mergeProps",[yi]:"toHandlers",[bi]:"camelize",[_i]:"capitalize",[xi]:"toHandlerKey",[Si]:"setBlockTracking",[Ci]:"pushScopeId",[ki]:"popScopeId",[wi]:"withScopeId",[Ti]:"withCtx",[Ni]:"unref",[Ei]:"isRef"};const Fi={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function Ai(e,t,n,o,r,s,i,l=!1,c=!1,a=Fi){return e&&(l?(e.helper(oi),e.helper(ri)):e.helper(si),i&&e.helper(fi)),{type:13,tag:t,props:n,children:o,patchFlag:r,dynamicProps:s,directives:i,isBlock:l,disableTracking:c,loc:a}}function Mi(e,t=Fi){return{type:17,loc:t,elements:e}}function Ii(e,t=Fi){return{type:15,loc:t,properties:e}}function Oi(e,t){return{type:16,loc:Fi,key:A(e)?Bi(e,!0):e,value:t}}function Bi(e,t,n=Fi,o=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:o}}function Ri(e,t=Fi){return{type:8,loc:t,children:e}}function Pi(e,t=[],n=Fi){return{type:14,loc:n,callee:e,arguments:t}}function Vi(e,t,n=!1,o=!1,r=Fi){return{type:18,params:e,returns:t,newline:n,isSlot:o,loc:r}}function Li(e,t,n,o=!0){return{type:19,test:e,consequent:t,alternate:n,newline:o,loc:Fi}}const ji=e=>4===e.type&&e.isStatic,Ui=(e,t)=>e===t||e===z(t);function Hi(e){return Ui(e,"Teleport")?Ys:Ui(e,"Suspense")?ei:Ui(e,"KeepAlive")?ti:Ui(e,"BaseTransition")?ni:void 0}const Di=/^\d|[^\$\w]/,zi=e=>!Di.test(e),Wi=/^[A-Za-z_$\xA0-\uFFFF][\w$\xA0-\uFFFF]*(?:\s*\.\s*[A-Za-z_$\xA0-\uFFFF][\w$\xA0-\uFFFF]*|\[[^\]]+\])*$/,Ki=e=>!!e&&Wi.test(e.trim());function Gi(e,t,n){const o={source:e.source.substr(t,n),start:qi(e.start,e.source,t),end:e.end};return null!=n&&(o.end=qi(e.start,e.source,t+n)),o}function qi(e,t,n=t.length){return Ji(S({},e),t,n)}function Ji(e,t,n=t.length){let o=0,r=-1;for(let s=0;s4===e.key.type&&e.key.content===n))}e||r.properties.unshift(t),o=r}else o=Pi(n.helper(vi),[Ii([t]),r]);13===e.type?e.props=o:e.arguments[2]=o}function rl(e,t){return`_${t}_${e.replace(/[^\w]/g,"_")}`}const sl=/&(gt|lt|amp|apos|quot);/g,il={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},ll={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:y,isPreTag:y,isCustomElement:y,decodeEntities:e=>e.replace(sl,((e,t)=>il[t])),onError:Zs,comments:!1};function cl(e,t={}){const n=function(e,t){const n=S({},ll);for(const o in t)n[o]=t[o]||ll[o];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1}}(e,t),o=Sl(n);return function(e,t=Fi){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(al(n,0,[]),Cl(n,o))}function al(e,t,n){const o=kl(n),r=o?o.ns:0,s=[];for(;!$l(e,t,n);){const i=e.source;let l;if(0===t||1===t)if(!e.inVPre&&wl(i,e.options.delimiters[0]))l=bl(e,t);else if(0===t&&"<"===i[0])if(1===i.length);else if("!"===i[1])l=wl(i,"\x3c!--")?fl(e):wl(i,""===i[2]){Tl(e,3);continue}if(/[a-z]/i.test(i[2])){gl(e,1,o);continue}l=dl(e)}else/[a-z]/i.test(i[1])?l=hl(e,n):"?"===i[1]&&(l=dl(e));if(l||(l=_l(e,t)),T(l))for(let e=0;e/.exec(e.source);if(o){n=e.source.slice(4,o.index);const t=e.source.slice(0,o.index);let r=1,s=0;for(;-1!==(s=t.indexOf("\x3c!--",r));)Tl(e,s-r+1),r=s+1;Tl(e,o.index+o[0].length-r+1)}else n=e.source.slice(4),Tl(e,e.source.length);return{type:3,content:n,loc:Cl(e,t)}}function dl(e){const t=Sl(e),n="?"===e.source[1]?1:2;let o;const r=e.source.indexOf(">");return-1===r?(o=e.source.slice(n),Tl(e,e.source.length)):(o=e.source.slice(n,r),Tl(e,r+1)),{type:3,content:o,loc:Cl(e,t)}}function hl(e,t){const n=e.inPre,o=e.inVPre,r=kl(t),s=gl(e,0,r),i=e.inPre&&!n,l=e.inVPre&&!o;if(s.isSelfClosing||e.options.isVoidTag(s.tag))return s;t.push(s);const c=e.options.getTextMode(s,r),a=al(e,c,t);if(t.pop(),s.children=a,Fl(e.source,s.tag))gl(e,1,r);else if(0===e.source.length&&"script"===s.tag.toLowerCase()){const e=a[0];e&&wl(e.loc.source,"\x3c!--")}return s.loc=Cl(e,s.loc.start),i&&(e.inPre=!1),l&&(e.inVPre=!1),s}const ml=t("if,else,else-if,for,slot");function gl(e,t,n){const o=Sl(e),r=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=r[1],i=e.options.getNamespace(s,n);Tl(e,r[0].length),Nl(e);const l=Sl(e),c=e.source;let a=vl(e,t);e.options.isPreTag(s)&&(e.inPre=!0),!e.inVPre&&a.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,S(e,l),e.source=c,a=vl(e,t).filter((e=>"v-pre"!==e.name)));let u=!1;0===e.source.length||(u=wl(e.source,"/>"),Tl(e,u?2:1));let p=0;const f=e.options;if(!e.inVPre&&!f.isCustomElement(s)){const e=a.some((e=>7===e.type&&"is"===e.name));f.isNativeTag&&!e?f.isNativeTag(s)||(p=1):(e||Hi(s)||f.isBuiltInComponent&&f.isBuiltInComponent(s)||/^[A-Z]/.test(s)||"component"===s)&&(p=1),"slot"===s?p=2:"template"===s&&a.some((e=>7===e.type&&ml(e.name)))&&(p=3)}return{type:1,ns:i,tag:s,tagType:p,props:a,isSelfClosing:u,children:[],loc:Cl(e,o),codegenNode:void 0}}function vl(e,t){const n=[],o=new Set;for(;e.source.length>0&&!wl(e.source,">")&&!wl(e.source,"/>");){if(wl(e.source,"/")){Tl(e,1),Nl(e);continue}const r=yl(e,o);0===t&&n.push(r),/^[^\t\r\n\f />]/.test(e.source),Nl(e)}return n}function yl(e,t){const n=Sl(e),o=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(o),t.add(o);{const e=/["'<]/g;let t;for(;t=e.exec(o););}let r;Tl(e,o.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Nl(e),Tl(e,1),Nl(e),r=function(e){const t=Sl(e);let n;const o=e.source[0],r='"'===o||"'"===o;if(r){Tl(e,1);const t=e.source.indexOf(o);-1===t?n=xl(e,e.source.length,4):(n=xl(e,t,4),Tl(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const o=/["'<=`]/g;let r;for(;r=o.exec(t[0]););n=xl(e,t[0].length,4)}return{content:n,isQuoted:r,loc:Cl(e,t)}}(e));const s=Cl(e,n);if(!e.inVPre&&/^(v-|:|@|#)/.test(o)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(o),i=t[1]||(wl(o,":")?"bind":wl(o,"@")?"on":"slot");let l;if(t[2]){const r="slot"===i,s=o.lastIndexOf(t[2]),c=Cl(e,El(e,n,s),El(e,n,s+t[2].length+(r&&t[3]||"").length));let a=t[2],u=!0;a.startsWith("[")?(u=!1,a.endsWith("]"),a=a.substr(1,a.length-2)):r&&(a+=t[3]||""),l={type:4,content:a,isStatic:u,constType:u?3:0,loc:c}}if(r&&r.isQuoted){const e=r.loc;e.start.offset++,e.start.column++,e.end=qi(e.start,r.content),e.source=e.source.slice(1,-1)}return{type:7,name:i,exp:r&&{type:4,content:r.content,isStatic:!1,constType:0,loc:r.loc},arg:l,modifiers:t[3]?t[3].substr(1).split("."):[],loc:s}}return{type:6,name:o,value:r&&{type:2,content:r.content,loc:r.loc},loc:s}}function bl(e,t){const[n,o]=e.options.delimiters,r=e.source.indexOf(o,n.length);if(-1===r)return;const s=Sl(e);Tl(e,n.length);const i=Sl(e),l=Sl(e),c=r-n.length,a=e.source.slice(0,c),u=xl(e,c,t),p=u.trim(),f=u.indexOf(p);f>0&&Ji(i,a,f);return Ji(l,a,c-(u.length-p.length-f)),Tl(e,o.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:p,loc:Cl(e,i,l)},loc:Cl(e,s)}}function _l(e,t){const n=["<",e.options.delimiters[0]];3===t&&n.push("]]>");let o=e.source.length;for(let s=0;st&&(o=t)}const r=Sl(e);return{type:2,content:xl(e,o,t),loc:Cl(e,r)}}function xl(e,t,n){const o=e.source.slice(0,t);return Tl(e,t),2===n||3===n||-1===o.indexOf("&")?o:e.options.decodeEntities(o,4===n)}function Sl(e){const{column:t,line:n,offset:o}=e;return{column:t,line:n,offset:o}}function Cl(e,t,n){return{start:t,end:n=n||Sl(e),source:e.originalSource.slice(t.offset,n.offset)}}function kl(e){return e[e.length-1]}function wl(e,t){return e.startsWith(t)}function Tl(e,t){const{source:n}=e;Ji(e,n,t),e.source=n.slice(t)}function Nl(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&Tl(e,t[0].length)}function El(e,t,n){return qi(t,e.originalSource.slice(t.offset,n),n)}function $l(e,t,n){const o=e.source;switch(t){case 0:if(wl(o,"=0;--e)if(Fl(o,n[e].tag))return!0;break;case 1:case 2:{const e=kl(n);if(e&&Fl(o,e.tag))return!0;break}case 3:if(wl(o,"]]>"))return!0}return!o}function Fl(e,t){return wl(e,"]/.test(e[2+t.length]||">")}function Al(e,t){Il(e,t,Ml(e,e.children[0]))}function Ml(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!nl(t)}function Il(e,t,n=!1){let o=!1,r=!0;const{children:s}=e;for(let i=0;i0){if(s<3&&(r=!1),s>=2){e.codegenNode.patchFlag="-1",e.codegenNode=t.hoist(e.codegenNode),o=!0;continue}}else{const n=e.codegenNode;if(13===n.type){const o=Pl(n);if((!o||512===o||1===o)&&Bl(e,t)>=2){const o=Rl(e);o&&(n.props=t.hoist(o))}}}}else if(12===e.type){const n=Ol(e.content,t);n>0&&(n<3&&(r=!1),n>=2&&(e.codegenNode=t.hoist(e.codegenNode),o=!0))}if(1===e.type){const n=1===e.tagType;n&&t.scopes.vSlot++,Il(e,t),n&&t.scopes.vSlot--}else if(11===e.type)Il(e,t,1===e.children.length);else if(9===e.type)for(let n=0;n1)for(let r=0;r`_${$i[S.helper(e)]}`,replaceNode(e){S.parent.children[S.childIndex]=S.currentNode=e},removeNode(e){const t=e?S.parent.children.indexOf(e):S.currentNode?S.childIndex:-1;e&&e!==S.currentNode?S.childIndex>t&&(S.childIndex--,S.onNodeRemoved()):(S.currentNode=null,S.onNodeRemoved()),S.parent.children.splice(t,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){S.hoists.push(e);const t=Bi(`_hoisted_${S.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:Fi}}(++S.cached,e,t)};return S}function Ll(e,t){const n=Vl(e,t);jl(e,n),t.hoistStatic&&Al(e,n),t.ssr||function(e,t){const{helper:n,removeHelper:o}=t,{children:r}=e;if(1===r.length){const t=r[0];if(Ml(e,t)&&t.codegenNode){const r=t.codegenNode;13===r.type&&(r.isBlock||(o(si),r.isBlock=!0,n(oi),n(ri))),e.codegenNode=r}else e.codegenNode=t}else if(r.length>1){let o=64;e.codegenNode=Ai(t,n(Xs),void 0,e.children,o+"",void 0,void 0,!0)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached}function jl(e,t){t.currentNode=e;const{nodeTransforms:n}=t,o=[];for(let s=0;s{n--};for(;nt===e:t=>e.test(t);return(e,o)=>{if(1===e.type){const{props:r}=e;if(3===e.tagType&&r.some(el))return;const s=[];for(let i=0;i`_${$i[e]}`,push(e,t){u.code+=e},indent(){p(++u.indentLevel)},deindent(e=!1){e?--u.indentLevel:p(--u.indentLevel)},newline(){p(u.indentLevel)}};function p(e){u.push("\n"+" ".repeat(e))}return u}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:o,push:r,prefixIdentifiers:s,indent:i,deindent:l,newline:c,ssr:a}=n,u=e.helpers.length>0,p=!s&&"module"!==o;!function(e,t){const{push:n,newline:o,runtimeGlobalName:r}=t,s=r,i=e=>`${$i[e]}: _${$i[e]}`;if(e.helpers.length>0&&(n(`const _Vue = ${s}\n`),e.hoists.length)){n(`const { ${[si,ii,li,ci].filter((t=>e.helpers.includes(t))).map(i).join(", ")} } = _Vue\n`)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:o}=t;o(),e.forEach(((e,r)=>{e&&(n(`const _hoisted_${r+1} = `),Gl(e,t),o())})),t.pure=!1})(e.hoists,t),o(),n("return ")}(e,n);if(r(`function ${a?"ssrRender":"render"}(${(a?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),i(),p&&(r("with (_ctx) {"),i(),u&&(r(`const { ${e.helpers.map((e=>`${$i[e]}: _${$i[e]}`)).join(", ")} } = _Vue`),r("\n"),c())),e.components.length&&(zl(e.components,"component",n),(e.directives.length||e.temps>0)&&c()),e.directives.length&&(zl(e.directives,"directive",n),e.temps>0&&c()),e.temps>0){r("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(r("\n"),c()),a||r("return "),e.codegenNode?Gl(e.codegenNode,n):r("null"),p&&(l(),r("}")),l(),r("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function zl(e,t,{helper:n,push:o,newline:r}){const s=n("component"===t?ai:pi);for(let i=0;i3||!1;t.push("["),n&&t.indent(),Kl(e,t,n),n&&t.deindent(),t.push("]")}function Kl(e,t,n=!1,o=!0){const{push:r,newline:s}=t;for(let i=0;ie||"null"))}([s,i,l,c,a]),t),n(")"),p&&n(")");u&&(n(", "),Gl(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:o,pure:r}=t,s=A(e.callee)?e.callee:o(e.callee);r&&n(Hl);n(s+"(",e),Kl(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:o,deindent:r,newline:s}=t,{properties:i}=e;if(!i.length)return void n("{}",e);const l=i.length>1||!1;n(l?"{":"{ "),l&&o();for(let c=0;c "),(c||l)&&(n("{"),o());i?(c&&n("return "),T(i)?Wl(i,t):Gl(i,t)):l&&Gl(l,t);(c||l)&&(r(),n("}"));a&&n(")")}(e,t);break;case 19:!function(e,t){const{test:n,consequent:o,alternate:r,newline:s}=e,{push:i,indent:l,deindent:c,newline:a}=t;if(4===n.type){const e=!zi(n.content);e&&i("("),ql(n,t),e&&i(")")}else i("("),Gl(n,t),i(")");s&&l(),t.indentLevel++,s||i(" "),i("? "),Gl(o,t),t.indentLevel--,s&&a(),s||i(" "),i(": ");const u=19===r.type;u||t.indentLevel++;Gl(r,t),u||t.indentLevel--;s&&c(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:o,indent:r,deindent:s,newline:i}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(r(),n(`${o(Si)}(-1),`),i());n(`_cache[${e.index}] = `),Gl(e.value,t),e.isVNode&&(n(","),i(),n(`${o(Si)}(1),`),i(),n(`_cache[${e.index}]`),s());n(")")}(e,t)}}function ql(e,t){const{content:n,isStatic:o}=e;t.push(o?JSON.stringify(n):n,e)}function Jl(e,t){for(let n=0;nfunction(e,t,n,o){if(!("else"===t.name||t.exp&&t.exp.content.trim())){t.exp=Bi("true",!1,t.exp?t.exp.loc:e.loc)}if("if"===t.name){const r=Xl(e,t),s={type:9,loc:e.loc,branches:[r]};if(n.replaceNode(s),o)return o(s,r,!0)}else{const r=n.parent.children;let s=r.indexOf(e);for(;s-- >=-1;){const i=r[s];if(!i||2!==i.type||i.content.trim().length){if(i&&9===i.type){n.removeNode();const r=Xl(e,t);i.branches.push(r);const s=o&&o(i,r,!1);jl(r,n),s&&s(),n.currentNode=null}break}n.removeNode(i)}}}(e,t,n,((e,t,o)=>{const r=n.parent.children;let s=r.indexOf(e),i=0;for(;s-- >=0;){const e=r[s];e&&9===e.type&&(i+=e.branches.length)}return()=>{if(o)e.codegenNode=Yl(t,i,n);else{(function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode)).alternate=Yl(t,i+e.branches.length-1,n)}}}))));function Xl(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||Zi(e,"for")?[e]:e.children,userKey:Qi(e,"key")}}function Yl(e,t,n){return e.condition?Li(e.condition,ec(e,t,n),Pi(n.helper(ii),['""',"true"])):ec(e,t,n)}function ec(e,t,n){const{helper:o,removeHelper:r}=n,s=Oi("key",Bi(`${t}`,!1,Fi,2)),{children:i}=e,l=i[0];if(1!==i.length||1!==l.type){if(1===i.length&&11===l.type){const e=l.codegenNode;return ol(e,s,n),e}{let t=64;return Ai(n,o(Xs),Ii([s]),i,t+"",void 0,void 0,!0,!1,e.loc)}}{const e=l.codegenNode;return 13!==e.type||e.isBlock||(r(si),e.isBlock=!0,o(oi),o(ri)),ol(e,s,n),e}}const tc=Ul("for",((e,t,n)=>{const{helper:o,removeHelper:r}=n;return function(e,t,n,o){if(!t.exp)return;const r=sc(t.exp);if(!r)return;const{scopes:s}=n,{source:i,value:l,key:c,index:a}=r,u={type:11,loc:t.loc,source:i,valueAlias:l,keyAlias:c,objectIndexAlias:a,parseResult:r,children:tl(e)?e.children:[e]};n.replaceNode(u),s.vFor++;const p=o&&o(u);return()=>{s.vFor--,p&&p()}}(e,t,n,(t=>{const s=Pi(o(di),[t.source]),i=Qi(e,"key"),l=i?Oi("key",6===i.type?Bi(i.value.content,!0):i.exp):null,c=4===t.source.type&&t.source.constType>0,a=c?64:i?128:256;return t.codegenNode=Ai(n,o(Xs),void 0,s,a+"",void 0,void 0,!0,!c,e.loc),()=>{let i;const a=tl(e),{children:u}=t,p=1!==u.length||1!==u[0].type,f=nl(e)?e:a&&1===e.children.length&&nl(e.children[0])?e.children[0]:null;f?(i=f.codegenNode,a&&l&&ol(i,l,n)):p?i=Ai(n,o(Xs),l?Ii([l]):void 0,e.children,"64",void 0,void 0,!0):(i=u[0].codegenNode,a&&l&&ol(i,l,n),i.isBlock!==!c&&(i.isBlock?(r(oi),r(ri)):r(si)),i.isBlock=!c,i.isBlock?(o(oi),o(ri)):o(si)),s.arguments.push(Vi(lc(t.parseResult),i,!0))}}))}));const nc=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,oc=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,rc=/^\(|\)$/g;function sc(e,t){const n=e.loc,o=e.content,r=o.match(nc);if(!r)return;const[,s,i]=r,l={source:ic(n,i.trim(),o.indexOf(i,s.length)),value:void 0,key:void 0,index:void 0};let c=s.trim().replace(rc,"").trim();const a=s.indexOf(c),u=c.match(oc);if(u){c=c.replace(oc,"").trim();const e=u[1].trim();let t;if(e&&(t=o.indexOf(e,a+c.length),l.key=ic(n,e,t)),u[2]){const r=u[2].trim();r&&(l.index=ic(n,r,o.indexOf(r,l.key?t+e.length:a+c.length)))}}return c&&(l.value=ic(n,c,a)),l}function ic(e,t,n){return Bi(t,!1,Gi(e,n,t.length))}function lc({value:e,key:t,index:n}){const o=[];return e&&o.push(e),t&&(e||o.push(Bi("_",!1)),o.push(t)),n&&(t||(e||o.push(Bi("_",!1)),o.push(Bi("__",!1))),o.push(n)),o}const cc=Bi("undefined",!1),ac=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Zi(e,"slot");if(n)return t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},uc=(e,t,n)=>Vi(e,t,!1,!0,t.length?t[0].loc:n);function pc(e,t,n=uc){t.helper(Ti);const{children:o,loc:r}=e,s=[],i=[],l=(e,t)=>Oi("default",n(e,t,r));let c=t.scopes.vSlot>0||t.scopes.vFor>0;const a=Zi(e,"slot",!0);if(a){const{arg:e,exp:t}=a;e&&!ji(e)&&(c=!0),s.push(Oi(e||Bi("default",!0),n(t,o,r)))}let u=!1,p=!1;const f=[],d=new Set;for(let g=0;gfunction(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:o}=e,r=1===e.tagType,s=r?function(e,t,n=!1){const{tag:o}=e,r=bc(o)?Qi(e,"is"):Zi(e,"is");if(r){const e=6===r.type?r.value&&Bi(r.value.content,!0):r.exp;if(e)return Pi(t.helper(ui),[e])}const s=Hi(o)||t.isBuiltInComponent(o);if(s)return n||t.helper(s),s;return t.helper(ai),t.components.add(o),rl(o,"component")}(e,t):`"${n}"`;let i,l,c,a,u,p,f=0,d=I(s)&&s.callee===ui||s===Ys||s===ei||!r&&("svg"===n||"foreignObject"===n||Qi(e,"key",!0));if(o.length>0){const n=gc(e,t);i=n.props,f=n.patchFlag,u=n.dynamicPropNames;const o=n.directives;p=o&&o.length?Mi(o.map((e=>function(e,t){const n=[],o=hc.get(e);o?n.push(t.helperString(o)):(t.helper(pi),t.directives.add(e.name),n.push(rl(e.name,"directive")));const{loc:r}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Bi("true",!1,r);n.push(Ii(e.modifiers.map((e=>Oi(e,t))),r))}return Mi(n,e.loc)}(e,t)))):void 0}if(e.children.length>0){s===ti&&(d=!0,f|=1024);if(r&&s!==Ys&&s!==ti){const{slots:n,hasDynamicSlots:o}=pc(e,t);l=n,o&&(f|=1024)}else if(1===e.children.length&&s!==Ys){const n=e.children[0],o=n.type,r=5===o||8===o;r&&0===Ol(n,t)&&(f|=1),l=r||2===o?n:e.children}else l=e.children}0!==f&&(c=String(f),u&&u.length&&(a=function(e){let t="[";for(let n=0,o=e.length;n{if(ji(e)){const o=e.content,r=_(o);if(i||!r||"onclick"===o.toLowerCase()||"onUpdate:modelValue"===o||L(o)||(h=!0),r&&L(o)&&(g=!0),20===n.type||(4===n.type||8===n.type)&&Ol(n,t)>0)return;"ref"===o?p=!0:"class"!==o||i?"style"!==o||i?"key"===o||v.includes(o)||v.push(o):d=!0:f=!0}else m=!0};for(let _=0;_1?Pi(t.helper(vi),c,s):c[0]):l.length&&(b=Ii(vc(l),s)),m?u|=16:(f&&(u|=2),d&&(u|=4),v.length&&(u|=8),h&&(u|=32)),0!==u&&32!==u||!(p||g||a.length>0)||(u|=512),{props:b,directives:a,patchFlag:u,dynamicPropNames:v}}function vc(e){const t=new Map,n=[];for(let o=0;o{if(nl(e)){const{children:n,loc:o}=e,{slotName:r,slotProps:s}=function(e,t){let n,o='"default"';const r=[];for(let s=0;s0){const{props:o,directives:s}=gc(e,t,r);n=o}return{slotName:o,slotProps:n}}(e,t),i=[t.prefixIdentifiers?"_ctx.$slots":"$slots",r];s&&i.push(s),n.length&&(s||i.push("{}"),i.push(Vi([],n,!1,!1,o))),t.scopeId&&!t.slotted&&(s||i.push("{}"),n.length||i.push("undefined"),i.push("true")),e.codegenNode=Pi(t.helper(hi),i,o)}};const xc=/^\s*([\w$_]+|\([^)]*?\))\s*=>|^\s*function(?:\s+[\w$]+)?\s*\(/,Sc=(e,t,n,o)=>{const{loc:r,modifiers:s,arg:i}=e;let l;if(4===i.type)if(i.isStatic){l=Bi(K(H(i.content)),!0,i.loc)}else l=Ri([`${n.helperString(xi)}(`,i,")"]);else l=i,l.children.unshift(`${n.helperString(xi)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let a=n.cacheHandlers&&!c;if(c){const e=Ki(c.content),t=!(e||xc.test(c.content)),n=c.content.includes(";");(t||a&&e)&&(c=Ri([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let u={props:[Oi(l,c||Bi("() => {}",!1,r))]};return o&&(u=o(u)),a&&(u.props[0].value=n.cache(u.props[0].value)),u},Cc=(e,t,n)=>{const{exp:o,modifiers:r,loc:s}=e,i=e.arg;return 4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=`${i.content} || ""`),r.includes("camel")&&(4===i.type?i.content=i.isStatic?H(i.content):`${n.helperString(bi)}(${i.content})`:(i.children.unshift(`${n.helperString(bi)}(`),i.children.push(")"))),!o||4===o.type&&!o.content.trim()?{props:[Oi(i,Bi("",!0,s))]}:{props:[Oi(i,o)]}},kc=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let o,r=!1;for(let e=0;e{if(1===e.type&&Zi(e,"once",!0)){if(wc.has(e))return;return wc.add(e),t.helper(Si),()=>{const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Nc=(e,t,n)=>{const{exp:o,arg:r}=e;if(!o)return Ec();const s=o.loc.source;if(!Ki(4===o.type?o.content:s))return Ec();const i=r||Bi("modelValue",!0),l=r?ji(r)?`onUpdate:${r.content}`:Ri(['"onUpdate:" + ',r]):"onUpdate:modelValue";let c;c=Ri([`${n.isTS?"($event: any)":"$event"} => (`,o," = $event)"]);const a=[Oi(i,e.exp),Oi(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(zi(e)?e:JSON.stringify(e))+": true")).join(", "),n=r?ji(r)?`${r.content}Modifiers`:Ri([r,' + "Modifiers"']):"modelModifiers";a.push(Oi(n,Bi(`{ ${t} }`,!1,e.loc,2)))}return Ec(a)};function Ec(e=[]){return{props:e}}function $c(e,t={}){const n=t.onError||Zs,o="module"===t.mode;!0===t.prefixIdentifiers?n(Qs(45)):o&&n(Qs(46));t.cacheHandlers&&n(Qs(47)),t.scopeId&&!o&&n(Qs(48));const r=A(e)?cl(e,t):e,[s,i]=[[Tc,Ql,tc,_c,mc,ac,kc],{on:Sc,bind:Cc,model:Nc}];return Ll(r,S({},t,{prefixIdentifiers:false,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:S({},i,t.directiveTransforms||{})})),Dl(r,S({},t,{prefixIdentifiers:false}))}const Fc=Symbol(""),Ac=Symbol(""),Mc=Symbol(""),Ic=Symbol(""),Oc=Symbol(""),Bc=Symbol(""),Rc=Symbol(""),Pc=Symbol(""),Vc=Symbol(""),Lc=Symbol("");var jc;let Uc;jc={[Fc]:"vModelRadio",[Ac]:"vModelCheckbox",[Mc]:"vModelText",[Ic]:"vModelSelect",[Oc]:"vModelDynamic",[Bc]:"withModifiers",[Rc]:"withKeys",[Pc]:"vShow",[Vc]:"Transition",[Lc]:"TransitionGroup"},Object.getOwnPropertySymbols(jc).forEach((e=>{$i[e]=jc[e]}));const Hc=t("style,iframe,script,noscript",!0),Dc={isVoidTag:p,isNativeTag:e=>a(e)||u(e),isPreTag:e=>"pre"===e,decodeEntities:function(e){return(Uc||(Uc=document.createElement("div"))).innerHTML=e,Uc.textContent},isBuiltInComponent:e=>Ui(e,"Transition")?Vc:Ui(e,"TransitionGroup")?Lc:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(Hc(e))return 2}return 0}},zc=(e,t)=>{const n=l(e);return Bi(JSON.stringify(n),!1,t,3)};const Wc=t("passive,once,capture"),Kc=t("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Gc=t("left,right"),qc=t("onkeyup,onkeydown,onkeypress",!0),Jc=(e,t)=>ji(e)&&"onclick"===e.content.toLowerCase()?Bi(t,!0):4!==e.type?Ri(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,Zc=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||t.removeNode()},Qc=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Bi("style",!0,t.loc),exp:zc(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],Xc={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:o,loc:r}=e;return t.children.length&&(t.children.length=0),{props:[Oi(Bi("innerHTML",!0,r),o||Bi("",!0))]}},text:(e,t,n)=>{const{exp:o,loc:r}=e;return t.children.length&&(t.children.length=0),{props:[Oi(Bi("textContent",!0),o?Pi(n.helperString(gi),[o],r):Bi("",!0))]}},model:(e,t,n)=>{const o=Nc(e,t,n);if(!o.props.length||1===t.tagType)return o;const{tag:r}=t,s=n.isCustomElement(r);if("input"===r||"textarea"===r||"select"===r||s){let e=Mc,i=!1;if("input"===r||s){const n=Qi(t,"type");if(n){if(7===n.type)e=Oc;else if(n.value)switch(n.value.content){case"radio":e=Fc;break;case"checkbox":e=Ac;break;case"file":i=!0}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(e=Oc)}else"select"===r&&(e=Ic);i||(o.needRuntime=n.helper(e))}return o.props=o.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),o},on:(e,t,n)=>Sc(e,0,n,(t=>{const{modifiers:o}=e;if(!o.length)return t;let{key:r,value:s}=t.props[0];const{keyModifiers:i,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t)=>{const n=[],o=[],r=[];for(let s=0;s({props:[],needRuntime:n.helper(Pc)})};const Yc=Object.create(null);function ea(e,t){if(!A(e)){if(!e.nodeType)return v;e=e.innerHTML}const n=e,o=Yc[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:r}=function(e,t={}){return $c(e,S({},Dc,t,{nodeTransforms:[Zc,...Qc,...t.nodeTransforms||[]],directiveTransforms:S({},Xc,t.directiveTransforms||{}),transformHoist:null}))}(e,S({hoistStatic:!0,onError(e){throw e}},t)),s=new Function(r)();return s._rc=!0,Yc[n]=s}return Nr(ea),e.BaseTransition=Un,e.Comment=Vo,e.Fragment=Ro,e.KeepAlive=Jn,e.Static=Lo,e.Suspense=un,e.Teleport=Ao,e.Text=Po,e.Transition=is,e.TransitionGroup=Ss,e.callWithAsyncErrorHandling=Ct,e.callWithErrorHandling=St,e.camelize=H,e.capitalize=W,e.cloneVNode=Xo,e.compile=ea,e.computed=Or,e.createApp=(...e)=>{const t=Gs().createApp(...e),{mount:n}=t;return t.mount=e=>{const o=Js(e);if(!o)return;const r=t._component;F(r)||r.render||r.template||(r.template=o.innerHTML),o.innerHTML="";const s=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),s},t},e.createBlock=Wo,e.createCommentVNode=function(e="",t=!1){return t?(Ho(),Wo(Vo,null,e)):Qo(Vo,null,e)},e.createHydrationRenderer=Co,e.createRenderer=So,e.createSSRApp=(...e)=>{const t=qs().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Js(e);if(t)return n(t,!0,t instanceof SVGElement)},t},e.createSlots=function(e,t){for(let n=0;n{let e;return a||(e=a=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),l)return new Promise(((t,n)=>{l(e,(()=>t((u++,a=null,p()))),(()=>n(e)),u+1)}));throw e})).then((t=>e!==a&&a?a:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),c=t,t))))};return vo({__asyncLoader:p,name:"AsyncComponentWrapper",setup(){const e=_r;if(c)return()=>yo(c,e);const t=t=>{a=null,kt(t,e,13,!o)};if(i&&e.suspense)return p().then((t=>()=>yo(t,e))).catch((e=>(t(e),()=>o?Qo(o,{error:e}):null)));const l=at(!1),u=at(),f=at(!!r);return r&&setTimeout((()=>{f.value=!1}),r),null!=s&&setTimeout((()=>{if(!l.value&&!u.value){const e=new Error(`Async component timed out after ${s}ms.`);t(e),u.value=e}}),s),p().then((()=>{l.value=!0})).catch((e=>{t(e),u.value=e})),()=>l.value&&c?yo(c,e):u.value&&o?Qo(o,{error:u.value}):n&&!f.value?Qo(n):void 0}})},e.defineComponent=vo,e.defineEmit=function(){return null},e.defineProps=function(){return null},e.getCurrentInstance=xr,e.getTransitionRawChildren=Gn,e.h=Br,e.handleError=kt,e.hydrate=(...e)=>{qs().hydrate(...e)},e.initCustomFormatter=function(){},e.inject=sr,e.isProxy=st,e.isReactive=ot,e.isReadonly=rt,e.isRef=ct,e.isRuntimeOnly=()=>!kr,e.isVNode=Ko,e.markRaw=function(e){return J(e,"__v_skip",!0),e},e.mergeProps=or,e.nextTick=Vt,e.onActivated=Qn,e.onBeforeMount=kn,e.onBeforeUnmount=En,e.onBeforeUpdate=Tn,e.onDeactivated=Xn,e.onErrorCaptured=Mn,e.onMounted=wn,e.onRenderTracked=An,e.onRenderTriggered=Fn,e.onUnmounted=$n,e.onUpdated=Nn,e.openBlock=Ho,e.popScopeId=function(){en=null},e.provide=rr,e.proxyRefs=ht,e.pushScopeId=function(e){en=e},e.queuePostFlushCb=Ht,e.reactive=Ye,e.readonly=tt,e.ref=at,e.registerRuntimeCompiler=Nr,e.render=(...e)=>{Gs().render(...e)},e.renderList=function(e,t){let n;if(T(e)||A(e)){n=new Array(e.length);for(let o=0,r=e.length;onull==e?"":I(e)?JSON.stringify(e,h,2):String(e),e.toHandlerKey=K,e.toHandlers=function(e){const t={};for(const n in e)t[K(n)]=e[n];return t},e.toRaw=it,e.toRef=vt,e.toRefs=function(e){const t=T(e)?new Array(e.length):{};for(const n in e)t[n]=vt(e,n);return t},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){pe(it(e),"set","value",void 0)},e.unref=ft,e.useContext=function(){const e=xr();return e.setupContext||(e.setupContext=$r(e))},e.useCssModule=function(e="$style"){return m},e.useCssVars=function(e){const t=xr();if(!t)return;const n=()=>os(t.subTree,e(t.proxy));wn((()=>In(n,{flush:"post"}))),Nn(n)},e.useSSRContext=()=>{},e.useTransitionState=Ln,e.vModelCheckbox=Fs,e.vModelDynamic=Ps,e.vModelRadio=Ms,e.vModelSelect=Is,e.vModelText=$s,e.vShow=Hs,e.version=Pr,e.warn=function(e,...t){ce();const n=bt.length?bt[bt.length-1].component:null,o=n&&n.appContext.config.warnHandler,r=function(){let e=bt[bt.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const o=e.component&&e.component.parent;e=o&&o.vnode}return t}();if(o)St(o,n,11,[e+t.join(""),n&&n.proxy,r.map((({vnode:e})=>`at <${Ir(n,e.type)}>`)).join("\n"),r]);else{const n=[`[Vue warn]: ${e}`,...t];r.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",o=` at <${Ir(e.component,e.type,!!e.component&&null==e.component.parent)}`,r=">"+n;return e.props?[o,..._t(e.props),r]:[o+r]}(e))})),t}(r)),console.warn(...n)}ae()},e.watch=Bn,e.watchEffect=In,e.withCtx=nn,e.withDirectives=function(e,t){if(null===Yt)return e;const n=Yt.proxy,o=e.dirs||(e.dirs=[]);for(let r=0;rn=>{if(!("key"in n))return;const o=z(n.key);return t.some((e=>e===o||Us[e]===o))?e(n):void 0},e.withModifiers=(e,t)=>(n,...o)=>{for(let e=0;enn,Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 496faf60..8576cb64 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -5,6 +5,7 @@ import ( "fmt" "html/template" "os" + "sort" "strings" "time" @@ -63,6 +64,35 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { } funcMap := template.FuncMap{ + "getResourceTypes": func() []string { + resources := []resource.Resource{} + list := []string{} + + resources = append(resources, analysis.Unmanaged()...) + resources = append(resources, analysis.Managed()...) + resources = append(resources, analysis.Deleted()...) + + for _, res := range resources { + if i := sort.SearchStrings(list, res.TerraformType()); i <= len(list)-1 { + continue + } + list = append(list, res.TerraformType()) + } + for _, d := range analysis.Differences() { + if i := sort.SearchStrings(list, d.Res.TerraformType()); i <= len(list)-1 { + continue + } + list = append(list, d.Res.TerraformType()) + } + for kind := range analysis.Alerts() { + if i := sort.SearchStrings(list, kind); i <= len(list)-1 { + continue + } + list = append(list, kind) + } + + return list + }, "formatChange": func(ch analyser.Change) string { prefix := "" suffix := "" diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index f1041f38..2e539f46 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -3,6 +3,7 @@ package output import ( "io/ioutil" "path" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -25,7 +26,7 @@ func TestHTML_Write(t *testing.T) { name: "test html output", goldenfile: "output.html", args: args{ - analysis: fakeAnalysis(), + analysis: fakeAnalysisWithAlerts(), }, err: nil, }, @@ -47,14 +48,14 @@ func TestHTML_Write(t *testing.T) { assert.NoError(t, err) } - result, err := ioutil.ReadFile(tempFile.Name()) + got, err := ioutil.ReadFile(tempFile.Name()) if err != nil { t.Fatal(err) } expectedFilePath := path.Join("./testdata/", tt.goldenfile) if *goldenfile.Update == tt.goldenfile { - if err := ioutil.WriteFile(expectedFilePath, result, 0600); err != nil { + if err := ioutil.WriteFile(expectedFilePath, got, 0600); err != nil { t.Fatal(err) } } @@ -64,7 +65,10 @@ func TestHTML_Write(t *testing.T) { t.Fatal(err) } - assert.Equal(t, string(expected), string(result)) + prettifiedExpected := strings.ReplaceAll(string(expected), " ", "") + prettifiedGot := strings.ReplaceAll(string(got), " ", "") + + assert.Equal(t, prettifiedExpected, prettifiedGot) }) } } diff --git a/pkg/cmd/scan/output/output_test.go b/pkg/cmd/scan/output/output_test.go index 74f2e35b..5ac690a2 100644 --- a/pkg/cmd/scan/output/output_test.go +++ b/pkg/cmd/scan/output/output_test.go @@ -79,6 +79,18 @@ func fakeAnalysis() *analyser.Analysis { return &a } +func fakeAnalysisWithAlerts() *analyser.Analysis { + a := fakeAnalysis() + a.SetAlerts(alerter.Alerts{ + "": []alerter.Alert{ + remote.NewEnumerationAccessDeniedAlert(aws.RemoteAWSTerraform, "aws_vpc", "aws_vpc"), + remote.NewEnumerationAccessDeniedAlert(aws.RemoteAWSTerraform, "aws_sqs", "aws_sqs"), + remote.NewEnumerationAccessDeniedAlert(aws.RemoteAWSTerraform, "aws_sns", "aws_sns"), + }, + }) + return a +} + func fakeAnalysisNoDrift() *analyser.Analysis { a := analyser.Analysis{} for i := 0; i < 5; i++ { diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index e69de29b..925567f5 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -0,0 +1,160 @@ + + + + Driftctl scan report + + + + + +
+

Driftctl scan report ❌

+ Coverage 8% + Apr 21, 2021 +
+
+ + +
+ +

Managed resources (2)

+ + + +
+ diff-id-1 + aws_diff_resource +
+ +
+ no-diff-id-1 + aws_no_diff_resource +
+ + +

Unmanaged resources (2)

+ + + +
+ unmanaged-id-1 + aws_unmanaged_resource +
+ +
+ unmanaged-id-2 + aws_unmanaged_resource +
+ + +

Changed resources (1)

+ + + +
+ diff-id-1 + aws_diff_resource +
+ +
~ updated.field: "foobar" => "barfoo"
+ +
+ new.field: <nil> => "newValue"
+ +
- a: "oldValue" => <nil>
+ +
+
+ + +

Missing resources (2)

+ + + +
+ deleted-id-1 + aws_deleted_resource +
+ +
+ deleted-id-2 + aws_deleted_resource +
+ + +

Alerts (1)

+ + + +
+ +
+ +
- {Ignoring aws_vpc from drift calculation: Listing aws_vpc is forbidden. aws+tf}
+ +
- {Ignoring aws_sqs from drift calculation: Listing aws_sqs is forbidden. aws+tf}
+ +
- {Ignoring aws_sns from drift calculation: Listing aws_sns is forbidden. aws+tf}
+ +
+
+ +
+ + + \ No newline at end of file From 3643c1ba66ba570a2445b0b26da9484a634fbb88 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 14 May 2021 19:02:13 +0200 Subject: [PATCH 03/19] refactor: html output template --- pkg/cmd/scan/output/assets/index.tmpl | 67 ++++--- pkg/cmd/scan/output/assets/index.vue.tmpl | 189 ------------------ pkg/cmd/scan/output/assets/style.css | 4 - pkg/cmd/scan/output/assets/vue.global.prod.js | 1 - 4 files changed, 41 insertions(+), 220 deletions(-) delete mode 100644 pkg/cmd/scan/output/assets/index.vue.tmpl delete mode 100644 pkg/cmd/scan/output/assets/vue.global.prod.js diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 10859710..5cd81b07 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -1,14 +1,14 @@ - + Driftctl scan report - + + -
-

Driftctl scan report {{ if (eq .Coverage 100) }}✅{{else}}❌{{end}}

+

Driftctl scan report

Coverage 8% Apr 21, 2021
@@ -22,37 +22,33 @@ + {{ if (gt (len .Managed) 0) }}

Managed resources ({{len .Managed}})

- {{ if (eq (len .Managed) 0) }} -

There's nothing to see there...

- {{end}} {{range $res := .Managed}} -
+
{{$res.TerraformId}} {{$res.TerraformType}}
{{end}} + {{end}} + {{ if (gt (len .Unmanaged) 0) }}

Unmanaged resources ({{len .Unmanaged}})

- {{ if (eq (len .Unmanaged) 0) }} -

There's nothing to see there...

- {{end}} {{range $res := .Unmanaged}} -
+
{{$res.TerraformId}} {{$res.TerraformType}}
{{end}} + {{end}} + {{ if (gt (len .Differences) 0) }}

Changed resources ({{len .Differences}})

- {{ if (eq (len .Differences) 0) }} -

There's nothing to see there...

- {{end}} {{range $diff := .Differences}} -
+
{{$diff.Res.TerraformId}} {{$diff.Res.TerraformType}}
@@ -62,26 +58,24 @@
{{end}} + {{end}} + {{ if (gt (len .Deleted) 0) }}

Missing resources ({{len .Deleted}})

- {{ if (eq (len .Deleted) 0) }} -

There's nothing to see there...

- {{end}} {{range $res := .Deleted}} -
+
{{$res.TerraformId}} {{$res.TerraformType}}
{{end}} + {{end}} + {{ if (gt (len .Alerts) 0) }}

Alerts ({{len .Alerts}})

- {{ if (eq (len .Alerts) 0) }} -

There's nothing to see there...

- {{end}} {{range $type, $messages := .Alerts}} -
+
{{ $type }}
{{range $msg := $messages}} @@ -90,6 +84,7 @@
{{end}} + {{end}}
- - - -
-

Driftctl scan report

- Coverage 8% - Apr 21, 2021 -
-
- - -
- -

Managed resources ({{Managed.length}})

- -
-

{{ res.id }}

- {{ res.type }} -
-

There's nothing to see there...

- -

Unmanaged resources ({{Unmanaged.length}})

- -
-

{{ res.id }}

- {{ res.type }} -
-

There's nothing to see there...

- -

Changed resources ({{Changed.length}})

- -
-

{{ ch.res.id }}

- {{ ch.res.type }} -
-
{{ formatDifference(diff) }}
-
-
-

There's nothing to see there...

- -

Missing resources ({{Missing.length}})

- -
-

{{ res.id }}

- {{ res.type }} -
-

There's nothing to see there...

- -

Alerts ({{alerts.length}})

- -
-

{{ alert.type }}

-
-
{{ msg }}
-
-
-

There's nothing to see there...

-
- - - \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index 9093da7b..26109332 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -2,10 +2,6 @@ body { font-family: sans-serif; } -div { - display: block; -} - .hide { display: none; } \ No newline at end of file diff --git a/pkg/cmd/scan/output/assets/vue.global.prod.js b/pkg/cmd/scan/output/assets/vue.global.prod.js deleted file mode 100644 index b174652e..00000000 --- a/pkg/cmd/scan/output/assets/vue.global.prod.js +++ /dev/null @@ -1 +0,0 @@ -var Vue=function(e){"use strict";function t(e,t){const n=Object.create(null),o=e.split(",");for(let r=0;r!!n[e.toLowerCase()]:e=>!!n[e]}const n=t("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"),o=t("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function r(e){if(T(e)){const t={};for(let n=0;n{if(e){const n=e.split(i);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function c(e){let t="";if(A(e))t=e;else if(T(e))for(let n=0;nf(e,t)))}const h=(e,t)=>N(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:E(t)?{[`Set(${t.size})`]:[...t.values()]}:!I(t)||T(t)||P(t)?t:String(t),m={},g=[],v=()=>{},y=()=>!1,b=/^on[^a-z]/,_=e=>b.test(e),x=e=>e.startsWith("onUpdate:"),S=Object.assign,C=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},k=Object.prototype.hasOwnProperty,w=(e,t)=>k.call(e,t),T=Array.isArray,N=e=>"[object Map]"===R(e),E=e=>"[object Set]"===R(e),$=e=>e instanceof Date,F=e=>"function"==typeof e,A=e=>"string"==typeof e,M=e=>"symbol"==typeof e,I=e=>null!==e&&"object"==typeof e,O=e=>I(e)&&F(e.then)&&F(e.catch),B=Object.prototype.toString,R=e=>B.call(e),P=e=>"[object Object]"===R(e),V=e=>A(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,L=t(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),j=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},U=/-(\w)/g,H=j((e=>e.replace(U,((e,t)=>t?t.toUpperCase():"")))),D=/\B([A-Z])/g,z=j((e=>e.replace(D,"-$1").toLowerCase())),W=j((e=>e.charAt(0).toUpperCase()+e.slice(1))),K=j((e=>e?`on${W(e)}`:"")),G=(e,t)=>e!==t&&(e==e||t==t),q=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Z=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Q=new WeakMap,X=[];let Y;const ee=Symbol(""),te=Symbol("");function ne(e,t=m){(function(e){return e&&!0===e._isEffect})(e)&&(e=e.raw);const n=function(e,t){const n=function(){if(!n.active)return t.scheduler?void 0:e();if(!X.includes(n)){se(n);try{return le.push(ie),ie=!0,X.push(n),Y=n,e()}finally{X.pop(),ae(),Y=X[X.length-1]}}};return n.id=re++,n.allowRecurse=!!t.allowRecurse,n._isEffect=!0,n.active=!0,n.raw=e,n.deps=[],n.options=t,n}(e,t);return t.lazy||n(),n}function oe(e){e.active&&(se(e),e.options.onStop&&e.options.onStop(),e.active=!1)}let re=0;function se(e){const{deps:t}=e;if(t.length){for(let n=0;n{e&&e.forEach((e=>{(e!==Y||e.allowRecurse)&&l.add(e)}))};if("clear"===t)i.forEach(c);else if("length"===n&&T(e))i.forEach(((e,t)=>{("length"===t||t>=o)&&c(e)}));else switch(void 0!==n&&c(i.get(n)),t){case"add":T(e)?V(n)&&c(i.get("length")):(c(i.get(ee)),N(e)&&c(i.get(te)));break;case"delete":T(e)||(c(i.get(ee)),N(e)&&c(i.get(te)));break;case"set":N(e)&&c(i.get(ee))}l.forEach((e=>{e.options.scheduler?e.options.scheduler(e):e()}))}const fe=t("__proto__,__v_isRef,__isVue"),de=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(M)),he=be(),me=be(!1,!0),ge=be(!0),ve=be(!0,!0),ye={};function be(e=!1,t=!1){return function(n,o,r){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_raw"===o&&r===(e?t?Qe:Ze:t?Je:qe).get(n))return n;const s=T(n);if(!e&&s&&w(ye,o))return Reflect.get(ye,o,r);const i=Reflect.get(n,o,r);if(M(o)?de.has(o):fe(o))return i;if(e||ue(n,0,o),t)return i;if(ct(i)){return!s||!V(o)?i.value:i}return I(i)?e?tt(i):Ye(i):i}}["includes","indexOf","lastIndexOf"].forEach((e=>{const t=Array.prototype[e];ye[e]=function(...e){const n=it(this);for(let t=0,r=this.length;t{const t=Array.prototype[e];ye[e]=function(...e){ce();const n=t.apply(this,e);return ae(),n}}));function _e(e=!1){return function(t,n,o,r){let s=t[n];if(!e&&(o=it(o),s=it(s),!T(t)&&ct(s)&&!ct(o)))return s.value=o,!0;const i=T(t)&&V(n)?Number(n)!0,deleteProperty:(e,t)=>!0},Ce=S({},xe,{get:me,set:_e(!0)}),ke=S({},Se,{get:ve}),we=e=>I(e)?Ye(e):e,Te=e=>I(e)?tt(e):e,Ne=e=>e,Ee=e=>Reflect.getPrototypeOf(e);function $e(e,t,n=!1,o=!1){const r=it(e=e.__v_raw),s=it(t);t!==s&&!n&&ue(r,0,t),!n&&ue(r,0,s);const{has:i}=Ee(r),l=o?Ne:n?Te:we;return i.call(r,t)?l(e.get(t)):i.call(r,s)?l(e.get(s)):void 0}function Fe(e,t=!1){const n=this.__v_raw,o=it(n),r=it(e);return e!==r&&!t&&ue(o,0,e),!t&&ue(o,0,r),e===r?n.has(e):n.has(e)||n.has(r)}function Ae(e,t=!1){return e=e.__v_raw,!t&&ue(it(e),0,ee),Reflect.get(e,"size",e)}function Me(e){e=it(e);const t=it(this);return Ee(t).has.call(t,e)||(t.add(e),pe(t,"add",e,e)),this}function Ie(e,t){t=it(t);const n=it(this),{has:o,get:r}=Ee(n);let s=o.call(n,e);s||(e=it(e),s=o.call(n,e));const i=r.call(n,e);return n.set(e,t),s?G(t,i)&&pe(n,"set",e,t):pe(n,"add",e,t),this}function Oe(e){const t=it(this),{has:n,get:o}=Ee(t);let r=n.call(t,e);r||(e=it(e),r=n.call(t,e)),o&&o.call(t,e);const s=t.delete(e);return r&&pe(t,"delete",e,void 0),s}function Be(){const e=it(this),t=0!==e.size,n=e.clear();return t&&pe(e,"clear",void 0,void 0),n}function Re(e,t){return function(n,o){const r=this,s=r.__v_raw,i=it(s),l=t?Ne:e?Te:we;return!e&&ue(i,0,ee),s.forEach(((e,t)=>n.call(o,l(e),l(t),r)))}}function Pe(e,t,n){return function(...o){const r=this.__v_raw,s=it(r),i=N(s),l="entries"===e||e===Symbol.iterator&&i,c="keys"===e&&i,a=r[e](...o),u=n?Ne:t?Te:we;return!t&&ue(s,0,c?te:ee),{next(){const{value:e,done:t}=a.next();return t?{value:e,done:t}:{value:l?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function Ve(e){return function(...t){return"delete"!==e&&this}}const Le={get(e){return $e(this,e)},get size(){return Ae(this)},has:Fe,add:Me,set:Ie,delete:Oe,clear:Be,forEach:Re(!1,!1)},je={get(e){return $e(this,e,!1,!0)},get size(){return Ae(this)},has:Fe,add:Me,set:Ie,delete:Oe,clear:Be,forEach:Re(!1,!0)},Ue={get(e){return $e(this,e,!0)},get size(){return Ae(this,!0)},has(e){return Fe.call(this,e,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Re(!0,!1)},He={get(e){return $e(this,e,!0,!0)},get size(){return Ae(this,!0)},has(e){return Fe.call(this,e,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Re(!0,!0)};function De(e,t){const n=t?e?He:je:e?Ue:Le;return(t,o,r)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get(w(n,o)&&o in t?n:t,o,r)}["keys","values","entries",Symbol.iterator].forEach((e=>{Le[e]=Pe(e,!1,!1),Ue[e]=Pe(e,!0,!1),je[e]=Pe(e,!1,!0),He[e]=Pe(e,!0,!0)}));const ze={get:De(!1,!1)},We={get:De(!1,!0)},Ke={get:De(!0,!1)},Ge={get:De(!0,!0)},qe=new WeakMap,Je=new WeakMap,Ze=new WeakMap,Qe=new WeakMap;function Xe(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((e=>R(e).slice(8,-1))(e))}function Ye(e){return e&&e.__v_isReadonly?e:nt(e,!1,xe,ze,qe)}function et(e){return nt(e,!1,Ce,We,Je)}function tt(e){return nt(e,!0,Se,Ke,Ze)}function nt(e,t,n,o,r){if(!I(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=r.get(e);if(s)return s;const i=Xe(e);if(0===i)return e;const l=new Proxy(e,2===i?o:n);return r.set(e,l),l}function ot(e){return rt(e)?ot(e.__v_raw):!(!e||!e.__v_isReactive)}function rt(e){return!(!e||!e.__v_isReadonly)}function st(e){return ot(e)||rt(e)}function it(e){return e&&it(e.__v_raw)||e}const lt=e=>I(e)?Ye(e):e;function ct(e){return Boolean(e&&!0===e.__v_isRef)}function at(e){return pt(e)}class ut{constructor(e,t=!1){this._rawValue=e,this._shallow=t,this.__v_isRef=!0,this._value=t?e:lt(e)}get value(){return ue(it(this),0,"value"),this._value}set value(e){G(it(e),this._rawValue)&&(this._rawValue=e,this._value=this._shallow?e:lt(e),pe(it(this),"set","value",e))}}function pt(e,t=!1){return ct(e)?e:new ut(e,t)}function ft(e){return ct(e)?e.value:e}const dt={get:(e,t,n)=>ft(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return ct(r)&&!ct(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function ht(e){return ot(e)?e:new Proxy(e,dt)}class mt{constructor(e){this.__v_isRef=!0;const{get:t,set:n}=e((()=>ue(this,0,"value")),(()=>pe(this,"set","value")));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}class gt{constructor(e,t){this._object=e,this._key=t,this.__v_isRef=!0}get value(){return this._object[this._key]}set value(e){this._object[this._key]=e}}function vt(e,t){return ct(e[t])?e[t]:new gt(e,t)}class yt{constructor(e,t,n){this._setter=t,this._dirty=!0,this.__v_isRef=!0,this.effect=ne(e,{lazy:!0,scheduler:()=>{this._dirty||(this._dirty=!0,pe(it(this),"set","value"))}}),this.__v_isReadonly=n}get value(){const e=it(this);return e._dirty&&(e._value=this.effect(),e._dirty=!1),ue(e,0,"value"),e._value}set value(e){this._setter(e)}}const bt=[];function _t(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...xt(n,e[n]))})),n.length>3&&t.push(" ..."),t}function xt(e,t,n){return A(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:ct(t)?(t=xt(e,it(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):F(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=it(t),n?t:[`${e}=`,t])}function St(e,t,n,o){let r;try{r=o?e(...o):e()}catch(s){kt(s,t,n)}return r}function Ct(e,t,n,o){if(F(e)){const r=St(e,t,n,o);return r&&O(r)&&r.catch((e=>{kt(e,t,n)})),r}const r=[];for(let s=0;s>>1;Wt(Nt[e])-1?Nt.splice(t,0,e):Nt.push(e),jt()}}function jt(){wt||Tt||(Tt=!0,Rt=Bt.then(Kt))}function Ut(e,t,n,o){T(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?o+1:o)||n.push(e),jt()}function Ht(e){Ut(e,It,Mt,Ot)}function Dt(e,t=null){if($t.length){for(Pt=t,Ft=[...new Set($t)],$t.length=0,At=0;AtWt(e)-Wt(t))),Ot=0;Otnull==e.id?1/0:e.id;function Kt(e){Tt=!1,wt=!0,Dt(e),Nt.sort(((e,t)=>Wt(e)-Wt(t)));try{for(Et=0;Ete.trim())):t&&(r=n.map(Z))}let l,c=o[l=K(t)]||o[l=K(H(t))];!c&&s&&(c=o[l=K(z(t))]),c&&Ct(c,e,6,r);const a=o[l+"Once"];if(a){if(e.emitted){if(e.emitted[l])return}else(e.emitted={})[l]=!0;Ct(a,e,6,r)}}function qt(e,t,n=!1){if(!t.deopt&&void 0!==e.__emits)return e.__emits;const o=e.emits;let r={},s=!1;if(!F(e)){const o=e=>{const n=qt(e,t,!0);n&&(s=!0,S(r,n))};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}return o||s?(T(o)?o.forEach((e=>r[e]=null)):S(r,o),e.__emits=r):e.__emits=null}function Jt(e,t){return!(!e||!_(t))&&(t=t.slice(2).replace(/Once$/,""),w(e,t[0].toLowerCase()+t.slice(1))||w(e,z(t))||w(e,t))}let Zt=0;const Qt=e=>Zt+=e;function Xt(e){return e.some((e=>!Ko(e)||e.type!==Vo&&!(e.type===Ro&&!Xt(e.children))))?e:null}let Yt=null,en=null;function tn(e){const t=Yt;return Yt=e,en=e&&e.type.__scopeId||null,t}function nn(e,t=Yt){if(!t)return e;const n=(...n)=>{Zt||Ho(!0);const o=tn(t),r=e(...n);return tn(o),Zt||Do(),r};return n._c=!0,n}function on(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:s,propsOptions:[i],slots:l,attrs:c,emit:a,render:u,renderCache:p,data:f,setupState:d,ctx:h}=e;let m;const g=tn(e);try{let e;if(4&n.shapeFlag){const t=r||o;m=er(u.call(t,t,p,s,d,f,h)),e=c}else{const n=t;0,m=er(n(s,n.length>1?{attrs:c,slots:l,emit:a}:null)),e=t.props?c:sn(c)}let g=m;if(!1!==t.inheritAttrs&&e){const t=Object.keys(e),{shapeFlag:n}=g;t.length&&(1&n||6&n)&&(i&&t.some(x)&&(e=ln(e,i)),g=Xo(g,e))}n.dirs&&(g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&(g.transition=n.transition),m=g}catch(v){jo.length=0,kt(v,e,1),m=Qo(Vo)}return tn(g),m}function rn(e){let t;for(let n=0;n{let t;for(const n in e)("class"===n||"style"===n||_(n))&&((t||(t={}))[n]=e[n]);return t},ln=(e,t)=>{const n={};for(const o in e)x(o)&&o.slice(9)in t||(n[o]=e[o]);return n};function cn(e,t,n){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let r=0;r0?(a(null,e.ssFallback,t,n,o,null,s,i),hn(f,e.ssFallback)):f.resolve()}(t,n,o,r,s,i,l,c,a):function(e,t,n,o,r,s,i,l,{p:c,um:a,o:{createElement:u}}){const p=t.suspense=e.suspense;p.vnode=t,t.el=e.el;const f=t.ssContent,d=t.ssFallback,{activeBranch:h,pendingBranch:m,isInFallback:g,isHydrating:v}=p;if(m)p.pendingBranch=f,Go(f,m)?(c(m,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0?p.resolve():g&&(c(h,d,n,o,r,null,s,i,l),hn(p,d))):(p.pendingId++,v?(p.isHydrating=!1,p.activeBranch=m):a(m,r,p),p.deps=0,p.effects.length=0,p.hiddenContainer=u("div"),g?(c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0?p.resolve():(c(h,d,n,o,r,null,s,i,l),hn(p,d))):h&&Go(f,h)?(c(h,f,n,o,r,p,s,i,l),p.resolve(!0)):(c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0&&p.resolve()));else if(h&&Go(f,h))c(h,f,n,o,r,p,s,i,l),hn(p,f);else{const e=t.props&&t.props.onPending;if(F(e)&&e(),p.pendingBranch=f,p.pendingId++,c(null,f,p.hiddenContainer,null,r,p,s,i,l),p.deps<=0)p.resolve();else{const{timeout:e,pendingId:t}=p;e>0?setTimeout((()=>{p.pendingId===t&&p.fallback(d)}),e):0===e&&p.fallback(d)}}}(e,t,n,o,r,i,l,c,a)},hydrate:function(e,t,n,o,r,s,i,l,c){const a=t.suspense=pn(t,o,n,e.parentNode,document.createElement("div"),null,r,s,i,l,!0),u=c(e,a.pendingBranch=t.ssContent,n,a,s,i);0===a.deps&&a.resolve();return u},create:pn};function pn(e,t,n,o,r,s,i,l,c,a,u=!1){const{p:p,m:f,um:d,n:h,o:{parentNode:m,remove:g}}=a,v=Z(e.props&&e.props.timeout),y={vnode:e,parent:t,parentComponent:n,isSVG:i,container:o,hiddenContainer:r,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof v?v:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:o,pendingId:r,effects:s,parentComponent:i,container:l}=y;if(y.isHydrating)y.isHydrating=!1;else if(!e){const e=n&&o.transition&&"out-in"===o.transition.mode;e&&(n.transition.afterLeave=()=>{r===y.pendingId&&f(o,l,t,0)});let{anchor:t}=y;n&&(t=h(n),d(n,i,y,!0)),e||f(o,l,t,0)}hn(y,o),y.pendingBranch=null,y.isInFallback=!1;let c=y.parent,a=!1;for(;c;){if(c.pendingBranch){c.effects.push(...s),a=!0;break}c=c.parent}a||Ht(s),y.effects=[];const u=t.props&&t.props.onResolve;F(u)&&u()},fallback(e){if(!y.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:o,container:r,isSVG:s}=y,i=t.props&&t.props.onFallback;F(i)&&i();const a=h(n),u=()=>{y.isInFallback&&(p(null,e,r,a,o,null,s,l,c),hn(y,e))},f=e.transition&&"out-in"===e.transition.mode;f&&(n.transition.afterLeave=u),d(n,o,null,!0),y.isInFallback=!0,f||u()},move(e,t,n){y.activeBranch&&f(y.activeBranch,e,t,n),y.container=e},next:()=>y.activeBranch&&h(y.activeBranch),registerDep(e,t){const n=!!y.pendingBranch;n&&y.deps++;const o=e.vnode.el;e.asyncDep.catch((t=>{kt(t,e,0)})).then((r=>{if(e.isUnmounted||y.isUnmounted||y.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:s}=e;Tr(e,r),o&&(s.el=o);const l=!o&&e.subTree.el;t(e,s,m(o||e.subTree.el),o?null:h(e.subTree),y,i,c),l&&g(l),an(e,s.el),n&&0==--y.deps&&y.resolve()}))},unmount(e,t){y.isUnmounted=!0,y.activeBranch&&d(y.activeBranch,n,e,t),y.pendingBranch&&d(y.pendingBranch,n,e,t)}};return y}function fn(e){if(F(e)&&(e=e()),T(e)){e=rn(e)}return er(e)}function dn(e,t){t&&t.pendingBranch?T(e)?t.effects.push(...e):t.effects.push(e):Ht(e)}function hn(e,t){e.activeBranch=t;const{vnode:n,parentComponent:o}=e,r=n.el=t.el;o&&o.subTree===n&&(o.vnode.el=r,an(o,r))}function mn(e,t,n,o){const[r,s]=e.propsOptions;if(t)for(const i in t){const s=t[i];if(L(i))continue;let l;r&&w(r,l=H(i))?n[l]=s:Jt(e.emitsOptions,i)||(o[i]=s)}if(s){const t=it(n);for(let o=0;o{i=!0;const[n,o]=vn(e,t,!0);S(r,n),o&&s.push(...o)};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}if(!o&&!i)return e.__props=g;if(T(o))for(let l=0;l-1,n[1]=o<0||t-1||w(n,"default"))&&s.push(e)}}}return e.__props=[r,s]}function yn(e){return"$"!==e[0]}function bn(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function _n(e,t){return bn(e)===bn(t)}function xn(e,t){return T(t)?t.findIndex((t=>_n(t,e))):F(t)&&_n(t,e)?0:-1}function Sn(e,t,n=_r,o=!1){if(n){const r=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;ce(),Sr(n);const r=Ct(t,n,e,o);return Sr(null),ae(),r});return o?r.unshift(s):r.push(s),s}}const Cn=e=>(t,n=_r)=>!wr&&Sn(e,t,n),kn=Cn("bm"),wn=Cn("m"),Tn=Cn("bu"),Nn=Cn("u"),En=Cn("bum"),$n=Cn("um"),Fn=Cn("rtg"),An=Cn("rtc"),Mn=(e,t=_r)=>{Sn("ec",e,t)};function In(e,t){return Rn(e,null,t)}const On={};function Bn(e,t,n){return Rn(e,t,n)}function Rn(e,t,{immediate:n,deep:o,flush:r,onTrack:s,onTrigger:i}=m,l=_r){let c,a,u=!1;if(ct(e)?(c=()=>e.value,u=!!e._shallow):ot(e)?(c=()=>e,o=!0):c=T(e)?()=>e.map((e=>ct(e)?e.value:ot(e)?Vn(e):F(e)?St(e,l,2,[l&&l.proxy]):void 0)):F(e)?t?()=>St(e,l,2,[l&&l.proxy]):()=>{if(!l||!l.isUnmounted)return a&&a(),Ct(e,l,3,[p])}:v,t&&o){const e=c;c=()=>Vn(e())}let p=e=>{a=g.options.onStop=()=>{St(e,l,4)}},f=T(e)?[]:On;const d=()=>{if(g.active)if(t){const e=g();(o||u||G(e,f))&&(a&&a(),Ct(t,l,3,[e,f===On?void 0:f,p]),f=e)}else g()};let h;d.allowRecurse=!!t,h="sync"===r?d:"post"===r?()=>_o(d,l&&l.suspense):()=>{!l||l.isMounted?function(e){Ut(e,Ft,$t,At)}(d):d()};const g=ne(c,{lazy:!0,onTrack:s,onTrigger:i,scheduler:h});return Fr(g,l),t?n?d():f=g():"post"===r?_o(g,l&&l.suspense):g(),()=>{oe(g),l&&C(l.effects,g)}}function Pn(e,t,n){const o=this.proxy;return Rn(A(e)?()=>o[e]:e.bind(o),t.bind(o),n,this)}function Vn(e,t=new Set){if(!I(e)||t.has(e))return e;if(t.add(e),ct(e))Vn(e.value,t);else if(T(e))for(let n=0;n{Vn(e,t)}));else for(const n in e)Vn(e[n],t);return e}function Ln(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return wn((()=>{e.isMounted=!0})),En((()=>{e.isUnmounting=!0})),e}const jn=[Function,Array],Un={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:jn,onEnter:jn,onAfterEnter:jn,onEnterCancelled:jn,onBeforeLeave:jn,onLeave:jn,onAfterLeave:jn,onLeaveCancelled:jn,onBeforeAppear:jn,onAppear:jn,onAfterAppear:jn,onAppearCancelled:jn},setup(e,{slots:t}){const n=xr(),o=Ln();let r;return()=>{const s=t.default&&Gn(t.default(),!0);if(!s||!s.length)return;const i=it(e),{mode:l}=i,c=s[0];if(o.isLeaving)return zn(c);const a=Wn(c);if(!a)return zn(c);const u=Dn(a,i,o,n);Kn(a,u);const p=n.subTree,f=p&&Wn(p);let d=!1;const{getTransitionKey:h}=a.type;if(h){const e=h();void 0===r?r=e:e!==r&&(r=e,d=!0)}if(f&&f.type!==Vo&&(!Go(a,f)||d)){const e=Dn(f,i,o,n);if(Kn(f,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},zn(c);"in-out"===l&&a.type!==Vo&&(e.delayLeave=(e,t,n)=>{Hn(o,f)[String(f.key)]=f,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=n})}return c}}};function Hn(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function Dn(e,t,n,o){const{appear:r,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:u,onBeforeLeave:p,onLeave:f,onAfterLeave:d,onLeaveCancelled:h,onBeforeAppear:m,onAppear:g,onAfterAppear:v,onAppearCancelled:y}=t,b=String(e.key),_=Hn(n,e),x=(e,t)=>{e&&Ct(e,o,9,t)},S={mode:s,persisted:i,beforeEnter(t){let o=l;if(!n.isMounted){if(!r)return;o=m||l}t._leaveCb&&t._leaveCb(!0);const s=_[b];s&&Go(e,s)&&s.el._leaveCb&&s.el._leaveCb(),x(o,[t])},enter(e){let t=c,o=a,s=u;if(!n.isMounted){if(!r)return;t=g||c,o=v||a,s=y||u}let i=!1;const l=e._enterCb=t=>{i||(i=!0,x(t?s:o,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,l),t.length<=1&&l()):l()},leave(t,o){const r=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return o();x(p,[t]);let s=!1;const i=t._leaveCb=n=>{s||(s=!0,o(),x(n?h:d,[t]),t._leaveCb=void 0,_[r]===e&&delete _[r])};_[r]=e,f?(f(t,i),f.length<=1&&i()):i()},clone:e=>Dn(e,t,n,o)};return S}function zn(e){if(qn(e))return(e=Xo(e)).children=null,e}function Wn(e){return qn(e)?e.children?e.children[0]:void 0:e}function Kn(e,t){6&e.shapeFlag&&e.component?Kn(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Gn(e,t=!1){let n=[],o=0;for(let r=0;r1)for(let r=0;re.type.__isKeepAlive,Jn={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=xr(),o=n.ctx;if(!o.renderer)return t.default;const r=new Map,s=new Set;let i=null;const l=n.suspense,{renderer:{p:c,m:a,um:u,o:{createElement:p}}}=o,f=p("div");function d(e){to(e),u(e,n,l)}function h(e){r.forEach(((t,n)=>{const o=Mr(t.type);!o||e&&e(o)||m(n)}))}function m(e){const t=r.get(e);i&&t.type===i.type?i&&to(i):d(t),r.delete(e),s.delete(e)}o.activate=(e,t,n,o,r)=>{const s=e.component;a(e,t,n,0,l),c(s.vnode,e,t,n,s,l,o,e.slotScopeIds,r),_o((()=>{s.isDeactivated=!1,s.a&&q(s.a);const t=e.props&&e.props.onVnodeMounted;t&&wo(t,s.parent,e)}),l)},o.deactivate=e=>{const t=e.component;a(e,f,null,1,l),_o((()=>{t.da&&q(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&wo(n,t.parent,e),t.isDeactivated=!0}),l)},Bn((()=>[e.include,e.exclude]),(([e,t])=>{e&&h((t=>Zn(e,t))),t&&h((e=>!Zn(t,e)))}),{flush:"post",deep:!0});let g=null;const v=()=>{null!=g&&r.set(g,no(n.subTree))};return wn(v),Nn(v),En((()=>{r.forEach((e=>{const{subTree:t,suspense:o}=n,r=no(t);if(e.type!==r.type)d(e);else{to(r);const e=r.component.da;e&&_o(e,o)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),o=n[0];if(n.length>1)return i=null,n;if(!(Ko(o)&&(4&o.shapeFlag||128&o.shapeFlag)))return i=null,o;let l=no(o);const c=l.type,a=Mr(c),{include:u,exclude:p,max:f}=e;if(u&&(!a||!Zn(u,a))||p&&a&&Zn(p,a))return i=l,o;const d=null==l.key?c:l.key,h=r.get(d);return l.el&&(l=Xo(l),128&o.shapeFlag&&(o.ssContent=l)),g=d,h?(l.el=h.el,l.component=h.component,l.transition&&Kn(l,l.transition),l.shapeFlag|=512,s.delete(d),s.add(d)):(s.add(d),f&&s.size>parseInt(f,10)&&m(s.values().next().value)),l.shapeFlag|=256,i=l,o}}};function Zn(e,t){return T(e)?e.some((e=>Zn(e,t))):A(e)?e.split(",").indexOf(t)>-1:!!e.test&&e.test(t)}function Qn(e,t){Yn(e,"a",t)}function Xn(e,t){Yn(e,"da",t)}function Yn(e,t,n=_r){const o=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}e()});if(Sn(t,o,n),n){let e=n.parent;for(;e&&e.parent;)qn(e.parent.vnode)&&eo(o,t,n,e),e=e.parent}}function eo(e,t,n,o){const r=Sn(t,e,o,!0);$n((()=>{C(o[t],r)}),n)}function to(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function no(e){return 128&e.shapeFlag?e.ssContent:e}const oo=e=>"_"===e[0]||"$stable"===e,ro=e=>T(e)?e.map(er):[er(e)],so=(e,t,n)=>nn((e=>ro(t(e))),n),io=(e,t)=>{const n=e._ctx;for(const o in e){if(oo(o))continue;const r=e[o];if(F(r))t[o]=so(0,r,n);else if(null!=r){const e=ro(r);t[o]=()=>e}}},lo=(e,t)=>{const n=ro(t);e.slots.default=()=>n};function co(e,t,n,o){const r=e.dirs,s=t&&t.dirs;for(let i=0;i(s.has(e)||(e&&F(e.install)?(s.add(e),e.install(l,...t)):F(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(r.mixins.includes(e)||(r.mixins.push(e),(e.props||e.emits)&&(r.deopt=!0)),l),component:(e,t)=>t?(r.components[e]=t,l):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,l):r.directives[e],mount(s,c,a){if(!i){const u=Qo(n,o);return u.appContext=r,c&&t?t(u,s):e(u,s,a),i=!0,l._container=s,s.__vue_app__=l,u.component.proxy}},unmount(){i&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,l)};return l}}let fo=!1;const ho=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,mo=e=>8===e.nodeType;function go(e){const{mt:t,p:n,o:{patchProp:o,nextSibling:r,parentNode:s,remove:i,insert:l,createComment:c}}=e,a=(n,o,i,l,c,m=!1)=>{const g=mo(n)&&"["===n.data,v=()=>d(n,o,i,l,c,g),{type:y,ref:b,shapeFlag:_}=o,x=n.nodeType;o.el=n;let S=null;switch(y){case Po:3!==x?S=v():(n.data!==o.children&&(fo=!0,n.data=o.children),S=r(n));break;case Vo:S=8!==x||g?v():r(n);break;case Lo:if(1===x){S=n;const e=!o.children.length;for(let t=0;t{t(o,e,null,i,l,ho(e),m)},u=o.type.__asyncLoader;u?u().then(a):a(),S=g?h(n):r(n)}else 64&_?S=8!==x?v():o.type.hydrate(n,o,i,l,c,m,e,p):128&_&&(S=o.type.hydrate(n,o,i,l,ho(s(n)),c,m,e,a))}return null!=b&&xo(b,null,l,o),S},u=(e,t,n,r,s,l)=>{l=l||!!t.dynamicChildren;const{props:c,patchFlag:a,shapeFlag:u,dirs:f}=t;if(-1!==a){if(f&&co(t,null,n,"created"),c)if(!l||16&a||32&a)for(const t in c)!L(t)&&_(t)&&o(e,t,null,c[t]);else c.onClick&&o(e,"onClick",null,c.onClick);let d;if((d=c&&c.onVnodeBeforeMount)&&wo(d,n,t),f&&co(t,null,n,"beforeMount"),((d=c&&c.onVnodeMounted)||f)&&dn((()=>{d&&wo(d,n,t),f&&co(t,null,n,"mounted")}),r),16&u&&(!c||!c.innerHTML&&!c.textContent)){let o=p(e.firstChild,t,e,n,r,s,l);for(;o;){fo=!0;const e=o;o=o.nextSibling,i(e)}}else 8&u&&e.textContent!==t.children&&(fo=!0,e.textContent=t.children)}return e.nextSibling},p=(e,t,o,r,s,i,l)=>{l=l||!!t.dynamicChildren;const c=t.children,u=c.length;for(let p=0;p{const{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);const f=s(e),d=p(r(e),t,f,n,o,i,a);return d&&mo(d)&&"]"===d.data?r(t.anchor=d):(fo=!0,l(t.anchor=c("]"),f,d),d)},d=(e,t,o,l,c,a)=>{if(fo=!0,t.el=null,a){const t=h(e);for(;;){const n=r(e);if(!n||n===t)break;i(n)}}const u=r(e),p=s(e);return i(e),n(null,t,p,u,o,l,ho(p),c),u},h=e=>{let t=0;for(;e;)if((e=r(e))&&mo(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return r(e);t--}return e};return[(e,t)=>{fo=!1,a(t.firstChild,e,null,null,null),zt(),fo&&console.error("Hydration completed but contains mismatches.")},a]}function vo(e){return F(e)?{setup:e,name:e.name}:e}function yo(e,{vnode:{ref:t,props:n,children:o}}){const r=Qo(e,n,o);return r.ref=t,r}const bo={scheduler:Lt,allowRecurse:!0},_o=dn,xo=(e,t,n,o)=>{if(T(e))return void e.forEach(((e,r)=>xo(e,t&&(T(t)?t[r]:t),n,o)));let r;if(o){if(o.type.__asyncLoader)return;r=4&o.shapeFlag?o.component.exposed||o.component.proxy:o.el}else r=null;const{i:s,r:i}=e,l=t&&t.r,c=s.refs===m?s.refs={}:s.refs,a=s.setupState;if(null!=l&&l!==i&&(A(l)?(c[l]=null,w(a,l)&&(a[l]=null)):ct(l)&&(l.value=null)),A(i)){const e=()=>{c[i]=r,w(a,i)&&(a[i]=r)};r?(e.id=-1,_o(e,n)):e()}else if(ct(i)){const e=()=>{i.value=r};r?(e.id=-1,_o(e,n)):e()}else F(i)&&St(i,s,12,[r,c])};function So(e){return ko(e)}function Co(e){return ko(e,go)}function ko(e,t){const{insert:n,remove:o,patchProp:r,forcePatchProp:s,createElement:i,createText:l,createComment:c,setText:a,setElementText:u,parentNode:p,nextSibling:f,setScopeId:d=v,cloneNode:h,insertStaticContent:y}=e,b=(e,t,n,o=null,r=null,s=null,i=!1,l=null,c=!1)=>{e&&!Go(e,t)&&(o=Y(e),K(e,r,s,!0),e=null),-2===t.patchFlag&&(c=!1,t.dynamicChildren=null);const{type:a,ref:u,shapeFlag:p}=t;switch(a){case Po:_(e,t,n,o);break;case Vo:x(e,t,n,o);break;case Lo:null==e&&C(t,n,o,i);break;case Ro:M(e,t,n,o,r,s,i,l,c);break;default:1&p?k(e,t,n,o,r,s,i,l,c):6&p?I(e,t,n,o,r,s,i,l,c):(64&p||128&p)&&a.process(e,t,n,o,r,s,i,l,c,te)}null!=u&&r&&xo(u,e&&e.ref,s,t)},_=(e,t,o,r)=>{if(null==e)n(t.el=l(t.children),o,r);else{const n=t.el=e.el;t.children!==e.children&&a(n,t.children)}},x=(e,t,o,r)=>{null==e?n(t.el=c(t.children||""),o,r):t.el=e.el},C=(e,t,n,o)=>{[e.el,e.anchor]=y(e.children,t,n,o)},k=(e,t,n,o,r,s,i,l,c)=>{i=i||"svg"===t.type,null==e?T(t,n,o,r,s,i,l,c):$(e,t,r,s,i,l,c)},T=(e,t,o,s,l,c,a,p)=>{let f,d;const{type:m,props:g,shapeFlag:v,transition:y,patchFlag:b,dirs:_}=e;if(e.el&&void 0!==h&&-1===b)f=e.el=h(e.el);else{if(f=e.el=i(e.type,c,g&&g.is,g),8&v?u(f,e.children):16&v&&E(e.children,f,null,s,l,c&&"foreignObject"!==m,a,p||!!e.dynamicChildren),_&&co(e,null,s,"created"),g){for(const t in g)L(t)||r(f,t,null,g[t],c,e.children,s,l,X);(d=g.onVnodeBeforeMount)&&wo(d,s,e)}N(f,e,e.scopeId,a,s)}_&&co(e,null,s,"beforeMount");const x=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;x&&y.beforeEnter(f),n(f,t,o),((d=g&&g.onVnodeMounted)||x||_)&&_o((()=>{d&&wo(d,s,e),x&&y.enter(f),_&&co(e,null,s,"mounted")}),l)},N=(e,t,n,o,r)=>{if(n&&d(e,n),o)for(let s=0;s{for(let a=c;a{const a=t.el=e.el;let{patchFlag:p,dynamicChildren:f,dirs:d}=t;p|=16&e.patchFlag;const h=e.props||m,g=t.props||m;let v;if((v=g.onVnodeBeforeUpdate)&&wo(v,n,t,e),d&&co(t,e,n,"beforeUpdate"),p>0){if(16&p)A(a,t,h,g,n,o,i);else if(2&p&&h.class!==g.class&&r(a,"class",null,g.class,i),4&p&&r(a,"style",h.style,g.style,i),8&p){const l=t.dynamicProps;for(let t=0;t{v&&wo(v,n,t,e),d&&co(t,e,n,"updated")}),o)},F=(e,t,n,o,r,s,i)=>{for(let l=0;l{if(n!==o){for(const a in o){if(L(a))continue;const u=o[a],p=n[a];(u!==p||s&&s(e,a))&&r(e,a,p,u,c,t.children,i,l,X)}if(n!==m)for(const s in n)L(s)||s in o||r(e,s,n[s],null,c,t.children,i,l,X)}},M=(e,t,o,r,s,i,c,a,u)=>{const p=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:d,dynamicChildren:h,slotScopeIds:m}=t;d>0&&(u=!0),m&&(a=a?a.concat(m):m),null==e?(n(p,o,r),n(f,o,r),E(t.children,o,f,s,i,c,a,u)):d>0&&64&d&&h&&e.dynamicChildren?(F(e.dynamicChildren,h,o,s,i,c,a),(null!=t.key||s&&t===s.subTree)&&To(e,t,!0)):j(e,t,o,f,s,i,c,a,u)},I=(e,t,n,o,r,s,i,l,c)=>{t.slotScopeIds=l,null==e?512&t.shapeFlag?r.ctx.activate(t,n,o,i,c):B(t,n,o,r,s,i,c):R(e,t,c)},B=(e,t,n,o,r,s,i)=>{const l=e.component=function(e,t,n){const o=e.type,r=(t?t.appContext:e.appContext)||yr,s={uid:br++,vnode:e,type:o,parent:t,appContext:r,root:null,next:null,subTree:null,update:null,render:null,proxy:null,exposed:null,withProxy:null,effects:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:vn(o,r),emitsOptions:qt(o,r),emit:null,emitted:null,propsDefaults:m,ctx:m,data:m,props:m,attrs:m,slots:m,refs:m,setupState:m,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=Gt.bind(null,s),s}(e,o,r);if(qn(e)&&(l.ctx.renderer=te),function(e,t=!1){wr=t;const{props:n,children:o}=e.vnode,r=Cr(e);(function(e,t,n,o=!1){const r={},s={};J(s,qo,1),e.propsDefaults=Object.create(null),mn(e,t,r,s),e.props=n?o?r:et(r):e.type.props?r:s,e.attrs=s})(e,n,r,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=t,J(t,"_",n)):io(t,e.slots={})}else e.slots={},t&&lo(e,t);J(e.slots,qo,1)})(e,o);const s=r?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,gr);const{setup:o}=n;if(o){const n=e.setupContext=o.length>1?$r(e):null;_r=e,ce();const r=St(o,e,0,[e.props,n]);if(ae(),_r=null,O(r)){if(t)return r.then((t=>{Tr(e,t)})).catch((t=>{kt(t,e,0)}));e.asyncDep=r}else Tr(e,r)}else Er(e)}(e,t):void 0;wr=!1}(l),l.asyncDep){if(r&&r.registerDep(l,P),!e.el){const e=l.subTree=Qo(Vo);x(null,e,t,n)}}else P(l,e,t,n,r,s,i)},R=(e,t,n)=>{const o=t.component=e.component;if(function(e,t,n){const{props:o,children:r,component:s}=e,{props:i,children:l,patchFlag:c}=t,a=s.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&c>=0))return!(!r&&!l||l&&l.$stable)||o!==i&&(o?!i||cn(o,i,a):!!i);if(1024&c)return!0;if(16&c)return o?cn(o,i,a):!!i;if(8&c){const e=t.dynamicProps;for(let t=0;tEt&&Nt.splice(t,1)}(o.update),o.update()}else t.component=e.component,t.el=e.el,o.vnode=t},P=(e,t,n,o,r,s,i)=>{e.update=ne((function(){if(e.isMounted){let t,{next:n,bu:o,u:l,parent:c,vnode:a}=e,u=n;n?(n.el=a.el,V(e,n,i)):n=a,o&&q(o),(t=n.props&&n.props.onVnodeBeforeUpdate)&&wo(t,c,n,a);const f=on(e),d=e.subTree;e.subTree=f,b(d,f,p(d.el),Y(d),e,r,s),n.el=f.el,null===u&&an(e,f.el),l&&_o(l,r),(t=n.props&&n.props.onVnodeUpdated)&&_o((()=>{wo(t,c,n,a)}),r)}else{let i;const{el:l,props:c}=t,{bm:a,m:u,parent:p}=e;a&&q(a),(i=c&&c.onVnodeBeforeMount)&&wo(i,p,t);const f=e.subTree=on(e);if(l&&se?se(t.el,f,e,r,null):(b(null,f,n,o,e,r,s),t.el=f.el),u&&_o(u,r),i=c&&c.onVnodeMounted){const e=t;_o((()=>{wo(i,p,e)}),r)}const{a:d}=e;d&&256&t.shapeFlag&&_o(d,r),e.isMounted=!0,t=n=o=null}}),bo)},V=(e,t,n)=>{t.component=e;const o=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,o){const{props:r,attrs:s,vnode:{patchFlag:i}}=e,l=it(r),[c]=e.propsOptions;if(!(o||i>0)||16&i){let o;mn(e,t,r,s);for(const s in l)t&&(w(t,s)||(o=z(s))!==s&&w(t,o))||(c?!n||void 0===n[s]&&void 0===n[o]||(r[s]=gn(c,t||m,s,void 0,e)):delete r[s]);if(s!==l)for(const e in s)t&&w(t,e)||delete s[e]}else if(8&i){const n=e.vnode.dynamicProps;for(let o=0;o{const{vnode:o,slots:r}=e;let s=!0,i=m;if(32&o.shapeFlag){const e=t._;e?n&&1===e?s=!1:(S(r,t),n||1!==e||delete r._):(s=!t.$stable,io(t,r)),i=t}else t&&(lo(e,t),i={default:1});if(s)for(const l in r)oo(l)||l in i||delete r[l]})(e,t.children,n),ce(),Dt(void 0,e.update),ae()},j=(e,t,n,o,r,s,i,l,c=!1)=>{const a=e&&e.children,p=e?e.shapeFlag:0,f=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void D(a,f,n,o,r,s,i,l,c);if(256&d)return void U(a,f,n,o,r,s,i,l,c)}8&h?(16&p&&X(a,r,s),f!==a&&u(n,f)):16&p?16&h?D(a,f,n,o,r,s,i,l,c):X(a,r,s,!0):(8&p&&u(n,""),16&h&&E(f,n,o,r,s,i,l,c))},U=(e,t,n,o,r,s,i,l,c)=>{const a=(e=e||g).length,u=(t=t||g).length,p=Math.min(a,u);let f;for(f=0;fu?X(e,r,s,!0,!1,p):E(t,n,o,r,s,i,l,c,p)},D=(e,t,n,o,r,s,i,l,c)=>{let a=0;const u=t.length;let p=e.length-1,f=u-1;for(;a<=p&&a<=f;){const o=e[a],u=t[a]=c?tr(t[a]):er(t[a]);if(!Go(o,u))break;b(o,u,n,null,r,s,i,l,c),a++}for(;a<=p&&a<=f;){const o=e[p],a=t[f]=c?tr(t[f]):er(t[f]);if(!Go(o,a))break;b(o,a,n,null,r,s,i,l,c),p--,f--}if(a>p){if(a<=f){const e=f+1,p=ef)for(;a<=p;)K(e[a],r,s,!0),a++;else{const d=a,h=a,m=new Map;for(a=h;a<=f;a++){const e=t[a]=c?tr(t[a]):er(t[a]);null!=e.key&&m.set(e.key,a)}let v,y=0;const _=f-h+1;let x=!1,S=0;const C=new Array(_);for(a=0;a<_;a++)C[a]=0;for(a=d;a<=p;a++){const o=e[a];if(y>=_){K(o,r,s,!0);continue}let u;if(null!=o.key)u=m.get(o.key);else for(v=h;v<=f;v++)if(0===C[v-h]&&Go(o,t[v])){u=v;break}void 0===u?K(o,r,s,!0):(C[u-h]=a+1,u>=S?S=u:x=!0,b(o,t[u],n,null,r,s,i,l,c),y++)}const k=x?function(e){const t=e.slice(),n=[0];let o,r,s,i,l;const c=e.length;for(o=0;o0&&(t[o]=n[s-1]),n[s]=o)}}s=n.length,i=n[s-1];for(;s-- >0;)n[s]=i,i=t[i];return n}(C):g;for(v=k.length-1,a=_-1;a>=0;a--){const e=h+a,p=t[e],f=e+1{const{el:i,type:l,transition:c,children:a,shapeFlag:u}=e;if(6&u)return void W(e.component.subTree,t,o,r);if(128&u)return void e.suspense.move(t,o,r);if(64&u)return void l.move(e,t,o,te);if(l===Ro){n(i,t,o);for(let e=0;e{let s;for(;e&&e!==t;)s=f(e),n(e,o,r),e=s;n(t,o,r)})(e,t,o);if(2!==r&&1&u&&c)if(0===r)c.beforeEnter(i),n(i,t,o),_o((()=>c.enter(i)),s);else{const{leave:e,delayLeave:r,afterLeave:s}=c,l=()=>n(i,t,o),a=()=>{e(i,(()=>{l(),s&&s()}))};r?r(i,l,a):a()}else n(i,t,o)},K=(e,t,n,o=!1,r=!1)=>{const{type:s,props:i,ref:l,children:c,dynamicChildren:a,shapeFlag:u,patchFlag:p,dirs:f}=e;if(null!=l&&xo(l,null,n,null),256&u)return void t.ctx.deactivate(e);const d=1&u&&f;let h;if((h=i&&i.onVnodeBeforeUnmount)&&wo(h,t,e),6&u)Q(e.component,n,o);else{if(128&u)return void e.suspense.unmount(n,o);d&&co(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,r,te,o):a&&(s!==Ro||p>0&&64&p)?X(a,t,n,!1,!0):(s===Ro&&(128&p||256&p)||!r&&16&u)&&X(c,t,n),o&&G(e)}((h=i&&i.onVnodeUnmounted)||d)&&_o((()=>{h&&wo(h,t,e),d&&co(e,null,t,"unmounted")}),n)},G=e=>{const{type:t,el:n,anchor:r,transition:s}=e;if(t===Ro)return void Z(n,r);if(t===Lo)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=f(e),o(e),e=n;o(t)})(e);const i=()=>{o(n),s&&!s.persisted&&s.afterLeave&&s.afterLeave()};if(1&e.shapeFlag&&s&&!s.persisted){const{leave:t,delayLeave:o}=s,r=()=>t(n,i);o?o(e.el,i,r):r()}else i()},Z=(e,t)=>{let n;for(;e!==t;)n=f(e),o(e),e=n;o(t)},Q=(e,t,n)=>{const{bum:o,effects:r,update:s,subTree:i,um:l}=e;if(o&&q(o),r)for(let c=0;c{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},X=(e,t,n,o=!1,r=!1,s=0)=>{for(let i=s;i6&e.shapeFlag?Y(e.component.subTree):128&e.shapeFlag?e.suspense.next():f(e.anchor||e.el),ee=(e,t,n)=>{null==e?t._vnode&&K(t._vnode,null,null,!0):b(t._vnode||null,e,t,null,null,null,n),zt(),t._vnode=e},te={p:b,um:K,m:W,r:G,mt:B,mc:E,pc:j,pbc:F,n:Y,o:e};let re,se;return t&&([re,se]=t(te)),{render:ee,hydrate:re,createApp:po(ee,re)}}function wo(e,t,n,o=null){Ct(e,t,7,[n,o])}function To(e,t,n=!1){const o=e.children,r=t.children;if(T(o)&&T(r))for(let s=0;se&&(e.disabled||""===e.disabled),Eo=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,$o=(e,t)=>{const n=e&&e.to;if(A(n)){if(t){return t(n)}return null}return n};function Fo(e,t,n,{o:{insert:o},m:r},s=2){0===s&&o(e.targetAnchor,t,n);const{el:i,anchor:l,shapeFlag:c,children:a,props:u}=e,p=2===s;if(p&&o(i,t,n),(!p||No(u))&&16&c)for(let f=0;f{16&v&&u(y,e,t,r,s,i,l,c)};g?b(n,a):p&&b(p,f)}else{t.el=e.el;const o=t.anchor=e.anchor,u=t.target=e.target,d=t.targetAnchor=e.targetAnchor,m=No(e.props),v=m?n:u,y=m?o:d;if(i=i||Eo(u),t.dynamicChildren?(f(e.dynamicChildren,t.dynamicChildren,v,r,s,i,l),To(e,t,!0)):c||p(e,t,v,y,r,s,i,l,!1),g)m||Fo(t,n,o,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=$o(t.props,h);e&&Fo(t,e,null,a,0)}else m&&Fo(t,u,d,a,1)}},remove(e,t,n,o,{um:r,o:{remove:s}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:u,target:p,props:f}=e;if(p&&s(u),(i||!No(f))&&(s(a),16&l))for(let d=0;d0&&Uo&&Uo.push(s),s}function Ko(e){return!!e&&!0===e.__v_isVNode}function Go(e,t){return e.type===t.type&&e.key===t.key}const qo="__vInternal",Jo=({key:e})=>null!=e?e:null,Zo=({ref:e})=>null!=e?A(e)||ct(e)||F(e)?{i:Yt,r:e}:e:null,Qo=function(e,t=null,n=null,o=0,s=null,i=!1){e&&e!==Io||(e=Vo);if(Ko(e)){const o=Xo(e,t,!0);return n&&nr(o,n),o}l=e,F(l)&&"__vccOpts"in l&&(e=e.__vccOpts);var l;if(t){(st(t)||qo in t)&&(t=S({},t));let{class:e,style:n}=t;e&&!A(e)&&(t.class=c(e)),I(n)&&(st(n)&&!T(n)&&(n=S({},n)),t.style=r(n))}const a=A(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:I(e)?4:F(e)?2:0,u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Jo(t),ref:t&&Zo(t),scopeId:en,slotScopeIds:null,children:null,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:o,dynamicProps:s,dynamicChildren:null,appContext:null};if(nr(u,n),128&a){const{content:e,fallback:t}=function(e){const{shapeFlag:t,children:n}=e;let o,r;return 32&t?(o=fn(n.default),r=fn(n.fallback)):(o=fn(n),r=er(null)),{content:o,fallback:r}}(u);u.ssContent=e,u.ssFallback=t}zo>0&&!i&&Uo&&(o>0||6&a)&&32!==o&&Uo.push(u);return u};function Xo(e,t,n=!1){const{props:o,ref:r,patchFlag:s,children:i}=e,l=t?or(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Jo(l),ref:t&&t.ref?n&&r?T(r)?r.concat(Zo(t)):[r,Zo(t)]:Zo(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ro?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xo(e.ssContent),ssFallback:e.ssFallback&&Xo(e.ssFallback),el:e.el,anchor:e.anchor}}function Yo(e=" ",t=0){return Qo(Po,null,e,t)}function er(e){return null==e||"boolean"==typeof e?Qo(Vo):T(e)?Qo(Ro,null,e):"object"==typeof e?null===e.el?e:Xo(e):Qo(Po,null,String(e))}function tr(e){return null===e.el?e:Xo(e)}function nr(e,t){let n=0;const{shapeFlag:o}=e;if(null==t)t=null;else if(T(t))n=16;else if("object"==typeof t){if(1&o||64&o){const n=t.default;return void(n&&(n._c&&Qt(1),nr(e,n()),n._c&&Qt(-1)))}{n=32;const o=t._;o||qo in t?3===o&&Yt&&(1024&Yt.vnode.patchFlag?(t._=2,e.patchFlag|=1024):t._=1):t._ctx=Yt}}else F(t)?(t={default:t,_ctx:Yt},n=32):(t=String(t),64&o?(n=16,t=[Yo(t)]):n=8);e.children=t,e.shapeFlag|=n}function or(...e){const t=S({},e[0]);for(let n=1;n1)return n&&F(t)?t():t}}let ir=!0;function lr(e,t,n=[],o=[],r=[],s=!1){const{mixins:i,extends:l,data:c,computed:a,methods:u,watch:p,provide:f,inject:d,components:h,directives:g,beforeMount:y,mounted:b,beforeUpdate:_,updated:x,activated:C,deactivated:k,beforeUnmount:w,unmounted:N,render:E,renderTracked:$,renderTriggered:A,errorCaptured:M,expose:O}=t,B=e.proxy,R=e.ctx,P=e.appContext.mixins;if(s&&E&&e.render===v&&(e.render=E),s||(ir=!1,cr("beforeCreate","bc",t,e,P),ir=!0,ur(e,P,n,o,r)),l&&lr(e,l,n,o,r,!0),i&&ur(e,i,n,o,r),d)if(T(d))for(let m=0;mpr(e,t,B))),c&&pr(e,c,B)),a)for(const m in a){const e=a[m],t=Or({get:F(e)?e.bind(B,B):F(e.get)?e.get.bind(B,B):v,set:!F(e)&&F(e.set)?e.set.bind(B):v});Object.defineProperty(R,m,{enumerable:!0,configurable:!0,get:()=>t.value,set:e=>t.value=e})}if(p&&o.push(p),!s&&o.length&&o.forEach((e=>{for(const t in e)fr(e[t],R,B,t)})),f&&r.push(f),!s&&r.length&&r.forEach((e=>{const t=F(e)?e.call(B):e;Reflect.ownKeys(t).forEach((e=>{rr(e,t[e])}))})),s&&(h&&S(e.components||(e.components=S({},e.type.components)),h),g&&S(e.directives||(e.directives=S({},e.type.directives)),g)),s||cr("created","c",t,e,P),y&&kn(y.bind(B)),b&&wn(b.bind(B)),_&&Tn(_.bind(B)),x&&Nn(x.bind(B)),C&&Qn(C.bind(B)),k&&Xn(k.bind(B)),M&&Mn(M.bind(B)),$&&An($.bind(B)),A&&Fn(A.bind(B)),w&&En(w.bind(B)),N&&$n(N.bind(B)),T(O)&&!s)if(O.length){const t=e.exposed||(e.exposed=ht({}));O.forEach((e=>{t[e]=vt(B,e)}))}else e.exposed||(e.exposed=m)}function cr(e,t,n,o,r){for(let s=0;s{let t=e;for(let e=0;en[o];if(A(e)){const n=t[e];F(n)&&Bn(r,n)}else if(F(e))Bn(r,e.bind(n));else if(I(e))if(T(e))e.forEach((e=>fr(e,t,n,o)));else{const o=F(e.handler)?e.handler.bind(n):t[e.handler];F(o)&&Bn(r,o,e)}}function dr(e,t,n){const o=n.appContext.config.optionMergeStrategies,{mixins:r,extends:s}=t;s&&dr(e,s,n),r&&r.forEach((t=>dr(e,t,n)));for(const i in t)e[i]=o&&w(o,i)?o[i](e[i],t[i],n.proxy,i):t[i]}const hr=e=>e?Cr(e)?e.exposed?e.exposed:e.proxy:hr(e.parent):null,mr=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$emit:e=>e.emit,$options:e=>function(e){const t=e.type,{__merged:n,mixins:o,extends:r}=t;if(n)return n;const s=e.appContext.mixins;if(!s.length&&!o&&!r)return t;const i={};return s.forEach((t=>dr(i,t,e))),dr(i,t,e),t.__merged=i}(e),$forceUpdate:e=>()=>Lt(e.update),$nextTick:e=>Vt.bind(e.proxy),$watch:e=>Pn.bind(e)}),gr={get({_:e},t){const{ctx:n,setupState:o,data:r,props:s,accessCache:i,type:l,appContext:c}=e;if("__v_skip"===t)return!0;let a;if("$"!==t[0]){const l=i[t];if(void 0!==l)switch(l){case 0:return o[t];case 1:return r[t];case 3:return n[t];case 2:return s[t]}else{if(o!==m&&w(o,t))return i[t]=0,o[t];if(r!==m&&w(r,t))return i[t]=1,r[t];if((a=e.propsOptions[0])&&w(a,t))return i[t]=2,s[t];if(n!==m&&w(n,t))return i[t]=3,n[t];ir&&(i[t]=4)}}const u=mr[t];let p,f;return u?("$attrs"===t&&ue(e,0,t),u(e)):(p=l.__cssModules)&&(p=p[t])?p:n!==m&&w(n,t)?(i[t]=3,n[t]):(f=c.config.globalProperties,w(f,t)?f[t]:void 0)},set({_:e},t,n){const{data:o,setupState:r,ctx:s}=e;if(r!==m&&w(r,t))r[t]=n;else if(o!==m&&w(o,t))o[t]=n;else if(w(e.props,t))return!1;return("$"!==t[0]||!(t.slice(1)in e))&&(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,propsOptions:s}},i){let l;return void 0!==n[i]||e!==m&&w(e,i)||t!==m&&w(t,i)||(l=s[0])&&w(l,i)||w(o,i)||w(mr,i)||w(r.config.globalProperties,i)}},vr=S({},gr,{get(e,t){if(t!==Symbol.unscopables)return gr.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!n(t)}),yr=ao();let br=0;let _r=null;const xr=()=>_r||Yt,Sr=e=>{_r=e};function Cr(e){return 4&e.vnode.shapeFlag}let kr,wr=!1;function Tr(e,t,n){F(t)?e.render=t:I(t)&&(e.setupState=ht(t)),Er(e)}function Nr(e){kr=e}function Er(e,t){const n=e.type;e.render||(kr&&n.template&&!n.render&&(n.render=kr(n.template,{isCustomElement:e.appContext.config.isCustomElement,delimiters:n.delimiters})),e.render=n.render||v,e.render._rc&&(e.withProxy=new Proxy(e.ctx,vr))),_r=e,ce(),lr(e,n),ae(),_r=null}function $r(e){const t=t=>{e.exposed=ht(t)};return{attrs:e.attrs,slots:e.slots,emit:e.emit,expose:t}}function Fr(e,t=_r){t&&(t.effects||(t.effects=[])).push(e)}const Ar=/(?:^|[-_])(\w)/g;function Mr(e){return F(e)&&e.displayName||e.name}function Ir(e,t,n=!1){let o=Mr(t);if(!o&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(o=e[1])}if(!o&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};o=n(e.components||e.parent.type.components)||n(e.appContext.components)}return o?o.replace(Ar,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}function Or(e){const t=function(e){let t,n;return F(e)?(t=e,n=v):(t=e.get,n=e.set),new yt(t,n,F(e)||!e.set)}(e);return Fr(t.effect),t}function Br(e,t,n){const o=arguments.length;return 2===o?I(t)&&!T(t)?Ko(t)?Qo(e,null,[t]):Qo(e,t):Qo(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):3===o&&Ko(n)&&(n=[n]),Qo(e,t,n))}const Rr=Symbol("");const Pr="3.0.11",Vr="http://www.w3.org/2000/svg",Lr="undefined"!=typeof document?document:null;let jr,Ur;const Hr={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t?Lr.createElementNS(Vr,e):Lr.createElement(e,n?{is:n}:void 0);return"select"===e&&o&&null!=o.multiple&&r.setAttribute("multiple",o.multiple),r},createText:e=>Lr.createTextNode(e),createComment:e=>Lr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Lr.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,o){const r=o?Ur||(Ur=Lr.createElementNS(Vr,"svg")):jr||(jr=Lr.createElement("div"));r.innerHTML=e;const s=r.firstChild;let i=s,l=i;for(;i;)l=i,Hr.insert(i,t,n),i=r.firstChild;return[s,l]}};const Dr=/\s*!important$/;function zr(e,t,n){if(T(n))n.forEach((n=>zr(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const o=function(e,t){const n=Kr[t];if(n)return n;let o=H(t);if("filter"!==o&&o in e)return Kr[t]=o;o=W(o);for(let r=0;rdocument.createEvent("Event").timeStamp&&(qr=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);Jr=!!(e&&Number(e[1])<=53)}let Zr=0;const Qr=Promise.resolve(),Xr=()=>{Zr=0};function Yr(e,t,n,o){e.addEventListener(t,n,o)}function es(e,t,n,o,r=null){const s=e._vei||(e._vei={}),i=s[t];if(o&&i)i.value=o;else{const[n,l]=function(e){let t;if(ts.test(e)){let n;for(t={};n=e.match(ts);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[z(e.slice(2)),t]}(t);if(o){Yr(e,n,s[t]=function(e,t){const n=e=>{const o=e.timeStamp||qr();(Jr||o>=n.attached-1)&&Ct(function(e,t){if(T(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=(()=>Zr||(Qr.then(Xr),Zr=qr()))(),n}(o,r),l)}else i&&(!function(e,t,n,o){e.removeEventListener(t,n,o)}(e,n,i,l),s[t]=void 0)}}const ts=/(?:Once|Passive|Capture)$/;const ns=/^on[a-z]/;function os(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{os(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el){const n=e.el.style;for(const e in t)n.setProperty(`--${e}`,t[e])}else e.type===Ro&&e.children.forEach((e=>os(e,t)))}const rs="transition",ss="animation",is=(e,{slots:t})=>Br(Un,as(e),t);is.displayName="Transition";const ls={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},cs=is.props=S({},Un.props,ls);function as(e){let{name:t="v",type:n,css:o=!0,duration:r,enterFromClass:s=`${t}-enter-from`,enterActiveClass:i=`${t}-enter-active`,enterToClass:l=`${t}-enter-to`,appearFromClass:c=s,appearActiveClass:a=i,appearToClass:u=l,leaveFromClass:p=`${t}-leave-from`,leaveActiveClass:f=`${t}-leave-active`,leaveToClass:d=`${t}-leave-to`}=e;const h={};for(const S in e)S in ls||(h[S]=e[S]);if(!o)return h;const m=function(e){if(null==e)return null;if(I(e))return[us(e.enter),us(e.leave)];{const t=us(e);return[t,t]}}(r),g=m&&m[0],v=m&&m[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:_,onLeave:x,onLeaveCancelled:C,onBeforeAppear:k=y,onAppear:w=b,onAppearCancelled:T=_}=h,N=(e,t,n)=>{fs(e,t?u:l),fs(e,t?a:i),n&&n()},E=(e,t)=>{fs(e,d),fs(e,f),t&&t()},$=e=>(t,o)=>{const r=e?w:b,i=()=>N(t,e,o);r&&r(t,i),ds((()=>{fs(t,e?c:s),ps(t,e?u:l),r&&r.length>1||ms(t,n,g,i)}))};return S(h,{onBeforeEnter(e){y&&y(e),ps(e,s),ps(e,i)},onBeforeAppear(e){k&&k(e),ps(e,c),ps(e,a)},onEnter:$(!1),onAppear:$(!0),onLeave(e,t){const o=()=>E(e,t);ps(e,p),bs(),ps(e,f),ds((()=>{fs(e,p),ps(e,d),x&&x.length>1||ms(e,n,v,o)})),x&&x(e,o)},onEnterCancelled(e){N(e,!1),_&&_(e)},onAppearCancelled(e){N(e,!0),T&&T(e)},onLeaveCancelled(e){E(e),C&&C(e)}})}function us(e){return Z(e)}function ps(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function fs(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ds(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let hs=0;function ms(e,t,n,o){const r=e._endId=++hs,s=()=>{r===e._endId&&o()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:c}=gs(e,t);if(!i)return o();const a=i+"end";let u=0;const p=()=>{e.removeEventListener(a,f),s()},f=t=>{t.target===e&&++u>=c&&p()};setTimeout((()=>{u(n[e]||"").split(", "),r=o("transitionDelay"),s=o("transitionDuration"),i=vs(r,s),l=o("animationDelay"),c=o("animationDuration"),a=vs(l,c);let u=null,p=0,f=0;t===rs?i>0&&(u=rs,p=i,f=s.length):t===ss?a>0&&(u=ss,p=a,f=c.length):(p=Math.max(i,a),u=p>0?i>a?rs:ss:null,f=u?u===rs?s.length:c.length:0);return{type:u,timeout:p,propCount:f,hasTransform:u===rs&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function vs(e,t){for(;e.lengthys(t)+ys(e[n]))))}function ys(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function bs(){return document.body.offsetHeight}const _s=new WeakMap,xs=new WeakMap,Ss={name:"TransitionGroup",props:S({},cs,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=xr(),o=Ln();let r,s;return Nn((()=>{if(!r.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const o=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&o.classList.remove(e)))}));n.split(/\s+/).forEach((e=>e&&o.classList.add(e))),o.style.display="none";const r=1===t.nodeType?t:t.parentNode;r.appendChild(o);const{hasTransform:s}=gs(o);return r.removeChild(o),s}(r[0].el,n.vnode.el,t))return;r.forEach(Cs),r.forEach(ks);const o=r.filter(ws);bs(),o.forEach((e=>{const n=e.el,o=n.style;ps(n,t),o.transform=o.webkitTransform=o.transitionDuration="";const r=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",r),n._moveCb=null,fs(n,t))};n.addEventListener("transitionend",r)}))})),()=>{const i=it(e),l=as(i),c=i.tag||Ro;r=s,s=t.default?Gn(t.default()):[];for(let e=0;e{const t=e.props["onUpdate:modelValue"];return T(t)?e=>q(t,e):t};function Ns(e){e.target.composing=!0}function Es(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}(t,"input"))}const $s={created(e,{modifiers:{lazy:t,trim:n,number:o}},r){e._assign=Ts(r);const s=o||"number"===e.type;Yr(e,t?"change":"input",(t=>{if(t.target.composing)return;let o=e.value;n?o=o.trim():s&&(o=Z(o)),e._assign(o)})),n&&Yr(e,"change",(()=>{e.value=e.value.trim()})),t||(Yr(e,"compositionstart",Ns),Yr(e,"compositionend",Es),Yr(e,"change",Es))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{trim:n,number:o}},r){if(e._assign=Ts(r),e.composing)return;if(document.activeElement===e){if(n&&e.value.trim()===t)return;if((o||"number"===e.type)&&Z(e.value)===t)return}const s=null==t?"":t;e.value!==s&&(e.value=s)}},Fs={created(e,t,n){e._assign=Ts(n),Yr(e,"change",(()=>{const t=e._modelValue,n=Bs(e),o=e.checked,r=e._assign;if(T(t)){const e=d(t,n),s=-1!==e;if(o&&!s)r(t.concat(n));else if(!o&&s){const n=[...t];n.splice(e,1),r(n)}}else if(E(t)){const e=new Set(t);o?e.add(n):e.delete(n),r(e)}else r(Rs(e,o))}))},mounted:As,beforeUpdate(e,t,n){e._assign=Ts(n),As(e,t,n)}};function As(e,{value:t,oldValue:n},o){e._modelValue=t,T(t)?e.checked=d(t,o.props.value)>-1:E(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=f(t,Rs(e,!0)))}const Ms={created(e,{value:t},n){e.checked=f(t,n.props.value),e._assign=Ts(n),Yr(e,"change",(()=>{e._assign(Bs(e))}))},beforeUpdate(e,{value:t,oldValue:n},o){e._assign=Ts(o),t!==n&&(e.checked=f(t,o.props.value))}},Is={created(e,{value:t,modifiers:{number:n}},o){const r=E(t);Yr(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?Z(Bs(e)):Bs(e)));e._assign(e.multiple?r?new Set(t):t:t[0])})),e._assign=Ts(o)},mounted(e,{value:t}){Os(e,t)},beforeUpdate(e,t,n){e._assign=Ts(n)},updated(e,{value:t}){Os(e,t)}};function Os(e,t){const n=e.multiple;if(!n||T(t)||E(t)){for(let o=0,r=e.options.length;o-1:t.has(s);else if(f(Bs(r),t))return void(e.selectedIndex=o)}n||(e.selectedIndex=-1)}}function Bs(e){return"_value"in e?e._value:e.value}function Rs(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Ps={created(e,t,n){Vs(e,t,n,null,"created")},mounted(e,t,n){Vs(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){Vs(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){Vs(e,t,n,o,"updated")}};function Vs(e,t,n,o,r){let s;switch(e.tagName){case"SELECT":s=Is;break;case"TEXTAREA":s=$s;break;default:switch(n.props&&n.props.type){case"checkbox":s=Fs;break;case"radio":s=Ms;break;default:s=$s}}const i=s[r];i&&i(e,t,n,o)}const Ls=["ctrl","shift","alt","meta"],js={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Ls.some((n=>e[`${n}Key`]&&!t.includes(n)))},Us={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Hs={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Ds(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Ds(e,!0),o.enter(e)):o.leave(e,(()=>{Ds(e,!1)})):Ds(e,t))},beforeUnmount(e,{value:t}){Ds(e,t)}};function Ds(e,t){e.style.display=t?e._vod:"none"}const zs=S({patchProp:(e,t,n,r,s=!1,i,l,c,a)=>{switch(t){case"class":!function(e,t,n){if(null==t&&(t=""),n)e.setAttribute("class",t);else{const n=e._vtc;n&&(t=(t?[t,...n]:[...n]).join(" ")),e.className=t}}(e,r,s);break;case"style":!function(e,t,n){const o=e.style;if(n)if(A(n)){if(t!==n){const t=o.display;o.cssText=n,"_vod"in e&&(o.display=t)}}else{for(const e in n)zr(o,e,n[e]);if(t&&!A(t))for(const e in t)null==n[e]&&zr(o,e,"")}else e.removeAttribute("style")}(e,n,r);break;default:_(t)?x(t)||es(e,t,0,r,l):function(e,t,n,o){if(o)return"innerHTML"===t||!!(t in e&&ns.test(t)&&F(n));if("spellcheck"===t||"draggable"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if(ns.test(t)&&A(n))return!1;return t in e}(e,t,r,s)?function(e,t,n,o,r,s,i){if("innerHTML"===t||"textContent"===t)return o&&i(o,r,s),void(e[t]=null==n?"":n);if("value"!==t||"PROGRESS"===e.tagName){if(""===n||null==n){const o=typeof e[t];if(""===n&&"boolean"===o)return void(e[t]=!0);if(null==n&&"string"===o)return e[t]="",void e.removeAttribute(t);if("number"===o)return e[t]=0,void e.removeAttribute(t)}try{e[t]=n}catch(l){}}else{e._value=n;const t=null==n?"":n;e.value!==t&&(e.value=t)}}(e,t,r,i,l,c,a):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(Gr,t.slice(6,t.length)):e.setAttributeNS(Gr,t,n);else{const r=o(t);null==n||r&&!1===n?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},forcePatchProp:(e,t)=>"value"===t},Hr);let Ws,Ks=!1;function Gs(){return Ws||(Ws=So(zs))}function qs(){return Ws=Ks?Ws:Co(zs),Ks=!0,Ws}function Js(e){if(A(e)){return document.querySelector(e)}return e}function Zs(e){throw e}function Qs(e,t,n,o){const r=new SyntaxError(String(e));return r.code=e,r.loc=t,r}const Xs=Symbol(""),Ys=Symbol(""),ei=Symbol(""),ti=Symbol(""),ni=Symbol(""),oi=Symbol(""),ri=Symbol(""),si=Symbol(""),ii=Symbol(""),li=Symbol(""),ci=Symbol(""),ai=Symbol(""),ui=Symbol(""),pi=Symbol(""),fi=Symbol(""),di=Symbol(""),hi=Symbol(""),mi=Symbol(""),gi=Symbol(""),vi=Symbol(""),yi=Symbol(""),bi=Symbol(""),_i=Symbol(""),xi=Symbol(""),Si=Symbol(""),Ci=Symbol(""),ki=Symbol(""),wi=Symbol(""),Ti=Symbol(""),Ni=Symbol(""),Ei=Symbol(""),$i={[Xs]:"Fragment",[Ys]:"Teleport",[ei]:"Suspense",[ti]:"KeepAlive",[ni]:"BaseTransition",[oi]:"openBlock",[ri]:"createBlock",[si]:"createVNode",[ii]:"createCommentVNode",[li]:"createTextVNode",[ci]:"createStaticVNode",[ai]:"resolveComponent",[ui]:"resolveDynamicComponent",[pi]:"resolveDirective",[fi]:"withDirectives",[di]:"renderList",[hi]:"renderSlot",[mi]:"createSlots",[gi]:"toDisplayString",[vi]:"mergeProps",[yi]:"toHandlers",[bi]:"camelize",[_i]:"capitalize",[xi]:"toHandlerKey",[Si]:"setBlockTracking",[Ci]:"pushScopeId",[ki]:"popScopeId",[wi]:"withScopeId",[Ti]:"withCtx",[Ni]:"unref",[Ei]:"isRef"};const Fi={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function Ai(e,t,n,o,r,s,i,l=!1,c=!1,a=Fi){return e&&(l?(e.helper(oi),e.helper(ri)):e.helper(si),i&&e.helper(fi)),{type:13,tag:t,props:n,children:o,patchFlag:r,dynamicProps:s,directives:i,isBlock:l,disableTracking:c,loc:a}}function Mi(e,t=Fi){return{type:17,loc:t,elements:e}}function Ii(e,t=Fi){return{type:15,loc:t,properties:e}}function Oi(e,t){return{type:16,loc:Fi,key:A(e)?Bi(e,!0):e,value:t}}function Bi(e,t,n=Fi,o=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:o}}function Ri(e,t=Fi){return{type:8,loc:t,children:e}}function Pi(e,t=[],n=Fi){return{type:14,loc:n,callee:e,arguments:t}}function Vi(e,t,n=!1,o=!1,r=Fi){return{type:18,params:e,returns:t,newline:n,isSlot:o,loc:r}}function Li(e,t,n,o=!0){return{type:19,test:e,consequent:t,alternate:n,newline:o,loc:Fi}}const ji=e=>4===e.type&&e.isStatic,Ui=(e,t)=>e===t||e===z(t);function Hi(e){return Ui(e,"Teleport")?Ys:Ui(e,"Suspense")?ei:Ui(e,"KeepAlive")?ti:Ui(e,"BaseTransition")?ni:void 0}const Di=/^\d|[^\$\w]/,zi=e=>!Di.test(e),Wi=/^[A-Za-z_$\xA0-\uFFFF][\w$\xA0-\uFFFF]*(?:\s*\.\s*[A-Za-z_$\xA0-\uFFFF][\w$\xA0-\uFFFF]*|\[[^\]]+\])*$/,Ki=e=>!!e&&Wi.test(e.trim());function Gi(e,t,n){const o={source:e.source.substr(t,n),start:qi(e.start,e.source,t),end:e.end};return null!=n&&(o.end=qi(e.start,e.source,t+n)),o}function qi(e,t,n=t.length){return Ji(S({},e),t,n)}function Ji(e,t,n=t.length){let o=0,r=-1;for(let s=0;s4===e.key.type&&e.key.content===n))}e||r.properties.unshift(t),o=r}else o=Pi(n.helper(vi),[Ii([t]),r]);13===e.type?e.props=o:e.arguments[2]=o}function rl(e,t){return`_${t}_${e.replace(/[^\w]/g,"_")}`}const sl=/&(gt|lt|amp|apos|quot);/g,il={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},ll={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:y,isPreTag:y,isCustomElement:y,decodeEntities:e=>e.replace(sl,((e,t)=>il[t])),onError:Zs,comments:!1};function cl(e,t={}){const n=function(e,t){const n=S({},ll);for(const o in t)n[o]=t[o]||ll[o];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1}}(e,t),o=Sl(n);return function(e,t=Fi){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(al(n,0,[]),Cl(n,o))}function al(e,t,n){const o=kl(n),r=o?o.ns:0,s=[];for(;!$l(e,t,n);){const i=e.source;let l;if(0===t||1===t)if(!e.inVPre&&wl(i,e.options.delimiters[0]))l=bl(e,t);else if(0===t&&"<"===i[0])if(1===i.length);else if("!"===i[1])l=wl(i,"\x3c!--")?fl(e):wl(i,""===i[2]){Tl(e,3);continue}if(/[a-z]/i.test(i[2])){gl(e,1,o);continue}l=dl(e)}else/[a-z]/i.test(i[1])?l=hl(e,n):"?"===i[1]&&(l=dl(e));if(l||(l=_l(e,t)),T(l))for(let e=0;e/.exec(e.source);if(o){n=e.source.slice(4,o.index);const t=e.source.slice(0,o.index);let r=1,s=0;for(;-1!==(s=t.indexOf("\x3c!--",r));)Tl(e,s-r+1),r=s+1;Tl(e,o.index+o[0].length-r+1)}else n=e.source.slice(4),Tl(e,e.source.length);return{type:3,content:n,loc:Cl(e,t)}}function dl(e){const t=Sl(e),n="?"===e.source[1]?1:2;let o;const r=e.source.indexOf(">");return-1===r?(o=e.source.slice(n),Tl(e,e.source.length)):(o=e.source.slice(n,r),Tl(e,r+1)),{type:3,content:o,loc:Cl(e,t)}}function hl(e,t){const n=e.inPre,o=e.inVPre,r=kl(t),s=gl(e,0,r),i=e.inPre&&!n,l=e.inVPre&&!o;if(s.isSelfClosing||e.options.isVoidTag(s.tag))return s;t.push(s);const c=e.options.getTextMode(s,r),a=al(e,c,t);if(t.pop(),s.children=a,Fl(e.source,s.tag))gl(e,1,r);else if(0===e.source.length&&"script"===s.tag.toLowerCase()){const e=a[0];e&&wl(e.loc.source,"\x3c!--")}return s.loc=Cl(e,s.loc.start),i&&(e.inPre=!1),l&&(e.inVPre=!1),s}const ml=t("if,else,else-if,for,slot");function gl(e,t,n){const o=Sl(e),r=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=r[1],i=e.options.getNamespace(s,n);Tl(e,r[0].length),Nl(e);const l=Sl(e),c=e.source;let a=vl(e,t);e.options.isPreTag(s)&&(e.inPre=!0),!e.inVPre&&a.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,S(e,l),e.source=c,a=vl(e,t).filter((e=>"v-pre"!==e.name)));let u=!1;0===e.source.length||(u=wl(e.source,"/>"),Tl(e,u?2:1));let p=0;const f=e.options;if(!e.inVPre&&!f.isCustomElement(s)){const e=a.some((e=>7===e.type&&"is"===e.name));f.isNativeTag&&!e?f.isNativeTag(s)||(p=1):(e||Hi(s)||f.isBuiltInComponent&&f.isBuiltInComponent(s)||/^[A-Z]/.test(s)||"component"===s)&&(p=1),"slot"===s?p=2:"template"===s&&a.some((e=>7===e.type&&ml(e.name)))&&(p=3)}return{type:1,ns:i,tag:s,tagType:p,props:a,isSelfClosing:u,children:[],loc:Cl(e,o),codegenNode:void 0}}function vl(e,t){const n=[],o=new Set;for(;e.source.length>0&&!wl(e.source,">")&&!wl(e.source,"/>");){if(wl(e.source,"/")){Tl(e,1),Nl(e);continue}const r=yl(e,o);0===t&&n.push(r),/^[^\t\r\n\f />]/.test(e.source),Nl(e)}return n}function yl(e,t){const n=Sl(e),o=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(o),t.add(o);{const e=/["'<]/g;let t;for(;t=e.exec(o););}let r;Tl(e,o.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Nl(e),Tl(e,1),Nl(e),r=function(e){const t=Sl(e);let n;const o=e.source[0],r='"'===o||"'"===o;if(r){Tl(e,1);const t=e.source.indexOf(o);-1===t?n=xl(e,e.source.length,4):(n=xl(e,t,4),Tl(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const o=/["'<=`]/g;let r;for(;r=o.exec(t[0]););n=xl(e,t[0].length,4)}return{content:n,isQuoted:r,loc:Cl(e,t)}}(e));const s=Cl(e,n);if(!e.inVPre&&/^(v-|:|@|#)/.test(o)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(o),i=t[1]||(wl(o,":")?"bind":wl(o,"@")?"on":"slot");let l;if(t[2]){const r="slot"===i,s=o.lastIndexOf(t[2]),c=Cl(e,El(e,n,s),El(e,n,s+t[2].length+(r&&t[3]||"").length));let a=t[2],u=!0;a.startsWith("[")?(u=!1,a.endsWith("]"),a=a.substr(1,a.length-2)):r&&(a+=t[3]||""),l={type:4,content:a,isStatic:u,constType:u?3:0,loc:c}}if(r&&r.isQuoted){const e=r.loc;e.start.offset++,e.start.column++,e.end=qi(e.start,r.content),e.source=e.source.slice(1,-1)}return{type:7,name:i,exp:r&&{type:4,content:r.content,isStatic:!1,constType:0,loc:r.loc},arg:l,modifiers:t[3]?t[3].substr(1).split("."):[],loc:s}}return{type:6,name:o,value:r&&{type:2,content:r.content,loc:r.loc},loc:s}}function bl(e,t){const[n,o]=e.options.delimiters,r=e.source.indexOf(o,n.length);if(-1===r)return;const s=Sl(e);Tl(e,n.length);const i=Sl(e),l=Sl(e),c=r-n.length,a=e.source.slice(0,c),u=xl(e,c,t),p=u.trim(),f=u.indexOf(p);f>0&&Ji(i,a,f);return Ji(l,a,c-(u.length-p.length-f)),Tl(e,o.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:p,loc:Cl(e,i,l)},loc:Cl(e,s)}}function _l(e,t){const n=["<",e.options.delimiters[0]];3===t&&n.push("]]>");let o=e.source.length;for(let s=0;st&&(o=t)}const r=Sl(e);return{type:2,content:xl(e,o,t),loc:Cl(e,r)}}function xl(e,t,n){const o=e.source.slice(0,t);return Tl(e,t),2===n||3===n||-1===o.indexOf("&")?o:e.options.decodeEntities(o,4===n)}function Sl(e){const{column:t,line:n,offset:o}=e;return{column:t,line:n,offset:o}}function Cl(e,t,n){return{start:t,end:n=n||Sl(e),source:e.originalSource.slice(t.offset,n.offset)}}function kl(e){return e[e.length-1]}function wl(e,t){return e.startsWith(t)}function Tl(e,t){const{source:n}=e;Ji(e,n,t),e.source=n.slice(t)}function Nl(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&Tl(e,t[0].length)}function El(e,t,n){return qi(t,e.originalSource.slice(t.offset,n),n)}function $l(e,t,n){const o=e.source;switch(t){case 0:if(wl(o,"=0;--e)if(Fl(o,n[e].tag))return!0;break;case 1:case 2:{const e=kl(n);if(e&&Fl(o,e.tag))return!0;break}case 3:if(wl(o,"]]>"))return!0}return!o}function Fl(e,t){return wl(e,"]/.test(e[2+t.length]||">")}function Al(e,t){Il(e,t,Ml(e,e.children[0]))}function Ml(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!nl(t)}function Il(e,t,n=!1){let o=!1,r=!0;const{children:s}=e;for(let i=0;i0){if(s<3&&(r=!1),s>=2){e.codegenNode.patchFlag="-1",e.codegenNode=t.hoist(e.codegenNode),o=!0;continue}}else{const n=e.codegenNode;if(13===n.type){const o=Pl(n);if((!o||512===o||1===o)&&Bl(e,t)>=2){const o=Rl(e);o&&(n.props=t.hoist(o))}}}}else if(12===e.type){const n=Ol(e.content,t);n>0&&(n<3&&(r=!1),n>=2&&(e.codegenNode=t.hoist(e.codegenNode),o=!0))}if(1===e.type){const n=1===e.tagType;n&&t.scopes.vSlot++,Il(e,t),n&&t.scopes.vSlot--}else if(11===e.type)Il(e,t,1===e.children.length);else if(9===e.type)for(let n=0;n1)for(let r=0;r`_${$i[S.helper(e)]}`,replaceNode(e){S.parent.children[S.childIndex]=S.currentNode=e},removeNode(e){const t=e?S.parent.children.indexOf(e):S.currentNode?S.childIndex:-1;e&&e!==S.currentNode?S.childIndex>t&&(S.childIndex--,S.onNodeRemoved()):(S.currentNode=null,S.onNodeRemoved()),S.parent.children.splice(t,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){S.hoists.push(e);const t=Bi(`_hoisted_${S.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:Fi}}(++S.cached,e,t)};return S}function Ll(e,t){const n=Vl(e,t);jl(e,n),t.hoistStatic&&Al(e,n),t.ssr||function(e,t){const{helper:n,removeHelper:o}=t,{children:r}=e;if(1===r.length){const t=r[0];if(Ml(e,t)&&t.codegenNode){const r=t.codegenNode;13===r.type&&(r.isBlock||(o(si),r.isBlock=!0,n(oi),n(ri))),e.codegenNode=r}else e.codegenNode=t}else if(r.length>1){let o=64;e.codegenNode=Ai(t,n(Xs),void 0,e.children,o+"",void 0,void 0,!0)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached}function jl(e,t){t.currentNode=e;const{nodeTransforms:n}=t,o=[];for(let s=0;s{n--};for(;nt===e:t=>e.test(t);return(e,o)=>{if(1===e.type){const{props:r}=e;if(3===e.tagType&&r.some(el))return;const s=[];for(let i=0;i`_${$i[e]}`,push(e,t){u.code+=e},indent(){p(++u.indentLevel)},deindent(e=!1){e?--u.indentLevel:p(--u.indentLevel)},newline(){p(u.indentLevel)}};function p(e){u.push("\n"+" ".repeat(e))}return u}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:o,push:r,prefixIdentifiers:s,indent:i,deindent:l,newline:c,ssr:a}=n,u=e.helpers.length>0,p=!s&&"module"!==o;!function(e,t){const{push:n,newline:o,runtimeGlobalName:r}=t,s=r,i=e=>`${$i[e]}: _${$i[e]}`;if(e.helpers.length>0&&(n(`const _Vue = ${s}\n`),e.hoists.length)){n(`const { ${[si,ii,li,ci].filter((t=>e.helpers.includes(t))).map(i).join(", ")} } = _Vue\n`)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:o}=t;o(),e.forEach(((e,r)=>{e&&(n(`const _hoisted_${r+1} = `),Gl(e,t),o())})),t.pure=!1})(e.hoists,t),o(),n("return ")}(e,n);if(r(`function ${a?"ssrRender":"render"}(${(a?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),i(),p&&(r("with (_ctx) {"),i(),u&&(r(`const { ${e.helpers.map((e=>`${$i[e]}: _${$i[e]}`)).join(", ")} } = _Vue`),r("\n"),c())),e.components.length&&(zl(e.components,"component",n),(e.directives.length||e.temps>0)&&c()),e.directives.length&&(zl(e.directives,"directive",n),e.temps>0&&c()),e.temps>0){r("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(r("\n"),c()),a||r("return "),e.codegenNode?Gl(e.codegenNode,n):r("null"),p&&(l(),r("}")),l(),r("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function zl(e,t,{helper:n,push:o,newline:r}){const s=n("component"===t?ai:pi);for(let i=0;i3||!1;t.push("["),n&&t.indent(),Kl(e,t,n),n&&t.deindent(),t.push("]")}function Kl(e,t,n=!1,o=!0){const{push:r,newline:s}=t;for(let i=0;ie||"null"))}([s,i,l,c,a]),t),n(")"),p&&n(")");u&&(n(", "),Gl(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:o,pure:r}=t,s=A(e.callee)?e.callee:o(e.callee);r&&n(Hl);n(s+"(",e),Kl(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:o,deindent:r,newline:s}=t,{properties:i}=e;if(!i.length)return void n("{}",e);const l=i.length>1||!1;n(l?"{":"{ "),l&&o();for(let c=0;c "),(c||l)&&(n("{"),o());i?(c&&n("return "),T(i)?Wl(i,t):Gl(i,t)):l&&Gl(l,t);(c||l)&&(r(),n("}"));a&&n(")")}(e,t);break;case 19:!function(e,t){const{test:n,consequent:o,alternate:r,newline:s}=e,{push:i,indent:l,deindent:c,newline:a}=t;if(4===n.type){const e=!zi(n.content);e&&i("("),ql(n,t),e&&i(")")}else i("("),Gl(n,t),i(")");s&&l(),t.indentLevel++,s||i(" "),i("? "),Gl(o,t),t.indentLevel--,s&&a(),s||i(" "),i(": ");const u=19===r.type;u||t.indentLevel++;Gl(r,t),u||t.indentLevel--;s&&c(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:o,indent:r,deindent:s,newline:i}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(r(),n(`${o(Si)}(-1),`),i());n(`_cache[${e.index}] = `),Gl(e.value,t),e.isVNode&&(n(","),i(),n(`${o(Si)}(1),`),i(),n(`_cache[${e.index}]`),s());n(")")}(e,t)}}function ql(e,t){const{content:n,isStatic:o}=e;t.push(o?JSON.stringify(n):n,e)}function Jl(e,t){for(let n=0;nfunction(e,t,n,o){if(!("else"===t.name||t.exp&&t.exp.content.trim())){t.exp=Bi("true",!1,t.exp?t.exp.loc:e.loc)}if("if"===t.name){const r=Xl(e,t),s={type:9,loc:e.loc,branches:[r]};if(n.replaceNode(s),o)return o(s,r,!0)}else{const r=n.parent.children;let s=r.indexOf(e);for(;s-- >=-1;){const i=r[s];if(!i||2!==i.type||i.content.trim().length){if(i&&9===i.type){n.removeNode();const r=Xl(e,t);i.branches.push(r);const s=o&&o(i,r,!1);jl(r,n),s&&s(),n.currentNode=null}break}n.removeNode(i)}}}(e,t,n,((e,t,o)=>{const r=n.parent.children;let s=r.indexOf(e),i=0;for(;s-- >=0;){const e=r[s];e&&9===e.type&&(i+=e.branches.length)}return()=>{if(o)e.codegenNode=Yl(t,i,n);else{(function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode)).alternate=Yl(t,i+e.branches.length-1,n)}}}))));function Xl(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||Zi(e,"for")?[e]:e.children,userKey:Qi(e,"key")}}function Yl(e,t,n){return e.condition?Li(e.condition,ec(e,t,n),Pi(n.helper(ii),['""',"true"])):ec(e,t,n)}function ec(e,t,n){const{helper:o,removeHelper:r}=n,s=Oi("key",Bi(`${t}`,!1,Fi,2)),{children:i}=e,l=i[0];if(1!==i.length||1!==l.type){if(1===i.length&&11===l.type){const e=l.codegenNode;return ol(e,s,n),e}{let t=64;return Ai(n,o(Xs),Ii([s]),i,t+"",void 0,void 0,!0,!1,e.loc)}}{const e=l.codegenNode;return 13!==e.type||e.isBlock||(r(si),e.isBlock=!0,o(oi),o(ri)),ol(e,s,n),e}}const tc=Ul("for",((e,t,n)=>{const{helper:o,removeHelper:r}=n;return function(e,t,n,o){if(!t.exp)return;const r=sc(t.exp);if(!r)return;const{scopes:s}=n,{source:i,value:l,key:c,index:a}=r,u={type:11,loc:t.loc,source:i,valueAlias:l,keyAlias:c,objectIndexAlias:a,parseResult:r,children:tl(e)?e.children:[e]};n.replaceNode(u),s.vFor++;const p=o&&o(u);return()=>{s.vFor--,p&&p()}}(e,t,n,(t=>{const s=Pi(o(di),[t.source]),i=Qi(e,"key"),l=i?Oi("key",6===i.type?Bi(i.value.content,!0):i.exp):null,c=4===t.source.type&&t.source.constType>0,a=c?64:i?128:256;return t.codegenNode=Ai(n,o(Xs),void 0,s,a+"",void 0,void 0,!0,!c,e.loc),()=>{let i;const a=tl(e),{children:u}=t,p=1!==u.length||1!==u[0].type,f=nl(e)?e:a&&1===e.children.length&&nl(e.children[0])?e.children[0]:null;f?(i=f.codegenNode,a&&l&&ol(i,l,n)):p?i=Ai(n,o(Xs),l?Ii([l]):void 0,e.children,"64",void 0,void 0,!0):(i=u[0].codegenNode,a&&l&&ol(i,l,n),i.isBlock!==!c&&(i.isBlock?(r(oi),r(ri)):r(si)),i.isBlock=!c,i.isBlock?(o(oi),o(ri)):o(si)),s.arguments.push(Vi(lc(t.parseResult),i,!0))}}))}));const nc=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,oc=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,rc=/^\(|\)$/g;function sc(e,t){const n=e.loc,o=e.content,r=o.match(nc);if(!r)return;const[,s,i]=r,l={source:ic(n,i.trim(),o.indexOf(i,s.length)),value:void 0,key:void 0,index:void 0};let c=s.trim().replace(rc,"").trim();const a=s.indexOf(c),u=c.match(oc);if(u){c=c.replace(oc,"").trim();const e=u[1].trim();let t;if(e&&(t=o.indexOf(e,a+c.length),l.key=ic(n,e,t)),u[2]){const r=u[2].trim();r&&(l.index=ic(n,r,o.indexOf(r,l.key?t+e.length:a+c.length)))}}return c&&(l.value=ic(n,c,a)),l}function ic(e,t,n){return Bi(t,!1,Gi(e,n,t.length))}function lc({value:e,key:t,index:n}){const o=[];return e&&o.push(e),t&&(e||o.push(Bi("_",!1)),o.push(t)),n&&(t||(e||o.push(Bi("_",!1)),o.push(Bi("__",!1))),o.push(n)),o}const cc=Bi("undefined",!1),ac=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Zi(e,"slot");if(n)return t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},uc=(e,t,n)=>Vi(e,t,!1,!0,t.length?t[0].loc:n);function pc(e,t,n=uc){t.helper(Ti);const{children:o,loc:r}=e,s=[],i=[],l=(e,t)=>Oi("default",n(e,t,r));let c=t.scopes.vSlot>0||t.scopes.vFor>0;const a=Zi(e,"slot",!0);if(a){const{arg:e,exp:t}=a;e&&!ji(e)&&(c=!0),s.push(Oi(e||Bi("default",!0),n(t,o,r)))}let u=!1,p=!1;const f=[],d=new Set;for(let g=0;gfunction(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:o}=e,r=1===e.tagType,s=r?function(e,t,n=!1){const{tag:o}=e,r=bc(o)?Qi(e,"is"):Zi(e,"is");if(r){const e=6===r.type?r.value&&Bi(r.value.content,!0):r.exp;if(e)return Pi(t.helper(ui),[e])}const s=Hi(o)||t.isBuiltInComponent(o);if(s)return n||t.helper(s),s;return t.helper(ai),t.components.add(o),rl(o,"component")}(e,t):`"${n}"`;let i,l,c,a,u,p,f=0,d=I(s)&&s.callee===ui||s===Ys||s===ei||!r&&("svg"===n||"foreignObject"===n||Qi(e,"key",!0));if(o.length>0){const n=gc(e,t);i=n.props,f=n.patchFlag,u=n.dynamicPropNames;const o=n.directives;p=o&&o.length?Mi(o.map((e=>function(e,t){const n=[],o=hc.get(e);o?n.push(t.helperString(o)):(t.helper(pi),t.directives.add(e.name),n.push(rl(e.name,"directive")));const{loc:r}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Bi("true",!1,r);n.push(Ii(e.modifiers.map((e=>Oi(e,t))),r))}return Mi(n,e.loc)}(e,t)))):void 0}if(e.children.length>0){s===ti&&(d=!0,f|=1024);if(r&&s!==Ys&&s!==ti){const{slots:n,hasDynamicSlots:o}=pc(e,t);l=n,o&&(f|=1024)}else if(1===e.children.length&&s!==Ys){const n=e.children[0],o=n.type,r=5===o||8===o;r&&0===Ol(n,t)&&(f|=1),l=r||2===o?n:e.children}else l=e.children}0!==f&&(c=String(f),u&&u.length&&(a=function(e){let t="[";for(let n=0,o=e.length;n{if(ji(e)){const o=e.content,r=_(o);if(i||!r||"onclick"===o.toLowerCase()||"onUpdate:modelValue"===o||L(o)||(h=!0),r&&L(o)&&(g=!0),20===n.type||(4===n.type||8===n.type)&&Ol(n,t)>0)return;"ref"===o?p=!0:"class"!==o||i?"style"!==o||i?"key"===o||v.includes(o)||v.push(o):d=!0:f=!0}else m=!0};for(let _=0;_1?Pi(t.helper(vi),c,s):c[0]):l.length&&(b=Ii(vc(l),s)),m?u|=16:(f&&(u|=2),d&&(u|=4),v.length&&(u|=8),h&&(u|=32)),0!==u&&32!==u||!(p||g||a.length>0)||(u|=512),{props:b,directives:a,patchFlag:u,dynamicPropNames:v}}function vc(e){const t=new Map,n=[];for(let o=0;o{if(nl(e)){const{children:n,loc:o}=e,{slotName:r,slotProps:s}=function(e,t){let n,o='"default"';const r=[];for(let s=0;s0){const{props:o,directives:s}=gc(e,t,r);n=o}return{slotName:o,slotProps:n}}(e,t),i=[t.prefixIdentifiers?"_ctx.$slots":"$slots",r];s&&i.push(s),n.length&&(s||i.push("{}"),i.push(Vi([],n,!1,!1,o))),t.scopeId&&!t.slotted&&(s||i.push("{}"),n.length||i.push("undefined"),i.push("true")),e.codegenNode=Pi(t.helper(hi),i,o)}};const xc=/^\s*([\w$_]+|\([^)]*?\))\s*=>|^\s*function(?:\s+[\w$]+)?\s*\(/,Sc=(e,t,n,o)=>{const{loc:r,modifiers:s,arg:i}=e;let l;if(4===i.type)if(i.isStatic){l=Bi(K(H(i.content)),!0,i.loc)}else l=Ri([`${n.helperString(xi)}(`,i,")"]);else l=i,l.children.unshift(`${n.helperString(xi)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let a=n.cacheHandlers&&!c;if(c){const e=Ki(c.content),t=!(e||xc.test(c.content)),n=c.content.includes(";");(t||a&&e)&&(c=Ri([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let u={props:[Oi(l,c||Bi("() => {}",!1,r))]};return o&&(u=o(u)),a&&(u.props[0].value=n.cache(u.props[0].value)),u},Cc=(e,t,n)=>{const{exp:o,modifiers:r,loc:s}=e,i=e.arg;return 4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=`${i.content} || ""`),r.includes("camel")&&(4===i.type?i.content=i.isStatic?H(i.content):`${n.helperString(bi)}(${i.content})`:(i.children.unshift(`${n.helperString(bi)}(`),i.children.push(")"))),!o||4===o.type&&!o.content.trim()?{props:[Oi(i,Bi("",!0,s))]}:{props:[Oi(i,o)]}},kc=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let o,r=!1;for(let e=0;e{if(1===e.type&&Zi(e,"once",!0)){if(wc.has(e))return;return wc.add(e),t.helper(Si),()=>{const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Nc=(e,t,n)=>{const{exp:o,arg:r}=e;if(!o)return Ec();const s=o.loc.source;if(!Ki(4===o.type?o.content:s))return Ec();const i=r||Bi("modelValue",!0),l=r?ji(r)?`onUpdate:${r.content}`:Ri(['"onUpdate:" + ',r]):"onUpdate:modelValue";let c;c=Ri([`${n.isTS?"($event: any)":"$event"} => (`,o," = $event)"]);const a=[Oi(i,e.exp),Oi(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(zi(e)?e:JSON.stringify(e))+": true")).join(", "),n=r?ji(r)?`${r.content}Modifiers`:Ri([r,' + "Modifiers"']):"modelModifiers";a.push(Oi(n,Bi(`{ ${t} }`,!1,e.loc,2)))}return Ec(a)};function Ec(e=[]){return{props:e}}function $c(e,t={}){const n=t.onError||Zs,o="module"===t.mode;!0===t.prefixIdentifiers?n(Qs(45)):o&&n(Qs(46));t.cacheHandlers&&n(Qs(47)),t.scopeId&&!o&&n(Qs(48));const r=A(e)?cl(e,t):e,[s,i]=[[Tc,Ql,tc,_c,mc,ac,kc],{on:Sc,bind:Cc,model:Nc}];return Ll(r,S({},t,{prefixIdentifiers:false,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:S({},i,t.directiveTransforms||{})})),Dl(r,S({},t,{prefixIdentifiers:false}))}const Fc=Symbol(""),Ac=Symbol(""),Mc=Symbol(""),Ic=Symbol(""),Oc=Symbol(""),Bc=Symbol(""),Rc=Symbol(""),Pc=Symbol(""),Vc=Symbol(""),Lc=Symbol("");var jc;let Uc;jc={[Fc]:"vModelRadio",[Ac]:"vModelCheckbox",[Mc]:"vModelText",[Ic]:"vModelSelect",[Oc]:"vModelDynamic",[Bc]:"withModifiers",[Rc]:"withKeys",[Pc]:"vShow",[Vc]:"Transition",[Lc]:"TransitionGroup"},Object.getOwnPropertySymbols(jc).forEach((e=>{$i[e]=jc[e]}));const Hc=t("style,iframe,script,noscript",!0),Dc={isVoidTag:p,isNativeTag:e=>a(e)||u(e),isPreTag:e=>"pre"===e,decodeEntities:function(e){return(Uc||(Uc=document.createElement("div"))).innerHTML=e,Uc.textContent},isBuiltInComponent:e=>Ui(e,"Transition")?Vc:Ui(e,"TransitionGroup")?Lc:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(Hc(e))return 2}return 0}},zc=(e,t)=>{const n=l(e);return Bi(JSON.stringify(n),!1,t,3)};const Wc=t("passive,once,capture"),Kc=t("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Gc=t("left,right"),qc=t("onkeyup,onkeydown,onkeypress",!0),Jc=(e,t)=>ji(e)&&"onclick"===e.content.toLowerCase()?Bi(t,!0):4!==e.type?Ri(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,Zc=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||t.removeNode()},Qc=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Bi("style",!0,t.loc),exp:zc(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],Xc={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:o,loc:r}=e;return t.children.length&&(t.children.length=0),{props:[Oi(Bi("innerHTML",!0,r),o||Bi("",!0))]}},text:(e,t,n)=>{const{exp:o,loc:r}=e;return t.children.length&&(t.children.length=0),{props:[Oi(Bi("textContent",!0),o?Pi(n.helperString(gi),[o],r):Bi("",!0))]}},model:(e,t,n)=>{const o=Nc(e,t,n);if(!o.props.length||1===t.tagType)return o;const{tag:r}=t,s=n.isCustomElement(r);if("input"===r||"textarea"===r||"select"===r||s){let e=Mc,i=!1;if("input"===r||s){const n=Qi(t,"type");if(n){if(7===n.type)e=Oc;else if(n.value)switch(n.value.content){case"radio":e=Fc;break;case"checkbox":e=Ac;break;case"file":i=!0}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(e=Oc)}else"select"===r&&(e=Ic);i||(o.needRuntime=n.helper(e))}return o.props=o.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),o},on:(e,t,n)=>Sc(e,0,n,(t=>{const{modifiers:o}=e;if(!o.length)return t;let{key:r,value:s}=t.props[0];const{keyModifiers:i,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t)=>{const n=[],o=[],r=[];for(let s=0;s({props:[],needRuntime:n.helper(Pc)})};const Yc=Object.create(null);function ea(e,t){if(!A(e)){if(!e.nodeType)return v;e=e.innerHTML}const n=e,o=Yc[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:r}=function(e,t={}){return $c(e,S({},Dc,t,{nodeTransforms:[Zc,...Qc,...t.nodeTransforms||[]],directiveTransforms:S({},Xc,t.directiveTransforms||{}),transformHoist:null}))}(e,S({hoistStatic:!0,onError(e){throw e}},t)),s=new Function(r)();return s._rc=!0,Yc[n]=s}return Nr(ea),e.BaseTransition=Un,e.Comment=Vo,e.Fragment=Ro,e.KeepAlive=Jn,e.Static=Lo,e.Suspense=un,e.Teleport=Ao,e.Text=Po,e.Transition=is,e.TransitionGroup=Ss,e.callWithAsyncErrorHandling=Ct,e.callWithErrorHandling=St,e.camelize=H,e.capitalize=W,e.cloneVNode=Xo,e.compile=ea,e.computed=Or,e.createApp=(...e)=>{const t=Gs().createApp(...e),{mount:n}=t;return t.mount=e=>{const o=Js(e);if(!o)return;const r=t._component;F(r)||r.render||r.template||(r.template=o.innerHTML),o.innerHTML="";const s=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),s},t},e.createBlock=Wo,e.createCommentVNode=function(e="",t=!1){return t?(Ho(),Wo(Vo,null,e)):Qo(Vo,null,e)},e.createHydrationRenderer=Co,e.createRenderer=So,e.createSSRApp=(...e)=>{const t=qs().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Js(e);if(t)return n(t,!0,t instanceof SVGElement)},t},e.createSlots=function(e,t){for(let n=0;n{let e;return a||(e=a=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),l)return new Promise(((t,n)=>{l(e,(()=>t((u++,a=null,p()))),(()=>n(e)),u+1)}));throw e})).then((t=>e!==a&&a?a:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),c=t,t))))};return vo({__asyncLoader:p,name:"AsyncComponentWrapper",setup(){const e=_r;if(c)return()=>yo(c,e);const t=t=>{a=null,kt(t,e,13,!o)};if(i&&e.suspense)return p().then((t=>()=>yo(t,e))).catch((e=>(t(e),()=>o?Qo(o,{error:e}):null)));const l=at(!1),u=at(),f=at(!!r);return r&&setTimeout((()=>{f.value=!1}),r),null!=s&&setTimeout((()=>{if(!l.value&&!u.value){const e=new Error(`Async component timed out after ${s}ms.`);t(e),u.value=e}}),s),p().then((()=>{l.value=!0})).catch((e=>{t(e),u.value=e})),()=>l.value&&c?yo(c,e):u.value&&o?Qo(o,{error:u.value}):n&&!f.value?Qo(n):void 0}})},e.defineComponent=vo,e.defineEmit=function(){return null},e.defineProps=function(){return null},e.getCurrentInstance=xr,e.getTransitionRawChildren=Gn,e.h=Br,e.handleError=kt,e.hydrate=(...e)=>{qs().hydrate(...e)},e.initCustomFormatter=function(){},e.inject=sr,e.isProxy=st,e.isReactive=ot,e.isReadonly=rt,e.isRef=ct,e.isRuntimeOnly=()=>!kr,e.isVNode=Ko,e.markRaw=function(e){return J(e,"__v_skip",!0),e},e.mergeProps=or,e.nextTick=Vt,e.onActivated=Qn,e.onBeforeMount=kn,e.onBeforeUnmount=En,e.onBeforeUpdate=Tn,e.onDeactivated=Xn,e.onErrorCaptured=Mn,e.onMounted=wn,e.onRenderTracked=An,e.onRenderTriggered=Fn,e.onUnmounted=$n,e.onUpdated=Nn,e.openBlock=Ho,e.popScopeId=function(){en=null},e.provide=rr,e.proxyRefs=ht,e.pushScopeId=function(e){en=e},e.queuePostFlushCb=Ht,e.reactive=Ye,e.readonly=tt,e.ref=at,e.registerRuntimeCompiler=Nr,e.render=(...e)=>{Gs().render(...e)},e.renderList=function(e,t){let n;if(T(e)||A(e)){n=new Array(e.length);for(let o=0,r=e.length;onull==e?"":I(e)?JSON.stringify(e,h,2):String(e),e.toHandlerKey=K,e.toHandlers=function(e){const t={};for(const n in e)t[K(n)]=e[n];return t},e.toRaw=it,e.toRef=vt,e.toRefs=function(e){const t=T(e)?new Array(e.length):{};for(const n in e)t[n]=vt(e,n);return t},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){pe(it(e),"set","value",void 0)},e.unref=ft,e.useContext=function(){const e=xr();return e.setupContext||(e.setupContext=$r(e))},e.useCssModule=function(e="$style"){return m},e.useCssVars=function(e){const t=xr();if(!t)return;const n=()=>os(t.subTree,e(t.proxy));wn((()=>In(n,{flush:"post"}))),Nn(n)},e.useSSRContext=()=>{},e.useTransitionState=Ln,e.vModelCheckbox=Fs,e.vModelDynamic=Ps,e.vModelRadio=Ms,e.vModelSelect=Is,e.vModelText=$s,e.vShow=Hs,e.version=Pr,e.warn=function(e,...t){ce();const n=bt.length?bt[bt.length-1].component:null,o=n&&n.appContext.config.warnHandler,r=function(){let e=bt[bt.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const o=e.component&&e.component.parent;e=o&&o.vnode}return t}();if(o)St(o,n,11,[e+t.join(""),n&&n.proxy,r.map((({vnode:e})=>`at <${Ir(n,e.type)}>`)).join("\n"),r]);else{const n=[`[Vue warn]: ${e}`,...t];r.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",o=` at <${Ir(e.component,e.type,!!e.component&&null==e.component.parent)}`,r=">"+n;return e.props?[o,..._t(e.props),r]:[o+r]}(e))})),t}(r)),console.warn(...n)}ae()},e.watch=Bn,e.watchEffect=In,e.withCtx=nn,e.withDirectives=function(e,t){if(null===Yt)return e;const n=Yt.proxy,o=e.dirs||(e.dirs=[]);for(let r=0;rn=>{if(!("key"in n))return;const o=z(n.key);return t.some((e=>e===o||Us[e]===o))?e(n):void 0},e.withModifiers=(e,t)=>(n,...o)=>{for(let e=0;enn,Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file From 5561041db9180a02a317e566d1a9a1129228935e Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 31 May 2021 16:59:02 +0200 Subject: [PATCH 04/19] fix: display alert messages --- pkg/cmd/scan/output/assets/index.tmpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 5cd81b07..17533b06 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -10,7 +10,7 @@

Driftctl scan report

Coverage 8% - Apr 21, 2021 + {{ .ScanDate }}
@@ -78,8 +78,8 @@
{{ $type }}
- {{range $msg := $messages}} -
- {{ $msg }}
+ {{range $el := $messages}} +
- {{ $el.Message }}
{{end}}
@@ -153,4 +153,4 @@ refreshState() - \ No newline at end of file + From fd0e673b37613b53290b59996ed15f8b08cb1187 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 1 Jun 2021 11:38:47 +0200 Subject: [PATCH 05/19] test: html output --- pkg/cmd/driftctl_test.go | 2 +- pkg/cmd/scan/output/html_test.go | 6 +- pkg/cmd/scan/output/testdata/output.html | 133 ++++++++++++++--------- pkg/cmd/scan_test.go | 8 +- 4 files changed, 85 insertions(+), 64 deletions(-) diff --git a/pkg/cmd/driftctl_test.go b/pkg/cmd/driftctl_test.go index 9ceb5202..97ee31d6 100644 --- a/pkg/cmd/driftctl_test.go +++ b/pkg/cmd/driftctl_test.go @@ -111,7 +111,7 @@ func TestDriftctlCmd_Scan(t *testing.T) { env: map[string]string{ "DCTL_OUTPUT": "test", }, - err: fmt.Errorf("Unable to parse output flag 'test': \nAccepted formats are: console://,json://PATH/TO/FILE.json"), + err: fmt.Errorf("Unable to parse output flag 'test': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json"), }, { env: map[string]string{ diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index 2e539f46..31692234 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -3,7 +3,6 @@ package output import ( "io/ioutil" "path" - "strings" "testing" "github.com/stretchr/testify/assert" @@ -65,10 +64,7 @@ func TestHTML_Write(t *testing.T) { t.Fatal(err) } - prettifiedExpected := strings.ReplaceAll(string(expected), " ", "") - prettifiedGot := strings.ReplaceAll(string(got), " ", "") - - assert.Equal(t, prettifiedExpected, prettifiedGot) + assert.Equal(t, string(expected), string(got)) }) } } diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index 925567f5..85c803b1 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -1,131 +1,136 @@ - + Driftctl scan report - + + +.hide { + display: none; +} -
-

Driftctl scan report ❌

+

Driftctl scan report

Coverage 8% - Apr 21, 2021 + Jun 01, 2021
+

Managed resources (2)

- - -
+ +
diff-id-1 aws_diff_resource
- -
+ +
no-diff-id-1 aws_no_diff_resource
+ + - +

Unmanaged resources (2)

- - -
+ +
unmanaged-id-1 aws_unmanaged_resource
- -
+ +
unmanaged-id-2 aws_unmanaged_resource
+ + - +

Changed resources (1)

- - -
+ +
diff-id-1 aws_diff_resource
- +
~ updated.field: "foobar" => "barfoo"
- +
+ new.field: <nil> => "newValue"
- +
- a: "oldValue" => <nil>
- +
+ + - +

Missing resources (2)

- - -
+ +
deleted-id-1 aws_deleted_resource
- -
+ +
deleted-id-2 aws_deleted_resource
+ + - +

Alerts (1)

- - -
+ +
- -
- {Ignoring aws_vpc from drift calculation: Listing aws_vpc is forbidden. aws+tf}
- -
- {Ignoring aws_sqs from drift calculation: Listing aws_sqs is forbidden. aws+tf}
- -
- {Ignoring aws_sns from drift calculation: Listing aws_sns is forbidden. aws+tf}
- + +
- Ignoring aws_vpc from drift calculation: Listing aws_vpc is forbidden.
+ +
- Ignoring aws_sqs from drift calculation: Listing aws_sqs is forbidden.
+ +
- Ignoring aws_sns from drift calculation: Listing aws_sns is forbidden.
+
- + +
- \ No newline at end of file + diff --git a/pkg/cmd/scan_test.go b/pkg/cmd/scan_test.go index 7181d5ae..f21935f2 100644 --- a/pkg/cmd/scan_test.go +++ b/pkg/cmd/scan_test.go @@ -174,7 +174,7 @@ func Test_parseOutputFlag(t *testing.T) { out: "", }, want: nil, - err: fmt.Errorf("Unable to parse output flag '': \nAccepted formats are: console://,json://PATH/TO/FILE.json"), + err: fmt.Errorf("Unable to parse output flag '': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json"), }, { name: "test invalid", @@ -182,7 +182,7 @@ func Test_parseOutputFlag(t *testing.T) { out: "sdgjsdgjsdg", }, want: nil, - err: fmt.Errorf("Unable to parse output flag 'sdgjsdgjsdg': \nAccepted formats are: console://,json://PATH/TO/FILE.json"), + err: fmt.Errorf("Unable to parse output flag 'sdgjsdgjsdg': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json"), }, { name: "test invalid", @@ -190,7 +190,7 @@ func Test_parseOutputFlag(t *testing.T) { out: "://", }, want: nil, - err: fmt.Errorf("Unable to parse output flag '://': \nAccepted formats are: console://,json://PATH/TO/FILE.json"), + err: fmt.Errorf("Unable to parse output flag '://': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json"), }, { name: "test unsupported", @@ -198,7 +198,7 @@ func Test_parseOutputFlag(t *testing.T) { out: "foobar://", }, want: nil, - err: fmt.Errorf("Unsupported output 'foobar': \nValid formats are: console://,json://PATH/TO/FILE.json"), + err: fmt.Errorf("Unsupported output 'foobar': \nValid formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json"), }, { name: "test empty json", From 067241ed2a91f0d77f4ad030c06667f6806a57e9 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 7 Jun 2021 15:21:57 +0200 Subject: [PATCH 06/19] refactor: html output --- pkg/cmd/scan/output/assets/index.tmpl | 12 ---- pkg/cmd/scan/output/html.go | 70 ++++++++++++------------ pkg/cmd/scan/output/html_test.go | 48 ++++++++++++++++ pkg/cmd/scan/output/testdata/output.html | 23 ++------ 4 files changed, 87 insertions(+), 66 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 17533b06..21957205 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -22,17 +22,6 @@ - {{ if (gt (len .Managed) 0) }} -

Managed resources ({{len .Managed}})

- - {{range $res := .Managed}} -
- {{$res.TerraformId}} - {{$res.TerraformType}} -
- {{end}} - {{end}} - {{ if (gt (len .Unmanaged) 0) }}

Unmanaged resources ({{len .Unmanaged}})

@@ -116,7 +105,6 @@ function refreshCounters() { const counterClassMapping = { - '.resource-item-managed': '.resource-count-managed', '.resource-item-unmanaged': '.resource-count-unmanaged', '.resource-item-changed': '.resource-count-changed', '.resource-item-deleted': '.resource-count-deleted', diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 8576cb64..34fd7cb3 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -5,7 +5,6 @@ import ( "fmt" "html/template" "os" - "sort" "strings" "time" @@ -26,23 +25,22 @@ type HTML struct { path string } +type HTMLTemplateParams struct { + ScanDate string + Coverage int + Summary analyser.Summary + Unmanaged []resource.Resource + Differences []analyser.Difference + Deleted []resource.Resource + Alerts alerter.Alerts + Stylesheet template.CSS +} + func NewHTML(path string) *HTML { return &HTML{path} } func (c *HTML) Write(analysis *analyser.Analysis) error { - type TemplateParams struct { - ScanDate string - Coverage int - Summary analyser.Summary - Managed []resource.Resource - Unmanaged []resource.Resource - Differences []analyser.Difference - Deleted []resource.Resource - Alerts alerter.Alerts - Stylesheet template.CSS - } - file := os.Stdout if !isStdOut(c.path) { f, err := os.OpenFile(c.path, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0600) @@ -65,33 +63,15 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { funcMap := template.FuncMap{ "getResourceTypes": func() []string { - resources := []resource.Resource{} - list := []string{} - + resources := make([]resource.Resource, 0) resources = append(resources, analysis.Unmanaged()...) - resources = append(resources, analysis.Managed()...) resources = append(resources, analysis.Deleted()...) - for _, res := range resources { - if i := sort.SearchStrings(list, res.TerraformType()); i <= len(list)-1 { - continue - } - list = append(list, res.TerraformType()) - } for _, d := range analysis.Differences() { - if i := sort.SearchStrings(list, d.Res.TerraformType()); i <= len(list)-1 { - continue - } - list = append(list, d.Res.TerraformType()) - } - for kind := range analysis.Alerts() { - if i := sort.SearchStrings(list, kind); i <= len(list)-1 { - continue - } - list = append(list, kind) + resources = append(resources, d.Res) } - return list + return distinctResourceTypes(resources) }, "formatChange": func(ch analyser.Change) string { prefix := "" @@ -119,11 +99,10 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { return err } - data := &TemplateParams{ + data := &HTMLTemplateParams{ ScanDate: time.Now().Format("Jan 02, 2006"), Summary: analysis.Summary(), Coverage: analysis.Coverage(), - Managed: analysis.Managed(), Unmanaged: analysis.Unmanaged(), Differences: analysis.Differences(), Deleted: analysis.Deleted(), @@ -138,3 +117,22 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { return nil } + +func distinctResourceTypes(resources []resource.Resource) []string { + types := make([]string, 0) + + for _, res := range resources { + found := false + for _, v := range types { + if v == res.TerraformType() { + found = true + break + } + } + if !found { + types = append(types, res.TerraformType()) + } + } + + return types +} diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index 31692234..9be8dbda 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -5,6 +5,8 @@ import ( "path" "testing" + "github.com/cloudskiff/driftctl/pkg/resource" + testresource "github.com/cloudskiff/driftctl/test/resource" "github.com/stretchr/testify/assert" "github.com/cloudskiff/driftctl/pkg/analyser" @@ -68,3 +70,49 @@ func TestHTML_Write(t *testing.T) { }) } } + +func TestHTML_DistinctResourceTypes(t *testing.T) { + tests := []struct { + name string + resources []resource.Resource + value []string + }{ + { + name: "test empty array", + resources: []resource.Resource{}, + value: []string{}, + }, + { + name: "test empty array", + resources: []resource.Resource{ + testresource.FakeResource{ + Id: "deleted-id-1", + Type: "aws_deleted_resource", + }, + testresource.FakeResource{ + Id: "unmanaged-id-1", + Type: "aws_unmanaged_resource", + }, + testresource.FakeResource{ + Id: "unmanaged-id-2", + Type: "aws_unmanaged_resource", + }, + testresource.FakeResource{ + Id: "diff-id-1", + Type: "aws_diff_resource", + }, + testresource.FakeResource{ + Id: "deleted-id-2", + Type: "aws_deleted_resource", + }, + }, + value: []string{"aws_deleted_resource", "aws_unmanaged_resource", "aws_diff_resource"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := distinctResourceTypes(tt.resources) + assert.Equal(t, tt.value, got) + }) + } +} diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index 85c803b1..f9a51dcb 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -16,7 +16,7 @@

Driftctl scan report

Coverage 8% - Jun 01, 2021 + Jun 07, 2021
@@ -25,26 +25,14 @@ + + + +
-

Managed resources (2)

- - -
- diff-id-1 - aws_diff_resource -
- -
- no-diff-id-1 - aws_no_diff_resource -
- - - -

Unmanaged resources (2)

@@ -145,7 +133,6 @@ function refreshCounters() { const counterClassMapping = { - '.resource-item-managed': '.resource-count-managed', '.resource-item-unmanaged': '.resource-count-unmanaged', '.resource-item-changed': '.resource-count-changed', '.resource-item-deleted': '.resource-count-deleted', From a9ce5c639fe35be255bef626fdbaddd92a707f69 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 7 Jun 2021 17:47:21 +0200 Subject: [PATCH 07/19] refactor: html output style --- pkg/cmd/scan/output/assets/index.tmpl | 169 ++++---- pkg/cmd/scan/output/assets/style.css | 253 +++++++++++- pkg/cmd/scan/output/testdata/output.html | 474 ++++++++++++++++++----- 3 files changed, 741 insertions(+), 155 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 21957205..28f6c91a 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -7,73 +7,106 @@ -
-

Driftctl scan report

- Coverage 8% - {{ .ScanDate }} -
-
- - -
- - {{ if (gt (len .Unmanaged) 0) }} -

Unmanaged resources ({{len .Unmanaged}})

- - {{range $res := .Unmanaged}} -
- {{$res.TerraformId}} - {{$res.TerraformType}} -
- {{end}} - {{end}} - - {{ if (gt (len .Differences) 0) }} -

Changed resources ({{len .Differences}})

- - {{range $diff := .Differences}} -
- {{$diff.Res.TerraformId}} - {{$diff.Res.TerraformType}} +
+
- {{range $change := $diff.Changelog}} -
{{ formatChange $change }}
- {{end}} +

Driftctl scan report

+ Coverage {{.Coverage}}% +
+

{{ .ScanDate }}

+
+
+
+
+ + + +
+
+ +
+ + + + +
+ {{ if (gt (len .Unmanaged) 0) }} + + {{end}} + {{ if (gt (len .Differences) 0) }} + + {{end}} + {{ if (gt (len .Deleted) 0) }} + + {{end}} + {{ if (gt (len .Alerts) 0) }} + + {{end}} +
+
+ {{ if (gt (len .Unmanaged) 0) }} +
+ {{range $res := .Unmanaged}} +
+ {{$res.TerraformId}} + {{$res.TerraformType}} +
+ {{end}} +
+ {{end}} + {{ if (gt (len .Differences) 0) }} +
+ {{range $diff := .Differences}} +
+ {{$diff.Res.TerraformId}} +
+ {{range $change := $diff.Changelog}} +
{{ formatChange $change }}
+ {{end}} +
+ {{$diff.Res.TerraformType}} +
+ {{end}} +
+ {{end}} + {{ if (gt (len .Deleted) 0) }} +
+ {{range $res := .Deleted}} +
+ {{$res.TerraformId}} + {{$res.TerraformType}} +
+ {{end}} +
+ {{end}} + {{ if (gt (len .Alerts) 0) }} +
+ {{range $type, $messages := .Alerts}} + {{range $el := $messages}} +
+ {{ $type }} + - {{ $el.Message }} +
+ {{end}} + {{end}} +
+ {{end}} +
+
+ +
+

There's nothing to see there...

- {{end}} - {{end}} - - {{ if (gt (len .Deleted) 0) }} -

Missing resources ({{len .Deleted}})

- - {{range $res := .Deleted}} -
- {{$res.TerraformId}} - {{$res.TerraformType}} -
- {{end}} - {{end}} - - {{ if (gt (len .Alerts) 0) }} -

Alerts ({{len .Alerts}})

- - {{range $type, $messages := .Alerts}} -
- {{ $type }} -
- {{range $el := $messages}} -
- {{ $el.Message }}
- {{end}} -
-
- {{end}} - {{end}}
diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index 26109332..87441b59 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -1,7 +1,258 @@ +@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600&display=swap'); + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + body { - font-family: sans-serif; + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* + * Custom style + */ +:root { + --transitionDuration: 400ms; +} + +body { + font-family: 'Source Sans Pro', sans-serif; + color: #1C1E21; + background-color: #F7F7F9; + padding-bottom: 50px; +} + +div.container { + max-width: 100%; + width: 1280px; + margin: auto; +} + +.heading { + height: 130px; } .hide { + display: none !important; +} + +.d-flex { + display: flex; + flex-direction: row; +} + +.justify-center { + justify-content: center; +} + +.justify-space-around { + justify-content: space-around; +} + +.justify-space-between { + justify-content: space-between; +} + +.align-center { + align-items: center; +} + +.mt-5 { + margin-top: 50px; +} + +.mb-5 { + margin-bottom: 50px; +} + +.mt-2 { + margin-top: 20px; +} + +.mb-2 { + margin-bottom: 20px; +} + +.mt-1 { + margin-top: 10px; +} + +.mb-1 { + margin-bottom: 10px; +} + +input[type="text"], +select { + padding: 8px; + font-size: 14px; + border: 1px solid #ececec; + outline: none; + transition: var(--transitionDuration); + color: #6e7071; +} + +input[type="text"]:focus, +select:focus { + border: 1px solid #71b2c3; +} + +input[name="resource-id-filter"], select[name="resource-type-filter"] { + width: 300px; +} + +h1 { + font-size: 24px; + font-weight: bold; +} + +h2 { + font-size: 20px; + font-weight: bold; +} + +.heading-title { + margin-bottom: 10px; +} + +.app-content { + padding: 25px; + border-top: 3px solid #71B2C3; + background-color: #ffffff; + border-radius: 0 0 10px 10px; +} + +.resource-item { + border: 1px solid #ececec; + padding: 10px; + margin-top: 10px; + color: #6e7071; +} + +.resource-item:hover { + background-color: #f9f9f9; +} + +.text--bold { + font-weight: bold; +} + +.reset-filter-btn { + border: none; + padding: 8px; + font-size: 14px; + background-color: transparent; + color: #5faabd; + cursor: pointer; +} + +/* tabs style */ +.tabs-wrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.tab { + cursor: pointer; + padding: 10px 20px; + margin: 0 2px; + background: transparent; + display: inline-block; + color: #747578; + transition: background-color 200ms; +} + +.tab:hover { + background-color: #f9f9f9; +} + +.panels { + min-height: 200px; + width: 100%; + padding: 20px; +} + +.panel { display: none; + animation: fadein .8s; +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.panel-title { + font-size: 1.5em; + font-weight: bold +} + +.radio { + display: none; +} + +#one:checked ~ .panels #one-panel, +#two:checked ~ .panels #two-panel, +#three:checked ~ .panels #three-panel, +#four:checked ~ .panels #four-panel { + display: block +} + +#one:checked ~ .tabs #one-tab, +#two:checked ~ .tabs #two-tab, +#three:checked ~ .tabs #three-tab, +#four:checked ~ .tabs #four-tab { + background: transparent; + color: #747578; + border-bottom: 2px solid #71b2c3; } \ No newline at end of file diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index f9a51dcb..4975ba51 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -4,104 +4,394 @@ Driftctl scan report - -
-

Driftctl scan report

- Coverage 8% - Jun 07, 2021 -
-
- - -
- - -

Unmanaged resources (2)

- - -
- unmanaged-id-1 - aws_unmanaged_resource -
- -
- unmanaged-id-2 - aws_unmanaged_resource -
- - - - -

Changed resources (1)

- - -
- diff-id-1 - aws_diff_resource +
+
- -
~ updated.field: "foobar" => "barfoo"
- -
+ new.field: <nil> => "newValue"
- -
- a: "oldValue" => <nil>
- +

Driftctl scan report

+ Coverage 33% +
+

Jun 07, 2021

+
+
+
+
+ + + +
+
+ +
+ + + + +
+ + + + + + + + + + + + +
+
+ +
+ +
+ unmanaged-id-1 + aws_unmanaged_resource +
+ +
+ unmanaged-id-2 + aws_unmanaged_resource +
+ +
+ + +
+ +
+ diff-id-1 +
+ +
~ updated.field: "foobar" => "barfoo"
+ +
+ new.field: <nil> => "newValue"
+ +
- a: "oldValue" => <nil>
+ +
+ aws_diff_resource +
+ +
+ + +
+ +
+ deleted-id-1 + aws_deleted_resource +
+ +
+ deleted-id-2 + aws_deleted_resource +
+ +
+ + +
+ + +
+ + - Ignoring aws_vpc from drift calculation: Listing aws_vpc is forbidden. +
+ +
+ + - Ignoring aws_sqs from drift calculation: Listing aws_sqs is forbidden. +
+ +
+ + - Ignoring aws_sns from drift calculation: Listing aws_sns is forbidden. +
+ + +
+ +
+
+ +
+

There's nothing to see there...

- - - - -

Missing resources (2)

- - -
- deleted-id-1 - aws_deleted_resource -
- -
- deleted-id-2 - aws_deleted_resource -
- - - - -

Alerts (1)

- - -
- -
- -
- Ignoring aws_vpc from drift calculation: Listing aws_vpc is forbidden.
- -
- Ignoring aws_sqs from drift calculation: Listing aws_sqs is forbidden.
- -
- Ignoring aws_sns from drift calculation: Listing aws_sns is forbidden.
- -
-
- -
From a14a72f212781eb2f0e8205a0bd8123ec822ff1c Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 7 Jun 2021 19:26:39 +0200 Subject: [PATCH 08/19] refactor: empty message in html output --- pkg/cmd/scan/output/assets/index.tmpl | 22 ++++++- pkg/cmd/scan/output/assets/style.css | 5 +- pkg/cmd/scan/output/html_test.go | 70 ++++++++++++++++++---- pkg/cmd/scan/output/testdata/output.html | 76 ++++++++++++++++++++++-- 4 files changed, 153 insertions(+), 20 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 28f6c91a..b5d40a67 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -16,6 +16,7 @@

{{ .ScanDate }}

+ {{ if (lt .Coverage 100) }}
@@ -103,9 +104,14 @@
-
+

There's nothing to see there...

+ {{else}} +
+

Congrats! Your infrastructure is in sync

+
+ {{end}}
@@ -153,6 +159,19 @@ } } + function computeEmptyMessage() { + const msgEl = document.querySelector('.empty-message-container') + const wrapperEl = document.querySelector('.tabs-wrapper') + const count = Array.from(resources).filter(el => !el.classList.contains('hide')).length + if (count === 0) { + msgEl.classList.remove('hide') + wrapperEl.classList.add('hide') + return + } + msgEl.classList.add('hide') + wrapperEl.classList.remove('hide') + } + function refreshState() { const queryFilterInput = document.querySelector('input[name=resource-id-filter]').value const typeFilterInput = document.querySelector('select[name=resource-type-filter]').value @@ -170,6 +189,7 @@ } refreshCounters() + computeEmptyMessage() } function resetFilters() { diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index 87441b59..fe7b9506 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -213,7 +213,6 @@ h2 { } .panels { - min-height: 200px; width: 100%; padding: 20px; } @@ -255,4 +254,8 @@ h2 { background: transparent; color: #747578; border-bottom: 2px solid #71b2c3; +} + +.empty-message-container { + color: #747578; } \ No newline at end of file diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index 9be8dbda..06f30905 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -7,6 +7,7 @@ import ( "github.com/cloudskiff/driftctl/pkg/resource" testresource "github.com/cloudskiff/driftctl/test/resource" + "github.com/r3labs/diff/v2" "github.com/stretchr/testify/assert" "github.com/cloudskiff/driftctl/pkg/analyser" @@ -14,20 +15,65 @@ import ( ) func TestHTML_Write(t *testing.T) { - type args struct { - analysis *analyser.Analysis - } tests := []struct { name string goldenfile string - args args + analysis func() *analyser.Analysis err error }{ { name: "test html output", goldenfile: "output.html", - args: args{ - analysis: fakeAnalysisWithAlerts(), + + analysis: func() *analyser.Analysis { + a := fakeAnalysisWithAlerts() + a.AddDeleted( + &testresource.FakeResource{ + Id: "deleted-id-3", + Type: "aws_deleted_resource", + }, + &testresource.FakeResource{ + Id: "deleted-id-4", + Type: "aws_deleted_resource", + }, + &testresource.FakeResource{ + Id: "deleted-id-5", + Type: "aws_deleted_resource", + }, + &testresource.FakeResource{ + Id: "deleted-id-6", + Type: "aws_deleted_resource", + }, + ) + a.AddUnmanaged( + &testresource.FakeResource{ + Id: "unmanaged-id-3", + Type: "aws_unmanaged_resource", + }, + &testresource.FakeResource{ + Id: "unmanaged-id-4", + Type: "aws_unmanaged_resource", + }, + &testresource.FakeResource{ + Id: "unmanaged-id-5", + Type: "aws_unmanaged_resource", + }, + ) + a.AddDifference(analyser.Difference{Res: &testresource.FakeResource{ + Id: "diff-id-1", + Type: "aws_diff_resource", + }, Changelog: []analyser.Change{ + { + Change: diff.Change{ + Type: diff.DELETE, + Path: []string{"path", "to", "field"}, + From: nil, + To: []string{"value"}, + }, + }, + }}) + + return a }, err: nil, }, @@ -42,7 +88,7 @@ func TestHTML_Write(t *testing.T) { } c := NewHTML(tempFile.Name()) - err = c.Write(tt.args.analysis) + err = c.Write(tt.analysis()) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -85,23 +131,23 @@ func TestHTML_DistinctResourceTypes(t *testing.T) { { name: "test empty array", resources: []resource.Resource{ - testresource.FakeResource{ + &testresource.FakeResource{ Id: "deleted-id-1", Type: "aws_deleted_resource", }, - testresource.FakeResource{ + &testresource.FakeResource{ Id: "unmanaged-id-1", Type: "aws_unmanaged_resource", }, - testresource.FakeResource{ + &testresource.FakeResource{ Id: "unmanaged-id-2", Type: "aws_unmanaged_resource", }, - testresource.FakeResource{ + &testresource.FakeResource{ Id: "diff-id-1", Type: "aws_diff_resource", }, - testresource.FakeResource{ + &testresource.FakeResource{ Id: "deleted-id-2", Type: "aws_deleted_resource", }, diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index 4975ba51..75bce948 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -219,7 +219,6 @@ h2 { } .panels { - min-height: 200px; width: 100%; padding: 20px; } @@ -261,6 +260,10 @@ h2 { background: transparent; color: #747578; border-bottom: 2px solid #71b2c3; +} + +.empty-message-container { + color: #747578; } @@ -268,11 +271,12 @@ h2 {

Driftctl scan report

- Coverage 33% + Coverage 15%

Jun 07, 2021

+
@@ -298,15 +302,15 @@ h2 {
+ class="resource-count-unmanaged">5) + class="resource-count-changed">2) + class="resource-count-deleted">6)
+
+ unmanaged-id-3 + aws_unmanaged_resource +
+ +
+ unmanaged-id-4 + aws_unmanaged_resource +
+ +
+ unmanaged-id-5 + aws_unmanaged_resource +
+
@@ -346,6 +365,16 @@ h2 { aws_diff_resource
+
+ diff-id-1 +
+ +
- path.to.field: <nil> => ["value"]
+ +
+ aws_diff_resource +
+
@@ -361,6 +390,26 @@ h2 { aws_deleted_resource
+
+ deleted-id-3 + aws_deleted_resource +
+ +
+ deleted-id-4 + aws_deleted_resource +
+ +
+ deleted-id-5 + aws_deleted_resource +
+ +
+ deleted-id-6 + aws_deleted_resource +
+
@@ -388,9 +437,10 @@ h2 {
-
+

There's nothing to see there...

+
@@ -438,6 +488,19 @@ h2 { } } + function computeEmptyMessage() { + const msgEl = document.querySelector('.empty-message-container') + const wrapperEl = document.querySelector('.tabs-wrapper') + const count = Array.from(resources).filter(el => !el.classList.contains('hide')).length + if (count === 0) { + msgEl.classList.remove('hide') + wrapperEl.classList.add('hide') + return + } + msgEl.classList.add('hide') + wrapperEl.classList.remove('hide') + } + function refreshState() { const queryFilterInput = document.querySelector('input[name=resource-id-filter]').value const typeFilterInput = document.querySelector('select[name=resource-type-filter]').value @@ -455,6 +518,7 @@ h2 { } refreshCounters() + computeEmptyMessage() } function resetFilters() { From a27d993b13ad06eb70be0f78223aadcefa9e4541 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Tue, 8 Jun 2021 17:14:28 +0200 Subject: [PATCH 09/19] refactor: html output custom style --- pkg/cmd/scan/output/assets/index.tmpl | 38 +- pkg/cmd/scan/output/assets/style.css | 70 ++- pkg/cmd/scan/output/html.go | 41 +- pkg/cmd/scan/output/html_test.go | 27 ++ pkg/cmd/scan/output/testdata/output.html | 138 ++++-- .../scan/output/testdata/output_empty.html | 458 ++++++++++++++++++ pkg/cmd/scan/output/testdata/output_sync.html | 428 ++++++++++++++++ 7 files changed, 1129 insertions(+), 71 deletions(-) create mode 100644 pkg/cmd/scan/output/testdata/output_empty.html create mode 100644 pkg/cmd/scan/output/testdata/output_sync.html diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index b5d40a67..cbe884e8 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -4,16 +4,28 @@ Driftctl scan report +
-

Driftctl scan report

+

Driftctl scan report

Coverage {{.Coverage}}%
-

{{ .ScanDate }}

+
+

{{ .ScanDate }}

+ Scan duration {{.ScanDuration}} +
+
+
+ Total resources: {{.Summary.TotalResources}} + Managed: {{rate .Summary.TotalManaged}}% + Changed: {{.Summary.TotalDrifted}}/{{.Summary.TotalManaged}} + Unmanaged: {{rate .Summary.TotalUnmanaged}}% + Missing: {{rate .Summary.TotalDeleted}}%
{{ if (lt .Coverage 100) }} @@ -56,16 +68,24 @@
{{ if (gt (len .Unmanaged) 0) }}
+
+ Resource id + Resource type +
{{range $res := .Unmanaged}}
{{$res.TerraformId}} - {{$res.TerraformType}} + {{$res.TerraformType}}
{{end}}
{{end}} {{ if (gt (len .Differences) 0) }}
+
+ Resource id + Resource type +
{{range $diff := .Differences}}
{{$diff.Res.TerraformId}} @@ -74,17 +94,21 @@
{{ formatChange $change }}
{{end}}
- {{$diff.Res.TerraformType}} + {{$diff.Res.TerraformType}}
{{end}}
{{end}} {{ if (gt (len .Deleted) 0) }}
+
+ Resource id + Resource type +
{{range $res := .Deleted}}
{{$res.TerraformId}} - {{$res.TerraformType}} + {{$res.TerraformType}}
{{end}}
@@ -94,8 +118,8 @@ {{range $type, $messages := .Alerts}} {{range $el := $messages}}
- {{ $type }} - - {{ $el.Message }} + {{ $type }} + {{ $el.Message }}
{{end}} {{end}} diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index fe7b9506..a3f89e68 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -1,5 +1,3 @@ -@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600&display=swap'); - /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) @@ -20,7 +18,6 @@ time, mark, audio, video { margin: 0; padding: 0; border: 0; - font-size: 100%; font: inherit; vertical-align: baseline; } @@ -45,7 +42,6 @@ blockquote, q { blockquote:before, blockquote:after, q:before, q:after { - content: ''; content: none; } @@ -62,7 +58,7 @@ table { } body { - font-family: 'Source Sans Pro', sans-serif; + font-family: "Helvetica", sans-serif; color: #1C1E21; background-color: #F7F7F9; padding-bottom: 50px; @@ -127,6 +123,26 @@ div.container { margin-bottom: 10px; } +.pa-1 { + padding: 10px; +} + +.pl-1 { + padding-left: 10px; +} + +.pr-1 { + padding-right: 10px; +} + +.pt-1 { + padding-top: 10px; +} + +.pb-1 { + padding-bottom: 10px; +} + input[type="text"], select { padding: 8px; @@ -144,6 +160,7 @@ select:focus { input[name="resource-id-filter"], select[name="resource-type-filter"] { width: 300px; + border-radius: 3px; } h1 { @@ -157,21 +174,32 @@ h2 { } .heading-title { - margin-bottom: 10px; + display: block; +} + +.heading-subtitle { + font-size: 14px; + display: block; } .app-content { padding: 25px; border-top: 3px solid #71B2C3; background-color: #ffffff; - border-radius: 0 0 10px 10px; + box-shadow: 0 0 5px #0000000a; } .resource-item { - border: 1px solid #ececec; - padding: 10px; - margin-top: 10px; + border-top: 1px solid #ececec; + border-left: 1px solid #ececec; + border-right: 1px solid #ececec; + padding: 15px; color: #6e7071; + font-size: 14px; +} + +.resource-item:last-child { + border-bottom: 1px solid #ececec; } .resource-item:hover { @@ -182,6 +210,22 @@ h2 { font-weight: bold; } +.text--grey { + color: #747578; +} + +.text--right { + text-align: right; +} + +.card { + padding: 15px; + font-size: 15px; + background: #ffffff; + box-shadow: 0 0 5px #0000000a; + border-radius: 3px; +} + .reset-filter-btn { border: none; padding: 8px; @@ -206,6 +250,7 @@ h2 { display: inline-block; color: #747578; transition: background-color 200ms; + border-radius: 3px; } .tab:hover { @@ -251,9 +296,8 @@ h2 { #two:checked ~ .tabs #two-tab, #three:checked ~ .tabs #three-tab, #four:checked ~ .tabs #four-tab { - background: transparent; - color: #747578; - border-bottom: 2px solid #71b2c3; + background: #71b2c3; + color: #ffffff; } .empty-message-container { diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 34fd7cb3..50916a99 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -4,6 +4,7 @@ import ( "embed" "fmt" "html/template" + "math" "os" "strings" "time" @@ -26,14 +27,15 @@ type HTML struct { } type HTMLTemplateParams struct { - ScanDate string - Coverage int - Summary analyser.Summary - Unmanaged []resource.Resource - Differences []analyser.Difference - Deleted []resource.Resource - Alerts alerter.Alerts - Stylesheet template.CSS + ScanDate string + Coverage int + Summary analyser.Summary + Unmanaged []resource.Resource + Differences []analyser.Difference + Deleted []resource.Resource + Alerts alerter.Alerts + Stylesheet template.CSS + ScanDuration string } func NewHTML(path string) *HTML { @@ -92,6 +94,12 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { return fmt.Sprintf("%s %s: %s => %s %s", prefix, strings.Join(ch.Path, "."), prettify(ch.From), prettify(ch.To), suffix) }, + "rate": func(count int) float64 { + if analysis.Summary().TotalResources == 0 { + return 0 + } + return math.Round(100 * float64(count) / float64(analysis.Summary().TotalResources)) + }, } tmpl, err := template.New("main").Funcs(funcMap).Parse(string(tmplFile)) @@ -100,14 +108,15 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { } data := &HTMLTemplateParams{ - ScanDate: time.Now().Format("Jan 02, 2006"), - Summary: analysis.Summary(), - Coverage: analysis.Coverage(), - Unmanaged: analysis.Unmanaged(), - Differences: analysis.Differences(), - Deleted: analysis.Deleted(), - Alerts: analysis.Alerts(), - Stylesheet: template.CSS(styleFile), + ScanDate: time.Now().Format("Jan 02, 2006"), + Summary: analysis.Summary(), + Coverage: analysis.Coverage(), + Unmanaged: analysis.Unmanaged(), + Differences: analysis.Differences(), + Deleted: analysis.Deleted(), + Alerts: analysis.Alerts(), + Stylesheet: template.CSS(styleFile), + ScanDuration: analysis.Duration.Round(time.Second).String(), } err = tmpl.Execute(file, data) diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index 06f30905..c53ee5f0 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -4,6 +4,7 @@ import ( "io/ioutil" "path" "testing" + "time" "github.com/cloudskiff/driftctl/pkg/resource" testresource "github.com/cloudskiff/driftctl/test/resource" @@ -21,12 +22,38 @@ func TestHTML_Write(t *testing.T) { analysis func() *analyser.Analysis err error }{ + { + name: "test html output when there's no resources", + goldenfile: "output_empty.html", + analysis: func() *analyser.Analysis { + a := &analyser.Analysis{} + return a + }, + err: nil, + }, + { + name: "test html output when infrastructure is in sync", + goldenfile: "output_sync.html", + analysis: func() *analyser.Analysis { + a := &analyser.Analysis{} + a.Duration = 72 * time.Second + a.AddManaged( + &testresource.FakeResource{ + Id: "deleted-id-3", + Type: "aws_deleted_resource", + }, + ) + return a + }, + err: nil, + }, { name: "test html output", goldenfile: "output.html", analysis: func() *analyser.Analysis { a := fakeAnalysisWithAlerts() + a.Duration = 91 * time.Second a.AddDeleted( &testresource.FakeResource{ Id: "deleted-id-3", diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index 75bce948..ba320065 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -4,9 +4,9 @@ Driftctl scan report - + + +
+
+
+

Driftctl scan report

+ Coverage 0% +
+
+

Jun 08, 2021

+ Scan duration 0s +
+
+
+ Total resources: 0 + Managed: 0% + Changed: 0/0 + Unmanaged: 0% + Missing: 0% +
+
+ +
+ + + + + +
+ +
+ + + + +
+ + + + +
+
+ + + + +
+
+ +
+

There's nothing to see there...

+
+ +
+
+ + + diff --git a/pkg/cmd/scan/output/testdata/output_sync.html b/pkg/cmd/scan/output/testdata/output_sync.html new file mode 100644 index 00000000..a0989829 --- /dev/null +++ b/pkg/cmd/scan/output/testdata/output_sync.html @@ -0,0 +1,428 @@ + + + + Driftctl scan report + + + + + + +
+
+
+

Driftctl scan report

+ Coverage 100% +
+
+

Jun 08, 2021

+ Scan duration 1m12s +
+
+
+ Total resources: 1 + Managed: 100% + Changed: 0/1 + Unmanaged: 0% + Missing: 0% +
+
+ +
+

Congrats! Your infrastructure is in sync

+
+ +
+
+ + + From 76613149c10305f47965bfca382f2cebbbe68ac5 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 10 Jun 2021 15:25:54 +0200 Subject: [PATCH 10/19] refactor: add date to analysis struct --- pkg/analyser/analysis.go | 1 + pkg/cmd/scan/output/html.go | 2 +- pkg/cmd/scan/output/html_test.go | 3 +++ pkg/cmd/scan/output/testdata/output.html | 2 +- pkg/cmd/scan/output/testdata/output_empty.html | 2 +- pkg/cmd/scan/output/testdata/output_sync.html | 2 +- pkg/driftctl.go | 5 +++-- 7 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pkg/analyser/analysis.go b/pkg/analyser/analysis.go index 914004fd..56dc08dc 100644 --- a/pkg/analyser/analysis.go +++ b/pkg/analyser/analysis.go @@ -42,6 +42,7 @@ type Analysis struct { summary Summary alerts alerter.Alerts Duration time.Duration + Date time.Time } type serializableDifference struct { diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 50916a99..5d7f903a 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -108,7 +108,7 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { } data := &HTMLTemplateParams{ - ScanDate: time.Now().Format("Jan 02, 2006"), + ScanDate: analysis.Date.Format("Jan 02, 2006"), Summary: analysis.Summary(), Coverage: analysis.Coverage(), Unmanaged: analysis.Unmanaged(), diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index c53ee5f0..a1d561a9 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -27,6 +27,7 @@ func TestHTML_Write(t *testing.T) { goldenfile: "output_empty.html", analysis: func() *analyser.Analysis { a := &analyser.Analysis{} + a.Date = time.Date(2021, 06, 10, 0, 0, 0, 0, &time.Location{}) return a }, err: nil, @@ -36,6 +37,7 @@ func TestHTML_Write(t *testing.T) { goldenfile: "output_sync.html", analysis: func() *analyser.Analysis { a := &analyser.Analysis{} + a.Date = time.Date(2021, 06, 10, 0, 0, 0, 0, &time.Location{}) a.Duration = 72 * time.Second a.AddManaged( &testresource.FakeResource{ @@ -53,6 +55,7 @@ func TestHTML_Write(t *testing.T) { analysis: func() *analyser.Analysis { a := fakeAnalysisWithAlerts() + a.Date = time.Date(2021, 06, 10, 0, 0, 0, 0, &time.Location{}) a.Duration = 91 * time.Second a.AddDeleted( &testresource.FakeResource{ diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index ba320065..07ad79e0 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -320,7 +320,7 @@ h2 { Coverage 15%
-

Jun 08, 2021

+

Jun 10, 2021

Scan duration 1m31s
diff --git a/pkg/cmd/scan/output/testdata/output_empty.html b/pkg/cmd/scan/output/testdata/output_empty.html index dcfdf2e2..a6557b72 100644 --- a/pkg/cmd/scan/output/testdata/output_empty.html +++ b/pkg/cmd/scan/output/testdata/output_empty.html @@ -320,7 +320,7 @@ h2 { Coverage 0%
-

Jun 08, 2021

+

Jun 10, 2021

Scan duration 0s
diff --git a/pkg/cmd/scan/output/testdata/output_sync.html b/pkg/cmd/scan/output/testdata/output_sync.html index a0989829..f4f17d27 100644 --- a/pkg/cmd/scan/output/testdata/output_sync.html +++ b/pkg/cmd/scan/output/testdata/output_sync.html @@ -320,7 +320,7 @@ h2 { Coverage 100%
-

Jun 08, 2021

+

Jun 10, 2021

Scan duration 1m12s
diff --git a/pkg/driftctl.go b/pkg/driftctl.go index bc9cd64a..a45f2e9f 100644 --- a/pkg/driftctl.go +++ b/pkg/driftctl.go @@ -128,12 +128,13 @@ func (d DriftCTL) Run() (*analyser.Analysis, error) { driftIgnore := filter.NewDriftIgnore() analysis, err := d.analyzer.Analyze(remoteResources, resourcesFromState, driftIgnore) - analysis.Duration = time.Since(start) - if err != nil { return nil, err } + analysis.Duration = time.Since(start) + analysis.Date = time.Now() + return &analysis, nil } From 21747180d9ae7d2afb6aa98faca5ade1950e8427 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 10 Jun 2021 18:35:13 +0200 Subject: [PATCH 11/19] refactor: diffs custom style --- pkg/cmd/scan/output/assets/index.tmpl | 44 ++- pkg/cmd/scan/output/assets/style.css | 37 ++ pkg/cmd/scan/output/console.go | 2 +- pkg/cmd/scan/output/html.go | 21 ++ pkg/cmd/scan/output/html_test.go | 38 +- pkg/cmd/scan/output/testdata/output.html | 345 +++++++++++++++++- pkg/cmd/scan/output/testdata/output.txt | 4 +- .../testdata/output_computed_fields.txt | 4 +- .../scan/output/testdata/output_empty.html | 37 ++ pkg/cmd/scan/output/testdata/output_sync.html | 37 ++ 10 files changed, 536 insertions(+), 33 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index cbe884e8..bd6def12 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -87,14 +87,44 @@ Resource type
{{range $diff := .Differences}} -
- {{$diff.Res.TerraformId}} -
- {{range $change := $diff.Changelog}} -
{{ formatChange $change }}
- {{end}} +
+
+ {{$diff.Res.TerraformId}} + {{$diff.Res.TerraformType}} +
+
+
    + {{range $change := $diff.Changelog}} +
  1. + {{ range $index, $path := $change.Path }} +
    + {{/* Add indentation for each YAML field */}} + {{ repeatString " " $index }} + {{ if eq (isInt .) true }}-{{ else }} + {{ $path }}: + {{end}} + + {{/* If it's the last path key, display value difference */}} + {{ if eq (len $change.Path) (sum $index 1) }} + {{ if eq $change.Type "delete" }} + {{ prettify $change.From }} + {{end}} + + {{ if eq $change.Type "create" }} + {{ prettify $change.To }} + {{end}} + + {{ if eq $change.Type "update" }} + {{ prettify $change.From }} => {{ prettify $change.To }} + {{end}} +
    + {{ end }} + {{end}} +
  2. + {{end}} +
- {{$diff.Res.TerraformType}}
{{end}}
diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index a3f89e68..c45ba101 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -206,6 +206,10 @@ h2 { background-color: #f9f9f9; } +.resource-item.resource-item-changed:hover { + background-color: transparent; +} + .text--bold { font-weight: bold; } @@ -302,4 +306,37 @@ h2 { .empty-message-container { color: #747578; +} + +.code-box { + padding: 5px; + background: #f6f8fa; + color: #747578; + margin-top: 21px; + border-radius: 3px; +} + +.code-box ol { + list-style-type: none; +} + +.code-box .code-box-line { + padding: 8px; + border-radius: 2px; + margin: 10px; +} + +span.code-box-line-create { + background-color: #22863a1a; + color: #22863a; + padding: 3px; + border-radius: 3px; +} + +span.code-box-line-delete { + text-decoration: line-through; + background-color: #bf404a17; + color: #bf404a; + padding: 3px; + border-radius: 3px; } \ No newline at end of file diff --git a/pkg/cmd/scan/output/console.go b/pkg/cmd/scan/output/console.go index 870086f9..41f4a8a7 100644 --- a/pkg/cmd/scan/output/console.go +++ b/pkg/cmd/scan/output/console.go @@ -168,7 +168,7 @@ func (c Console) writeSummary(analysis *analyser.Analysis) { func prettify(resource interface{}) string { res := reflect.ValueOf(resource) if resource == nil || res.Kind() == reflect.Ptr && res.IsNil() { - return "" + return "" } return awsutil.Prettify(resource) diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 5d7f903a..1eb66def 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -6,6 +6,7 @@ import ( "html/template" "math" "os" + "strconv" "strings" "time" @@ -100,6 +101,26 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { } return math.Round(100 * float64(count) / float64(analysis.Summary().TotalResources)) }, + "isInt": func(str string) bool { + _, err := strconv.ParseInt(str, 10, 32) + if err != nil { + return false + } + return true + }, + "prettify": func(res interface{}) string { + return prettify(res) + }, + "sum": func(n ...int) int { + total := 0 + for _, v := range n { + total += v + } + return total + }, + "repeatString": func(s string, count int) template.HTML { + return template.HTML(strings.Repeat(s, count)) + }, } tmpl, err := template.New("main").Funcs(funcMap).Parse(string(tmplFile)) diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index a1d561a9..d6cc2215 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -90,15 +90,47 @@ func TestHTML_Write(t *testing.T) { }, ) a.AddDifference(analyser.Difference{Res: &testresource.FakeResource{ - Id: "diff-id-1", + Id: "diff-id-2", Type: "aws_diff_resource", }, Changelog: []analyser.Change{ { Change: diff.Change{ Type: diff.DELETE, - Path: []string{"path", "to", "field"}, + Path: []string{"path", "to", "fields", "0"}, + From: []string{"value"}, + To: nil, + }, + }, + { + Change: diff.Change{ + Type: diff.DELETE, + Path: []string{"path", "to", "fields", "1"}, + From: []string{"test"}, + To: nil, + }, + }, + { + Change: diff.Change{ + Type: diff.DELETE, + Path: []string{"group_id"}, + From: []string{"a071314398026"}, + To: nil, + }, + }, + { + Change: diff.Change{ + Type: diff.CREATE, + Path: []string{"Tags", "Name"}, From: nil, - To: []string{"value"}, + To: "aws-www-1-root", + }, + }, + { + Change: diff.Change{ + Type: diff.UPDATE, + Path: []string{"InstanceInitiatedShutdownBehavior"}, + From: "", + To: nil, }, }, }}) diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index 07ad79e0..e64e5f3f 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -214,6 +214,10 @@ h2 { background-color: #f9f9f9; } +.resource-item.resource-item-changed:hover { + background-color: transparent; +} + .text--bold { font-weight: bold; } @@ -310,6 +314,39 @@ h2 { .empty-message-container { color: #747578; +} + +.code-box { + padding: 5px; + background: #f6f8fa; + color: #747578; + margin-top: 21px; + border-radius: 3px; +} + +.code-box ol { + list-style-type: none; +} + +.code-box .code-box-line { + padding: 8px; + border-radius: 2px; + margin: 10px; +} + +span.code-box-line-create { + background-color: #22863a1a; + color: #22863a; + padding: 3px; + border-radius: 3px; +} + +span.code-box-line-delete { + text-decoration: line-through; + background-color: #bf404a17; + color: #bf404a; + padding: 3px; + border-radius: 3px; } @@ -415,28 +452,300 @@ h2 { Resource type
-
- diff-id-1 -
- -
~ updated.field: "foobar" => "barfoo"
- -
+ new.field: <nil> => "newValue"
- -
- a: "oldValue" => <nil>
- +
+
+ diff-id-1 + aws_diff_resource +
+
+
    + +
  1. + +
    + + + + updated: + + + + + +
    + +   + + field: + + + + + + + + + + "foobar" => "barfoo" + +
    + + +
  2. + +
  3. + +
    + + + + new: + + + + + +
    + +   + + field: + + + + + + + + "newValue" + + + +
    + + +
  4. + +
  5. + +
    + + + + a: + + + + + + "oldValue" + + + + + +
    + + +
  6. + +
- aws_diff_resource
-
- diff-id-1 -
- -
- path.to.field: <nil> => ["value"]
- +
+
+ diff-id-2 + aws_diff_resource +
+
+
    + +
  1. + +
    + + + + path: + + + + + +
    + +   + + to: + + + + + +
    + +    + + fields: + + + + + +
    + +     + - + + + + + ["value"] + + + + + +
    + + +
  2. + +
  3. + +
    + + + + path: + + + + + +
    + +   + + to: + + + + + +
    + +    + + fields: + + + + + +
    + +     + - + + + + + ["test"] + + + + + +
    + + +
  4. + +
  5. + +
    + + + + group_id: + + + + + + ["a071314398026"] + + + + + +
    + + +
  6. + +
  7. + +
    + + + + Tags: + + + + + +
    + +   + + Name: + + + + + + + + "aws-www-1-root" + + + +
    + + +
  8. + +
  9. + +
    + + + + InstanceInitiatedShutdownBehavior: + + + + + + + + + + "" => <null> + +
    + + +
  10. + +
- aws_diff_resource
diff --git a/pkg/cmd/scan/output/testdata/output.txt b/pkg/cmd/scan/output/testdata/output.txt index a56601c0..3f8eb409 100644 --- a/pkg/cmd/scan/output/testdata/output.txt +++ b/pkg/cmd/scan/output/testdata/output.txt @@ -16,8 +16,8 @@ Found resources not covered by IaC: Found changed resources: - diff-id-1 (aws_diff_resource): ~ updated.field: "foobar" => "barfoo" - + new.field: => "newValue" - - a: "oldValue" => + + new.field: => "newValue" + - a: "oldValue" => Found 10 resource(s) - 20% coverage - 2 covered by IaC diff --git a/pkg/cmd/scan/output/testdata/output_computed_fields.txt b/pkg/cmd/scan/output/testdata/output_computed_fields.txt index 458b8e4e..9d4033d8 100644 --- a/pkg/cmd/scan/output/testdata/output_computed_fields.txt +++ b/pkg/cmd/scan/output/testdata/output_computed_fields.txt @@ -1,8 +1,8 @@ Found changed resources: - diff-id-1 (aws_diff_resource): ~ updated.field: "foobar" => "barfoo" (computed) - + new.field: => "newValue" - - a: "oldValue" => (computed) + + new.field: => "newValue" + - a: "oldValue" => (computed) ~ struct.0.array.0: "foo" => "oof" (computed) ~ struct.0.string: "one" => "two" (computed) Found 1 resource(s) diff --git a/pkg/cmd/scan/output/testdata/output_empty.html b/pkg/cmd/scan/output/testdata/output_empty.html index a6557b72..39cb9b64 100644 --- a/pkg/cmd/scan/output/testdata/output_empty.html +++ b/pkg/cmd/scan/output/testdata/output_empty.html @@ -214,6 +214,10 @@ h2 { background-color: #f9f9f9; } +.resource-item.resource-item-changed:hover { + background-color: transparent; +} + .text--bold { font-weight: bold; } @@ -310,6 +314,39 @@ h2 { .empty-message-container { color: #747578; +} + +.code-box { + padding: 5px; + background: #f6f8fa; + color: #747578; + margin-top: 21px; + border-radius: 3px; +} + +.code-box ol { + list-style-type: none; +} + +.code-box .code-box-line { + padding: 8px; + border-radius: 2px; + margin: 10px; +} + +span.code-box-line-create { + background-color: #22863a1a; + color: #22863a; + padding: 3px; + border-radius: 3px; +} + +span.code-box-line-delete { + text-decoration: line-through; + background-color: #bf404a17; + color: #bf404a; + padding: 3px; + border-radius: 3px; } diff --git a/pkg/cmd/scan/output/testdata/output_sync.html b/pkg/cmd/scan/output/testdata/output_sync.html index f4f17d27..4408b5c2 100644 --- a/pkg/cmd/scan/output/testdata/output_sync.html +++ b/pkg/cmd/scan/output/testdata/output_sync.html @@ -214,6 +214,10 @@ h2 { background-color: #f9f9f9; } +.resource-item.resource-item-changed:hover { + background-color: transparent; +} + .text--bold { font-weight: bold; } @@ -310,6 +314,39 @@ h2 { .empty-message-container { color: #747578; +} + +.code-box { + padding: 5px; + background: #f6f8fa; + color: #747578; + margin-top: 21px; + border-radius: 3px; +} + +.code-box ol { + list-style-type: none; +} + +.code-box .code-box-line { + padding: 8px; + border-radius: 2px; + margin: 10px; +} + +span.code-box-line-create { + background-color: #22863a1a; + color: #22863a; + padding: 3px; + border-radius: 3px; +} + +span.code-box-line-delete { + text-decoration: line-through; + background-color: #bf404a17; + color: #bf404a; + padding: 3px; + border-radius: 3px; } From 3d12c9933e305f48b9ec54fa87f5782a33c25d31 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 10 Jun 2021 18:46:21 +0200 Subject: [PATCH 12/19] refactor: simplify code --- pkg/cmd/scan/output/html.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index 1eb66def..a28f2c42 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -103,10 +103,7 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { }, "isInt": func(str string) bool { _, err := strconv.ParseInt(str, 10, 32) - if err != nil { - return false - } - return true + return err == nil }, "prettify": func(res interface{}) string { return prettify(res) From bc2164a00865b8cfa4763b898564bfab50eb7eb2 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 11 Jun 2021 18:43:51 +0200 Subject: [PATCH 13/19] refactor: diff custom style --- pkg/cmd/scan/output/assets/index.tmpl | 44 ++- pkg/cmd/scan/output/assets/style.css | 3 +- pkg/cmd/scan/output/html.go | 101 ++++--- pkg/cmd/scan/output/html_test.go | 57 +++- pkg/cmd/scan/output/testdata/output.html | 263 ++---------------- .../scan/output/testdata/output_empty.html | 3 +- pkg/cmd/scan/output/testdata/output_sync.html | 3 +- 7 files changed, 156 insertions(+), 318 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index bd6def12..41816464 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -94,35 +94,27 @@
    - {{range $change := $diff.Changelog}} -
  1. - {{ range $index, $path := $change.Path }} -
    - {{/* Add indentation for each YAML field */}} - {{ repeatString " " $index }} - {{ if eq (isInt .) true }}-{{ else }} - {{ $path }}: - {{end}} +
    {{ jsonDiff $diff.Changelog }}
    +{{/* {{range $change := $diff.Changelog}}*/}} +{{/*
  2. */}} +{{/* */}}{{/* Add indentation for each YAML field */}} +{{/* {{ prettifyPaths $change.Path }}*/}} - {{/* If it's the last path key, display value difference */}} - {{ if eq (len $change.Path) (sum $index 1) }} - {{ if eq $change.Type "delete" }} - {{ prettify $change.From }} - {{end}} +{{/* */}}{{/* If it's the last path key, display value difference */}} +{{/* {{ if eq $change.Type "delete" }}*/}} +{{/* {{ prettify $change.From }}*/}} +{{/* {{end}}*/}} - {{ if eq $change.Type "create" }} - {{ prettify $change.To }} - {{end}} +{{/* {{ if eq $change.Type "create" }}*/}} +{{/* {{ prettify $change.To }}*/}} +{{/* {{end}}*/}} - {{ if eq $change.Type "update" }} - {{ prettify $change.From }} => {{ prettify $change.To }} - {{end}} -
- {{ end }} - {{end}} - - {{end}} +{{/* {{ if eq $change.Type "update" }}*/}} +{{/* {{ prettify $change.From }} => {{ prettify $change.To }}*/}} +{{/* {{end}}*/}} +{{/* */}} +{{/* {{end}}*/}}
diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index c45ba101..cb948ebc 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -321,9 +321,8 @@ h2 { } .code-box .code-box-line { - padding: 8px; - border-radius: 2px; margin: 10px; + line-height: 30px; } span.code-box-line-create { diff --git a/pkg/cmd/scan/output/html.go b/pkg/cmd/scan/output/html.go index a28f2c42..11aca4f0 100644 --- a/pkg/cmd/scan/output/html.go +++ b/pkg/cmd/scan/output/html.go @@ -1,6 +1,7 @@ package output import ( + "bytes" "embed" "fmt" "html/template" @@ -76,47 +77,53 @@ func (c *HTML) Write(analysis *analyser.Analysis) error { return distinctResourceTypes(resources) }, - "formatChange": func(ch analyser.Change) string { - prefix := "" - suffix := "" - - switch ch.Type { - case diff.CREATE: - prefix = "+" - case diff.UPDATE: - prefix = "~" - case diff.DELETE: - prefix = "-" - } - - if ch.Computed { - suffix = "(computed)" - } - - return fmt.Sprintf("%s %s: %s => %s %s", prefix, strings.Join(ch.Path, "."), prettify(ch.From), prettify(ch.To), suffix) - }, "rate": func(count int) float64 { if analysis.Summary().TotalResources == 0 { return 0 } return math.Round(100 * float64(count) / float64(analysis.Summary().TotalResources)) }, - "isInt": func(str string) bool { - _, err := strconv.ParseInt(str, 10, 32) - return err == nil - }, - "prettify": func(res interface{}) string { - return prettify(res) - }, - "sum": func(n ...int) int { - total := 0 - for _, v := range n { - total += v + //"prettify": func(res interface{}) string { + // return prettify(res) + //}, + //"prettifyPaths": func(paths []string) template.HTML { + // return template.HTML(prettifyPaths(paths)) + //}, + "jsonDiff": func(ch analyser.Changelog) template.HTML { + var buf bytes.Buffer + + whiteSpace := " " + for _, change := range ch { + for i, v := range change.Path { + if _, err := strconv.Atoi(v); err == nil { + change.Path[i] = fmt.Sprintf("[%s]", v) + } + } + path := strings.Join(change.Path, ".") + + switch change.Type { + case diff.CREATE: + pref := fmt.Sprintf("%s %s:", "+", path) + _, _ = fmt.Fprintf(&buf, "%s%s %s", whiteSpace, pref, prettify(change.To)) + case diff.DELETE: + pref := fmt.Sprintf("%s %s:", "-", path) + _, _ = fmt.Fprintf(&buf, "%s%s %s", whiteSpace, pref, prettify(change.From)) + case diff.UPDATE: + prefix := fmt.Sprintf("%s %s:", "~", path) + if change.JsonString { + _, _ = fmt.Fprintf(&buf, "%s%s
%s%s
", whiteSpace, prefix, whiteSpace, jsonDiff(change.From, change.To, whiteSpace)) + continue + } + _, _ = fmt.Fprintf(&buf, "%s%s %s => %s", whiteSpace, prefix, prettify(change.From), prettify(change.To)) + } + + if change.Computed { + _, _ = fmt.Fprintf(&buf, " %s", "(computed)") + } + _, _ = fmt.Fprintf(&buf, "
") } - return total - }, - "repeatString": func(s string, count int) template.HTML { - return template.HTML(strings.Repeat(s, count)) + + return template.HTML(buf.String()) }, } @@ -163,3 +170,29 @@ func distinctResourceTypes(resources []resource.Resource) []string { return types } + +func prettifyPaths(paths []string) string { + content := "" + for i, v := range paths { + var isArrayKey bool + + // If the previous path is an integer, it means the current path is part of an array + if j := i - 1; j >= 0 && len(paths) >= j { + _, err := strconv.Atoi(paths[j]) + isArrayKey = err == nil + } + + if i > 0 && !isArrayKey { + content += "
" + content += strings.Repeat(" ", i) + } + + if _, err := strconv.Atoi(v); err == nil { + content += "- " + } else { + content += fmt.Sprintf("%s:", v) + } + } + + return content +} diff --git a/pkg/cmd/scan/output/html_test.go b/pkg/cmd/scan/output/html_test.go index d6cc2215..cabbd176 100644 --- a/pkg/cmd/scan/output/html_test.go +++ b/pkg/cmd/scan/output/html_test.go @@ -97,32 +97,40 @@ func TestHTML_Write(t *testing.T) { Change: diff.Change{ Type: diff.DELETE, Path: []string{"path", "to", "fields", "0"}, - From: []string{"value"}, + From: "value", To: nil, }, }, { Change: diff.Change{ - Type: diff.DELETE, + Type: diff.UPDATE, Path: []string{"path", "to", "fields", "1"}, - From: []string{"test"}, - To: nil, + From: 12, + To: "12", }, }, { Change: diff.Change{ Type: diff.DELETE, - Path: []string{"group_id"}, + Path: []string{"group_ids"}, From: []string{"a071314398026"}, To: nil, }, }, + { + Change: diff.Change{ + Type: diff.UPDATE, + Path: []string{"Policies", "0"}, + From: testresource.FakeResource{}, + To: testresource.FakeResource{Id: "093cd6ba-cf6d-4800-b252-6a50ca8903cd", Type: "aws_iam_policy"}, + }, + }, { Change: diff.Change{ Type: diff.CREATE, - Path: []string{"Tags", "Name"}, + Path: []string{"Tags", "0", "Name"}, From: nil, - To: "aws-www-1-root", + To: "test", }, }, { @@ -224,3 +232,38 @@ func TestHTML_DistinctResourceTypes(t *testing.T) { }) } } + +func TestHTML_PrettifyPaths(t *testing.T) { + tests := []struct { + name string + paths []string + expected string + }{ + { + name: "test simple object", + paths: []string{"path", "to", "field"}, + expected: "path:
 to:
  field:", + }, + { + name: "test object with array of string", + paths: []string{"properties", "tags", "0"}, + expected: "properties:
 tags:
  - ", + }, + { + name: "test object with array of objects", + paths: []string{"path", "to", "0", "field"}, + expected: "path:
 to:
  - field:", + }, + { + name: "test with simple array", + paths: []string{"0", "field"}, + expected: "- field:", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := prettifyPaths(tt.paths) + assert.Equal(t, tt.expected, got) + }) + } +} diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index e64e5f3f..cb12810c 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -329,9 +329,8 @@ h2 { } .code-box .code-box-line { - padding: 8px; - border-radius: 2px; margin: 10px; + line-height: 30px; } span.code-box-line-create { @@ -459,97 +458,27 @@ span.code-box-line-delete {
    - -
  1. - -
    - - - - updated: - +
     ~ updated.field: "foobar" => "barfoo"
     + new.field: "newValue"
     - a: "oldValue"
    + + + + + + + + + - - - -
    - -   - - field: - - - - - - - "foobar" => "barfoo" - -
    - - -
  2. - -
  3. - -
    - - - - new: - - - - -
    - -   - - field: - - - - - - "newValue" - - -
    - - -
  4. - -
  5. - -
    - - - - a: - - - - - "oldValue" - - - -
    - - -
  6. -
@@ -561,189 +490,33 @@ span.code-box-line-delete {
    - -
  1. - -
    - - - - path: - +
     - path.to.fields.[0]: "value"
     ~ path.to.fields.[1]: 12 => "12"
     - group_ids: ["a071314398026"]
     ~ Policies.[0]: { + Id: "", + Type: "" +} => { + Id: "093cd6ba-cf6d-4800-b252-6a50ca8903cd", + Type: "aws_iam_policy" +}
     + Tags.[0].Name: "test"
     ~ InstanceInitiatedShutdownBehavior: "" =>
    - - - -
    - -   - - to: - - - - -
    - -    - - fields: - - - - -
    - -     - - - - - - ["value"] - - - -
    - - -
  2. - -
  3. - -
    - - - - path: - - - - -
    - -   - - to: - - - - -
    - -    - - fields: - - - - -
    - -     - - - - - - ["test"] - - - -
    - - -
  4. - -
  5. - -
    - - - - group_id: - - - - - ["a071314398026"] - - - -
    - - -
  6. - -
  7. - -
    - - - - Tags: - - - - -
    - -   - - Name: - - - - - - "aws-www-1-root" - - -
    - - -
  8. - -
  9. - -
    - - - - InstanceInitiatedShutdownBehavior: - - - - - - - - - "" => <null> - -
    - - -
  10. -
diff --git a/pkg/cmd/scan/output/testdata/output_empty.html b/pkg/cmd/scan/output/testdata/output_empty.html index 39cb9b64..20aa468b 100644 --- a/pkg/cmd/scan/output/testdata/output_empty.html +++ b/pkg/cmd/scan/output/testdata/output_empty.html @@ -329,9 +329,8 @@ h2 { } .code-box .code-box-line { - padding: 8px; - border-radius: 2px; margin: 10px; + line-height: 30px; } span.code-box-line-create { diff --git a/pkg/cmd/scan/output/testdata/output_sync.html b/pkg/cmd/scan/output/testdata/output_sync.html index 4408b5c2..76d03c78 100644 --- a/pkg/cmd/scan/output/testdata/output_sync.html +++ b/pkg/cmd/scan/output/testdata/output_sync.html @@ -329,9 +329,8 @@ h2 { } .code-box .code-box-line { - padding: 8px; - border-radius: 2px; margin: 10px; + line-height: 30px; } span.code-box-line-create { From 5fa7c1029602aed24f12b0407ddedaebe4b69b4c Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 14 Jun 2021 16:38:54 +0200 Subject: [PATCH 14/19] fix: console output --- pkg/cmd/scan/output/assets/index.tmpl | 8 ++++---- pkg/cmd/scan/output/assets/style.css | 1 + pkg/cmd/scan/output/output.go | 4 ++-- pkg/cmd/scan/output/testdata/output.html | 8 ++++---- pkg/cmd/scan/output/testdata/output_empty.html | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 41816464..d1b026ca 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -1,7 +1,7 @@ - Driftctl scan report + driftctl scan report
-

Driftctl scan report

+

driftctl scan report

Coverage {{.Coverage}}%
@@ -30,7 +30,7 @@
{{ if (lt .Coverage 100) }}
-
+
- +
diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index cb948ebc..0d1351fc 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -255,6 +255,7 @@ h2 { color: #747578; transition: background-color 200ms; border-radius: 3px; + font-size: 19px; } .tab:hover { diff --git a/pkg/cmd/scan/output/output.go b/pkg/cmd/scan/output/output.go index 2b8a50cf..dd44b30f 100644 --- a/pkg/cmd/scan/output/output.go +++ b/pkg/cmd/scan/output/output.go @@ -55,10 +55,10 @@ func GetOutput(config OutputConfig, quiet bool) Output { switch config.Key { case JSONOutputType: return NewJSON(config.Options["path"]) - case ConsoleOutputType: - fallthrough case HTMLOutputType: return NewHTML(config.Options["path"]) + case ConsoleOutputType: + fallthrough default: return NewConsole() } diff --git a/pkg/cmd/scan/output/testdata/output.html b/pkg/cmd/scan/output/testdata/output.html index cb12810c..da85893b 100644 --- a/pkg/cmd/scan/output/testdata/output.html +++ b/pkg/cmd/scan/output/testdata/output.html @@ -1,7 +1,7 @@ - Driftctl scan report + driftctl scan report
-

Driftctl scan report

+

driftctl scan report

Coverage 15%
@@ -370,7 +370,7 @@ span.code-box-line-delete {
-
+
- +
diff --git a/pkg/cmd/scan/output/testdata/output_empty.html b/pkg/cmd/scan/output/testdata/output_empty.html index 20aa468b..89f03b4f 100644 --- a/pkg/cmd/scan/output/testdata/output_empty.html +++ b/pkg/cmd/scan/output/testdata/output_empty.html @@ -370,14 +370,14 @@ span.code-box-line-delete {
-
+
- +
From 7a60e69efb30f7b172796dbad9a1bdc30e5054a8 Mon Sep 17 00:00:00 2001 From: William Beuil Date: Thu, 17 Jun 2021 14:01:39 +0200 Subject: [PATCH 15/19] Refactor output HTML with a11y and responsive in mind --- pkg/cmd/scan/output/assets/index.tmpl | 480 +++++++++++++++---------- pkg/cmd/scan/output/assets/style.css | 487 +++++++++++++------------- 2 files changed, 535 insertions(+), 432 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index d1b026ca..4473c91e 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -1,249 +1,367 @@ - + - driftctl scan report + driftctl Scan Report - +
-
+
+
-

driftctl scan report

- Coverage {{.Coverage}}% +

Scan Report

+

{{ .ScanDate }}

+

Scan Duration: {{.ScanDuration}}

-
-

{{ .ScanDate }}

- Scan duration {{.ScanDuration}} +
+
+
+ Total Resources: + {{.Summary.TotalResources}}
-
-
- Total resources: {{.Summary.TotalResources}} - Managed: {{rate .Summary.TotalManaged}}% - Changed: {{.Summary.TotalDrifted}}/{{.Summary.TotalManaged}} - Unmanaged: {{rate .Summary.TotalUnmanaged}}% - Missing: {{rate .Summary.TotalDeleted}}% -
-
+
+ Coverage: + {{.Coverage}}% +
+
+ Managed: + {{rate .Summary.TotalManaged}}% + {{.Summary.TotalManaged}}/{{.Summary.TotalResources}} +
+
+ Unmanaged: + {{rate .Summary.TotalUnmanaged}}% + {{.Summary.TotalUnmanaged}}/{{.Summary.TotalResources}} +
+
+ Missing: + {{rate .Summary.TotalDeleted}}% + {{.Summary.TotalDeleted}}/{{.Summary.TotalResources}} +
+ +
{{ if (lt .Coverage 100) }} -
-
- - - -
-
+
+ + + + + +
- - - - -
- {{ if (gt (len .Unmanaged) 0) }} - +
+ {{if (gt (len .Unmanaged) 0)}} + {{end}} - {{ if (gt (len .Differences) 0) }} - + {{if (gt (len .Differences) 0)}} + {{end}} - {{ if (gt (len .Deleted) 0) }} - + {{if (gt (len .Deleted) 0)}} + {{end}} - {{ if (gt (len .Alerts) 0) }} - + {{if (gt (len .Alerts) 0)}} + {{end}}
{{ if (gt (len .Unmanaged) 0) }} -
-
- Resource id - Resource type +
+ + + + + + + + + {{range $res := .Unmanaged}} + + + + + {{end}} + +
Resource IDResource Type
{{$res.TerraformId}}{{$res.TerraformType}}
+ - {{range $res := .Unmanaged}} -
- {{$res.TerraformId}} - {{$res.TerraformType}} -
- {{end}}
{{end}} {{ if (gt (len .Differences) 0) }} -
-
- Resource id - Resource type -
- {{range $diff := .Differences}} -
-
- {{$diff.Res.TerraformId}} - {{$diff.Res.TerraformType}} +
- - + + diff --git a/pkg/cmd/scan/output/assets/style.css b/pkg/cmd/scan/output/assets/style.css index 0d1351fc..5c3f68f6 100644 --- a/pkg/cmd/scan/output/assets/style.css +++ b/pkg/cmd/scan/output/assets/style.css @@ -1,275 +1,288 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; +html,body,div,span,h1,h2,p,pre,a,code,img,ul,li,form,label,table,tbody,thead,tr,th,td,header,section,button { border: 0; font: inherit; + margin: 0; + padding: 0; vertical-align: baseline; } -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} - body { - line-height: 1; + background-color: #f7f7f9; + color: #1c1e21; + font-family: Helvetica, sans-serif; + padding-bottom: 50px; } -ol, ul { - list-style: none; +form { + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + margin-bottom: 20px; } -blockquote, q { - quotes: none; +h1 { + font-size: 24px; + font-weight: 700; + margin-bottom: 5px; } -blockquote:before, blockquote:after, -q:before, q:after { - content: none; +h2 { + font-size: 20px; + font-weight: 700; + margin-bottom: 5px; +} + +header { + align-items: center; + display: flex; + flex-direction: row; + height: 130px; + justify-content: center; +} + +img { + margin-right: 20px; +} + +input::placeholder { + color: #ccc; + opacity: 1; +} + +main { + background-color: #fff; + border-top: 3px solid #71b2c3; + box-shadow: 0 0 5px #0000000a; + padding: 25px; +} + +section { + background: #fff; + border-radius: 3px; + box-shadow: 0 0 5px #0000000a; + color: #747578; + display: flex; + flex-direction: column; + font-size: 15px; + margin-bottom: 20px; + padding: 15px; +} + +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0Ljk1IDEwIj48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2ZmZjt9LmNscy0ye2ZpbGw6IzQ0NDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPmFycm93czwvdGl0bGU+PHJlY3QgY2xhc3M9ImNscy0xIiB3aWR0aD0iNC45NSIgaGVpZ2h0PSIxMCIvPjxwb2x5Z29uIGNsYXNzPSJjbHMtMiIgcG9pbnRzPSIxLjQxIDQuNjcgMi40OCAzLjE4IDMuNTQgNC42NyAxLjQxIDQuNjciLz48cG9seWdvbiBjbGFzcz0iY2xzLTIiIHBvaW50cz0iMy41NCA1LjMzIDIuNDggNi44MiAxLjQxIDUuMzMgMy41NCA1LjMzIi8+PC9zdmc+) no-repeat 97% 50%; } table { border-collapse: collapse; border-spacing: 0; + width: 100%; } -/* - * Custom style - */ -:root { - --transitionDuration: 400ms; +tbody,ul,.table-body { + border-left: 1px solid #ececec; + border-right: 1px solid #ececec; + border-top: 1px solid #ececec; } -body { - font-family: "Helvetica", sans-serif; - color: #1C1E21; - background-color: #F7F7F9; - padding-bottom: 50px; +ul { + list-style: none; } -div.container { - max-width: 100%; - width: 1280px; - margin: auto; +[role="tab"] { + background: transparent; + border-radius: 3px; + color: #747578; + cursor: pointer; + display: inline-block; + font-size: 16px; + margin: 4px; + padding: 10px 20px; } -.heading { - height: 130px; +[role="tab"]:hover { + background-color: #f9f9f9; } -.hide { - display: none !important; +[role="tab"][aria-selected="true"] { + background: #71b2c3; + color: #fff; } -.d-flex { +[role="tablist"] { + display: flex; + flex-direction: column; +} + +[role="tabpanel"] { + -webkit-animation: fadein .8s; + animation: fadein .8s; + width: 100%; +} + +[role="tabpanel"].is-hidden { + opacity: 0; +} + +input[type="reset"] { + background-color: transparent; + border: none; + color: #5faabd; + cursor: pointer; + font-size: 14px; + height: 34px; + margin: 5px; + width: 100px; +} + +input[type="search"],select { + border: 1px solid #ececec; + border-radius: 3px; + color: #6e7071; + font-size: 14px; + height: 36px; + margin: 5px; + max-width: 300px; + padding: 8px; + width: 100%; +} + +.card { + align-items: center; display: flex; flex-direction: row; -} - -.justify-center { justify-content: center; + margin: 5px 0; } -.justify-space-around { - justify-content: space-around; -} - -.justify-space-between { - justify-content: space-between; -} - -.align-center { - align-items: center; -} - -.mt-5 { - margin-top: 50px; -} - -.mb-5 { - margin-bottom: 50px; -} - -.mt-2 { +.code-box { + background: #eee; + border-radius: 3px; + color: #747578; + display: flex; margin-top: 20px; } -.mb-2 { - margin-bottom: 20px; -} - -.mt-1 { - margin-top: 10px; -} - -.mb-1 { - margin-bottom: 10px; -} - -.pa-1 { +.code-box-line { + line-height: 30px; + overflow-x: auto; padding: 10px; + width: 100%; } -.pl-1 { - padding-left: 10px; -} - -.pr-1 { - padding-right: 10px; -} - -.pt-1 { - padding-top: 10px; -} - -.pb-1 { - padding-bottom: 10px; -} - -input[type="text"], -select { - padding: 8px; - font-size: 14px; - border: 1px solid #ececec; - outline: none; - transition: var(--transitionDuration); - color: #6e7071; -} - -input[type="text"]:focus, -select:focus { - border: 1px solid #71b2c3; -} - -input[name="resource-id-filter"], select[name="resource-type-filter"] { - width: 300px; +.code-box-line-create { + background-color: #22863a1a; border-radius: 3px; + color: #22863a; + padding: 3px; } -h1 { - font-size: 24px; - font-weight: bold; +.code-box-line-delete { + background-color: #bf404a17; + border-radius: 3px; + color: #bf404a; + padding: 3px; + text-decoration: line-through; } -h2 { +.congrats { + color: #4d9221; + text-align: center; + margin: 50px 0; +} + +.container { + margin: auto; + max-width: 100%; + width: 1280px; +} + +.empty-panel { + color: #747578; + display: flex; + flex-direction: row; font-size: 20px; - font-weight: bold; -} - -.heading-title { - display: block; -} - -.heading-subtitle { - font-size: 14px; - display: block; -} - -.app-content { + font-weight: 600; + justify-content: center; padding: 25px; - border-top: 3px solid #71B2C3; - background-color: #ffffff; - box-shadow: 0 0 5px #0000000a; +} + +.fraction { + background: #e8e8e8; + border-radius: 3px; + color: #555; + font-size: 12px; + margin-left: 5px; + padding: 4px 5px; +} + +.panels { + padding: 10px; + width: 100%; } .resource-item { - border-top: 1px solid #ececec; - border-left: 1px solid #ececec; - border-right: 1px solid #ececec; - padding: 15px; + border-bottom: 1px solid #ececec; color: #6e7071; font-size: 14px; -} - -.resource-item:last-child { - border-bottom: 1px solid #ececec; + padding: 15px; } .resource-item:hover { background-color: #f9f9f9; } -.resource-item.resource-item-changed:hover { - background-color: transparent; +.row { + display: flex; + flex-direction: row; + justify-content: space-between; } -.text--bold { - font-weight: bold; +.strong { + color: #333; + font-weight: 700; + margin-left: 5px; } -.text--grey { +.table-header { color: #747578; + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 10px; } -.text--right { - text-align: right; -} - -.card { - padding: 15px; - font-size: 15px; - background: #ffffff; - box-shadow: 0 0 5px #0000000a; - border-radius: 3px; -} - -.reset-filter-btn { - border: none; - padding: 8px; - font-size: 14px; - background-color: transparent; - color: #5faabd; - cursor: pointer; -} - -/* tabs style */ .tabs-wrapper { + align-items: center; display: flex; flex-direction: column; - align-items: center; } -.tab { - cursor: pointer; - padding: 10px 20px; - margin: 0 2px; - background: transparent; - display: inline-block; - color: #747578; - transition: background-color 200ms; - border-radius: 3px; - font-size: 19px; +.visuallyhidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } -.tab:hover { - background-color: #f9f9f9; -} - -.panels { - width: 100%; - padding: 20px; -} - -.panel { +.is-hidden { display: none; - animation: fadein .8s; +} + +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } } @keyframes fadein { @@ -281,62 +294,34 @@ h2 { } } -.panel-title { - font-size: 1.5em; - font-weight: bold -} +@media (min-width: 768px) { + form { + flex-direction: row; + } -.radio { - display: none; -} + header { + padding: 0 50px; + justify-content: flex-start; + } -#one:checked ~ .panels #one-panel, -#two:checked ~ .panels #two-panel, -#three:checked ~ .panels #three-panel, -#four:checked ~ .panels #four-panel { - display: block -} + section { + flex-direction: row; + justify-content: space-around; + } -#one:checked ~ .tabs #one-tab, -#two:checked ~ .tabs #two-tab, -#three:checked ~ .tabs #three-tab, -#four:checked ~ .tabs #four-tab { - background: #71b2c3; - color: #ffffff; -} + [role="tab"] { + font-size: 18px; + } -.empty-message-container { - color: #747578; -} + [role="tablist"] { + flex-direction: row; + } -.code-box { - padding: 5px; - background: #f6f8fa; - color: #747578; - margin-top: 21px; - border-radius: 3px; -} + .card { + margin: 0; + } -.code-box ol { - list-style-type: none; + .panels { + padding: 20px; + } } - -.code-box .code-box-line { - margin: 10px; - line-height: 30px; -} - -span.code-box-line-create { - background-color: #22863a1a; - color: #22863a; - padding: 3px; - border-radius: 3px; -} - -span.code-box-line-delete { - text-decoration: line-through; - background-color: #bf404a17; - color: #bf404a; - padding: 3px; - border-radius: 3px; -} \ No newline at end of file From ead85d5f84465504a08ffea54830d9e9a8aa0ca2 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 17 Jun 2021 16:43:39 +0200 Subject: [PATCH 16/19] chore: fix lint errors --- pkg/cmd/scan/output/assets/index.tmpl | 68 +++++++++++++++------------ pkg/cmd/scan/output/assets/style.css | 6 +-- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/pkg/cmd/scan/output/assets/index.tmpl b/pkg/cmd/scan/output/assets/index.tmpl index 4473c91e..65476479 100644 --- a/pkg/cmd/scan/output/assets/index.tmpl +++ b/pkg/cmd/scan/output/assets/index.tmpl @@ -4,13 +4,15 @@ driftctl Scan Report - +
- + driftctl logo

Scan Report

{{ .ScanDate }}

@@ -65,17 +67,20 @@ {{end}} {{if (gt (len .Differences) 0)}} - {{end}} {{if (gt (len .Deleted) 0)}} - {{end}} {{if (gt (len .Alerts) 0)}} - {{end}} @@ -85,18 +90,18 @@
- - - - + + + + - {{range $res := .Unmanaged}} - - - - - {{end}} + {{range $res := .Unmanaged}} + + + + + {{end}}
Resource IDResource Type
Resource IDResource Type
{{$res.TerraformId}}{{$res.TerraformType}}
{{$res.TerraformId}}{{$res.TerraformType}}