[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
From: |
Mathieu Othacehe |
Date: |
Fri, 28 May 2021 05:25:46 -0400 (EDT) |
branch: master
commit 54bff10fc7a85707360deb382c4118d3de18f159
Author: Mathieu Othacehe <othacehe@gnu.org>
AuthorDate: Fri May 28 11:21:58 2021 +0200
Add badges support.
* src/static/images/badge-error.svg: New file.
* src/static/images/badge-per.svg: New file.
* src/static/images/badge-running.svg: New file.
* Makefile.am (dist_images_DATA): Add them.
* src/cuirass/templates.scm (badge-svg): New procedure.
* src/cuirass/http.scm (badge-string): New procedure.
(url-handler): Add a new "/jobset/spec/badge" route.
* doc/cuirass.texi (Badges): New section.
---
Makefile.am | 3 +
doc/cuirass.texi | 20 ++++
src/cuirass/http.scm | 20 ++++
src/cuirass/templates.scm | 34 ++++++-
src/static/images/badge-error.svg | 179 ++++++++++++++++++++++++++++++++++++
src/static/images/badge-per.svg | 127 +++++++++++++++++++++++++
src/static/images/badge-running.svg | 179 ++++++++++++++++++++++++++++++++++++
7 files changed, 561 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 8135feb..c0de526 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -113,6 +113,9 @@ dist_fonts_DATA = \
src/static/fonts/open-iconic.ttf \
src/static/fonts/open-iconic.woff
dist_images_DATA = \
+ src/static/images/badge-error.svg \
+ src/static/images/badge-per.svg \
+ src/static/images/badge-running.svg \
src/static/images/guix.png \
src/static/images/icon.png
dist_js_DATA = \
diff --git a/doc/cuirass.texi b/doc/cuirass.texi
index 3735db2..1a252dc 100644
--- a/doc/cuirass.texi
+++ b/doc/cuirass.texi
@@ -53,6 +53,7 @@ Documentation License''.
* Introduction:: What is Cuirass about?
* Specifications:: Writing Cuirass specifications.
* Notifications:: Build notifications.
+* Badges:: Cuirass badges.
* Parameters:: Cuirass parameters.
* Build modes:: Build modes.
* Invocation:: How to run Cuirass.
@@ -294,6 +295,25 @@ the @var{spec} specification.
@end itemize
@c *********************************************************************
+@node Badges
+@chapter Badges
+@cindex cuirass badges
+
+Cuirass is able to generate SVG badges that can be integrated inside
+your favorite forge.
+
+@itemize
+@item @url{http://cuirass-url/jobset/spec/badge}
+Generates a badge for the @code{spec} specification. The badge
+represents the percentage of successful jobs for the latest evaluation
+of the @code{spec} specification. If the latest evaluation is still
+being processed, a @code{running} badge is generated. If no
+evaluation could be found for the @code{spec} specification, an
+@code{error} badge is generated.
+
+@end itemize
+
+@c *********************************************************************
@node Parameters
@chapter Parameters
@cindex cuirass parameters
diff --git a/src/cuirass/http.scm b/src/cuirass/http.scm
index 9232b5d..10c60bd 100644
--- a/src/cuirass/http.scm
+++ b/src/cuirass/http.scm
@@ -38,6 +38,7 @@
#:use-module (srfi srfi-26)
#:use-module (ice-9 binary-ports)
#:use-module (ice-9 match)
+ #:use-module (ice-9 textual-ports)
#:use-module (ice-9 format)
#:use-module (json)
#:use-module (web request)
@@ -468,6 +469,12 @@ passed, only display JOBS targeting this SYSTEM."
(#:link . ,(string-append "/eval/" (number->string evaluation-id)))))
#:margin? #f)))
+(define (badge-string name)
+ "Return the content of the badge file with the given NAME as a string."
+ (call-with-input-file
+ (string-append (%static-directory) "/images/" name)
+ get-string-all))
+
;;;
;;; Web server.
@@ -493,6 +500,10 @@ passed, only display JOBS targeting this SYSTEM."
(respond '((content-type . (text/plain)))
#:body body ...))
+ (define-syntax-rule (respond-svg body ...)
+ (respond '((content-type . (image/svg+xml)))
+ #:body body ...))
+
(define-syntax-rule (respond-json-with-error error-code message)
(respond
(build-response #:headers '((content-type . (application/json)))
@@ -1063,6 +1074,15 @@ passed, only display JOBS targeting this SYSTEM."
,@params))
#:params params))))
+ (('GET "jobset" spec "badge")
+ (let* ((params (request-parameters request))
+ (summary
+ (match (db-get-evaluations-build-summary spec 1 #f #f)
+ ((summary) summary)
+ (else #f))))
+ (respond-svg
+ (badge-svg badge-string summary))))
+
(('GET "workers")
(respond-html
(html-page
diff --git a/src/cuirass/templates.scm b/src/cuirass/templates.scm
index b816398..bccddc4 100644
--- a/src/cuirass/templates.scm
+++ b/src/cuirass/templates.scm
@@ -53,7 +53,8 @@
global-metrics-content
workers-status
machine-status
- evaluation-dashboard))
+ evaluation-dashboard
+ badge-svg))
(define (navigation-items navigation)
(match navigation
@@ -1925,3 +1926,34 @@ text-dark d-flex position-absolute w-100"))
(div (@ (id "dashboard")
(class "invisible")
(url ,jobs))))))
+
+(define (badge-svg badge-string summary)
+ "Return the badge SVG for the specification with the given SUMMARY. The
+BADGE-STRING procedure takes a badge name as input an returns the badge
+content as a string."
+ (define complete?
+ (eq? (assq-ref summary #:status) 0))
+
+ (cond
+ ((not summary)
+ (badge-string "badge-error.svg"))
+ (complete?
+ (let* ((succeeded
+ (assq-ref summary #:succeeded))
+ (failed
+ (assq-ref summary #:failed))
+ (scheduled
+ (assq-ref summary #:scheduled))
+ (percentage
+ (nearest-exact-integer
+ (* 100
+ (/ succeeded
+ (+ succeeded failed scheduled)))))
+ (percentage-str
+ (string-append
+ (number->string percentage) "%")))
+ (string-replace-substring
+ (badge-string "badge-per.svg")
+ "X%" percentage-str)))
+ (else
+ (badge-string "badge-running.svg"))))
diff --git a/src/static/images/badge-error.svg
b/src/static/images/badge-error.svg
new file mode 100644
index 0000000..803ec4d
--- /dev/null
+++ b/src/static/images/badge-error.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="99.998856"
+ height="26.153"
+ id="svg2"
+ version="1.1"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+ sodipodi:docname="badge-error.svg">
+ <title
+ id="title3831">Cuirass icon</title>
+ <defs
+ id="defs4">
+ <rect
+ x="9094.3613"
+ y="2431.5554"
+ width="363.25549"
+ height="110.18591"
+ id="rect226" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="71.646296"
+ inkscape:cy="11.632562"
+ inkscape:document-units="px"
+ inkscape:current-layer="g328"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="false"
+ borderlayer="true"
+ inkscape:document-rotation="0"
+ inkscape:snap-global="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-bbox="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ showborder="false">
+ <inkscape:grid
+ type="axonomgrid"
+ id="grid3004"
+ units="mm"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingy="3.7mm"
+ originx="-8829.3366"
+ originy="-1180.3996" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Cuirass icon</dc:title>
+ <dc:date>2021-01-09</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Luis Felipe López Acevedo</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="ref"
+ sodipodi:insensitive="true"
+ transform="translate(-8814.2185,-1148.2736)" />
+ <g
+ inkscape:label="layer"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-8814.2185,-2000.6358)">
+ <text
+ xml:space="preserve"
+ id="text224"
+
style="font-style:normal;font-weight:normal;font-size:96px;line-height:0;font-family:sans-serif;white-space:pre;shape-inside:url(#rect226);fill:#000000;fill-opacity:1;stroke:none;"><tspan
+ style="visibility:hidden"
+ x="9094.3613"
+ y="2631.4797"><tspan
+ dx="0 61.078125 61.078125"
+
style="font-size:96px;line-height:1.35;fill:#ff6600">40%</tspan></tspan></text>
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path244"
+ transform="translate(9421.1025,2673.3733)" />
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path246"
+ transform="translate(9421.1025,2673.3733)" />
+ <g
+ id="g328"
+ transform="matrix(0.13076492,0,0,0.13076492,7664.8791,1688.7373)">
+ <rect
+ style="fill:#191919;fill-opacity:1;stroke:none;stroke-width:0.284347"
+ id="rect4281"
+ width="200"
+ height="200.00011"
+ x="8789.3555"
+ y="2385.1848" />
+ <g
+ id="g1247"
+ transform="matrix(0.75,0,0,0.75,1729.7789,386.40491)">
+ <path
+ id="path4303"
+
style="fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:1.40209;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9551.1873,2698.3734 v 38.6156 h 15.2577 v -3.0224 l
6.7796,-6.7797 h 20.339 20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644
0 0 1 0,0.2698 v 20.3389 l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v
-3.7572 h -15.2577 v 54.2372 h 15.2577 v -3.0223 l 6.7796,-6.7797 h 20.339
20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644 0 0 1 0,0.2698 v 20.3389
l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v -3.7573 h -15.2577 v
39.3506 h 82.2034 l 12.7119,-12.71 [...]
+ <path
+ id="path4305"
+ style="fill:#ffffff;fill-opacity:1;stroke-width:1.86014"
+ d="m 9458.8145,2698.3733 -12.7119,12.7119 v 174.5763 l
12.7119,12.7119 h 82.2034 v -39.3506 -8.9545 h 35.5966 v 5.9322 l 3.3898,3.3898
h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898 h -27.1186 l
-3.3898,3.3898 v 5.9322 h -35.5966 v -9.6895 -54.2372 -8.9546 h 35.5966 v
5.9322 l 3.3898,3.3898 h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898
h -27.1186 l -3.3898,3.3898 v 5.9322 h -35.5966 v -9.6894 -38.6157 z m
13.5593,16.9492 h 51.6949 v 166.1017 h -51.6949 l -9. [...]
+ </g>
+ <path
+ style="fill:#191919;fill-opacity:1;stroke-width:0.844933"
+ d="m 8989.3555,2485.1848 v -100 h 282.3611 282.3612 v 100 100 h
-282.3612 -282.3611 z"
+ id="path222" />
+ <text
+ xml:space="preserve"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:98.8576px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:0.726558"
+ x="9513.0264"
+ y="2418.6541"
+ id="text260"
+ transform="scale(0.96288659,1.0385439)"><tspan
+ sodipodi:role="line"
+ id="tspan258"
+ x="9513.0264"
+ y="2418.6541"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#ff0000;stroke-width:0.726558">error</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/src/static/images/badge-per.svg b/src/static/images/badge-per.svg
new file mode 100644
index 0000000..f882cce
--- /dev/null
+++ b/src/static/images/badge-per.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ width="99.998856"
+ height="26.153"
+ id="svg2"
+ version="1.1">
+ <title
+ id="title3831">Cuirass icon</title>
+ <defs
+ id="defs4">
+ <rect
+ x="9094.3613"
+ y="2431.5554"
+ width="363.25549"
+ height="110.18591"
+ id="rect226" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Cuirass icon</dc:title>
+ <dc:date>2021-01-09</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Luis Felipe López Acevedo</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer2"
+ transform="translate(-8814.2185,-1148.2736)" />
+ <g
+ id="layer1"
+ transform="translate(-8814.2185,-2000.6358)">
+ <text
+ xml:space="preserve"
+ id="text224"
+
style="font-style:normal;font-weight:normal;font-size:96px;line-height:0;font-family:sans-serif;white-space:pre;shape-inside:url(#rect226);fill:#000000;fill-opacity:1;stroke:none;"><tspan
+ style="visibility:hidden"
+ x="9094.3613"
+ y="2631.4797"><tspan
+ dx="0 61.078125 61.078125"
+
style="font-size:96px;line-height:1.35;fill:#ff6600">40%</tspan></tspan></text>
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path244"
+ transform="translate(9421.1025,2673.3733)" />
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path246"
+ transform="translate(9421.1025,2673.3733)" />
+ <g
+ id="g328"
+ transform="matrix(0.13076492,0,0,0.13076492,7664.8791,1688.7373)">
+ <rect
+ style="fill:#191919;fill-opacity:1;stroke:none;stroke-width:0.284347"
+ id="rect4281"
+ width="200"
+ height="200.00011"
+ x="8789.3555"
+ y="2385.1848" />
+ <g
+ id="g1247"
+ transform="matrix(0.75,0,0,0.75,1729.7789,386.40491)">
+ <path
+ id="path4303"
+
style="fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:1.40209;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9551.1873,2698.3734 v 38.6156 h 15.2577 v -3.0224 l
6.7796,-6.7797 h 20.339 20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644
0 0 1 0,0.2698 v 20.3389 l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v
-3.7572 h -15.2577 v 54.2372 h 15.2577 v -3.0223 l 6.7796,-6.7797 h 20.339
20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644 0 0 1 0,0.2698 v 20.3389
l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v -3.7573 h -15.2577 v
39.3506 h 82.2034 l 12.7119,-12.71 [...]
+ <path
+ id="path4305"
+ style="fill:#ffffff;fill-opacity:1;stroke-width:1.86014"
+ d="m 9458.8145,2698.3733 -12.7119,12.7119 v 174.5763 l
12.7119,12.7119 h 82.2034 v -39.3506 -8.9545 h 35.5966 v 5.9322 l 3.3898,3.3898
h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898 h -27.1186 l
-3.3898,3.3898 v 5.9322 h -35.5966 v -9.6895 -54.2372 -8.9546 h 35.5966 v
5.9322 l 3.3898,3.3898 h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898
h -27.1186 l -3.3898,3.3898 v 5.9322 h -35.5966 v -9.6894 -38.6157 z m
13.5593,16.9492 h 51.6949 v 166.1017 h -51.6949 l -9. [...]
+ </g>
+ <path
+ style="fill:#191919;fill-opacity:1;stroke-width:0.844933"
+ d="m 8989.3555,2485.1848 v -100 h 282.3611 282.3612 v 100 100 h
-282.3612 -282.3611 z"
+ id="path222" />
+ <text
+ xml:space="preserve"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:98.8576px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:0.726558"
+ x="9530.4248"
+ y="2427.2546"
+ id="text260"
+ transform="scale(0.96288659,1.0385439)"><tspan
+ id="tspan258"
+ x="9530.4248"
+ y="2427.2546"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;stroke-width:0.726558">X%</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/src/static/images/badge-running.svg
b/src/static/images/badge-running.svg
new file mode 100644
index 0000000..0a4b096
--- /dev/null
+++ b/src/static/images/badge-running.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="99.998856"
+ height="26.153"
+ id="svg2"
+ version="1.1"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+ sodipodi:docname="badge_running.svg">
+ <title
+ id="title3831">Cuirass icon</title>
+ <defs
+ id="defs4">
+ <rect
+ x="9094.3613"
+ y="2431.5554"
+ width="363.25549"
+ height="110.18591"
+ id="rect226" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="71.646296"
+ inkscape:cy="11.632563"
+ inkscape:document-units="px"
+ inkscape:current-layer="g328"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="false"
+ borderlayer="true"
+ inkscape:document-rotation="0"
+ inkscape:snap-global="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-bbox="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ showborder="false">
+ <inkscape:grid
+ type="axonomgrid"
+ id="grid3004"
+ units="mm"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingy="3.7mm"
+ originx="-8829.3366"
+ originy="-1180.3996" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Cuirass icon</dc:title>
+ <dc:date>2021-01-09</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Luis Felipe López Acevedo</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="ref"
+ sodipodi:insensitive="true"
+ transform="translate(-8814.2185,-1148.2736)" />
+ <g
+ inkscape:label="layer"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-8814.2185,-2000.6358)">
+ <text
+ xml:space="preserve"
+ id="text224"
+
style="font-style:normal;font-weight:normal;font-size:96px;line-height:0;font-family:sans-serif;white-space:pre;shape-inside:url(#rect226);fill:#000000;fill-opacity:1;stroke:none;"><tspan
+ style="visibility:hidden"
+ x="9094.3613"
+ y="2631.4797"><tspan
+ dx="0 61.078125 61.078125"
+
style="font-size:96px;line-height:1.35;fill:#ff6600">40%</tspan></tspan></text>
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path244"
+ transform="translate(9421.1025,2673.3733)" />
+ <path
+ style="fill:#fd7e14;fill-opacity:1;stroke-width:0.707107"
+ d=""
+ id="path246"
+ transform="translate(9421.1025,2673.3733)" />
+ <g
+ id="g328"
+ transform="matrix(0.13076492,0,0,0.13076492,7664.8791,1688.7373)">
+ <rect
+ style="fill:#191919;fill-opacity:1;stroke:none;stroke-width:0.284347"
+ id="rect4281"
+ width="200"
+ height="200.00011"
+ x="8789.3555"
+ y="2385.1848" />
+ <g
+ id="g1247"
+ transform="matrix(0.75,0,0,0.75,1729.7789,386.40491)">
+ <path
+ id="path4303"
+
style="fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:1.40209;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9551.1873,2698.3734 v 38.6156 h 15.2577 v -3.0224 l
6.7796,-6.7797 h 20.339 20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644
0 0 1 0,0.2698 v 20.3389 l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v
-3.7572 h -15.2577 v 54.2372 h 15.2577 v -3.0223 l 6.7796,-6.7797 h 20.339
20.339 l 6.7797,6.7797 v 20.0692 a 27.118644,27.118644 0 0 1 0,0.2698 v 20.3389
l -6.7797,6.7797 h -20.339 -20.339 l -6.7796,-6.7797 v -3.7573 h -15.2577 v
39.3506 h 82.2034 l 12.7119,-12.71 [...]
+ <path
+ id="path4305"
+ style="fill:#ffffff;fill-opacity:1;stroke-width:1.86014"
+ d="m 9458.8145,2698.3733 -12.7119,12.7119 v 174.5763 l
12.7119,12.7119 h 82.2034 v -39.3506 -8.9545 h 35.5966 v 5.9322 l 3.3898,3.3898
h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898 h -27.1186 l
-3.3898,3.3898 v 5.9322 h -35.5966 v -9.6895 -54.2372 -8.9546 h 35.5966 v
5.9322 l 3.3898,3.3898 h 27.1186 l 3.3899,-3.3898 v -27.1187 l -3.3899,-3.3898
h -27.1186 l -3.3898,3.3898 v 5.9322 h -35.5966 v -9.6894 -38.6157 z m
13.5593,16.9492 h 51.6949 v 166.1017 h -51.6949 l -9. [...]
+ </g>
+ <path
+ style="fill:#191919;fill-opacity:1;stroke-width:0.844933"
+ d="m 8989.3555,2485.1848 v -100 h 282.3611 282.3612 v 100 100 h
-282.3612 -282.3611 z"
+ id="path222" />
+ <text
+ xml:space="preserve"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:98.8576px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#fd7e14;fill-opacity:1;stroke:none;stroke-width:0.726558"
+ x="9455.4414"
+ y="2420.0381"
+ id="text260"
+ transform="scale(0.96288659,1.0385439)"><tspan
+ sodipodi:role="line"
+ id="tspan258"
+ x="9455.4414"
+ y="2420.0381"
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;stroke-width:0.726558">running</tspan></text>
+ </g>
+ </g>
+</svg>