Siteimprove CMS
Plugin SDK
General
Token endpoint: https://my2.siteimprove.com/auth/token?cms=nameOfCMS
- Authentication is not needed to reach this endpoint.
- Returns a json payload with one key
token
. - The token should be persisted in the CMS.
- The url parameter "cms" is the name and version of the CMS, e.g. Drupal 8. You can use spaces using
normal URL encoding such as
cms=Drupal%208
.
Script: https://cdn.siteimprove.net/cms/overlay-latest.js. See more details about script versioning below.
Script
The script's functionality is available globally under the name _si
.
-
It has 8 core functions:
-
input(url, token, callback)
is used by the CMS to inform the plugin that we're at a place in the CMS where a single page is in context and that we're on a page that might have been checked by Siteimprove. The "callback" parameter is optional (or can be set asnull
) but when set, will be called when data has been successfully fetched. The token has to be provided, and be the value from the token endpoint above. You can also provide an empty URL (ornull
) and the plugin will know that no page is currently in context and clear out existing data. -
clear(callback, token)
is used by the CMS to inform the plugin that the previously passed URL for theinput
function is not longer in scope and the results should be cleared. Use this function if the CMS is navigating away from editing a page and e.g. going to a settings page. This is the same as callinginput
with an empty ornull
URL, and the "callback" and "token" parameters are the same as above.Note that the "token" parameter was added as part of version 2 of the plugin and was therefor added as the last parameter even though the "callback" parameter is optional. We consider "token" as mandatory with the newest version because the plugin can now also be initialized with
clear
, and we need the token upon initialization. -
recheck(url, token, callback)
is used by the CMS to start a full recheck of a single page outside of the regular Siteimprove crawl schedule, and can be used by the CMS for either a user action or called automatically when a new version of a page is published. The "url" parameter is the page to recheck and "callback" and "token" is used the same way as above. Note that the callback is called when the recheck is successfully ordered and not finished. -
contentcheck(content, url, token, callback)
is used by the CMS to push the HTML content of a page and run checks before the page is published. Content - the html content (as text) to be checked before publishing. The URL is optional but when provided it is used to provide better context to the checks - e.g. for resolving relative resource links in the page. The URL doesn't have to be the same as the provided URL in theinput
call and is handled separately by the content check. The "token" and "callback" parameters are the same as for the above calls. -
contentcheck-flat-dom(contentDOM, url, token, callback)
is used by the CMS to push a DOM reference for the plugin to traverse and run checks before the page is published (previously known as "contentcheck", but now called "prepublish check"). The URL is optional but when provided it is used to provide better context to the checks - e.g. for resolving relative resource links in the DOM. The URL doesn't have to be the same as the provided URL in theinput
call and is handled separately by the content check. The "token" and "callback" parameters are the same as for the above calls.The DOM reference must be the DOM node of the rendered page - it can be the Document node of an
<iframe>
or a new window, but the content must be done rendering before calling this function, and the content must be accessible with JavaScript (so on the same domain to avoid XSS errors). This will trigger a JavaScript "traversal" of the DOM, which is then uploaded and analyzed by Siteimprove.It is possible to also call this function after having called
clear
, in which case we will show the plugin in a special prepublish-only mode where we focus on just prepublish and we don't display data about the last crawl data for the selected page. This mode can be used to check issues on a DOM that is not a full page such as a shared component, snippet or widget. -
contentcheck-zip(zip, url, token, callback)
is a function that can be used by the CMS to check ZIP files before publishing. The first parameter is a zipped archive in file bytes containing the ZIP content to be checked, as well inside any related js- or css-files. The second parameter is an optional URL which can provide better context for the checks, especially for resolving relative resource links in the page. The URL doesn't have to be the same as the provided URL in the input call and is handled separately by the content check. The "token" and "callback" parameters are the same as for the above calls.Upon calling this function, the content will be sent to the ContentCheck API for analysis. The API will take into account any scripts and stylesheets included in the archive when analyzing the HTML.
-
registerPrepublishCallback(callback)
is used by the CMS to provide a way for the CMS plugin to ask for the DOM reference for running a prepublish "content check" test on the current page. In version 2 of the plugin we have added the ability to start the prepublish check from inside the CMS plugin itself as research has found that the feature could be hard to discover. If the CMS registers a callback with this method, the plugin will then show a button to "pull" the DOM from the CMS to be checked, but the CMS is also able to "push" the DOM to the plugin with thecontentcheck-flat-dom
method.The "callback" parameter can also be
null
, in which case the CMS plugin will dynamically remove the button to pull the DOM again. So the CMS should call this method with either a valid callback ornull
depending on if we're in a situation where it's possible to collect the DOM.The callback method must provide the DOM of the rendered page, which can be the Document node of an
<iframe>
or a new window, but the content must be accessible with javascript (so on the same domain to avoid XSS errors). This will be used in a JavaScript "traversal" of the DOM, which is then uploaded and analyzed by Siteimprove.The callback method must have one of the following signatures:
function() : [Promise<document>, function(): void] function() : Promise<document> function() : [document, function(): void] function() : document
The way the DOM is returned can be either as a Promise the resolves into a document element, or just the document element itself. If you end up opening a window or
<iframe>
"on demand", it may be useful to return a promise that resolves once the document is done rendering (by tying it up to a window event). However, if you already have a "preview" of the content open, you can simply return the document element.Either the callback returns just the DOM element, or an array with the DOM and a function that will be invoked once the DOM is analyzed - this function can be used for closing a window or
<iframe>
that may have been opened specifically for rendering the DOM. -
onHighlight(callback)
takes one parameter - the callback which will be called when trying to highlight an issue in the CMS. You can set the callback at any time and you can set it tonull
if highlighting is not supported at some point. The callback will receive one parameter structured like this, where offset is optional:
{ highlights: [ { selector: "<string>", offset: { start: <number>, length: <number> } }, { selector: "<string>" } }, ... ] }
-
-
It has 1 utility function:
showlog()
with no parameters. This will show an internal log for the script. This way it is possible to see what is going on inside the script.
Script versioning
The current version of the CMS plugin SDK is 2.x and a few breaking changes were made to the original 1.x version:
- The
domain
function is no-longer supported. The function was used for the CMS plugin to show site-wide information, but this has now been deprecated and we focus only on page-specific issues. - The
recrawl
function is no-longer supported. The function was used to trigger a full crawl of the whole site, but now the focus is on individual pages instead. - The
clear
function now also takes in the token as a paramater. This is becauseclear
may also be used to initialize the plugin, at which point we need to know the token.
Originally the script path was https://cdn.siteimprove.net/cms/overlay.js and for backwards compatibility this path still servers the original version.
To better support future updates, we are now publishing several versions of overlay.js and are changing the recommendation to use the following:
- https://cdn.siteimprove.net/cms/overlay-latest.js: Always the latest code. At the moment this will be version 2.x but with future updates this will always be the latest version.
- https://cdn.siteimprove.net/cms/overlay-v2.js: This is guaranteed to deliver you version 2.x if you are not ready to just accept the very latest.
- https://cdn.siteimprove.net/cms/overlay-v1.js: This is pointing to the original version 1.x and can be used if you want to stay on the old version while to make sure version 2.x has feature parity with version 1.x.
At some point we will fully deprecate version 1.x and at that point https://cdn.siteimprove.net/cms/overlay.js will serve the version 2.x code as well. We now recommend all CMS's to switch to using https://cdn.siteimprove.net/cms/overlay-latest.js going forward.
Order of function calls
The CMS plugin is initialized when you call either input
or clear
, so make sure these are
the first calls you make. registerPrepublishCallback
and onHighlight
can be called at any
time. contentcheck-flat-dom
can be called either after a call to input
or
clear
.
Using the functions
In order to handle the script being loaded asynchronously, the script functionality is used in a different way than
just a function call in the variable. But it means a little bit extra work when calling function in _ si
- Input function
var _si = window._si || [];
_si.push([
"input",
"<url-goes-here>",
"<token-goes-here>",
function () {
console.log("Inputted page specific url to Siteimprove");
},
]);
- Clear function
var _si = window._si || [];
_si.push([
"clear",
function () {
console.log("Cleared");
},
"<token-goes-here>",
]);
- ContentcheckFlatDom function
var _si = window._si || [];
_si.push([
"contentcheck-flat-dom",
domContent,
"<url-goes-here>",
"<token-goes-here>",
function () {
console.log("Pre-publish check ordered (flat dom version)");
},
]);
- ContentcheckZip function
var _si = window._si || [];
_si.push([
"contentcheck-zip",
zipFileInBytes,
"<url-goes-here>",
"<token-goes-here>",
function () {
console.log("Pre-publish check ordered (zip version)");
},
]);
- RegisterPrepublishCallback function
var _si = window._si || [];
_si.push(["registerPrepublishCallback", getDomCallback]);
// To disable prepublish again
_si.push(["registerPrepublishCallback", null]);
- onHighlight function
var _si = window._si || [];
_si.push([
"onHighlight",
function (highlightInfo) {
console.log("Highlight " + highlightInfo);
},
]);
// Example implementation of rendering the page in a popup window
var getDomCallback = async function () {
var pageWindow = window.open(
pageUrl,
"Page Preview",
"width=400,height=500"
);
var promise = new Promise(function (resolve, reject) {
pageWindow.addEventListener(
"load",
() => {
resolve(pageWindow.document);
},
{ once: true }
);
});
var document = await promise;
return [
document,
() => {
pageWindow.close();
},
];
};
How to provide the best Prepublish experience
To provide the best and fastest prepublish experience, we suggest to use the direct DOM method (or
"FlatDOM") where Siteimprove receives a DOM reference through either the contentcheck-flat-dom
or registerPrepublishCallback
methods. For this to work, however, the CMS has to generate the DOM for the
page and this can provide some challenges:
-
If the DOM is not automatically available, we suggest to create a new
<iframe>
on the page, render it there and then pass the CMS plugin the DOM from there. -
Some checks might be dependent on the screen size, so the
<iframe>
should have the same size as current view. -
What we have found to work it to dynamically (with JavaScript) add a new
<div>
add the end of<body>
. In this, create a new<iframe>
element with the url that renders a preview of the page. Finally, setstyle='height:100vh; width:100%'
to the<iframe>
to get it to render at the bottom of the document but with same height and width as the main page. -
Make sure to only render the actual concent of the page in the new
<iframe>
; No extra menus from the CMS and don't load the Siteimprove overlay script which will render the CMS plugin icon in the side. -
Add an event handler in JavaScript for the
load
event on the<iframe>
and in there you can get the DOM reference throughcontentWindow.document
on the<iframe>
element. Once thecontentcheck-flat-dom
orregisterPrepublishCallback
is done, the<iframe>
and<div>
can be removed again.
Server-side recheck or recrawl
As well as the client-side call to recheck
a single page as listed above, we also offer rechecks and
recrawls initiated by the CMS server-side using a HTTP REST endpoint. It must be called by a HTTP POST to this
endpoint: https://api-gateway.siteimprove.com/cms-recheck
.
The endpoint will receive a JSON payload describing the URL, token and type of check.
Recheck page
{
"url": "url",
"token": "token",
"type": "recheck"
}
Recrawl site
{
"url": "url",
"token": "token",
"type": "recrawl"
}
The Siteimprove icon
If you need to show the official Siteimprove icon on a button or other action in the CMS, we suggest using this official SVG:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 220 19">
<defs>
<style>
.cls-1 {
fill: none;
}
.cls-2 {
fill: #0d4cd3;
}
.cls-3, .cls-4 {
fill: #202124;
}
.cls-4 {
fill-rule: evenodd;
}
.cls-5 {
clip-path: url(#clippath);
}
</style>
<clipPath id="clippath">
<rect class="cls-1" width="220" height="19"/>
</clipPath>
</defs>
<!-- Generator: Adobe Illustrator 28.7.1, SVG Export Plug-In . SVG Version: 1.2.0 Build 142) -->
<g>
<g id="Layer_1">
<g class="cls-5">
<g>
<g>
<path class="cls-3" d="M108.99,8.968c-.156-.69-.441-1.287-.855-1.791-.408-.51-.927-.906-1.557-1.188-.63-.288-1.347-.432-2.151-.432-.732,0-1.404.12-2.016.36-.606.234-1.134.567-1.584.999-.444.432-.792.945-1.044,1.539-.246.594-.369,1.245-.369,1.953,0,.978.213,1.833.639,2.565.426.726,1.02,1.293,1.782,1.701.762.402,1.647.603,2.655.603.456,0,.933-.051,1.431-.153.504-.096.978-.228,1.422-.396.45-.174.816-.369,1.098-.585l-.927-1.998c-.444.294-.909.513-1.395.657-.486.138-.999.207-1.539.207-.486,0-.912-.075-1.278-.225-.366-.156-.654-.369-.864-.639-.21-.27-.318-.585-.324-.945h6.894c.144-.804.138-1.548-.018-2.232ZM102.294,9.211c.048-.462.258-.831.63-1.107.378-.276.852-.414,1.422-.414.564,0,1.011.138,1.341.414s.501.645.513,1.107h-3.906Z"/>
<polygon class="cls-3" points="94.019 11.905 92.229 5.828 89.062 5.828 92.302 15.008 95.74 15.008 98.862 5.828 95.766 5.828 94.019 11.905"/>
<path class="cls-3" d="M86.052,6.223c-.768-.444-1.653-.666-2.655-.666-.75,0-1.437.132-2.061.396-.624.258-1.164.615-1.62,1.071-.456.45-.81.969-1.062,1.557-.246.582-.369,1.194-.369,1.836,0,.882.216,1.692.648,2.43.438.738,1.041,1.329,1.809,1.773.768.438,1.653.657,2.655.657.75,0,1.437-.132,2.061-.396.624-.264,1.164-.621,1.62-1.071.456-.45.807-.966,1.053-1.548.246-.588.369-1.203.369-1.845,0-.882-.216-1.692-.648-2.43-.432-.738-1.032-1.326-1.8-1.764ZM85.323,11.65c-.192.348-.456.618-.792.81-.336.186-.714.279-1.134.279s-.798-.093-1.134-.279c-.336-.192-.603-.462-.801-.81-.192-.348-.288-.759-.288-1.233,0-.48.096-.891.288-1.233.192-.348.456-.615.792-.801.336-.192.717-.288,1.143-.288s.807.096,1.143.288c.336.186.597.453.783.801.192.342.288.753.288,1.233,0,.474-.096.885-.288,1.233Z"/>
<path class="cls-3" d="M76.745,5.539c-.534,0-1.029.108-1.485.324s-.822.561-1.098,1.035v-1.071h-2.952v9.18h2.952v-4.671c0-.618.18-1.086.54-1.404.366-.324.828-.486,1.386-.486.228,0,.456.024.684.072.228.042.444.099.648.171l.351-3.033c-.156-.03-.315-.057-.477-.081s-.345-.036-.549-.036Z"/>
<path class="cls-3" d="M67.268,6.16c-.684-.402-1.464-.603-2.34-.603-.702,0-1.32.12-1.854.36-.528.24-.963.561-1.305.963v-1.053h-2.547v12.96h2.943v-4.509c.36.318.765.564,1.215.738.456.174.954.261,1.494.261.678,0,1.296-.123,1.854-.369.564-.246,1.053-.588,1.467-1.026.414-.444.732-.96.954-1.548.228-.594.342-1.233.342-1.917,0-.972-.198-1.824-.594-2.556s-.939-1.299-1.629-1.701ZM66.314,11.65c-.192.348-.456.618-.792.81-.336.186-.717.279-1.143.279s-.807-.093-1.143-.279c-.33-.192-.591-.462-.783-.81s-.288-.759-.288-1.233c0-.48.096-.891.288-1.233.192-.348.456-.615.792-.801.336-.192.714-.288,1.134-.288.426,0,.804.096,1.134.288.336.186.6.453.792.801.198.342.297.753.297,1.233,0,.474-.096.885-.288,1.233Z"/>
<path class="cls-3" d="M55.444,6.07c-.51-.342-1.209-.513-2.097-.513-.684,0-1.329.135-1.935.405-.606.264-1.089.687-1.449,1.269-.18-.51-.516-.915-1.008-1.215-.486-.306-1.065-.459-1.737-.459-.348,0-.693.054-1.035.162-.342.102-.663.258-.963.468-.3.204-.561.462-.783.774v-1.134h-2.952v9.18h2.952v-5.238c0-.288.069-.546.207-.774.144-.234.342-.42.594-.558s.543-.207.873-.207c.51,0,.9.156,1.17.468.276.306.414.717.414,1.233v5.076h2.952v-5.238c0-.288.069-.546.207-.774.144-.234.342-.42.594-.558.252-.138.54-.207.864-.207.516,0,.909.156,1.179.468.27.306.405.717.405,1.233v5.076h2.952v-5.922c0-.6-.108-1.167-.324-1.701-.21-.54-.57-.978-1.08-1.314Z"/>
<path class="cls-3" d="M37.547,1.184c-.474,0-.888.147-1.242.441-.348.294-.522.693-.522,1.197s.174.906.522,1.206c.354.294.768.441,1.242.441.48,0,.894-.147,1.242-.441.348-.3.522-.702.522-1.206s-.174-.903-.522-1.197c-.348-.294-.762-.441-1.242-.441Z"/>
<rect class="cls-3" x="36.071" y="5.828" width="2.952" height="9.18"/>
<path class="cls-3" d="M33.375,7.177c-.408-.51-.927-.906-1.557-1.188-.63-.288-1.347-.432-2.151-.432-.732,0-1.404.12-2.016.36-.606.234-1.134.567-1.584.999-.444.432-.792.945-1.044,1.539-.246.594-.369,1.245-.369,1.953,0,.978.213,1.833.639,2.565.426.726,1.02,1.293,1.782,1.701.762.402,1.647.603,2.655.603.456,0,.933-.051,1.431-.153.504-.096.978-.228,1.422-.396.45-.174.816-.369,1.098-.585l-.927-1.998c-.444.294-.909.513-1.395.657-.486.138-.999.207-1.539.207-.486,0-.912-.075-1.278-.225-.366-.156-.654-.369-.864-.639-.21-.27-.318-.585-.324-.945h6.894c.144-.804.138-1.548-.018-2.232-.156-.69-.441-1.287-.855-1.791ZM27.534,9.211c.048-.462.258-.831.63-1.107.378-.276.852-.414,1.422-.414.564,0,1.011.138,1.341.414s.501.645.513,1.107h-3.906Z"/>
<path class="cls-3" d="M22.742,12.604c-.18.042-.363.063-.549.063-.342,0-.621-.099-.837-.297s-.324-.543-.324-1.035v-3.168h2.151v-2.34h-2.151v-2.628h-2.952v2.628h-1.782v2.34h1.782v3.681c0,1.14.291,1.998.873,2.574.582.57,1.383.855,2.403.855.444,0,.864-.057,1.26-.171.396-.108.735-.24,1.017-.396l-.378-2.313c-.156.09-.327.159-.513.207Z"/>
<rect class="cls-3" x="11.901" y="5.828" width="2.952" height="9.18"/>
<path class="cls-3" d="M13.377,1.184c-.474,0-.888.147-1.242.441-.348.294-.522.693-.522,1.197s.174.906.522,1.206c.354.294.768.441,1.242.441.48,0,.894-.147,1.242-.441.348-.3.522-.702.522-1.206s-.174-.903-.522-1.197c-.348-.294-.762-.441-1.242-.441Z"/>
<path class="cls-3" d="M6.408,7.582l-1.098-.324c-.498-.15-.894-.288-1.188-.414-.288-.126-.495-.258-.621-.396-.12-.144-.18-.321-.18-.531,0-.258.081-.48.243-.666.168-.192.399-.339.693-.441s.639-.153,1.035-.153c.402,0,.801.051,1.197.153s.762.243,1.098.423.618.39.846.63l1.458-2.16c-.498-.48-1.158-.858-1.98-1.134-.816-.282-1.701-.423-2.655-.423-.69,0-1.329.099-1.917.297-.582.192-1.089.465-1.521.819-.432.348-.768.762-1.008,1.242-.24.474-.36.993-.36,1.557,0,.876.285,1.626.855,2.25.57.624,1.503,1.116,2.799,1.476l1.08.306c.762.204,1.281.417,1.557.639.282.222.423.495.423.819,0,.396-.195.699-.585.909-.384.204-.885.306-1.503.306-.438,0-.891-.054-1.359-.162-.462-.114-.897-.273-1.305-.477-.408-.204-.744-.447-1.008-.729l-1.404,2.232c.624.534,1.386.942,2.286,1.224.9.282,1.827.423,2.781.423,1.026,0,1.911-.171,2.655-.513.75-.342,1.329-.816,1.737-1.422.408-.612.612-1.317.612-2.115,0-.912-.288-1.653-.864-2.223-.576-.57-1.509-1.044-2.799-1.422Z"/>
</g>
<g>
<path class="cls-2" d="M219.267,5.567c-.162-.024-.345-.036-.549-.036-.534,0-1.029.108-1.485.324-.456.216-.822.561-1.098,1.035v-1.071h-2.952v9.18h2.952v-4.671c0-.618.18-1.086.54-1.404.366-.324.828-.486,1.386-.486.228,0,.456.024.684.072.228.042.444.099.648.171l.351-3.033c-.156-.03-.315-.057-.477-.081Z"/>
<path class="cls-2" d="M210.487,7.169c-.408-.51-.927-.906-1.557-1.188-.63-.288-1.347-.432-2.151-.432-.732,0-1.404.12-2.016.36-.606.234-1.134.567-1.584.999-.444.432-.792.945-1.044,1.539-.246.594-.369,1.245-.369,1.953,0,.978.213,1.833.639,2.565.426.726,1.02,1.293,1.782,1.701.762.402,1.647.603,2.655.603.456,0,.933-.051,1.431-.153.504-.096.978-.228,1.422-.396.45-.174.816-.369,1.098-.585l-.927-1.998c-.444.294-.909.513-1.395.657-.486.138-.999.207-1.539.207-.486,0-.912-.075-1.278-.225-.366-.156-.654-.369-.864-.639-.21-.27-.318-.585-.324-.945h6.894c.144-.804.138-1.548-.018-2.232-.156-.69-.441-1.287-.855-1.791ZM204.646,9.203c.048-.462.258-.831.63-1.107.378-.276.852-.414,1.422-.414.564,0,1.011.138,1.341.414s.501.645.513,1.107h-3.906Z"/>
<path class="cls-2" d="M198.465,6.152c-.684-.402-1.464-.603-2.34-.603-.702,0-1.32.12-1.854.36-.528.24-.963.561-1.305.963v-1.053h-2.547v12.96h2.943v-4.509c.36.318.765.564,1.215.738.456.174.954.261,1.494.261.678,0,1.296-.123,1.854-.369.564-.246,1.053-.588,1.467-1.026.414-.444.732-.96.954-1.548.228-.594.342-1.233.342-1.917,0-.972-.198-1.824-.594-2.556s-.939-1.299-1.629-1.701ZM197.511,11.642c-.192.348-.456.618-.792.81-.336.186-.717.279-1.143.279s-.807-.093-1.143-.279c-.33-.192-.591-.462-.783-.81-.192-.348-.288-.759-.288-1.233,0-.48.096-.891.288-1.233.192-.348.456-.615.792-.801.336-.192.714-.288,1.134-.288.426,0,.804.096,1.134.288.336.186.6.453.792.801.198.342.297.753.297,1.233,0,.474-.096.885-.288,1.233Z"/>
<path class="cls-2" d="M186.242,6.215c-.768-.444-1.653-.666-2.655-.666-.75,0-1.437.132-2.061.396-.624.258-1.164.615-1.62,1.071-.456.45-.81.969-1.062,1.557-.246.582-.369,1.194-.369,1.836,0,.882.216,1.692.648,2.43.438.738,1.041,1.329,1.809,1.773.768.438,1.653.657,2.655.657.75,0,1.437-.132,2.061-.396s1.164-.621,1.62-1.071c.456-.45.807-.966,1.053-1.548.246-.588.369-1.203.369-1.845,0-.882-.216-1.692-.648-2.43-.432-.738-1.032-1.326-1.8-1.764ZM185.513,11.642c-.192.348-.456.618-.792.81-.336.186-.714.279-1.134.279s-.798-.093-1.134-.279c-.336-.192-.603-.462-.801-.81-.192-.348-.288-.759-.288-1.233,0-.48.096-.891.288-1.233.192-.348.456-.615.792-.801.336-.192.717-.288,1.143-.288s.807.096,1.143.288c.336.186.597.453.783.801.192.342.288.753.288,1.233,0,.474-.096.885-.288,1.233Z"/>
<rect class="cls-2" x="173.79" y="2.039" width="2.952" height="12.96"/>
<path class="cls-2" d="M171.094,7.169c-.408-.51-.927-.906-1.557-1.188-.63-.288-1.347-.432-2.151-.432-.732,0-1.404.12-2.016.36-.606.234-1.134.567-1.584.999-.444.432-.792.945-1.044,1.539-.246.594-.369,1.245-.369,1.953,0,.978.213,1.833.639,2.565.426.726,1.02,1.293,1.782,1.701.762.402,1.647.603,2.655.603.456,0,.933-.051,1.431-.153.504-.096.978-.228,1.422-.396.45-.174.816-.369,1.098-.585l-.927-1.998c-.444.294-.909.513-1.395.657-.486.138-.999.207-1.539.207-.486,0-.912-.075-1.278-.225-.366-.156-.654-.369-.864-.639-.21-.27-.318-.585-.324-.945h6.894c.144-.804.138-1.548-.018-2.232-.156-.69-.441-1.287-.855-1.791ZM165.253,9.203c.048-.462.258-.831.63-1.107.378-.276.852-.414,1.422-.414.564,0,1.011.138,1.341.414s.501.645.513,1.107h-3.906Z"/>
<polygon class="cls-2" points="156.978 11.895 155.189 5.818 152.021 5.818 155.261 14.998 158.699 14.998 161.822 5.818 158.726 5.818 156.978 11.895"/>
<path class="cls-2" d="M150.492,7.169c-.408-.51-.927-.906-1.557-1.188-.63-.288-1.347-.432-2.151-.432-.732,0-1.404.12-2.016.36-.606.234-1.134.567-1.584.999-.444.432-.792.945-1.044,1.539-.246.594-.369,1.245-.369,1.953,0,.978.213,1.833.639,2.565.426.726,1.02,1.293,1.782,1.701.762.402,1.647.603,2.655.603.456,0,.933-.051,1.431-.153.504-.096.978-.228,1.422-.396.45-.174.816-.369,1.098-.585l-.927-1.998c-.444.294-.909.513-1.395.657-.486.138-.999.207-1.539.207-.486,0-.912-.075-1.278-.225-.366-.156-.654-.369-.864-.639-.21-.27-.318-.585-.324-.945h6.894c.144-.804.138-1.548-.018-2.232-.156-.69-.441-1.287-.855-1.791ZM144.651,9.203c.048-.462.258-.831.63-1.107.378-.276.852-.414,1.422-.414.564,0,1.011.138,1.341.414s.501.645.513,1.107h-3.906Z"/>
<path class="cls-2" d="M137.424,3.199c-.984-.534-2.13-.801-3.438-.801h-4.32v12.6h4.32c.984,0,1.878-.15,2.682-.45.804-.306,1.497-.738,2.079-1.296.582-.558,1.029-1.221,1.341-1.989.318-.774.477-1.629.477-2.565,0-1.242-.276-2.334-.828-3.276-.552-.948-1.323-1.689-2.313-2.223ZM137.172,10.21c-.168.438-.414.807-.738,1.107-.318.3-.696.525-1.134.675-.438.15-.927.225-1.467.225h-1.179v-7.038h1.179c.714,0,1.341.135,1.881.405.546.264.969.66,1.269,1.188.3.522.45,1.164.45,1.926,0,.57-.087,1.074-.261,1.512Z"/>
</g>
<path class="cls-4" d="M119.181,0c.552,0,1,.448,1,1v17c0,.552-.448,1-1,1s-1-.448-1-1V1C118.181.448,118.628,0,119.181,0Z"/>
</g>
</g>
</g>
</g>
</svg>