From 74b73cafc11a46b552d3d799b29a7867cf43289e Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Thu, 5 Dec 2024 06:20:50 +0100 Subject: [PATCH] The current chart with katenarry 3.0.0-rc2 --- chart/Chart.yaml | 18 + chart/README.md | 39 +++ chart/templates/NOTES.txt | 41 +++ chart/templates/_helpers.tpl | 36 ++ chart/templates/server/deployment.yaml | 52 +++ chart/templates/server/ingress.yaml | 37 ++ chart/templates/server/service.yaml | 19 + .../server/statics/dist/configmap.yaml | 327 ++++++++++++++++++ chart/values.yaml | 78 +++++ 9 files changed, 647 insertions(+) create mode 100644 chart/Chart.yaml create mode 100644 chart/README.md create mode 100644 chart/templates/NOTES.txt create mode 100644 chart/templates/_helpers.tpl create mode 100644 chart/templates/server/deployment.yaml create mode 100644 chart/templates/server/ingress.yaml create mode 100644 chart/templates/server/service.yaml create mode 100644 chart/templates/server/statics/dist/configmap.yaml create mode 100644 chart/values.yaml diff --git a/chart/Chart.yaml b/chart/Chart.yaml new file mode 100644 index 0000000..2d66827 --- /dev/null +++ b/chart/Chart.yaml @@ -0,0 +1,18 @@ +# This is the main values.yaml file for the website chart. +# More information can be found in the chart's README.md file. +# +# generated at: 2024-12-04T10:05:52+01:00 +# compose files: compose.katenary.yaml, compose.yaml +# compose hash (sha1): 07a6c3341d6d1030ebf49ee3a618c3296c87ae32 + +# Name of the chart (required), basically the name of the project. +name: website +apiVersion: v2 + +# Version of the chart (required) +version: 0.1.0 + +# Version of the application (required). +# This should be the main application version. +appVersion: 0.1.0 +description: A Helm chart for website diff --git a/chart/README.md b/chart/README.md new file mode 100644 index 0000000..bf43b14 --- /dev/null +++ b/chart/README.md @@ -0,0 +1,39 @@ +# website + +A Helm chart for website + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```bash +# Standard Helm install +$ helm install my-release website + +# To use a custom namespace and force the creation of the namespace +$ helm install my-release --namespace my-namespace --create-namespace website + +# To use a custom values file +$ helm install my-release -f my-values.yaml website +``` + +See the [Helm documentation](https://helm.sh/docs/intro/using_helm/) for more information on installing and managing the chart. + +## Configuration + +The following table lists the configurable parameters of the website chart and their default values. + +| Parameter | Default | +| ---------------------------- | ----------------- | +| `server.imagePullPolicy` | `IfNotPresent` | +| `server.ingress.class` | `-` | +| `server.ingress.enabled` | `false` | +| `server.ingress.host` | `katenary.org` | +| `server.ingress.path` | `/` | +| `server.ingress.tls.enabled` | `true` | +| `server.replicas` | `1` | +| `server.repository.image` | `docker.io/nginx` | +| `server.repository.tag` | `` | +| `server.serviceAccount` | `` | + + diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt new file mode 100644 index 0000000..9fca6cf --- /dev/null +++ b/chart/templates/NOTES.txt @@ -0,0 +1,41 @@ +Thanks to have installed {{ .Chart.Name }} {{ .Chart.Version }} as {{ .Release.Name }} ({{.Chart.AppVersion }}). + +# Get release information + +To learn more about the release, try: + + $ helm -n {{ .Release.Namespace }} status {{ .Release.Name }} + $ helm -n {{ .Release.Namespace }} get values {{ .Release.Name }} + $ helm -n {{ .Release.Namespace }} get all {{ .Release.Name }} + +# To delete the release + +Use helm uninstall command to delete the release. + + $ helm -n {{ .Release.Namespace }} uninstall {{ .Release.Name }} + +Note that some resources may still be in use after a release is deleted. For exemple, PersistentVolumeClaims are not deleted by default for some storage classes or if some annotations are set. + +# More information + +You can see this notes again by running: + + $ helm -n {{ .Release.Namespace }} get notes {{ .Release.Name }} + +{{- $count := 0 -}} +{{- $listOfURL := "" -}} +{{- if and .Values.server.ingress .Values.server.ingress.enabled }} +{{- $count = add1 $count -}}{{- $listOfURL = printf "%s\n- http://%s" $listOfURL (tpl .Values.server.ingress.host .) -}} +{{- end }} +{{- if gt $count 0 }} + +# List of activated ingresses URL: +{{ $listOfURL }} + +You can get these urls with kubectl: + + kubeclt get ingress -n {{ .Release.Namespace }} + +{{- end }} + +Thanks for using Helm! diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl new file mode 100644 index 0000000..9eecfc2 --- /dev/null +++ b/chart/templates/_helpers.tpl @@ -0,0 +1,36 @@ +{{- define "website.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "website.name" -}} +{{- if .Values.nameOverride -}} +{{- .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{- define "website.labels" -}} +{{ include "website.selectorLabels" .}} +{{ if .Chart.Version -}} +{{ printf "katenary.v3/chart-version: '%s'" .Chart.Version }} +{{- end }} +{{ if .Chart.AppVersion -}} +{{ printf "katenary.v3/app-version: '%s'" .Chart.AppVersion }} +{{- end }} +{{- end -}} + +{{- define "website.selectorLabels" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{ printf "katenary.v3/name: %s" $name }} +{{ printf "katenary.v3/instance: %s" .Release.Name }} +{{- end -}} diff --git a/chart/templates/server/deployment.yaml b/chart/templates/server/deployment.yaml new file mode 100644 index 0000000..4799004 --- /dev/null +++ b/chart/templates/server/deployment.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + katenary.v3/compose-hash: 07a6c3341d6d1030ebf49ee3a618c3296c87ae32 + katenary.v3/version: develop-628b35d + labels: + {{- include "website.labels" . | nindent 4 }} + katenary.v3/component: server + name: '{{ include "website.fullname" . }}-server' +spec: + replicas: {{ .Values.server.replicas }} + selector: + matchLabels: + {{- include "website.selectorLabels" . | nindent 6 }} + katenary.v3/component: server + strategy: {} + template: + metadata: + labels: + {{- include "website.selectorLabels" . | nindent 8 }} + katenary.v3/component: server + spec: + containers: + - image: '{{ tpl .Values.server.repository.image $ }}:{{ tpl .Values.server.repository.tag $ | default "latest" }}' + imagePullPolicy: {{ .Values.server.imagePullPolicy }} + name: server + ports: + - containerPort: 80 + name: http + {{- if .Values.server.resources }} + resources: + {{ .Values.server.resources | toYaml | nindent 10 }} + {{- end }} + volumeMounts: + - mountPath: /usr/share/nginx/html + name: dist + {{- if .Values.pullSecrets }} + imagePullSecrets: + {{- .Values.pullSecrets | toYaml | nindent 6 }} + {{- end }} + {{- if .Values.server.nodeSelector }} + nodeSelector: + {{- .Values.server.nodeSelector | toYaml | nindent 8 }} + {{- end }} + {{- if ne .Values.server.serviceAccount "" }} + serviceAccountName: {{ .Values.server.serviceAccount | quote }} + {{- end }} + volumes: + - configMap: + name: '{{ include "website.fullname" . }}-server-dist' + name: dist diff --git a/chart/templates/server/ingress.yaml b/chart/templates/server/ingress.yaml new file mode 100644 index 0000000..e7cc57e --- /dev/null +++ b/chart/templates/server/ingress.yaml @@ -0,0 +1,37 @@ +{{- if .Values.server.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + katenary.v3/compose-hash: 07a6c3341d6d1030ebf49ee3a618c3296c87ae32 + katenary.v3/version: develop-628b35d + {{- if .Values.server.ingress.annotations -}} + {{- toYaml .Values.server.ingress.annotations | nindent 4 }} + {{- end }} + labels: + {{- include "website.labels" . | nindent 4 }} + katenary.v3/component: server + name: '{{ include "website.fullname" . }}-server' +spec: + {{- if ne .Values.server.ingress.class "-" }} + ingressClassName: '{{ tpl .Values.server.ingress.class $ }}' + {{- end }} + rules: + - host: '{{ tpl .Values.server.ingress.host $ }}' + http: + paths: + - backend: + service: + name: '{{ include "website.fullname" . }}-server' + port: + name: http + path: '{{ tpl .Values.server.ingress.path $ }}' + pathType: ImplementationSpecific + {{- if .Values.server.ingress.tls.enabled }} + tls: + - hosts: + - '{{ tpl .Values.server.ingress.host . }}' + secretName: '{{ include "website.fullname" . }}-server-tls' + {{ end -}} + +{{- end -}} \ No newline at end of file diff --git a/chart/templates/server/service.yaml b/chart/templates/server/service.yaml new file mode 100644 index 0000000..5aebcb9 --- /dev/null +++ b/chart/templates/server/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + katenary.v3/compose-hash: 07a6c3341d6d1030ebf49ee3a618c3296c87ae32 + katenary.v3/version: develop-628b35d + labels: + {{- include "website.labels" . | nindent 4 }} + katenary.v3/component: server + name: '{{ include "website.fullname" . }}-server' +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + selector: + {{- include "website.selectorLabels" . | nindent 4 }} + katenary.v3/component: server diff --git a/chart/templates/server/statics/dist/configmap.yaml b/chart/templates/server/statics/dist/configmap.yaml new file mode 100644 index 0000000..37707af --- /dev/null +++ b/chart/templates/server/statics/dist/configmap.yaml @@ -0,0 +1,327 @@ +apiVersion: v1 +binaryData: + icon.c628fb04.ico: AAABAAQAEBAAAAEAIABoBAAARgAAABgYAAABACAAiAkAAK4EAAAgIAAAAQAgAKgQAAA2DgAAQEAAAAEAIAAoQgAA3h4AACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAADJjTYAx444AMeOOADHjjgAx444B8eOOAjHjjgAx444AMeOOADIkDcAAAAAAAAAAAAAAAAAAAAAAMePOADHjjgAx444AMeOOADHjjgFx444R8eOOKzHjjiyx444UceOOAjHjjgAx444AMeOOADHizgAAAAAAMePOADHjzgAx444AMeOOALHjjg3x444oMeOOPHHjjj/x444/8eOOPXHjjisx444QseOOAXHjjgAx444AMeOOADHjjgABwD4AMeOOC7HjjiTx4446seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPDHjjigx444NsePOALHjjgAx444KMeOOIrHjjjjx444/8eOOP/Hjjj/x444/seOONbHjjjSx444/ceOOP/Hjjj/x444/8eOOOnHjjiUx444MMeOOM/Hjjj/x444/8eOOP/Hjjj+x444zseOOG3Hjjgox444JseOOGXHjjjHx444/ceOOP/Hjjj/x444/8eOON3Hjjj+x444/8eOOP/HjjjXx444cMeOOCLHjjhRx444useOOL/Hjjhcx444IseOOGfHjjjQx444/8eOOP/Hjjj/x444+MeOOODHjjh+x444JseOOEDHjjiqx4449seOOP/Hjjj/x444+seOOLjHjjhMx444JMeOOHLHjjjZx444/8eOOHPHjjgux444N8eOOJ7Hjjjwx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4449ceOOKzHjjhAx444KceOOHPHjjgxx444mMeOOOvHjjj/x444/8eOOP/Hjjj3x444u8eOOLfHjjj0x444/8eOOP/Hjjj/x4448MeOOKLHjjg6x4442ceOOP/Hjjj/x444/8eOOPzHjjjEx444VMeOOA/HjjgOx444S8eOOLnHjjj5x444/8eOOP/Hjjj/x4445seOOPTHjjj/x444/8eOOM7Hjjhkx444G8eOOEXHjjijx444qseOOEzHjjgax444WMeOOMXHjjj9x444/8eOOP3HjjiAx444xseOOHnHjjggx444P8eOOKvHjjj0x444/8eOOP/Hjjj3x444tMeOOEfHjjgcx444a8eOOMDHjjiQx444A8eOOAzHjjgSx444k8eOOPTHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj3x444oseOOBjHjjgJyI43BMeOOADHjjgAx444CMeOOE7Hjjivx4448MeOOPbHjjjMx444vceOOO3Hjjj1x444vMeOOFvHjjgMx444AMeOOAAAAAAAx444AMeOOADHjjgAx444CceOOErHjjhWx444GMeOOA3HjjhDx444VceOOBHHjjgAx444AMeOOAAAAAAA4AcAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAACgAAAAYAAAAMAAAAAEAIAAAAAAAAAkAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMiPNwDHjjgAx444AMeOOADHjjgAx444AMiRNwDGjTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJkzYAx444AMeOOADHjjgAyI43DMeOOD7HjjhExo45EceOOADHjjgAxo45AMePOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx484AMeNOADHjTgAx444AMeOOAPHjjhAx444sceOOPPHjjj2x444v8eOOFDHjjgHx444AMeOOADHjjgAx444AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKSPQDHjjgAxo45AMeOOADIizcBx444MceOOJjHjjjtx444/8eOOP/Hjjj/x444/8eOOPTHjjipx444QMaPOQXHjjgAx404AMeNOADAlj8AAAAAAAAAAADMmTMAyI83AMmQNgDHjjgAyI43AMeOOCjHjjiLx4445ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4447seOOJ7Hjjg2x4w4AseOOADHjzgAx444AMSQOwDGjTkAx444AMaNOQDHjjghx444fseOON3Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjox444kceOOCvGijkAx444AMaOOQDHjjgAx444HseOOHbHjjjWx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPrHjjj4x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOODHjjiFx444J8mNNgDHjjhUx4440MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj2x444uceOOFnHjjhPx444rseOOPHHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44428eOOGnHjjjbx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4449ceOOLHHjjhNx444CseOOAfHjjgIyI83BseOOEHHjjikx4448MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOO/Hjjj7x444/8eOOP/Hjjj/x444/8eOOPnHjji7x444UMeOOAfHjTgKx444YseOOL7HjjjDx444cMeOOBPJjjYCx444Q8eOOK7Hjjj1x444/8eOOP/Hjjj/x444/8eOOP/Hjjj6x444/8eOOP/Hjjj8x444xseOOF3HjjgLx444A8eOOEbHjji1x444+seOOP/Hjjj/x444/seOOMbHjjhax404C8aOOQbHjjhOx444uceOOPjHjjj/x444/8eOOP/Hjjjwx444/8eOOM/Hjjhox444EtWaKgDHjjg7x444pMeOOPHHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj5x444uceOOE7HjzgFyI43CseOOFjHjjjDx444/MeOOP/Hjji2x444eMeOOBjHjTgAx444MMeOOJnHjjjsx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPTHjjitx444QceLOAHHjjgQx444Z8eOOMDHjjgRxY46AceOOCzHjjiNx4445seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44478eOOJ7Hjjg4yI83AseOOA7Hjjgex444jMeOOOXHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4443ceOOI/HjjiJx4441ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjtx444nMeOOCvHjji3x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOvHjjiVx444KceOOADHjjgAx444IMeOOITHjjjix444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOM7Hjjj4x444/8eOOP/Hjjj/x444/8eOOP/Hjjjxx444pMeOODnMizIAyI03A8eOODXHjjg8x444B8eOOADHjjgsx444kseOOOnHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjmx444/8eOOP/Hjjj/x4449seOOLDHjjhFxo45A8eNNwXHjjhIx444pseOOOvHjjjwx444sseOOFTHjjgKx404AMeOODbHjjifx44478eOOP/Hjjj/x444/8eOOPXHjjh8x4448seOOPnHjjjEx444VMeOOAfMjDMCx444QMeOOKrHjjjzx444/8eOOP/Hjjj/x444/8eOOPjHjji3x444TciONwbJkDYBx444QseOOLDHjjjzx44498eOOJjHjjgIx444RMeOOE7HjjgUx404AceOODbHjjifx44478eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4449MeOOK3HjjhEx444BceOOAvHjjhAx444R8eOOBDHjjgAx444AMeOOADDjDwAx444bMeOOOvHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj0x444hMeOOAXHjjgAx444AMeOOAAAAAAAAAAAAMeNOADGizkAx444KMeOOIHHjjjYx444/8eOOP/Hjjj/x444/8eOOPbHjjjsx444/8eOOP/Hjjj/x444/8eOOOXHjjiVx444NMiNNwLHjTgAAAAAAAAAAAAAAAAAAAAAAMeNOADHjDgAx444AMiONwDHjjggx444dMeOOM7HjjjZx444mMeOOEvHjjgxx444c8eOOMLHjjjbx444j8eOOC/GjzkCx444AMeNOADHjTgAAAAAAAAAAAAAAAAAAAAAAAAAAADEiTsAxo45AMWOOgDHjjgAx444AMeOOBzHjjgix484AseOOADHjjgAx444AMeOOBPHjjgkx404AseOOADHjjgAx444AL2WQgAAAAAAAAAAAAAAAAD/AP8A/AA/APAADwDAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAMAwAADAOAABwAoAAAAIAAAAEAAAAABACAAAAAAAAAQAADDDgAAww4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AADFhzoAx5A4AMeOOACsoFMAwpI9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyZMwDHjDgAyI43AMeOOADHkTgBx444A8eOOADHjjgAyYk2AMaQOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGjjkAx444AMeOOADIjjcLx444T8eOOJ3Hjjimx444YMeOOBPHjjgAx444AMaPOQC/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIjjcAyY42AMeOOADHjTgCx444OseOOKrHjjj1x444/8eOOP/Hjjj7x444wMeOOE7GjjkHx444AMaOOQDHjjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHjzgAx484AMeOOAB7sYQAx444LMeOOJDHjjjpx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4448seOOKbHjjg/xo45BceOOADGjjgAxo44AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGjzkAxZE6AMeOOADHjDgAx444I8eOOIPHjjjgx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOO3Hjjidx444NsaONwLHjjgAxo45AMeNOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIjzcAzZYyAMePOADIjTcAx444G8eOOHbHjjjYx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjnx444j8eOOCzWhSkAx444AMePOADHjzgAAAAAAAAAAADGjzkAxZA6AMeOOADGjTkAx444FseOOGvHjjjOx444/seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44438eOOILHjjgix404AMeOOADHjjgAx444AMeOOADHjjgAx444FMeOOGHHjjjGx444/MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOONbHjjh0x444H8ePOADHjjgAyI03B8eOOFjHjjjGx444+seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjsx444pMeOOJjHjjjjx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP7HjjjUx444bsePOBDHjjh3x44488eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjmx444mMeOODrIjjcFx4o4AceOOC3HjjiHx4443MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj7x444mMeOONvHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjlx444jseOODHHkDgBx444AMeOOAnHjjgLx404AMWMOgDHjjglx444fceOONrHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj1x444+MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjrx444mMeOODLIjTcBx444AMeNOBbHjjhvx444vMeOOMLHjjh8x404IsiONwDGjjkAx444JceOOIbHjjjhx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj9x444/8eOOP/Hjjj/x444/8eOOP/Hjjjxx444pceOODzGjzkDx444AMeOOAjHjjhRx444w8eOOP3Hjjj/x444/8eOOP/HjjjVx444a8eOOBPHjjgAxZE6AMeOOC7HjjiSx4446MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPPHjjj/x444/8eOOP/Hjjj1x444sseOOEjIjjcHx444AMaOOQTHjjg/x444qceOOPPHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj7x444w8eOOFvHjjgOx444AMeROALHjjg3x444nseOOO3Hjjj/x444/8eOOP/Hjjj/x44448eOOP/Hjjj5x444u8eOOFLHjjgLx444AMqRNQLHjjg3x444nMeOOO3Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444+MeOOLjHjjhOx484CceOOADJjjYEx444P8eOOKnHjjjzx444/8eOOP/HjjjQx444yceOOF7HjjgPx404AMuONADHjjgtx444kseOOOjHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPTHjjirx444QseNOAXHjjgAx404CceOOEvHjji1x44468eOOEXHjjgYx444AMaOOQDHjjglx444hMeOOOHHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjux444nseOODXFizoCx444AMeOOA7HjjhEx444AMqONQDHjjgox444gseOONrHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/ceOOPzHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44458eOOJbHjjg3xo45AseOOADHjjgQx444dseOON7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44498eOOLTHjjhjx444W8eOOKbHjjjxx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOnHjjiNx444HMeOOI7Hjjj7x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/seOOMvHjjhdx444DMeOOADHjjgAx444B8eOOEvHjji4x444+MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjiwx4446seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOONXHjjhyx444GseOOADHjjgAyJU3AcqQNQLHjjgAx444AMeOOA7Hjjhbx444xMeOOPvHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPvHjjj2x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOON7HjjiAx444IcaNOQDHjjgAx444BseOODjHjjiOx444nMeOOEbHjjgLx444AMiONwDHjjgVx444Z8eOOM7Hjjj+x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOONTHjjj/x444/8eOOP/Hjjj/x444/8eOOOXHjjiNx444KsiPNwDHjjgAx403CMeOOEjHjjinx44468eOOP/Hjjj/x4448seOOLbHjjhZx444D8eOOADIjTcAx444HMeOOHbHjjjXx444/8eOOP/Hjjj/x444/8eOOP/Hjjjtx444b8eOOPbHjjj/x444/8eOOPLHjjigx444NMyLMwHHjjgAyI43BceOOEDHjjiox4448seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPjHjji5x444UMiONwrHjjgAxo05AMeOOCPHjjiFx4445MeOOP/Hjjj/x444/seOOJTIjjcJx444aceOOLfHjjijx444TMeNOAfHjjgAx484AseOODfHjjiex4447ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj1x444r8eOOEbHjTgHx444ALuTRADHjjgyx444iseOOLHHjjh+x444F8eOOADHjjgAxo04CceNOATHjjgAyI43AseOOC7HjjiQx44458eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4448ceOOKbHjjg/x484BseOOADDkjwAyI43B8GMPgDHjjgAx444AMeOOADHjTgAx404AMeOOADHjjg5x44418eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOnHjjhWx444AMiNNwDIjjcAyY42AMiONwAAAAAAAAAAAAAAAAAAAAAAxo45AMeOOA3HjjhTx444sceOOPLHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPvHjjjIx444aceOOBfHjzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGjjkAx444AMeOOADHjjgKx444R8eOOKjHjjjux444/8eOOP/Hjjj8x4442seOOJXHjjhwx444sMeOOOvHjjj/x444/8eOOPrHjjjEx444Y8eOOBbIjjcAx444AMeOOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEiTsAx5A4AMeOOADHjjgAx484B8eOOD3Hjjiax444qMeOOF7Hjjgfyo01AceOOADIjjcIx444NMeOOIHHjjitx444YceOOBTHjjgAx444AL6TQQDEjzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAMaLOQDHjjgAx444AMiONwTIjzcGx444AMeOOADIjjcAxo45AMiONwDHjjgAxZA6AMiONwfGjjkAx444AMWgOgDHjjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4H///4Af//8AB//8AAP/8AAA/8AAAD8AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAP8AAAD/gAAB/+AAB/KAAAAEAAAACAAAAAAQAgAAAAAAAAQAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFkToAy6I0AMePOADIjTcAxJA7AMeNOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqNNQDdhSIAyI43AMaMOQDIijcA/FoDAMiNNwDHjjgAv5VAAMaPOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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OP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjjx44428eOOPnHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjnx444n8eOODzFjzoHyY42AM2LMgDGjzkAx444B8eOOF3HjjjKx444/ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOON7HjjiQx444OMeOOCPHjjhyx444xceOOPrHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjnx444h8iPNxrGjjkAyoo1B8eOOHPHjjjux444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj8x44418eOOIbIjjcwy440BsWOOgDIjTcAiu11AMeNOB7Hjjhkx444wMeOOPPHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP3Hjjilxo85HseOOEjHjjjmx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPzHjjjMx444e8iPNybTiywCxo85AMmONgDAkT8AyIw3AMiMNwDGjjkAwZA+AMiQNxPHjjhdx444sseOOPPHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/MeOOIHHjjiSx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44498eOOMjHjjhux444I8aQOQHHjzgA14ooAMCKPwDKjDUAAAAAAAAAAADJjTYA4H0fAMiNNwDIkTcAxok5AMeOOBPGjjlQx444rceOOOzHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/HjjjVx444yMeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj8x444yMeOOGvHjzgY0qAtAMeOOADHjzgAy5c0AMeOOADHjjgAyI03AMaQOQDHjTgByZE2AMeOOADHjTgAyYo2AMuZNADIjjcAyYs2AMmLNgrHjjhLx444qseOOPLHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/ceOOOjHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPzHjjjUx444dciONyHXRCgAx484AMeOOADHjjgAxIw7AMiPNwDHjTgHyI43MseOOHrHjjiux444tceOOI3HjzhFx444D8WQOgDGizkAyI43AMSQOwDJjDYAyI43AMiPNxDHjjhTx444uMeOOPTHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj4x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOONnHjjiBx444JMOXPAHHjjgAx484AMePOADHjDgAx444AMKPPQHHjTgvx444kceOOObHjjj8x444/8eOOP/Hjjj/x4448ceOOKzHjThPxYs6CceOOADIjjcAx404ALqERQDHjzgAxpA5AMePOBHHjjhfx444v8eOOPnHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4445MeOOI3HjTgwwZQ+A8iNNwDHjzgA//8AAMeNOADIjTcAxo45AMeNOBfHjjhvx4441seOOP7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4447MeOOJ3Gjzk0x5A4A8eOOADKiDUAx404AMiMNwDIjjcAwpQ9AMeNOBvGjjlpx444zMeOOPrHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPfHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjnx444msePODjJjjYFxo85AMSQOwDJjDYAzI4zAMiONwDHjjgAx4w4C8eOOE7Hjji7x444+ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4444seOOIHIjjckothdAMeOOADIjDcAx404AMuJNADHjjgAz5swAMePOBzHjjh0x4440ceOOP3Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjrx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPHHjjipx444Q8mONgjGjzkAyI43ANZ7KQDGjDkAxow5AMaNOQDJjzYHxo45PMeOOKPHjjjrx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj7x444zceOOHPGjTkdv5lAAMeOOAAo/9cAy4w0AMaNOQDHjzgAx5I4AciPNynHjjh/x4443MeOOP7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4442seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4448ceOOK/HjjhPyI83DMaROQDJjjYAxJA7AJCbbwDGjjkAxo05AMSLOwPHjjg1x444lMeOOOfHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj6x444y8eOOGfHjjgZw5M8AMeOOADFjDoAx484AMiRNwDHjTgAxo45AsiPNyzHjjiKx4443MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOMjHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj2x444useOOFbIjjcQx444AMePOADJizYAy5Q0AMmVNgDJjjYAwo09A8aPOSnHjjiIx44428eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj3x444vMeOOFrGjjkQyZE2AMiQNwC/fkAAlyVoAMeOOADHjzgAz4kwA8eOODXHjjiRx4446ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjji1x444/8eOOP/Hjjj/x444/8eOOPnHjji/x444YciQNxPJkDYAyI43AMWOOgC9ekIAxo45AMePOAByAI0Ax444KceOOIDHjjjcx444/seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjzx444tMeOOE/IkTcNxYo6AMePOADDkDwAxpA5AMqLNQDIjzcAyY02B8eOOD/Hjjijx4447MeOOP/Hjjj/x444/8eOOP/Hjjj8x444pseOOP/Hjjj/x444/MeOOM/HjThux444HM6HMQDGjzkAxo05AMaNOQD//wAAxo05AMuQNADHjTgcx484dceOOM/Hjjj+x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjtx444psePOELGjjkHyI43AMiMNwDIizcAw4g8AMeOOADHjjgAxos5C8eOOEzHjjiqx4448seOOP/Hjjj/x4448MeOOJjHjjj/x44408eOOHzIjTcfvG9DAMiPNwCDw3wAvJlDAMePOADHjjgAx444AMePOBrHjjhnx444y8eOOPrHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjqx444mseOODvLijQEx404AMeNOAC1k0oAyI43AMaMOQDGjzkAyI43DceOOFPHjji0x4449ceOOOXHjjhux444iMeOOCzQgi8Bx404AMeMOADNlzIAvYtCAMiONwDHjDgAx444EcaOOVvHjji9x444+MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjgx444jcaNOSzIijcCx444AMKGPQDGiTkAyIs3AMeOOADHjjgAx484FMeOOGDHjjiYx444CsqPNQXGjjkAyoo1AMmLNgDHjzgAx444AMaNOQDJjjYQx444UceOOLTHjjj0x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP7Hjjjbx444eseOOCXlwRoAx404AMiONwDKlzUAxos5AMaNOQDIijcAxo45DMeOOADIjzcAa5GUALyWQwDGjjkAx4w4AMeOOBDHjjhRx444rceOOPDHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPzHjjjNx444d8eNOCLMjjMCx404AMaMOQDEiTsAx484AMaOOQDGjjkAxIU7AMaNOQDIjDcAxo45F8eOOFjHjji1x4448ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPvHjjjWx444f8eOOC7DgjwBx484AL2TQgDEkDsAypA1AMiONwDGjDkKxo45UMeOOLjHjjj2x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj0x444w8eOOI7HjjiHx444sMeOOOnHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/HjjjWx444d8ePOBvLjDQAxo45AMeOOADIjzcbx444lMeOOO7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPTHjjizx444UciONxfHjzgFx404A8iONw/Ijjc4x444l8eOOObHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPrHjji+x444O8WOOgHGjzkVx444nMeOOP7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/seOOM7Hjjhkx484EseOOADHjjgAx444AMeOOADIjjcAx444AMaNOQfHjjhFx444sMeOOPXHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOM/Hjjg4x444Z8eOOPXHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4443seOOIXIjjckxoo5AMePOADHjzgAxo45AAAAAAAAAAAAAAAAAMaOOQDGjjkAyYs2AMaOORLHjjhbx444v8eOOPXHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444pseOOLjHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjox444kseOODfGiTkCx444AMePOADHjzgAAAAAAMmUNgDJlDYA0ZEuAIisdwD/gAAAxJI7AMCXPwDIjjcAyYw2AMaPORbHjjhnx444y8eOOPzHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOO3Hjjjlx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOnHjjigx484PMWPOgfJjjYAw4o8AMaLOQDGjjkAzowxALWVSgDGjzkAxIk7AL+MQADFjzoAwY8+ALePSADIjjcAwpI9AM2KMgDGjzkAyJU3AMeOOCDHjjh0x4440seOOP3Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4448ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44488eOOK3HjjhKxow5CMaNOQDGjjkA/wAAAL2NQgDQmC8Ax404AMaPOQDIijcBxo45G8eOOGXIjzd8x444N8SPOwbHjjgAx444AMqMNQDIjTcAx444AMeOOADIjTcA15EoAMeOOCjHjjh+x4442seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOXHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjzx444t8eOOFLHjjgQyJI3AMWMOgDFjDoAxY86AMWMOgDFizoAx484AMeMOAfIjjcux444fseOOM3Hjjj2x444/8eOOOLHjjiex484RMeOOBLFjzoAxo05AMqVNQDAfz8Axo45AP+OAADHjjgAxZE6AsePOC7HjjiPx4444MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjji+x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPnHjjjBx444X8eOOBLHjzgAx444AMOIPADGijkA3nkqAMeNNwDGjzkAxow5CcaOOUHHjjiUx4443ceOOP7Hjjj/x444/8eOOP/Hjjj/x444/8eOOO/Hjjivx444XcaOORfIkjcAyI03AMuUNADHizgAx444AMeOOADIjTcAv5FAA8eOODrHjjiZx4446seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjzx444gceOOP3Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444+seOOMzHjjhqyY02GsOLPADHjzgAx484AAAAAADDhzwAxYg6AMaQOQDHjDYLx444RceOOKrHjjjnx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPPHjjjGx444Z8aOORrBhj4Ax4w4AMiMNwAAAAAAtpJJAL2PQgDIjzcAxo45CciON0HHjjinx4447MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444vciONzXHjjjXx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x4442ceOOHjHjTgfuJpHAMeOOADKjzUAyY42ALucRADIjTcAxow5AMWKOgXHjjg+x444n8eOOOzHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPjHjjjAyI43XseNOBLHjDgAyI03AMuPNADIjTcAjx5wAMeOOADFjzoAxZA6CseOOE7Hjjixx4449ceOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x44498eOOGjHijgDx444b8eOOPTHjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjjrx444lseOODC8lUMCx404ALedSADVgCsA/4AAAPV/CgDGkDkAyow1BcePODTHjjiXx44448eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPPHjji4x444UsmNNhDGjjkAyYw2AMmLNgAAAAAAxJE8AMWPOgDFkToAx404E8aOOV/HjjjIx444+seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOK3HjjgYyI03AMiONwrHjjh7x44458eOOP/Hjjj/x444/8eOOPDHjjitx404SseNOAfHjjgAxI87AMiMNwDHjzgAx444AMiNNwDrhhQByI43L8eOOIrHjjjhx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOPLHjjisx444S8mMNgnGjjkAxo45ALhyRwDHijgAyoo1AMeNOADLjzQAx444HseOOHbHjjjNx444+ceOOP/Hjjj/x44498eOOLTHjjgtx404AMCXPwDEkDsAx4w4B8eOODrHjjh8x444lceOOHzHjjhCyI43EcORPADKizUAyI03AMaOOQDLkTQAx444AMSROwHIjjclyI43gceOONjHjjj+x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOrHjjikx404P8aNOQnIkDcAxIk7AMSJOwDAgD8AzJQzAMeNOAC2m0kBx444IceOOFHHjjh5x444eciON03IjjcXxY46AMmONgDVgCsAw5E8AMeNOADGjjkAxoo2AcWNOAPHijgBxo85AMiONwDaeyUAzYkyAMmNNgDHjjgAyI83AMeOOB3Hjjhxx4440ceOOP7Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOrHjjiZx444PcWKOgTIjjcAx484ANx8IwDHjjgAxJA7AMeOOADGjzkAyos1Ac2RMgHGjjkAyI43AMmONgDIjjcAAAAAAAAAAADHjjgAyI84AMeNOADGjTgAx404AMiNNwDIjTcAxY86AMaPOQC+kkEAxo05GseOOGnHjjjIx444+MeOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOHHjjiVxo45MseROAXLizQAy4o0AAAAAADGjDkAyI03AMiONwDIjjcAyY42AMmONgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMWPOgDDkDwEx444UceOOMPHjjj6x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOOHHjjiAxo45E8eOOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHjTgAx404CseOOJDHjjj4x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444yceNOCbHjTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyYs2ANGCLgDFjzoSx444XceOOLPHjjjyx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP3HjjjWx444hseOOCvFiDoCxos5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMiMNwDRgi4AxZA6AMuLNADGjjkTx444UMeOOK3Hjjjrx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/MeOONfHjjiCxo45LMCRPwPIjTcAxIc7AMaKOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKSPQC9lkIAx444AMeQOADEjzsKxo45RceOOKLHjjjox444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj9x4442MeOOKzHjjjHx4449seOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/8eOOP/Hjjj8x444z8eOOH3HjjgmyZQ2AsiNNwDDkDwAyYo2AKqqVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIk7AMqRNQDIjTcAxo85AMWLOgDGjjkMx484QceOOJrHjjjkx444/8eOOP/Hjjj/x444/8eOOP/Hjjj/x444/ceOOOrHjji3yI43aseOOC7HjzgLx444IMeOOFPHjjigx4444ceOOPrHjjj/x444/8eOOP/Hjjj/x444/8eOOPrHjjjSx444eMeOOCbCij0Bx444AMeQOACumlEArKhTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyZMwDAgD8Axo45AMaMOQDGjjkGx444M8eOOI7HjjjYx444/8eOOP/Hjjjyx444wseOOILHjjg6x444DL2OQgDHjTgAx484AMeOOADFjjoAyo01B8eOOCrHjjh0x444uMeOOO7Hjjj/x444/MeOOM3Hjjh2xo05IMePOAHHjjgAxo05AMaOOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMWLOgDKlDUAx444AMeNOADEizsEx444MMiON4LHjjiNx484TMePOBzCgj0Ax444AMeOOADJjjYA//kAAMyPMwDIjTcAyY02AMiONwDGjjkA0IwvAMePOBTHjjhJx444iceOOGzHjjgl/2UAAMeNOADHjjgAyYo2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGjTkAxo05AMaNOQDKjzUDyI43BceOOADHjzgAyZM2AMiRNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv49AALqQRQDHjjgAx484AMiNNwT/nAAAx444AMmNNgDIjTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqONQDMjjMAyI43AMiONwDIkDcAyJA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIw3AMiMNwDIjTcAyI43AMWNOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////+B/////////gB////////4AB////////AAB///////gAAB//////8AAAB/////+AAAAB/////wAAAAD////8AAAAAB////AAAAAAD///wAAAAAAB//8AAAAAAAD//gAAAAAAAH/wAAAAAAAAD+AAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAIAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAQP/gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB///gAAAAAAP///AAAAAAD////gAAAAB/////gAAAAf/////wB/AH//////gf/B///w== +data: + index.87e0faa9.js: | + document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelectorAll("main > section, body > header"),t=document.querySelectorAll("nav a"),r=Array.from(t),a=new IntersectionObserver(e=>{e.forEach(e=>{if(""===e.target.id){r.forEach(e=>e.classList.remove("active")),t[0].classList.add("active");return}if(e.isIntersecting){let t=e.target.id,a=r.find(e=>e.href.includes(t));r.forEach(e=>e.classList.remove("active")),a.classList.add("active")}})},{rootMargin:"-50% 0px -50% 0px"});e.forEach(e=>a.observe(e))}); + //# sourceMappingURL=index.87e0faa9.js.map + index.87e0faa9.js.map: '{"mappings":"ACAA,SAAS,gBAAgB,CAAC,mBAAoB,KAG5C,IAAM,EAAW,SAAS,gBAAgB,CAAC,iCACrC,EAAQ,SAAS,gBAAgB,CAAC,SAClC,EAAa,MAAM,IAAI,CAAC,GACxB,EAAW,IAAI,qBACnB,AAAC,IACC,EAAQ,OAAO,CAAC,AAAC,IACf,GAAI,AAAoB,KAApB,EAAM,MAAM,CAAC,EAAE,CAAS,CAC1B,EAAW,OAAO,CAAC,AAAC,GAAS,EAAK,SAAS,CAAC,MAAM,CAAC,WACnD,CAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UACvB,MACF,CACA,GAAI,EAAM,cAAc,CAAE,CACxB,IAAM,EAAK,EAAM,MAAM,CAAC,EAAE,CACpB,EAAO,EAAW,IAAI,CAAC,AAAC,GAAS,EAAK,IAAI,CAAC,QAAQ,CAAC,IAC1D,EAAW,OAAO,CAAC,AAAC,GAAS,EAAK,SAAS,CAAC,MAAM,CAAC,WACnD,EAAK,SAAS,CAAC,GAAG,CAAC,SACrB,CACF,EACF,EACA,CAAE,WAAY,mBAAoB,GAEpC,EAAS,OAAO,CAAC,AAAC,GAAY,EAAS,OAAO,CAAC,GACjD","sources":["","src/links.js"],"sourcesContent":["document.addEventListener(\"DOMContentLoaded\", + ()=>{\n // when the user scroll to a section, the active class is added to\n // + the corresponding link in the navbar\n const sections = document.querySelectorAll(\"main + > section, body > header\");\n const links = document.querySelectorAll(\"nav + a\");\n const linksArray = Array.from(links);\n const observer = new IntersectionObserver((entries)=>{\n entries.forEach((entry)=>{\n if + (entry.target.id === \"\") {\n linksArray.forEach((link)=>link.classList.remove(\"active\"));\n links[0].classList.add(\"active\");\n return;\n }\n if + (entry.isIntersecting) {\n const id = entry.target.id;\n const + link = linksArray.find((link)=>link.href.includes(id));\n linksArray.forEach((link)=>link.classList.remove(\"active\"));\n link.classList.add(\"active\");\n }\n });\n }, + {\n rootMargin: \"-50% 0px -50% 0px\"\n });\n sections.forEach((section)=>observer.observe(section));\n});\n\n//# + sourceMappingURL=index.87e0faa9.js.map\n","document.addEventListener(\"DOMContentLoaded\", + () => {\n // when the user scroll to a section, the active class is added to\n // + the corresponding link in the navbar\n const sections = document.querySelectorAll(\"main + > section, body > header\");\n const links = document.querySelectorAll(\"nav + a\");\n const linksArray = Array.from(links);\n const observer = new IntersectionObserver(\n (entries) + => {\n entries.forEach((entry) => {\n if (entry.target.id === \"\") + {\n linksArray.forEach((link) => link.classList.remove(\"active\"));\n links[0].classList.add(\"active\");\n return;\n }\n if + (entry.isIntersecting) {\n const id = entry.target.id;\n const + link = linksArray.find((link) => link.href.includes(id));\n linksArray.forEach((link) + => link.classList.remove(\"active\"));\n link.classList.add(\"active\");\n }\n });\n },\n { + rootMargin: \"-50% 0px -50% 0px\" },\n );\n sections.forEach((section) => observer.observe(section));\n});\n"],"names":["document","addEventListener","sections","querySelectorAll","links","linksArray","Array","from","observer","IntersectionObserver","entries","forEach","entry","target","id","link","classList","remove","add","isIntersecting","find","href","includes","rootMargin","section","observe"],"version":3,"file":"index.87e0faa9.js.map"}' + index.82434563.css: | + :root{--primary-color:#2a1827;--secondary-color:#6c757d;--dark-color:#343a40;--light-color:#f4f4f4;--white:#fff;--danger-color:#dc3545;--covered:50%}html{scroll-behavior:smooth}body{color:#333;margin:0;padding:0;font-family:Arial,sans-serif;line-height:1.6;overflow-x:hidden}img{max-width:100%}.container{max-width:1200px;margin:0 auto;padding:20px}.header{background:var(--dark-color);color:#fff;text-align:center;padding:50px 20px}.header .container{flex-direction:column;justify-content:space-evenly;height:100%;display:flex}@media (width>=768px){.header{align-items:center;height:100vh;padding:0 0 115px;display:flex}main>section{flex:1;justify-content:center;align-items:center;height:100vh;display:flex}}.header h1{color:#0000;background-image:url(https://github.com/metal3d/katenary/raw/refs/heads/develop/doc/docs/statics/logo-vertical.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;height:265px;margin:0;font-size:3rem}.header p{margin:20px 0;font-size:1.2rem}.btn-primary{color:var(--primary-color);background:#fff;border-radius:5px;margin-top:20px;padding:10px 20px;font-weight:700;text-decoration:none;display:inline-block}.btn-primary:hover{color:#fff;background:#0056b3}.features{background:var(--light-color);text-align:center;padding:50px 20px}.features h2{margin-bottom:20px;font-size:2.5rem}.feature-grid{flex-wrap:wrap;justify-content:center;gap:20px;display:flex}@keyframes slidingLeft{0%{filter:opacity(0)blur(10px);transform:translate(-100vw)}to{filter:opacity()blur();transform:translate(0)}}@keyframes slidingRight{0%{filter:opacity(0)blur(10px);transform:translate(100vw)}to{filter:opacity()blur();transform:translate(0)}}.feature-item{background:var(--white);border:1px solid #ddd;border-radius:8px;flex:200px;padding:20px;box-shadow:0 2px 5px #0000001a}@media (width>=768px){:root{--animation-slide:entry 0% contain 0%}.from-left{view-timeline:--reveal-blockl;view-timeline-axis:block;animation:linear forwards slidingLeft;animation-range:var(--animation-slide);animation-timeline:--reveal-blockl}.from-right{view-timeline:--reveal-blockr;view-timeline-axis:block;animation:linear forwards slidingRight;animation-range:var(--animation-slide);animation-timeline:--reveal-blockr}}.how-it-works,.how-to-use,.tutorials{text-align:center;padding:50px 20px}h2{text-align:center;margin-bottom:20px;font-size:2.5rem}.how-it-works ol{text-align:left;max-width:800px;margin:0 auto;padding:0;list-style:decimal inside}.image-placeholder{border-radius:8px;justify-content:center;align-items:center;width:100%;max-width:800px;height:200px;margin:30px auto;font-size:1.2rem;display:flex}.image-placeholder img{object-fit:cover;border-radius:8px;width:100%;height:100%;margin:10px}.get-started{background:var(--primary-color);color:var(--white);text-align:center;padding:50px 20px}.get-started pre{background:var(--white);color:#333;border-radius:5px;margin:20px 0;padding:10px}div.video{padding-top:25px}pre{text-align:left}@media (width>=768px){.example{justify-content:space-between;align-items:center;gap:20px;display:flex}iframe{width:100%;height:500px}}iframe{max-width:100%}section {width:100%}section:nth-child(2n) .example{text-align:right;flex-direction:row-reverse!important}section:nth-child(odd) .example{text-align:left;flex-direction:row}section:nth-child(2n) .example h3 {text-align:right}.example>div{flex:200px;align-content:center}code.hljs{border-radius:5px;box-shadow:0 6px 15px #00000080}p code{background:var(--dark-color);color:var(--light-color);border-radius:5px;padding:1px 5px;display:inline-block}section.alternate:nth-child(odd){background:var(--light-color);color:var(--dark-color)}section.alternate:nth-child(2n){background:var(--dark-color);color:var(--light-color)}#menu-toggle{z-index:11;margin:0;position:fixed}@media (width>=768px){#menu-toggle{display:none}.navbar{background:var(--white);color:var(--dark-color);z-index:10;justify-content:space-evenly;align-items:center;width:100%;display:flex;position:fixed;top:0}.navbar .container{padding:0}nav ul{flex-wrap:wrap;list-style:none;display:flex}nav ul li{margin:0 10px}nav ul li a{color:var(--dark-color);padding:10px;text-decoration:none;display:block}nav ul li a:hover{color:var(--light-color);background:var(--dark-color)}nav ul li a.active{color:var(--light-color)!important;background:var(--dark-color)!important}}@media (width<=768px){.navbar{display:none!important}.navbar:hover,#menu-toggle:focus~.navbar{display:block!important}.navbar{opacity:.8;color:var(--white);cursor:pointer;background:var(--dark-color);border:1px solid var(--dark-color);border-radius:5px;justify-content:space-between;align-items:center;padding:10px 20px;font-size:1rem;display:flex;position:fixed;top:10px;left:0;box-shadow:0 2px 5px #0000001a}.navbar:has(a:active){display:none}nav ul{margin:0;padding:0;list-style:none;display:block}nav ul li{margin:0}nav ul li a{color:var(--white);padding:10px;text-decoration:none;display:block}}footer{color:#fff;text-align:center;background:#333;flex-wrap:wrap;padding:20px 0;font-size:.9rem;display:flex}footer section{text-align:center;flex:250px;padding:20px}footer section p{font-weight:700}footer ul{padding:0;list-style:none}footer ul li{margin:5px 0}footer a{color:var(--white)}footer .container{flex-wrap:wrap;flex:auto;justify-content:space-between;align-items:start;width:100%;display:flex}footer .container>p{text-align:center;flex:auto}footer section{flex:auto;align-self:normal;position:relative}@media (width>=768px){footer section:after{content:" ";filter:opacity(.5)blur(1px);background:#fff;width:1px;height:90%;display:block;position:absolute;top:5%;right:0}footer section:last-child:after{display:none}}.large-icon{font-size:3rem}@keyframes bouncing{0%{transform:translateY(0)}50%{transform:translateY(-20px)}to{transform:translateY(0)}}.down{position:relative;bottom:0}a.down{background:var(--white);color:var(--dark-color);border-radius:50%;justify-content:center;align-self:center;align-items:center;width:120px;height:120px;animation:2s infinite bouncing;display:flex} + /*# sourceMappingURL=index.82434563.css.map */ + index.82434563.css.map: '{"mappings":"ACCA,qJASA,4BAIA,kGASA,mBAIA,uDAMA,oFAOA,+FAQA,sBACE,uEAOA,yFASF,4PAWA,yCAKA,sKAWA,iDAKA,4EAMA,iDAKA,0EAcA,oIAWA,oIAWA,qIASA,sBACE,4CAGA,kLAOA,qLASF,yEAcA,yDAMA,mGAQA,sKAYA,6FAQA,oGAOA,iGAQA,2BAIA,oBAIA,sBACE,gFAMA,gCAKF,sBAGA,qBAIA,qFAIA,mEAIA,qDAIA,6CAKA,4DAIA,oHAQA,uFAIA,sFAKA,gDAKA,sBACE,0BAGA,gKAYA,6BAIA,mDAKA,wBAGA,oFAMA,wEAIA,8FAMF,sBACE,+BAIA,iEAIA,oSAkBA,mCAGA,wDAMA,mBAGA,gFAQF,+GAWA,yDAKA,iCAGA,oCAIA,0BAIA,4BAIA,mHAQA,gDAKA,6DAMA,sBACE,iJAYA,8CAKF,2BAIA,2GAYA,iCAKA","sources":["index.82434563.css","src/main.css"],"sourcesContent":[":root + {\n --primary-color: #2a1827;\n --secondary-color: #6c757d;\n --dark-color: + #343a40;\n --light-color: #f4f4f4;\n --white: #fff;\n --danger-color: #dc3545;\n --covered: + 50%;\n}\n\nhtml {\n scroll-behavior: smooth;\n}\n\nbody {\n color: #333;\n margin: + 0;\n padding: 0;\n font-family: Arial, sans-serif;\n line-height: 1.6;\n overflow-x: + hidden;\n}\n\nimg {\n max-width: 100%;\n}\n\n.container {\n max-width: 1200px;\n margin: + 0 auto;\n padding: 20px;\n}\n\n.header {\n background: var(--dark-color);\n color: + #fff;\n text-align: center;\n padding: 50px 20px;\n}\n\n.header .container {\n flex-direction: + column;\n justify-content: space-evenly;\n height: 100%;\n display: flex;\n}\n\n@media + (width >= 768px) {\n .header {\n align-items: center;\n height: 100vh;\n padding: + 0 0 115px;\n display: flex;\n }\n\n main > section {\n flex: 1;\n justify-content: + center;\n align-items: center;\n height: 100vh;\n display: flex;\n }\n}\n\n.header + h1 {\n color: #0000;\n background-image: url(\"https://github.com/metal3d/katenary/raw/refs/heads/develop/doc/docs/statics/logo-vertical.svg\");\n background-position: + center;\n background-repeat: no-repeat;\n background-size: contain;\n height: + 265px;\n margin: 0;\n font-size: 3rem;\n}\n\n.header p {\n margin: 20px 0;\n font-size: + 1.2rem;\n}\n\n.btn-primary {\n color: var(--primary-color);\n background: #fff;\n border-radius: + 5px;\n margin-top: 20px;\n padding: 10px 20px;\n font-weight: bold;\n text-decoration: + none;\n display: inline-block;\n}\n\n.btn-primary:hover {\n color: #fff;\n background: + #0056b3;\n}\n\n.features {\n background: var(--light-color);\n text-align: center;\n padding: + 50px 20px;\n}\n\n.features h2 {\n margin-bottom: 20px;\n font-size: 2.5rem;\n}\n\n.feature-grid + {\n flex-wrap: wrap;\n justify-content: center;\n gap: 20px;\n display: flex;\n}\n\n@keyframes + slidingLeft {\n from {\n filter: opacity(0) blur(10px);\n transform: translateX(-100vw);\n }\n\n to + {\n filter: opacity() blur();\n transform: translateX(0);\n }\n}\n\n@keyframes + slidingRight {\n from {\n filter: opacity(0) blur(10px);\n transform: translateX(100vw);\n }\n\n to + {\n filter: opacity() blur();\n transform: translateX(0);\n }\n}\n\n.feature-item + {\n background: var(--white);\n border: 1px solid #ddd;\n border-radius: 8px;\n flex: + 200px;\n padding: 20px;\n box-shadow: 0 2px 5px #0000001a;\n}\n\n@media (width + >= 768px) {\n :root {\n --animation-slide: entry 0% contain 0%;\n }\n\n .from-left + {\n view-timeline: --reveal-blockl;\n view-timeline-axis: block;\n animation: + linear forwards slidingLeft;\n animation-range: var(--animation-slide);\n animation-timeline: + --reveal-blockl;\n }\n\n .from-right {\n view-timeline: --reveal-blockr;\n view-timeline-axis: + block;\n animation: linear forwards slidingRight;\n animation-range: var(--animation-slide);\n animation-timeline: + --reveal-blockr;\n }\n}\n\n.how-it-works, .how-to-use, .tutorials {\n text-align: + center;\n padding: 50px 20px;\n}\n\nh2 {\n text-align: center;\n margin-bottom: + 20px;\n font-size: 2.5rem;\n}\n\n.how-it-works ol {\n text-align: left;\n max-width: + 800px;\n margin: 0 auto;\n padding: 0;\n list-style: decimal inside;\n}\n\n.image-placeholder + {\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n width: + 100%;\n max-width: 800px;\n height: 200px;\n margin: 30px auto;\n font-size: + 1.2rem;\n display: flex;\n}\n\n.image-placeholder img {\n object-fit: cover;\n border-radius: + 8px;\n width: 100%;\n height: 100%;\n margin: 10px;\n}\n\n.get-started {\n background: + var(--primary-color);\n color: var(--white);\n text-align: center;\n padding: + 50px 20px;\n}\n\n.get-started pre {\n background: var(--white);\n color: #333;\n border-radius: + 5px;\n margin: 20px 0;\n padding: 10px;\n}\n\ndiv.video {\n padding-top: 25px;\n}\n\npre + {\n text-align: left;\n}\n\n@media (width >= 768px) {\n .example {\n justify-content: + space-between;\n align-items: center;\n gap: 20px;\n display: flex;\n }\n\n iframe + {\n width: 100%;\n height: 500px;\n }\n}\n\niframe {\n max-width: 100%;\n}\n\nsection  + {\n width: 100%;\n}\n\nsection:nth-child(2n) .example {\n text-align: right;\n flex-direction: + row-reverse !important;\n}\n\nsection:nth-child(odd) .example {\n text-align: + left;\n flex-direction: row;\n}\n\nsection:nth-child(2n) .example h3  {\n text-align: + right;\n}\n\n.example > div {\n flex: 200px;\n align-content: center;\n}\n\ncode.hljs + {\n border-radius: 5px;\n box-shadow: 0 6px 15px #00000080;\n}\n\np code {\n background: + var(--dark-color);\n color: var(--light-color);\n border-radius: 5px;\n padding: + 1px 5px;\n display: inline-block;\n}\n\nsection.alternate:nth-child(odd) {\n background: + var(--light-color);\n color: var(--dark-color);\n}\n\nsection.alternate:nth-child(2n) + {\n background: var(--dark-color);\n color: var(--light-color);\n}\n\n#menu-toggle + {\n z-index: 11;\n margin: 0;\n position: fixed;\n}\n\n@media (width >= 768px) + {\n #menu-toggle {\n display: none;\n }\n\n .navbar {\n background: var(--white);\n color: + var(--dark-color);\n z-index: 10;\n justify-content: space-evenly;\n align-items: + center;\n width: 100%;\n display: flex;\n position: fixed;\n top: + 0;\n }\n\n .navbar .container {\n padding: 0;\n }\n\n nav ul {\n flex-wrap: + wrap;\n list-style: none;\n display: flex;\n }\n\n nav ul li {\n margin: + 0 10px;\n }\n\n nav ul li a {\n color: var(--dark-color);\n padding: 10px;\n text-decoration: + none;\n display: block;\n }\n\n nav ul li a:hover {\n color: var(--light-color);\n background: + var(--dark-color);\n }\n\n nav ul li a.active {\n color: var(--light-color) + !important;\n background: var(--dark-color) !important;\n }\n}\n\n@media (width + <= 768px) {\n .navbar {\n display: none !important;\n }\n\n .navbar:hover, + #menu-toggle:focus ~ .navbar {\n display: block !important;\n }\n\n .navbar + {\n opacity: .8;\n color: var(--white);\n cursor: pointer;\n background: + var(--dark-color);\n border: 1px solid var(--dark-color);\n border-radius: + 5px;\n justify-content: space-between;\n align-items: center;\n padding: + 10px 20px;\n font-size: 1rem;\n display: flex;\n position: fixed;\n top: + 10px;\n left: 0;\n box-shadow: 0 2px 5px #0000001a;\n }\n\n .navbar:has(a:active) + {\n display: none;\n }\n\n nav ul {\n margin: 0;\n padding: 0;\n list-style: + none;\n display: block;\n }\n\n nav ul li {\n margin: 0;\n }\n\n nav + ul li a {\n color: var(--white);\n padding: 10px;\n text-decoration: + none;\n display: block;\n }\n}\n\nfooter {\n color: #fff;\n text-align: + center;\n background: #333;\n flex-wrap: wrap;\n padding: 20px 0;\n font-size: + .9rem;\n display: flex;\n}\n\nfooter section {\n text-align: center;\n flex: + 250px;\n padding: 20px;\n}\n\nfooter section p {\n font-weight: bold;\n}\n\nfooter + ul {\n padding: 0;\n list-style: none;\n}\n\nfooter ul li {\n margin: 5px 0;\n}\n\nfooter + a {\n color: var(--white);\n}\n\nfooter .container {\n flex-wrap: wrap;\n flex: + auto;\n justify-content: space-between;\n align-items: start;\n width: 100%;\n display: + flex;\n}\n\nfooter .container > p {\n text-align: center;\n flex: auto;\n}\n\nfooter + section {\n flex: auto;\n align-self: normal;\n position: relative;\n}\n\n@media + (width >= 768px) {\n footer section:after {\n content: \" \";\n filter: + opacity(.5) blur(1px);\n background: #fff;\n width: 1px;\n height: 90%;\n display: + block;\n position: absolute;\n top: 5%;\n right: 0;\n }\n\n footer + section:last-child:after {\n display: none;\n }\n}\n\n.large-icon {\n font-size: + 3rem;\n}\n\n@keyframes bouncing {\n 0% {\n transform: translateY(0);\n }\n\n 50% + {\n transform: translateY(-20px);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n\n.down + {\n position: relative;\n bottom: 0;\n}\n\na.down {\n background: var(--white);\n color: + var(--dark-color);\n border-radius: 50%;\n justify-content: center;\n align-self: + center;\n align-items: center;\n width: 120px;\n height: 120px;\n animation: + 2s infinite bouncing;\n display: flex;\n}\n/*# sourceMappingURL=index.82434563.css.map + */\n","/* styles.css */\n:root {\n --primary-color: #2a1827;\n --secondary-color: + #6c757d;\n --dark-color: #343a40;\n --light-color: #f4f4f4;\n --white: #fff;\n --danger-color: + #dc3545;\n --covered: 50%;\n}\nhtml {\n scroll-behavior: smooth;\n}\n\nbody + {\n font-family: Arial, sans-serif;\n line-height: 1.6;\n margin: 0;\n padding: + 0;\n color: #333;\n overflow-x: hidden;\n}\n\nimg {\n max-width: 100%;\n}\n\n.container + {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.header {\n background: + var(--dark-color);\n color: #fff;\n text-align: center;\n padding: 50px 20px;\n}\n\n.header + .container {\n display: flex;\n flex-direction: column;\n justify-content: + space-evenly;\n display: flex;\n height: 100%;\n}\n\n@media (min-width: 768px) + {\n .header {\n display: flex;\n align-items: center;\n height: 100vh;\n padding: + 0;\n padding-bottom: 115px;\n }\n main > section {\n flex: 1;\n height: + 100vh;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n}\n\n.header + h1 {\n font-size: 3rem;\n margin: 0;\n background-image: url(\"https://github.com/metal3d/katenary/raw/refs/heads/develop/doc/docs/statics/logo-vertical.svg\");\n color: + transparent;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: + center;\n height: 265px;\n}\n\n.header p {\n font-size: 1.2rem;\n margin: 20px + 0;\n}\n\n.btn-primary {\n display: inline-block;\n background: #fff;\n color: + var(--primary-color);\n padding: 10px 20px;\n border-radius: 5px;\n text-decoration: + none;\n font-weight: bold;\n margin-top: 20px;\n}\n\n.btn-primary:hover {\n background: + #0056b3;\n color: #fff;\n}\n\n.features {\n background: var(--light-color);\n padding: + 50px 20px;\n text-align: center;\n}\n\n.features h2 {\n font-size: 2.5rem;\n margin-bottom: + 20px;\n}\n\n.feature-grid {\n /*\n display: grida;\n gap: 20px;\n margin-top: + 20px;\n grid-auto-rows: 200px;\n grid-template-columns: repeat(auto-fit, minmax(250px, + 1fr));\n */\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: + 20px;\n}\n\n@keyframes slidingLeft {\n from {\n transform: translateX(-100vw);\n filter: + opacity(0) blur(10px);\n }\n to {\n transform: translateX(0);\n filter: + opacity(1) blur(0);\n }\n}\n\n@keyframes slidingRight {\n from {\n transform: + translateX(100vw);\n filter: opacity(0) blur(10px);\n }\n to {\n transform: + translateX(0);\n filter: opacity(1) blur(0);\n }\n}\n\n.feature-item {\n background: + var(--white);\n border: 1px solid #ddd;\n flex: 1 1 200px;\n padding: 20px;\n border-radius: + 8px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n}\n\n@media (min-width: 768px) + {\n :root {\n --animation-slide: entry 0% contain 0%;\n }\n .from-left {\n view-timeline: + --reveal-blockl;\n view-timeline-axis: block;\n animation: linear slidingLeft + forwards;\n animation-range: var(--animation-slide);\n animation-timeline: + --reveal-blockl;\n }\n .from-right {\n view-timeline: --reveal-blockr;\n view-timeline-axis: + block;\n animation: linear slidingRight forwards;\n animation-range: var(--animation-slide);\n animation-timeline: + --reveal-blockr;\n }\n}\n\n.how-it-works {\n padding: 50px 20px;\n text-align: + center;\n}\n\n.how-to-use {\n padding: 50px 20px;\n text-align: center;\n}\n.tutorials + {\n padding: 50px 20px;\n text-align: center;\n}\n\nh2 {\n font-size: 2.5rem;\n margin-bottom: + 20px;\n text-align: center;\n}\n\n.how-it-works ol {\n list-style: decimal inside;\n text-align: + left;\n max-width: 800px;\n margin: 0 auto;\n padding: 0;\n}\n\n.image-placeholder + {\n margin: 30px auto;\n height: 200px;\n width: 100%;\n max-width: 800px;\n display: + flex;\n justify-content: center;\n align-items: center;\n font-size: 1.2rem;\n border-radius: + 8px;\n}\n\n.image-placeholder img {\n margin: 10px;\n width: 100%;\n height: + 100%;\n object-fit: cover;\n border-radius: 8px;\n}\n\n.get-started {\n background: + var(--primary-color);\n color: var(--white);\n padding: 50px 20px;\n text-align: + center;\n}\n\n.get-started pre {\n background: var(--white);\n color: #333;\n padding: + 10px;\n margin: 20px 0;\n border-radius: 5px;\n}\n\ndiv.video {\n padding-top: + 25px;\n}\n\npre {\n text-align: left;\n}\n\n@media (min-width: 768px) {\n .example + {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: + 20px;\n }\n iframe {\n width: 100%;\n height: 500px;\n }\n}\niframe {\n max-width: + 100%;\n}\nsection  {\n width: 100%;\n}\n\nsection:nth-child(even) .example {\n text-align: + right;\n flex-direction: row-reverse !important;\n}\nsection:nth-child(odd) .example + {\n text-align: left;\n flex-direction: row;\n}\nsection:nth-child(even) .example + h3  {\n text-align: right;\n}\n\n.example > div {\n flex: 1 1 200px;\n align-content: + center;\n}\n\ncode.hljs {\n border-radius: 5px;\n box-shadow: 0 6px 15px rgba(0, + 0, 0, 0.5);\n}\np code {\n background: var(--dark-color);\n color: var(--light-color);\n padding: + 1px 5px;\n border-radius: 5px;\n display: inline-block;\n}\n\nsection.alternate:nth-child(odd) + {\n background: var(--light-color);\n color: var(--dark-color);\n}\nsection.alternate:nth-child(even) + {\n background: var(--dark-color);\n color: var(--light-color);\n}\n\n#menu-toggle + {\n position: fixed;\n z-index: 11;\n margin: 0;\n}\n@media (min-width: 768px) + {\n #menu-toggle {\n display: none;\n }\n .navbar {\n background: var(--white);\n color: + var(--dark-color);\n display: flex;\n justify-content: space-evenly;\n align-items: + center;\n position: fixed;\n top: 0px;\n z-index: 10;\n width: 100%;\n }\n\n .navbar + .container {\n padding: 0;\n }\n\n nav ul {\n display: flex;\n flex-wrap: + wrap;\n list-style: none;\n }\n nav ul li {\n margin: 0 10px;\n }\n nav + ul li a {\n color: var(--dark-color);\n text-decoration: none;\n display: + block;\n padding: 10px;\n }\n nav ul li a:hover {\n color: var(--light-color);\n background: + var(--dark-color);\n }\n nav ul li a.active {\n color: var(--light-color) + !important;\n background: var(--dark-color) !important;\n }\n}\n\n@media (max-width: + 768px) {\n .navbar {\n display: none !important;\n }\n\n .navbar:hover,\n #menu-toggle:focus + ~ .navbar {\n display: block !important;\n }\n .navbar {\n opacity: 0.8;\n position: + fixed;\n top: 10px;\n left: 0px;\n color: var(--white);\n font-size: + 1rem;\n cursor: pointer;\n background: var(--dark-color);\n color: var(--white);\n display: + flex;\n justify-content: space-between;\n align-items: center;\n padding: + 10px 20px;\n border: 1px solid var(--dark-color);\n box-shadow: 0 2px 5px + rgba(0, 0, 0, 0.1);\n border-radius: 5px;\n }\n .navbar:has(a:active) {\n display: + none;\n }\n nav ul {\n display: block;\n list-style: none;\n padding: + 0;\n margin: 0;\n }\n nav ul li {\n margin: 0;\n }\n nav ul li a {\n color: + var(--white);\n text-decoration: none;\n display: block;\n padding: 10px;\n }\n}\n\nfooter + {\n display: flex;\n flex-wrap: wrap;\n background: #333;\n color: #fff;\n text-align: + center;\n padding: 20px 0;\n font-size: 0.9rem;\n flex-wrap: wrap;\n}\n\nfooter + section {\n padding: 20px;\n text-align: center;\n flex: 1 1 250px;\n}\nfooter + section p {\n font-weight: bold;\n}\nfooter ul {\n list-style: none;\n padding: + 0;\n}\nfooter ul li {\n margin: 5px 0;\n}\n\nfooter a {\n color: var(--white);\n}\n\nfooter + .container {\n display: flex;\n flex: 1 1 auto;\n justify-content: space-between;\n align-items: + start;\n width: 100%;\n flex-wrap: wrap;\n}\nfooter .container > p {\n flex: + 1 1 auto;\n text-align: center;\n}\n\nfooter section {\n flex: 1 1 auto;\n align-self: + normal;\n position: relative;\n}\n\n@media (min-width: 768px) {\n footer section:after + {\n content: \" \";\n display: block;\n background: #fff;\n position: + absolute;\n right: 0;\n top: 5%;\n height: 90%;\n width: 1px;\n filter: + opacity(0.5) blur(1px);\n }\n\n footer section:last-child:after {\n display: + none;\n }\n}\n\n.large-icon {\n font-size: 3rem;\n}\n\n@keyframes bouncing {\n 0% + {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-20px);\n }\n 100% + {\n transform: translateY(0);\n }\n}\n\n.down {\n position: relative;\n bottom: + 0;\n}\n\na.down {\n background: var(--white);\n color: var(--dark-color);\n width: + 120px;\n height: 120px;\n display: flex;\n align-items: center;\n justify-content: + center;\n border-radius: 50%;\n align-self: center;\n animation: bouncing 2s + infinite;\n}\n"],"names":[],"version":3,"file":"index.82434563.css.map"}' + index.html: "Katenary + - Effortless Helm Chart Conversion
+

Katenary

Effortless Helm Chart Conversion for Kubernetes Deployments

+
+

Why + Katenary?

Simplify your deployment workflow by converting Compose files + into production-ready Helm Charts with ease.

+

Automated Conversion

Generate complete + Helm Charts from your Compose files effortlessly.

+

Flexible Configuration

Customize deployments with `values.yaml` and + environment labels.

Dependency Management

+

Ensure proper service startup sequences using `depends_on` support.

+

Open Source

Free, opensource, under the + MIT license!

+

How It Works

Katenary + simply read your compose.yaml file (or docker-compose.yaml) + and use official libraries to read it and generate Kubernetes + resources as YAML.

Then, it adds templating conditions, values file, + define a Chart.yaml file, adapt dependencies if needed, and many + others things.

Using configuration files to be mounted? + No problem, Katenary will create ConfigMaps if you declared that + thes directories or files are statics.
(Do not do this for sources + of your project, use it for simple configuration files)

The result + is a complete \"Helm Chart\" that can be installed, configured, packaged and shared. +

\"Katenary

Almost everything can be overriden as Ingresses, + Dependencies, values, environment variables, secrets...

  1. Add optional + labels to your Compose files.
  2. Run katenary convert from + the command line.
  3. Deploy the generated Helm Chart in Kubernetes.
  4. +

How to use?

Install the binary, and use katenar + convert command line inside your project directory

You can adapt + your compose YAML file with labels, or add a compose.katenary.yaml + file to override your project.

You may also use a specific katenary.yaml + file that accepts the directives without using labels.

+

Only add labels! + (if needed!)

You can adapt, configure, or change the conversion behaviour + addind labels.

It doesn't change the docker compose + or podman compose behaviour. It is only used while using + katenary compose command line

There are plenty of labels to help you to customize and adapt the + resulting Helm Chart.

\n#
+    your \"docker-compose.yml\", or \"compose.yaml\"\nservices:\nweb:\n  image: docker.io/nginx:latest\n
+    \ ports:\n    - \"80:80\"\n  labels:\n    # generate an ingress resource in the
+    Helm Chart\n    katenary.io/ingress: |-\n      hostname: example.com\n      port:
+    80\n          
+

Ease the deployment

+

Kubernetes somtimes lacks of automation. Katenary helps you to add what is + needed, like having a depends_on feature.

\n# your \"docker-compose.yml\",
+    or \"compose.yaml\"\nservices:\n  db:\n    image: docker.io/postgres:latest\n
+    \   # ...\n    labels:\n      katenary.v3/ports: |-\n        - 5432\n      \n
+    \ web:\n    image: php:fpm\n    # ...\n    depends_on:\n      - db\n            
+
+

Watch the Tutorials

A playlist is progressivelly filled to help the Katenary + adoption. Take a look and learn how it is simple.

+

Get Started

Download Katenary’s binary and + start using it today.

sh <(curl -sSL https://raw.githubusercontent.com/metal3d/katenary/master/install.sh)
+

Go to + GitHub

" +kind: ConfigMap +metadata: + annotations: + katenary.v3/compose-hash: 07a6c3341d6d1030ebf49ee3a618c3296c87ae32 + katenary.v3/version: develop-628b35d + labels: + {{- include "website.labels" . | nindent 4 }} + katenary.v3/component: server + name: '{{ include "website.fullname" . }}-server-dist' diff --git a/chart/values.yaml b/chart/values.yaml new file mode 100644 index 0000000..22a89fe --- /dev/null +++ b/chart/values.yaml @@ -0,0 +1,78 @@ +# This file is autogenerated by katenary +# +# DO NOT EDIT IT BY HAND UNLESS YOU KNOW WHAT YOU ARE DOING +# +# If you want to change the content of this file, you should edit the +# compose file and run katenary again. +# If you need to override some values, you can do it in a override file +# and use the -f flag to specify it when running the helm command. + + + +# imagePullSecrets allows you to specify a name of an image pull secret. +# You must provide a list of object with the name field set to the name of the +# e.g. +# pullSecrets: +# - name: regcred +# You are, for now, responsible for creating the secret. +pullSecrets: [] + +# server configuration +server: + # key: server.repository + repository: + # key: server.repository.image + image: docker.io/nginx + # key: server.repository.tag + tag: "" + # Default value for ingress.class annotation + # class: "-" + # If the value is "-", controller will not set ingressClassName + # If the value is "", Ingress will be set to an empty string, so + # controller will use the default value for ingressClass + # If the value is specified, controller will set the named class e.g. "nginx" + # key: server.ingress + ingress: + # key: server.ingress.annotations + annotations: {} + # key: server.ingress.host + host: katenary.org + # key: server.ingress.path + path: / + # key: server.ingress.class + class: '-' + # key: server.ingress.enabled + enabled: false + # key: server.ingress.tls + tls: + # key: server.ingress.tls.enabled + enabled: true + # key: server.replicas + replicas: 1 + # key: server.nodeSelector + nodeSelector: {} + # Resources allows you to specify the resource requests and limits for a service. + # Resources are used to specify the amount of CPU and memory that + # a container needs. + # + # e.g. + # resources: + # requests: + # memory: "64Mi" + # cpu: "250m" + # limits: + # memory: "128Mi" + # cpu: "500m" + # key: server.resources + resources: {} + # imagePullPolicy allows you to specify a policy to cache or always pull an image. + # You must provide a string value with one of the following values: + # - Always -> will always pull the image + # - Never -> will never pull the image, the image should be present on the node + # - IfNotPresent -> will pull the image only if it is not present on the node + # key: server.imagePullPolicy + imagePullPolicy: IfNotPresent + # key: server.serviceAccount + serviceAccount: "" + +# vim: ft=yaml