diff --git a/.eslintrc.js b/.eslintrc.js index af05af0f6e402..e66331594b4ae 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -491,6 +491,7 @@ module.exports = { 'x-pack/dev-tools/mocha/setup_mocha.js', 'x-pack/scripts/*.js', ], + excludedFiles: ['**/integration_tests/**/*'], rules: { 'import/no-commonjs': 'off', 'prefer-object-spread/prefer-object-spread': 'off', diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f9f43b804fc92..f327206464090 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -131,6 +131,7 @@ /src/legacy/server/saved_objects/ @elastic/kibana-platform /src/legacy/server/status/ @elastic/kibana-platform /src/plugins/status_page/ @elastic/kibana-platform +/src/plugins/saved_objects_management/ @elastic/kibana-platform /src/dev/run_check_published_api_changes.ts @elastic/kibana-platform # Security diff --git a/.i18nrc.json b/.i18nrc.json index 78c4be6f4a356..c293b3103a39c 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -33,6 +33,7 @@ "newsfeed": "src/plugins/newsfeed", "regionMap": "src/legacy/core_plugins/region_map", "savedObjects": "src/plugins/saved_objects", + "savedObjectsManagement": "src/plugins/saved_objects_management", "server": "src/legacy/server", "statusPage": "src/legacy/core_plugins/status_page", "telemetry": [ @@ -51,10 +52,7 @@ "visTypeVega": "src/legacy/core_plugins/vis_type_vega", "visTypeVislib": "src/legacy/core_plugins/vis_type_vislib", "visTypeXy": "src/legacy/core_plugins/vis_type_xy", - "visualizations": [ - "src/plugins/visualizations", - "src/legacy/core_plugins/visualizations" - ] + "visualizations": "src/plugins/visualizations" }, "exclude": [ "src/legacy/ui/ui_render/ui_render_mixin.js" diff --git a/docs/apm/custom-links.asciidoc b/docs/apm/custom-links.asciidoc new file mode 100644 index 0000000000000..75c1c9d0009a2 --- /dev/null +++ b/docs/apm/custom-links.asciidoc @@ -0,0 +1,218 @@ +[[custom-links]] +=== Custom links + +Elastic's custom link feature allows you to easily create up to 500 dynamic links +based on your specific APM data. +Custom links can be filtered to only appear in the APM app for relevant services, +environments, transaction types, or transaction names. + +Ready to dive in? Jump straight to the <>. + +[float] +[[custom-links-create]] +=== Create a link + +Each custom link consists of a label, url, and optional filter. +The easiest way to create a custom link is from within the actions dropdown in the transaction detail page. +This method will automatically apply filters, scoping the link to that specific service, +environment, transaction type, and transaction name. + +Alternatively, you can create a custom link in the APM app by navigating to **Settings** > **Customize UI**, +and selecting **Create custom link**. + +[float] +[[custom-links-label]] +==== Label + +The name of your custom link. +This text will be shown in the actions context menu, +so keep it as short as possible. + +TIP: Custom links are displayed alphabetically in the actions menu. + +[float] +[[custom-links-url]] +==== URL + +The URL your link points to. +URLs support dynamic field name variables, encapsulated in double curly brackets: `{{field.name}}`. +These variables will be replaced with transaction metadata when the link is clicked. + +Because everyone's data is different, +you'll need to examine your own traces to see what metadata is available for use. +The easiest way to do this is to select a trace in the APM app, and click **Metadata** in the **Trace Sample** table. + +[role="screenshot"] +image::apm/images/example-metadata.png[Example metadata] + +[float] +[[custom-links-filters]] +==== Filters + +Filter each link to only appear so it only appears for specific services or transactions. +You can filter on the following fields: + +* `service.name` +* `service.env` +* `transaction.type` +* `transaction.name` + +Multiple values are allowed when comma separated. + +[float] +[[custom-links-examples]] +=== Custom link examples + +// Relevant documentation links +:jira-query-params: https://confluence.atlassian.com/jirakb/how-to-create-issues-using-direct-html-links-in-jira-server-159474.html +:github-query-params: https://help.github.com/en/github/managing-your-work-on-github/about-automation-for-issues-and-pull-requests-with-query-parameters + +Not sure where to start with custom links? +Take a look at the examples below, and customize them to your liking! + +[float] +[[custom-links-examples-email]] +==== Email + +Email the owner of a service. + +|==== +|Label |`Email engineer` +|Link |`mailto:@.com` +|Filters |`service.name:` +|==== + +**Example** + +This link opens an email addressed to the team or owner of `python-backend`. +It will only appear on services with the name `python-backend`. + +|==== +|Label |`Email python-backend engineers` +|Link |`mailto:python_team@elastic.co` +|Filters |`service.name:python-backend` +|==== + +[float] +[[custom-links-examples-gh]] +==== GitHub issue + +Open a GitHub issue with pre-populated metadata from the selected trace sample. + +|==== +|Label |`Open an issue in ` +|Link |`https://github.com///issues/new?title=&body=<BODY>` +|Filters |`service.name:client` +|==== + +**Example** + +This link opens a new GitHub issue in the apm-agent-rum repository. +It populates the issue body with relevant metadata from the currently active trace. +Clicking this link results in the following issue being created: + +[role="screenshot"] +image::apm/images/create-github-issue.png[Example github issue] + +|==== +|Label |`Open an issue in apm-rum-js` +|Link |`https://github.com/elastic/apm-agent-rum-js/issues/new?title=Investigate+APM+trace&body=Investigate+the+following+APM+trace%3A%0D%0A%0D%0Aservice.name%3A+{{service.name}}%0D%0Atransaction.id%3A+{{transaction.id}}%0D%0Acontainer.id%3A+{{container.id}}%0D%0Aurl.full%3A+{{url.full}}` +|Filters |`service.name:client` +|==== + +See the {github-query-params}[GitHub automation documentation] for a full list of supported query parameters. + +[float] +[[custom-links-examples-jira]] +==== Jira task + +Create a Jira task with pre-populated metadata from the selected trace sample. + +|==== +|Label |`Open an issue in Jira` +|Link |`https://<JIRA_BASE_URL>/secure/CreateIssueDetails!init.jspa?<ARGUMENTS>` +|==== + +**Example** + +This link creates a new task on the Engineering board in Jira. +It populates the issue body with relevant metadata from the currently active trace. +Clicking this link results in the following task being created in Jira: + +[role="screenshot"] +image::apm/images/create-jira-issue.png[Example jira issue] + +|==== +|Label |`Open a task in Jira` +|Link |`https://test-site-33.atlassian.net/secure/CreateIssueDetails!init.jspa?pid=10000&issuetype=10001&summary=Created+via+APM&description=Investigate+the+following+APM+trace%3A%0D%0A%0D%0Aservice.name%3A+{{service.name}}%0D%0Atransaction.id%3A+{{transaction.id}}%0D%0Acontainer.id%3A+{{container.id}}%0D%0Aurl.full%3A+{{url.full}}` +|==== + +See the {jira-query-params}[Jira application administration knowledge base] +for a full list of supported query parameters. + +[float] +[[custom-links-examples-kib]] +==== Kibana dashboards + +Link to a custom dashboard in Kibana. + +|==== +|Label |`Open transaction in custom visualization` +|Link |`https://kibana-instance/app/kibana#/dashboard?_g=query:(language:kuery,query:'transaction.id:{{transaction.id}}'...` +|==== + +**Example** + +This link opens the current `transaction.id` in a custom kibana dashboard. +There are no filters set. + +|==== +|Label |`Open transaction in Python drilldown viz` +|URL |`https://kibana-instance/app/kibana#/dashboard?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(description:'',filters:!(),fullScreenMode:!f,options:(hidePanelTitles:!f,useMargins:!t),panels:!((embeddableConfig:(),gridData:(h:15,i:cb79c1c0-1af8-472c-aaf7-d158a76946fb,w:24,x:0,y:0),id:c8c74b20-6a30-11ea-92ab-b5d3feff11df,panelIndex:cb79c1c0-1af8-472c-aaf7-d158a76946fb,type:visualization,version:'7.7')),query:(language:kuery,query:'transaction.id:{{transaction.id}}'),timeRestore:!f,title:'',viewMode:edit)` +|==== + +[float] +[[custom-links-examples-slack]] +==== Slack channel + +Open a specified slack channel. + +|==== +|Label |`Open SLACK_CHANNEL` +|Link |`https://COMPANY_SLACK.slack.com/archives/SLACK_CHANNEL` +|Filters |`service.name` : `SERVICE_NAME` +|==== + +**Example** + +This link opens a company slack channel, #apm-support. +It only appears when `transaction.name` is `GET user/login`. + +|==== +|Label |`Open #apm-user-support` +|Link |`https://microsoft.slack.com/archives/efk52kt23k` +|Filters |`transaction.name:GET user/login` +|==== + +[float] +[[custom-links-examples-web]] +==== Website + +Open an internal or external website. + +|==== +|Label |`Open <WEBSITE>` +|Link |`https://<COMPANY_SLACK>.slack.com/archives/<SLACK_CHANNEL>` +|Filters |`service.name:<SERVICE_NAME>` +|==== + +**Example** + +This link opens more data on a specific `user.email`. +It only appears on front-end transactions. + +|==== +|Label |`View user internally` +|Link |`https://internal-site.company.com/user/{{user.email}}` +|Filters |`service.name:client` +|==== diff --git a/docs/apm/images/create-github-issue.png b/docs/apm/images/create-github-issue.png new file mode 100644 index 0000000000000..81ea4e5e78c27 Binary files /dev/null and b/docs/apm/images/create-github-issue.png differ diff --git a/docs/apm/images/create-jira-issue.png b/docs/apm/images/create-jira-issue.png new file mode 100644 index 0000000000000..962c98df3f6c6 Binary files /dev/null and b/docs/apm/images/create-jira-issue.png differ diff --git a/docs/apm/images/example-metadata.png b/docs/apm/images/example-metadata.png new file mode 100644 index 0000000000000..0e35f90691723 Binary files /dev/null and b/docs/apm/images/example-metadata.png differ diff --git a/docs/apm/using-the-apm-ui.asciidoc b/docs/apm/using-the-apm-ui.asciidoc index 95ec41cf8a403..1361dc046e3b1 100644 --- a/docs/apm/using-the-apm-ui.asciidoc +++ b/docs/apm/using-the-apm-ui.asciidoc @@ -37,6 +37,8 @@ include::metrics.asciidoc[] include::agent-configuration.asciidoc[] +include::custom-links.asciidoc[] + include::advanced-queries.asciidoc[] include::settings.asciidoc[] diff --git a/docs/canvas/canvas-elements.asciidoc b/docs/canvas/canvas-elements.asciidoc index 1160b735154dc..85f0ee1150ba0 100644 --- a/docs/canvas/canvas-elements.asciidoc +++ b/docs/canvas/canvas-elements.asciidoc @@ -1,132 +1,132 @@ [role="xpack"] -[[element-intro]] -== Showcase your data with elements +[[add-canvas-elements]] +=== Add elements -Canvas _elements_ are the building blocks of your workpad. With elements, you can combine images, text, and visualizations to tell a story about your data. +Create a story about your data by adding elements to your workpad that include images, text, charts, and more. You can create your own elements and connect them to your data sources, add saved objects, and add your own images. -When you add elements to your workpad, you can: - -* <<connect-element-data,Connect the elements to your live data>> - -* <<configure-display-options,Choose how you want the element to appear on your workpad>> - -* <<configure-auto-refresh-interval,Change the data refresh interval>> +[float] +[[create-canvas-element]] +==== Create an element -* <<organize-element,Move and arrange elements on your workpad>> +Choose the type of element you want to use, then connect it to your own data. -* <<element-save,Save your elements>> +. Click *Add element*, then select the element you want to use. ++ +[role="screenshot"] +image::images/canvas-element-select.gif[Canvas elements] -[float] -[[add-canvas-element]] -=== Add elements to your workpad +. To familiarize yourself with the element, use the preconfigured data demo data. ++ +By default, most of the elements you create use demo data until you change the data source. The demo data includes a small data set that you can use to experiment with your element. -Choose the elements to display on your workpad, then familiarize yourself with the element using the preconfigured demo data. By default, most elements use demo data until you change the data source. The demo data includes a small sample data set that you can use to experiment with your element. +. To connect the element to your data, select *Data*, then select one of the following data sources: -To add a Canvas element: +* *{es} SQL* — Access your data in {es} using SQL syntax. For information about SQL syntax, refer to {ref}/sql-spec.html[SQL language]. -. Click *Add element*. +* *{es} raw data* — Access your raw data in {es} without the use of aggregations. Use {es} raw data when you have low volume datasets, or to plot exact, non-aggregated values. -. In the *Elements* window, select the element you want to use. -+ -[role="screenshot"] -image::images/canvas-element-select.gif[Canvas elements] +* *Timelion* — Access your time series data using <<timelion,Timelion>> queries. To use Timelion queries, you can enter a query using the <<lucene-query,Lucene Query Syntax>>. -. Play around with the default settings and see what the element can do. +[float] +[[canvas-add-object]] +==== Add a saved object -To add a map: +Add a <<managing-saved-objects,saved object>>, such as a map or Lens visualization, then customize it to fit your display needs. . Click *Embed object*. -. Select the map you want to add to the workpad. +. Select the object you want to add. + [role="screenshot"] image::images/canvas-map-embed.gif[] -NOTE: Demo data is only supported on Canvas elements. Maps do not support demo data. +. To use the customization options, click the panel menu, then select one of the following options: + +* *Edit map* — Opens <<maps,Maps>> so that you can edit the original map. + +* *Customize panel* — Specifies the object title options. -Want to use a different element? You can delete the element by selecting it, clicking the *Element options* icon in the top right, then selecting *Delete*. +* *Inspect* — Allows you to drill down into the element data. + +* *Customize time range* — Exposes a time filter dedicated to the map. [float] -[[connect-element-data]] -=== Connect the Canvas element to your data +[[canvas-add-image]] +==== Add your own image -When you have finished using the demo data, connect the Canvas element to a data source. +To personalize your workpad, add your own logos and graphics. -NOTE: Maps do not support data sources. To change the map data, refer to <<maps, Elastic Maps>>. +. Click *Manage assets*. -. Make sure that the element is selected, then select *Data*. +. On the *Manage workpad assets* window, drag and drop your images. -. Click *Change your data source*. +. To add the image to the workpad, click the *Create image element* icon. ++ +[role="screenshot"] +image::images/canvas-add-image.gif[] [float] -[[elasticsearch-sql-data-source]] -==== Connect to {es} SQL +[[move-canvas-elements]] +==== Organize elements + +Move and resize your elements to meet your design needs. -Access your data in {es} using SQL syntax. For information about SQL syntax, refer to {ref}/sql-spec.html[SQL language]. +* To move, click and hold the element, then drag to the new location. -. Click *{es} SQL*. +* To move by 1 pixel, select the element, press and hold Shift, then use your arrow keys. -. In the *{es} SQL query* box, enter your query, then *Preview* it. +* To move by 10 pixels, select the element, then use your arrow keys. -. If everything looks correct, *Save* it. +* To resize, click and drag the resize handles to the new dimensions. [float] -[[elasticsearch-raw-doc-data-source]] -==== Connect to {es} raw data +[[format-canvas-elements]] +==== Format elements -Access your raw data in {es} without the use of aggregations. Use {es} raw data when you have low volume datasets, or to plot exact, non-aggregated values. +Align, distribute, and reorder elements for consistency and readability across your workpad pages. -To use targeted queries, you can enter a query using the <<lucene-query,Lucene Query Syntax>>. +Access the align, distribute, and reorder options by clicking the *Element options* icon. -. Click *{es} raw documents*. +[role="screenshot"] +image::images/canvas_element_options.png[] -. In the *Index* field, enter the index pattern that you want to display. +To align elements: -. From the *Fields* dropdown, select the associated fields you want to display. +. Press and hold Shift, then select the elements you want to align. -. To sort the data, select an option from the *Sort Field* and *Sort Order* dropdowns. +. Click the , then select *Group*. -. For more targeted queries, enter a *Query* using the Lucene query string syntax. +. Click the *Element options* icon, then select *Alignment*. -. *Preview* the query. +. Select the alignment option. -. If your query looks correct, *Save* it. +To distribute elements: -[float] -[[timelion-data-source]] -==== Connect to Timelion +. Press and hold Shift, then select the elements you want to distribute. -Access your time series data using <<timelion,Timelion>> queries. To use Timelion queries, you can enter a query using the <<lucene-query,Lucene Query Syntax>>. +. Click the *Element options* icon, then select *Group*. -. Click *Timelion*. +. Click the *Element options* icon, then select *Distribution*. -. Enter a *Query* using the Lucene query string syntax. +. Select the distribution option. -. Enter the *Interval*, then *Preview* the query. +To reorder elements: -. If your query looks correct, *Save* it. +. Select the element you want to reorder. -[float] -[[configure-display-options]] -=== Choose the display options +. Click the *Element options* icon, then select *Order*. -Choose how you want the elements to appear on your workpad. +. Select the order option. [float] [[data-display]] -==== Specify how to display the data - -When you connect your element to a data source, the element often appears as a warning. To remove the error, specify the display options. +==== Change the element display options -. Click *Display* +Each element has its own display options to fit your design needs. -. Change the display options for the element. +To choose the display options, click *Display*, then make your changes. -[float] -[[element-display-container]] -==== Change the appearance of the element container - -Further define the appearance of the element container and border. +To define the appearance of the container and border: . Next to *Element style*, click *+*, then select *Container style*. @@ -134,17 +134,13 @@ Further define the appearance of the element container and border. . Change the *Appearance* and *Border* options. -[float] -[[apply-element-styles]] -==== Apply a set of styles - -To make your element look exactly the way you want, apply CSS overrides. +To apply CSS overrides: . Next to *Element style*, click *+*, then select *CSS*. . Enter the *CSS*. For example, to center the Markdown element, enter: + -[source,js] +[source,text] -------------------------------------------------- .canvasRenderEl h1 { text.align: center; @@ -154,137 +150,31 @@ text.align: center; . Click *Apply stylesheet*. [float] -[[configure-auto-refresh-interval]] -==== Change the data auto-refresh interval - -Increase or decrease how often your Canvas element data refreshes on your workpad. - -. In the top left corner, click the *Control settings* icon. - -. Under *Change auto-refresh interval*, select the interval you want to use. -+ -[role="screenshot"] -image::images/canvas-refresh-interval.png[Element data refresh interval] - -TIP: To manually refresh the data, click the *Refresh data* icon. - -[float] -[[canvas-time-range]] -==== Customize map time ranges - -Configure the maps on your workpad for a specific time range. - -From the panel menu, select *Customize time range* to expose a time filter dedicated to the map. - -[role="screenshot"] -image::images/canvas_map-time-filter.gif[] - -[float] -[[organize-element]] -=== Organize the elements on your workpad - -Choose where you want the elements to appear on your workpad. - -[float] -[[move-canvas-elements]] -==== Move elements - -Move the element to a preferred location on your workpad. As you move the element, notice the alignment lines that appear to help you place the element exactly where you want it. - -* Click and drag the element to your preferred location. - -* To move the element by 1 pixel, select the element, press and hold Shift, then use your arrow keys. - -* To move the element by 10 pixels, select the element, then use your arrow keys. - -[float] -[[resize-canvas-elements]] -==== Resize elements +[[save-elements]] +==== Save elements -Make your elements bigger or smaller than the default size. +To use the elements across all workpads, save the elements. -. Select the element. - -. Click and drag the resize handles to the size you want. - -[float] -[[align-canvas-elements]] -==== Align elements +When you're ready to save your element, select the element, then click the *Save as new element* icon. -Align two or more elements on your workpad. - -. Press and hold Shift, then select the elements you want to align. - -. Click the *Element options* icon in the top right corner, then select *Align elements*. - -. From the *Alignment* menu, select how you want to align the elements on the workpad. -+ [role="screenshot"] -image::images/canvas-align-elements.gif[Align elements] - -[float] -[[distribute-canvas-elements]] -==== Distribute elements - -Distribute three or more elements on your workpad. - -. Press and hold Shift, then select the elements you want to distribute. - -. Click the *Element options* icon in the top right corner, then select *Distribute elements*. +image::images/canvas_save_element.png[] -. From the *Distribution* menu, select how you want to distribute the elements on the workpad. -+ -[role="screenshot"] -image::images/canvas-distribute-elements.gif[Distribute elements] - -[float] -[[change-element-order]] -==== Change the element order - -Change the order of how the elements are displayed on your workpad. - -. Select an element. - -. In the top right corder, click the *Element options* icon. - -. Select *Order*, then select the order that you want the element to appear. - -[float] -[[zoom-in-out]] -=== Use the zoom options - -In the upper left corner, click the *Zoom controls* icon, then select one of the options. - -[role="screenshot"] -image::images/canvas-zoom-controls.png[Zoom controls] - -[float] -[[element-save]] -=== Save elements - -After you have made changes to elements, save them so that you can reuse them across all of your workpads. - -. Select the element that you want to save. -+ To save a group of elements, press and hold Shift, then select the elements you want to save. -. Click the *Save as new element* icon. - -. In the *Create new element* window, enter a *Name*. - -. Enter an optional *Description*, then click *Save*. - -. To access the element, click *Add element*, then select *My elements*. +To access your saved elements, click *Add element*, then select *My elements*. [float] -[[add-more-pages]] -=== Add pages +[[delete-elements]] +==== Delete elements -When you have run out of room on your workpad page, add more pages. +When you no longer need an element, delete it from your workpad. -. Click *Page 1*, then click *+*. +. Select the element you want to delete. -. On the *Page* editor panel on the right, select the page transition from the *Transition* dropdown. +. Click the *Element options* icon. + [role="screenshot"] -image::images/canvas-add-pages.gif[Add pages] +image::images/canvas_element_options.png[] + +. Select *Delete*. diff --git a/docs/canvas/canvas-present-workpad.asciidoc b/docs/canvas/canvas-present-workpad.asciidoc index 21b112f68eb69..486686cd857b5 100644 --- a/docs/canvas/canvas-present-workpad.asciidoc +++ b/docs/canvas/canvas-present-workpad.asciidoc @@ -1,12 +1,12 @@ [role="xpack"] [[canvas-present-workpad]] -== Present your workpad +=== Present your workpad When you are ready to present your workpad, use and enable the presentation options. [float] [[view-fullscreen-mode]] -=== View your workpad in fullscreen mode +==== View your workpad in fullscreen mode In the upper left corner, click the *Enter fullscreen mode* icon. @@ -15,7 +15,7 @@ image::images/canvas-fullscreen.png[Fullscreen mode] [float] [[enable-autoplay]] -=== Enable autoplay +==== Enable autoplay Automatically cycle through your workpads pages in fullscreen mode. diff --git a/docs/canvas/canvas-share-workpad.asciidoc b/docs/canvas/canvas-share-workpad.asciidoc index c46ba8a980ce2..dbba12865b8ca 100644 --- a/docs/canvas/canvas-share-workpad.asciidoc +++ b/docs/canvas/canvas-share-workpad.asciidoc @@ -1,12 +1,12 @@ [role="xpack"] [[workpad-share-options]] -== Share your workpad +=== Share your workpad When you've finished your workpad, you can share it outside of {kib}. [float] [[export-single-workpad]] -=== Export workpads +==== Export workpads Create a JSON file of your workpad that you can export outside of {kib}. @@ -21,7 +21,7 @@ Want to export multiple workpads? Go to the *Canvas workpads* view, select the w [float] [[create-workpad-pdf]] -=== Create a PDF +==== Create a PDF If you have a license that supports the {report-features}, you can create a PDF copy of your workpad that you can save and share outside {kib}. @@ -36,7 +36,7 @@ image::images/canvas-generate-pdf.gif[Generate PDF] [float] [[create-workpad-URL]] -=== Create a POST URL +==== Create a POST URL If you have a license that supports the {report-features}, you can create a POST URL that you can use to automatically generate PDF reports using Watcher or a script. @@ -51,7 +51,7 @@ image::images/canvas-create-URL.gif[Create POST URL] [float] [[add-workpad-website]] -=== Share the workpad on a website +==== Share the workpad on a website beta[] Canvas allows you to create _shareables_, which are workpads that you download and securely share on any website. To customize the behavior of the workpad on your website, you can choose to autoplay the pages or hide the workpad toolbar. @@ -70,13 +70,11 @@ NOTE: Shareable workpads encode the current state of the workpad in a JSON file. [float] [[change-the-workpad-settings]] -=== Change the settings +==== Change the settings After you've added the workpad to your website, you can change the autoplay and toolbar settings. -[float] -[[shareable-workpad-enable-autoplay]] -==== Change the autoplay settings +To change the autoplay settings: . In the lower right corner of the shareable workpad, click the settings icon. @@ -85,9 +83,7 @@ After you've added the workpad to your website, you can change the autoplay and [role="screenshot"] image::images/canvas_share_autoplay_480.gif[Autoplay settings] -[float] -[[hide-workpad-toolbar]] -==== Change the toolbar settings +To change the toolbar settings: . In the lower right corner, click the settings icon. diff --git a/docs/canvas/canvas-tutorial.asciidoc b/docs/canvas/canvas-tutorial.asciidoc index efc03f1c6c494..b6d684bdf5dde 100644 --- a/docs/canvas/canvas-tutorial.asciidoc +++ b/docs/canvas/canvas-tutorial.asciidoc @@ -12,7 +12,7 @@ For this tutorial, you'll need to add the <<add-sample-data, Sample eCommerce or [float] === Create and personalize your workpad -Your first step to working with Canvas is to create a workpad. +Your first step to working with Canvas is to create a workpad. . Open *Canvas*. @@ -43,7 +43,7 @@ You'll notice that the image is tagged as an asset, which allows you to reuse th Customize your data by connecting it to the Sample eCommerce orders data. -. Click *Add element*, then click *Metric*. +. Click *Add element*, then click *Metric*. + By default, the *Metric* element is connected to a demo data source, which enables you to experiment with the element before you connect it to your own data source. @@ -89,7 +89,7 @@ image::images/canvas-metric-element.png[] To show what your data can do, add charts, graphs, progress monitors, and more to your workpad. -. Click *Add element*, then click *Area chart*. +. Click *Add element*, then click *Area chart*. . To connect the element to your own data source, make sure that the element is selected, then click *Data*. @@ -117,7 +117,7 @@ image::images/canvas-chart-element.png[] [float] === Show how your data changes over time -To focus your data on a specific time range, add a time filter to your workpad. +To focus your data on a specific time range, add a time filter to your workpad. . Click *Add element*, then click *Time filter*. @@ -132,26 +132,30 @@ image::images/canvas-timefilter-element.png[] To see how the data changes, set the time filter to *Last 7 days*. As you change the time filter options, the metrics dynamically update. -Your workpad is now complete! Use the icons in the upper left corner to: +Your workpad is now complete! From the workpad menu, use the icons to: -* Display your workpad in fullscreen mode +* Configure the refresh rate for your data -* Download your workpad as a PDF report or JSON object +* Refresh the data that displays on your workpad -* Configure the refresh rate for your data +* Display your workpad in fullscreen mode + +* Control the zoom options * Share your workpad +* Hide the editing controls + [float] === Next steps -Now that you know the Canvas basics, you're ready to explore on your own. +Now that you know the Canvas basics, you're ready to explore on your own. Here are some things to try: -* Play with the {kibana-ref}/add-sample-data.html[sample Canvas workpads]. +* Play with the {kibana-ref}/add-sample-data.html[sample Canvas workpads]. -* Learn more about <<create-canvas-workpad,Workpads>>. +* Build presentations of your own live data with <<create-canvas-workpad,workpads>>. -* Learn more about <<element-intro,Elements>>. +* Learn more about <<add-canvas-elements,elements>> — the building blocks of your workpad. * Deep dive into the {kibana-ref}/canvas-function-reference.html[expression language and functions] that drive Canvas. diff --git a/docs/canvas/canvas-workpad.asciidoc b/docs/canvas/canvas-workpad.asciidoc index f833bd903b0bc..c5c163441439c 100644 --- a/docs/canvas/canvas-workpad.asciidoc +++ b/docs/canvas/canvas-workpad.asciidoc @@ -4,19 +4,19 @@ A Canvas _workpad_ provides you with a workspace where you can build presentations of your live data. -To create a workpad, you can: +To create a workpad, choose one of the following options: * <<blank-canvas-workpad,Build fully customizable presentations of your own data>> * <<canvas-template-workpad,Choose from a set of preconfigured workpad templates>> -* <<import-canvas-workpad,Import a workpad that someone else has already started>> - * <<sample-data-workpad,Gather inspiration from the {kib} sample data workpads>> +* <<import-canvas-workpad,Import a workpad that someone else has already started>> + [float] [[blank-canvas-workpad]] -=== Start with a blank page +=== Start with a blank workpad To use the background colors, images, and data of your choice, start with a blank workpad. @@ -69,21 +69,21 @@ Each of the sample data sets comes with a Canvas workpad that you can use for yo . Add a {kibana-ref}/add-sample-data.html[sample data set]. -. On the *Add Data to Kibana* page, click the *View data* dropdown list, then select *Canvas*. -+ -Need some more workpad inspiration? Check out the link:https://www.elastic.co/blog/[Elastic Blog]. +. On the *Add Data* page, click *View data*, then select *Canvas*. [float] [[apply-workpad-styles]] -== Apply a set of styles to the entire workpad +=== Apply a set of styles to the entire workpad -To make your workpad look exactly the way you want, use the editor on the right to apply CSS overrides. +To make your workpad look exactly the way you want, use the editor to apply CSS overrides. . Expand *Global CSS overrides*. -. Enter the CSS. For example, to change the background on every page, enter: +. Enter the CSS. ++ +For example, to change the background on every page, enter: + -[source,js] +[source,text] -------------------------------------------------- .canvasPage { background-color: #3990e6; @@ -91,3 +91,46 @@ background-color: #3990e6; -------------------------------------------------- . Click *Apply stylesheet*. + +[float] +[[configure-auto-refresh-interval]] +=== Change the auto-refresh interval + +Increase or decrease how often the data refreshes on your workpad. + +. In the top left corner, click the *Control settings* icon. + +. Under *Change auto-refresh interval*, select the interval you want to use. ++ +[role="screenshot"] +image::images/canvas-refresh-interval.png[Element data refresh interval] + +TIP: To manually refresh the data, click the *Refresh data* icon. + +[float] +[[zoom-in-out]] +=== Use the zoom options + +In the upper left corner, click the *Zoom controls* icon, then select one of the options. + +[role="screenshot"] +image::images/canvas-zoom-controls.png[Zoom controls] + +[float] +[[add-more-pages]] +=== Add pages + +Organize your ideas onto separate pages by adding more pages. + +. Click *Page 1*, then click *+*. + +. On the *Page* editor panel on the right, select the page transition from the *Transition* dropdown. ++ +[role="screenshot"] +image::images/canvas-add-pages.gif[Add pages] + +include::{kib-repo-dir}/canvas/canvas-elements.asciidoc[] + +include::{kib-repo-dir}/canvas/canvas-present-workpad.asciidoc[] + +include::{kib-repo-dir}/canvas/canvas-share-workpad.asciidoc[] diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md index 7e65ef85c8bec..afb6ea88f9fad 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md @@ -10,7 +10,7 @@ search: { aggs: { AggConfigs: typeof AggConfigs; - aggGroupNamesMap: () => Record<"buckets" | "metrics", string>; + aggGroupNamesMap: () => Record<"metrics" | "buckets", string>; aggTypeFilters: import("./search/aggs/filter/agg_type_filters").AggTypeFilters; CidrMask: typeof CidrMask; convertDateRangeToString: typeof convertDateRangeToString; diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index e756eb9b72905..259d725b3bf0d 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -23,6 +23,7 @@ | Function | Description | | --- | --- | | [getDefaultSearchParams(config)](./kibana-plugin-plugins-data-server.getdefaultsearchparams.md) | | +| [getTotalLoaded({ total, failed, successful })](./kibana-plugin-plugins-data-server.gettotalloaded.md) | | | [parseInterval(interval)](./kibana-plugin-plugins-data-server.parseinterval.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-server.plugin.md) | Static code to be shared externally | | [shouldReadFieldFromDocValues(aggregatable, esType)](./kibana-plugin-plugins-data-server.shouldreadfieldfromdocvalues.md) | | diff --git a/docs/images/canvas-add-image.gif b/docs/images/canvas-add-image.gif new file mode 100644 index 0000000000000..a2263e22c4c49 Binary files /dev/null and b/docs/images/canvas-add-image.gif differ diff --git a/docs/images/canvas-map-embed.gif b/docs/images/canvas-map-embed.gif index eadf521c3b4d1..59ef97e0ceae8 100644 Binary files a/docs/images/canvas-map-embed.gif and b/docs/images/canvas-map-embed.gif differ diff --git a/docs/images/canvas-refresh-interval.png b/docs/images/canvas-refresh-interval.png index f1c840f503ec4..99006a5b8f12d 100644 Binary files a/docs/images/canvas-refresh-interval.png and b/docs/images/canvas-refresh-interval.png differ diff --git a/docs/images/canvas-zoom-controls.png b/docs/images/canvas-zoom-controls.png index a7d2820a58925..892721b627027 100644 Binary files a/docs/images/canvas-zoom-controls.png and b/docs/images/canvas-zoom-controls.png differ diff --git a/docs/images/canvas_create_image.png b/docs/images/canvas_create_image.png new file mode 100644 index 0000000000000..7b7c38102e4c9 Binary files /dev/null and b/docs/images/canvas_create_image.png differ diff --git a/docs/images/canvas_element_options.png b/docs/images/canvas_element_options.png new file mode 100644 index 0000000000000..191348d919b50 Binary files /dev/null and b/docs/images/canvas_element_options.png differ diff --git a/docs/images/canvas_save_element.png b/docs/images/canvas_save_element.png new file mode 100644 index 0000000000000..a63f5135f2a0e Binary files /dev/null and b/docs/images/canvas_save_element.png differ diff --git a/docs/management/alerting/alert-details.asciidoc b/docs/management/alerting/alert-details.asciidoc new file mode 100644 index 0000000000000..b108f79fe5bad --- /dev/null +++ b/docs/management/alerting/alert-details.asciidoc @@ -0,0 +1,34 @@ +[role="xpack"] +[[alert-details]] +=== Alert details + +beta[] + +The *Alert details* page tells you about the state of the alert and provides granular control over the actions it is taking. + +[role="screenshot"] +image::images/alerts-details-instances-active.png[Alert details page with three alert instances] + +In this example, alerts detect when a site serves more than a threshold number of bytes in a 24 hour period. Three sites are above the threshold. These are called alert instances - occurrences of the condition being detected - and the instance name, status, time of detection, and duration of the condition are shown in this view. + +Upon detection, each instance can trigger one or more actions. If the condition persists, the same actions will trigger either on the next scheduled alert check, or (if defined) after the re-notify period on the alert has passed. To prevent re-notification, you can suppress future actions by clicking on the eye icon to mute an individual alert instance. Muting means that the alert checks continue to run on a schedule, but that instance will not trigger any action. + +[role="screenshot"] +image::images/alerts-details-instance-muting.png[Muting an alert instance] + +Alert instances will come and go from the list depending on whether they meet the alert conditions or not - unless they are muted. If a muted instance no longer meets the alert conditions, it will appear as inactive in the list. This prevents an instance from triggering actions if it reappears in the future. + +[role="screenshot"] +image::images/alerts-details-instances-inactive.png[Alert details page with three inactive alert instances] + +If you want to suppress actions on all current and future instances, you can mute the entire alert. Alert checks continue to run and the instance list will update as instances activate or deactivate, but no actions will be triggered. + +[role="screenshot"] +image::images/alerts-details-muting.png[Use the mute toggle to suppress all action on current and future instances] + +You can also disable an alert altogether. When disabled, the alert stops running checks altogether and will clear any instances it is tracking. You may want to disable alerts that are not currently needed to reduce the load on {kib} and {es}. + +[role="screenshot"] +image::images/alerts-details-disabling.png[Use the disable toggle to turn off alert checks and clear instances tracked] + +* For further information on alerting concepts and examples, see <<alerting-getting-started>>. diff --git a/docs/management/alerting/alert-management.asciidoc b/docs/management/alerting/alert-management.asciidoc new file mode 100644 index 0000000000000..caf260937b7be --- /dev/null +++ b/docs/management/alerting/alert-management.asciidoc @@ -0,0 +1,59 @@ +[role="xpack"] +[[alert-management]] +=== Managing Alerts + +beta[] + +The *Alerts* tab provides a cross-app view of alerting. Different {kib} apps like <<xpack-infra, Metrics>>, <<xpack-apm, APM>>, <<xpack-uptime, Uptime>>, and <<xpack-siem, SIEM>> can offer their own alerts, and the *Alerts* tab provides a central place to: + +* <<create-edit-alerts, Create and edit>> alerts +* <<controlling-alerts, Control alerts>> including enabling/disabling, muting/unmuting, and deleting +* Drill-down to <<alert-details, alert details>> + +[role="screenshot"] +image:management/alerting/images/alerts-and-actions-ui.png[Example alert listing in the Alerts and Actions UI] + +For more information on alerting concepts and the types of alerts and actions available, see <<alerting-getting-started>>. + +[float] +==== Finding alerts + +The *Alerts* tab lists all alerts in the current space, including summary information about their execution frequency, tags, and type. + +The *search bar* can be used to quickly find alerts by name or tag. + +[role="screenshot"] +image::images/alerts-filter-by-search.png[Filtering the alerts list using the search bar] + +The *type* dropdown lets you filter to a subset of alert types. + +[role="screenshot"] +image::images/alerts-filter-by-type.png[Filtering the alerts list by types of alert] + +The *Action type* dropdown lets you filter by the type of action used in the alert. + +[role="screenshot"] +image::images/alerts-filter-by-action-type.png[Filtering the alert list by type of action] + +[float] +[[create-edit-alerts]] +==== Creating and editing alerts + +Many alerts must be created within the context of a {kib} app like <<xpack-infra, Metrics>>, <<xpack-apm, APM>>, or <<xpack-uptime, Uptime>>, but others are generic. Generic alert types can be created in the *Alerts* management UI by clicking the *Create* button. This will launch a flyout that guides you through selecting an alert type and configuring it's properties. Refer to <<alert-types>> for details on what types of alerts are available and how to configure them. + +After an alert is created, you can re-open the flyout and change an alerts properties by clicking the *Edit* button shown on each row of the alert listing. + + +[float] +[[controlling-alerts]] +==== Controlling alerts + +The alert listing allows you to quickly mute/unmute, disable/enable, and delete individual alerts by clicking the action button at the right of each row. + +[role="screenshot"] +image:management/alerting/images/individual-mute-disable.png[The actions button allows an individual alert to be muted, disabled, or deleted] + +These operations can also be performed in bulk by multi-selecting alerts and clicking the *Manage alerts* button: + +[role="screenshot"] +image:management/alerting/images/bulk-mute-disable.png[The Manage alerts button lets you mute/unmute, enable/disable, and delete in bulk] \ No newline at end of file diff --git a/docs/management/alerting/alerts-and-actions-intro.asciidoc b/docs/management/alerting/alerts-and-actions-intro.asciidoc new file mode 100644 index 0000000000000..4674c9ba902be --- /dev/null +++ b/docs/management/alerting/alerts-and-actions-intro.asciidoc @@ -0,0 +1,25 @@ +[role="xpack"] +[[managing-alerts-and-actions]] +== Alerts and Actions + +beta[] + +The *Alerts and Actions* UI lets you <<alert-management, see and control all the alerts>> in a space, and provides tools to <<connector-management, create and manage connectors>> so that alerts can trigger actions like notification, indexing, and ticketing. + +To manage alerting and connectors, go to *Management > {kib} > Alerts and Actions*. + +[role="screenshot"] +image:management/alerting/images/alerts-and-actions-ui.png[Example alert listing in the Alerts and Actions UI] + +[NOTE] +============================================================================ +Similar to dashboards, alerts and connectors reside in a <<xpack-spaces, space>>. +The *Alerts and Actions* UI only shows alerts and connectors for the current space. +============================================================================ + +[NOTE] +============================================================================ +{es} also offers alerting capabilities through Watcher, which +can be managed through the <<watcher-ui, Watcher UI>>. See +<<alerting-concepts-differences>> for more information. +============================================================================ \ No newline at end of file diff --git a/docs/management/alerting/connector-management.asciidoc b/docs/management/alerting/connector-management.asciidoc new file mode 100644 index 0000000000000..1002a372f9460 --- /dev/null +++ b/docs/management/alerting/connector-management.asciidoc @@ -0,0 +1,47 @@ +[role="xpack"] +[[connector-management]] +=== Managing Connectors + +beta[] + +Alerts use *Connectors* to route actions to different destinations like log files, ticketing systems, and messaging tools. While each {kib} app can offer their own types of alerts, they typically share connectors. The *Connectors* tab offers a central place to view and manage all the connectors in the current space. + +For more information on connectors and the types of actions available see <<action-types>>. + +[role="screenshot"] +image::images/connector-listing.png[Example connector listing in the Alerts and Actions UI] + + +[float] +==== Connector list + +The *Connectors* tab lists all connectors in the current space. The *search bar* can be used to find specific connectors by name and/or type. + +[role="screenshot"] +image::images/connector-filter-by-search.png[Filtering the connector list using the search bar] + + +The *type* dropdown also lets you filter to a subset of action types. + +[role="screenshot"] +image::images/connector-filter-by-type.png[Filtering the connector list by types of actions] + +The *Actions* column indicates the number of actions that reference the connector. This count helps you confirm a connector is unused before you delete it, and tells you how many actions will be affected when a connector is modified. + +[role="screenshot"] +image::images/connector-action-count.png[Filtering the connector list by types of actions] + +You can delete individual connectors using the trash icon on the right of each row. Connectors can also be deleted in bulk by multi-selecting them and clicking the *Delete* button to the left of the search box. + +[role="screenshot"] +image::images/connector-delete.png[Deleting connectors individually or in bulk] + +[NOTE] +============================================================================ +You can delete a connector even if there are still actions referencing it. +When this happens the action will fail to execute, and appear as errors in the {kib} logs. +============================================================================ + +==== Creating a new connector + +New connectors can be created by clicking the *Create connector* button, which will guide you to select the type of connector and configure it's properties. Refer to <<action-types>> for the types of connectors available and how to configure them. Once you create a connector it will be made available to you anytime you set up an action in the current space. \ No newline at end of file diff --git a/docs/management/alerting/images/alerts-and-actions-ui.png b/docs/management/alerting/images/alerts-and-actions-ui.png new file mode 100644 index 0000000000000..acf3f3b1f0be9 Binary files /dev/null and b/docs/management/alerting/images/alerts-and-actions-ui.png differ diff --git a/docs/management/alerting/images/alerts-details-disabling.png b/docs/management/alerting/images/alerts-details-disabling.png new file mode 100644 index 0000000000000..7057afc8ad07d Binary files /dev/null and b/docs/management/alerting/images/alerts-details-disabling.png differ diff --git a/docs/management/alerting/images/alerts-details-instance-muting.png b/docs/management/alerting/images/alerts-details-instance-muting.png new file mode 100644 index 0000000000000..9d26fad419e4f Binary files /dev/null and b/docs/management/alerting/images/alerts-details-instance-muting.png differ diff --git a/docs/management/alerting/images/alerts-details-instances-active.png b/docs/management/alerting/images/alerts-details-instances-active.png new file mode 100644 index 0000000000000..d6895bd4952b8 Binary files /dev/null and b/docs/management/alerting/images/alerts-details-instances-active.png differ diff --git a/docs/management/alerting/images/alerts-details-instances-inactive.png b/docs/management/alerting/images/alerts-details-instances-inactive.png new file mode 100644 index 0000000000000..b049b4ba082f6 Binary files /dev/null and b/docs/management/alerting/images/alerts-details-instances-inactive.png differ diff --git a/docs/management/alerting/images/alerts-details-muting.png b/docs/management/alerting/images/alerts-details-muting.png new file mode 100644 index 0000000000000..9b47d82a74639 Binary files /dev/null and b/docs/management/alerting/images/alerts-details-muting.png differ diff --git a/docs/management/alerting/images/alerts-filter-by-action-type.png b/docs/management/alerting/images/alerts-filter-by-action-type.png new file mode 100644 index 0000000000000..94336a20e1d6c Binary files /dev/null and b/docs/management/alerting/images/alerts-filter-by-action-type.png differ diff --git a/docs/management/alerting/images/alerts-filter-by-search.png b/docs/management/alerting/images/alerts-filter-by-search.png new file mode 100644 index 0000000000000..df4b6d7d9d9aa Binary files /dev/null and b/docs/management/alerting/images/alerts-filter-by-search.png differ diff --git a/docs/management/alerting/images/alerts-filter-by-type.png b/docs/management/alerting/images/alerts-filter-by-type.png new file mode 100644 index 0000000000000..75ffb3ff69bab Binary files /dev/null and b/docs/management/alerting/images/alerts-filter-by-type.png differ diff --git a/docs/management/alerting/images/bulk-mute-disable.png b/docs/management/alerting/images/bulk-mute-disable.png new file mode 100644 index 0000000000000..04cdc3f03f34d Binary files /dev/null and b/docs/management/alerting/images/bulk-mute-disable.png differ diff --git a/docs/management/alerting/images/connector-action-count.png b/docs/management/alerting/images/connector-action-count.png new file mode 100644 index 0000000000000..b792ae2cc11c8 Binary files /dev/null and b/docs/management/alerting/images/connector-action-count.png differ diff --git a/docs/management/alerting/images/connector-delete.png b/docs/management/alerting/images/connector-delete.png new file mode 100644 index 0000000000000..ccb6bcea4bade Binary files /dev/null and b/docs/management/alerting/images/connector-delete.png differ diff --git a/docs/management/alerting/images/connector-filter-by-search.png b/docs/management/alerting/images/connector-filter-by-search.png new file mode 100644 index 0000000000000..1f052ea23a577 Binary files /dev/null and b/docs/management/alerting/images/connector-filter-by-search.png differ diff --git a/docs/management/alerting/images/connector-filter-by-type.png b/docs/management/alerting/images/connector-filter-by-type.png new file mode 100644 index 0000000000000..06c7d6f4dad47 Binary files /dev/null and b/docs/management/alerting/images/connector-filter-by-type.png differ diff --git a/docs/management/alerting/images/connector-listing.png b/docs/management/alerting/images/connector-listing.png new file mode 100644 index 0000000000000..43014ff88057f Binary files /dev/null and b/docs/management/alerting/images/connector-listing.png differ diff --git a/docs/management/alerting/images/individual-mute-disable.png b/docs/management/alerting/images/individual-mute-disable.png new file mode 100644 index 0000000000000..ca00240a4af61 Binary files /dev/null and b/docs/management/alerting/images/individual-mute-disable.png differ diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index e3b9e61667bdf..d7f1ec637d1df 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -27,7 +27,7 @@ If not set, {kib} will generate a random key on startup, but all alert and actio Although the key can be specified in clear text in `kibana.yml`, it's recommended to store this key securely in the <<secure-settings,{kib} Keystore>>. [float] -[[alert-settings]] +[[action-settings]] ==== Action settings `xpack.actions.whitelistedHosts`:: @@ -41,7 +41,7 @@ A list of action types that are enabled. It defaults to `[*]`, enabling all type Disabled action types will not appear as an option when creating new connectors, but existing connectors and actions of that type will remain in {kib} and will not function. [float] -[[action-settings]] +[[alert-settings]] ==== Alert settings You do not need to configure any additional settings to use alerting in {kib}. diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc new file mode 100644 index 0000000000000..02c09736e1fa0 --- /dev/null +++ b/docs/user/alerting/action-types.asciidoc @@ -0,0 +1,182 @@ +[role="xpack"] +[[action-types]] +== Action and connector types + +{kib} provides the following types of actions: + +* <<email-action-type, Email>> +* <<index-action-type, Index>> +* <<pagerduty-action-type, PagerDuty>> +* <<server-log-action-type, ServerLog>> +* <<slack-action-type, Slack>> +* <<webhook-action-type, Webhook>> + +This section describes how to configure connectors and actions for each type. + +[NOTE] +============================================== +Some action types are paid commercial features, while others are free. +For a comparison of the Elastic license levels, +see https://www.elastic.co/subscriptions[the subscription page]. +============================================== + +[float] +[[email-action-type]] +=== Email + +The email action type uses the SMTP protocol to send mail message, using an integration of https://nodemailer.com/[Nodemailer]. Email message text is sent as both plain text and html text. + +[float] +[[email-connector-configuration]] +==== Connector configuration + +Email connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Sender:: The from address for all emails sent with this connector, specified in `user@host-name` format. +Host:: Host name of the service provider. If you are using the <<action-settings, `xpack.actions.whitelistedHosts`>> setting, make sure this hostname is whitelisted. +Port:: The port to connect to on the service provider. +Secure:: If true the connection will use TLS when connecting to the service provider. See https://nodemailer.com/smtp/#tls-options[nodemailer TLS documentation] for more information. +Username:: username for 'login' type authentication. +Password:: password for 'login' type authentication. + +[float] +[[email-action-configuration]] +==== Action configuration + +Email actions have the following configuration properties: + +To, CC, BCC:: Each is a list of addresses. Addresses can be specified in `user@host-name` format, or in `name <user@host-name>` format. One of To, CC, or BCC must contain an entry. +Subject:: The subject line of the email. +Message:: The message text of the email. Markdown format is supported. + +[float] +[[index-action-type]] +=== Index + +The index action type will index a document into {es}. + +[float] +[[index-connector-configuration]] +==== Connector configuration + +Index connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Index:: The {es} index to be written to. +Refresh:: Setting for the {ref}/docs-refresh.html[refresh] policy for the write request. +Execution time field:: This field will be automatically set to the time the alert condition was detected. + +[float] +[[index-action-configuration]] +==== Action configuration + +Index actions have the following properties: + +Document:: The document to index in json format. + +[float] +[[pagerduty-action-type]] +=== PagerDuty + +The PagerDuty action type uses the https://v2.developer.pagerduty.com/docs/events-api-v2[v2 Events API] to trigger, acknowledge, and resolve PagerDuty alerts. + +[float] +[[pagerduty-connector-configuration]] +==== Connector configuration + +PagerDuty connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +API URL:: An optional PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. If you are using the <<action-settings, `xpack.actions.whitelistedHosts`>> setting, make sure the hostname is whitelisted. +Routing Key:: A 32 character PagerDuty Integration Key for an integration on a service or on a global ruleset. + +[float] +[[pagerduty-action-configuration]] +==== Action configuration + +PagerDuty actions have the following properties: + +Severity:: The perceived severity of on the affected system. This can be one of `Critical`, `Error`, `Warning` or `Info`(default). +Event action:: One of `Trigger` (default), `Resolve`, or `Acknowledge`. See https://v2.developer.pagerduty.com/docs/events-api-v2#event-action[event action] for more details. +Dedup Key:: All actions sharing this key will be associated with the same PagerDuty alert. This value is used to correlate trigger and resolution. This value is *optional*, and if unset defaults to `action:<action saved object id>`. The maximum length is *255* characters. See https://v2.developer.pagerduty.com/docs/events-api-v2#alert-de-duplication[alert deduplication] for details. +Timestamp:: An *optional* https://v2.developer.pagerduty.com/v2/docs/types#datetime[ISO-8601 format date-time], indicating the time the event was detected or generated. +Component:: An *optional* value indicating the component of the source machine that is responsible for the event, for example `mysql` or `eth0`. +Group:: An *optional* value indicating the logical grouping of components of a service, for example `app-stack`. +Source:: An *optional* value indicating the affected system, preferably a hostname or fully qualified domain name. Defaults to the {kib} saved object id of the action. +Summary:: An *optional* text summary of the event, defaults to `No summary provided`. The maximum length is 1024 characters. +Class:: An *optional* value indicating the class/type of the event, for example `ping failure` or `cpu load`. + +For more details on these properties, see https://v2.developer.pagerduty.com/v2/docs/send-an-event-events-api-v2[PagerDuty v2 event parameters]. + +[float] +[[server-log-action-type]] +=== Server log + +This action type writes and entry to the {kib} server log. + +[float] +[[server-log-connector-configuration]] +==== Connector configuration + +Server log connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. + +[float] +[[server-log-action-configuration]] +==== Action configuration + +Server log actions have the following properties: + +Message:: The message to log. + +[float] +[[slack-action-type]] +=== Slack + +The Slack action type uses https://api.slack.com/incoming-webhooks[Slack Incoming Webhooks]. + +[float] +[[slack-connector-configuration]] +==== Connector configuration + +Slack connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messaging/webhooks#getting_started[Slack Incoming Webhooks] for instructions on generating this URL. If you are using the <<action-settings, `xpack.actions.whitelistedHosts`>> setting, make sure the hostname is whitelisted. + +[float] +[[slack-action-configuration]] +==== Action configuration + +Slack actions have the following properties: + +Message:: The message text, converted to the `text` field in the Webhook JSON payload. Currently only the text field is supported. Markdown, images, and other advanced formatting are not yet supported. + +[float] +[[webhook-action-type]] +=== Webhook + +The Webhook action type uses https://github.com/axios/axios[axios] to send a POST or PUT request to a web service. + +[float] +[[webhook-connector-configuration]] +==== Connector configuration + +Webhook connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +URL:: The request URL. If you are using the <<action-settings, `xpack.actions.whitelistedHosts`>> setting, make sure the hostname is whitelisted. +Method:: HTTP request method, either `post`(default) or `put`. +Headers:: A set of key-value pairs sent as headers with the request +User:: An optional username. If set, HTTP basic authentication is used. Currently only basic authentication is supported. +Password:: An optional password. If set, HTTP basic authentication is used. Currently only basic authentication is supported. + +[float] +[[webhook-action-configuration]] +==== Action configuration + +Webhook actions have the following properties: + +Body:: A json payload sent to the request URL. \ No newline at end of file diff --git a/docs/user/alerting/alert-types.asciidoc b/docs/user/alerting/alert-types.asciidoc new file mode 100644 index 0000000000000..4a99c70f9d961 --- /dev/null +++ b/docs/user/alerting/alert-types.asciidoc @@ -0,0 +1,115 @@ +[role="xpack"] +[[alert-types]] +== Alert types + +{kib} supplies alerts types in two ways: some are built into {kib}, while domain-specific alert types are registered by {kib} apps such as <<xpack-apm,*APM*>>, <<xpack-infra,*Metrics*>>, and <<xpack-uptime,*Uptime*>>. + +This section covers built-in alert types. For domain-specific alert types, refer to the documentation for that app. + +Currently {kib} provides one built-in alert type: the <<alert-type-index-threshold>> type. + +[float] +[[alert-type-index-threshold]] +=== Index threshold + +The index threshold alert type is designed to run an {es} query over indices, aggregating field values from documents, comparing them to threshold values, and scheduling actions to run when the thresholds are met. + +[float] +==== Creating the alert + +An index threshold alert can be created from the *Create* button in the <<alert-management, alert management UI>>. Fill in the <<defining-alerts-general-details, general alert details>>, then select *Index Threshold*. + +[role="screenshot"] +image::images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] + +[float] +==== Defining the conditions + +The index threshold has 5 clauses that define the condition to detect. + +[role="screenshot"] +image::images/alert-types-index-threshold-conditions.png[Five clauses define the condition to detect] + +Index:: This clause requires an *index or index pattern* and a *time field* that will be used for the *time window*. +When:: This clause specifies how the value to be compared to the threshold is calculated. The value is calculated by aggregating a numeric field a the *time window*. The aggregation options are: `count`, `average`, `sum`, `min`, and `max`. When using `count` the document count is used, and an aggregation field is not necessary. +Over/Grouped Over:: This clause lets you configure whether the aggregation is applied over all documents, or should be split into groups using a grouping field. If grouping is used, an <<alerting-concepts-alert-instances, alert instance>> will be created for each group when it exceeds the threshold. To limit the number of instances on high cardinality fields, you must specify the number of groups to check against the threshold. Only the *top* groups are checked. +Threshold:: This clause defines a threshold value and a comparison operator (one of `is above`, `is above or equals`, `is below`, `is below or equals`, or `is between`). The result of the aggregation is compared to this threshold. +Time window:: This clause determines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be to a value higher than the *check every* value in the <<defining-alerts-general-details, general alert details>>, to avoid gaps in detection. + +If data is available and all clauses have been defined, a preview chart will render the threshold value and display a line chart showing the value for the last 30 intervals. This can provide an indication of recent values and their proximity to the threshold, and help you tune the clauses. + +[role="screenshot"] +image::images/alert-types-index-threshold-preview.png[Five clauses define the condition to detect] + +[float] +=== Example + +In this section, you will use the {kib} <<add-sample-data, weblog sample dataset>> to setup and tune the conditions on an index threshold alert. For this example, we want to detect when any of our top three sites have served more than 420,000 bytes over a 24 hour period. + +From the <<alert-management, alert management UI>>, create a new alert, and fill in the <<defining-alerts-general-details, general alert details>>. This alert will be checked every 4 hours, and will not execute actions more than once per day. Choose the index threshold alert type. + +[role="screenshot"] +image::images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] + +Click on each clause to open a control that helps you set the value: + +[float] +==== Index clause +The index clause control will list and allow you to search for available indices. Choose *kibana_sample_data_logs* + +[role="screenshot"] +image::images/alert-types-index-threshold-example-index.png[Choosing an index] + +Once an index is selected, the list of time fields for that index will be available to select. Choose *@timestamp*. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-timefield.png[Choosing a time field] + +[float] +==== When clause + +We want to detect the number of bytes served during the time window, so we select `sum` as the aggregation, and `bytes` as the field to aggregate. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-aggregation.png[Choosing the aggregation] + +[float] +==== Over/Grouped over clause + +We want to alert on the three sites that have the most traffic, so we'll group the sum of bytes by the `host.keyword` field and take the top 3 values. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-grouping.png[Choosing the groups] + +[float] +==== Threshold clause + +We want to alert when any site exceeds 420,000 bytes over a 24 hour period, so we'll set the threshold to 420,000 and use the `is above` comparison. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-threshold.png[Setting the threshold] + +[float] +==== Time window clause + +Finally, set the time window to 24 hours to complete the alert configuration. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-window.png[Setting the time window] + +The preview chart will render showing the 24 hour sum of bytes at 4 hours intervals (the *check every* interval) for the past 120 hours (the last 30 intervals). + +[role="screenshot"] +image::images/alert-types-index-threshold-example-preview.png[Setting the time window] + +[float] +==== Comparing time windows + +You can interactively change the time window and observe the effect it has on the chart. Compare a 24 window to a 12 hour window. Notice the variability in the sum of bytes, due to different traffic levels during the day compared to at night. This variability would result in noisy alerts, so the 24 hour window is better. The preview chart can help you find the right values for your alert. + +[role="screenshot"] +image::images/alert-types-index-threshold-example-comparison.png[Comparing two time windows] + + + + diff --git a/docs/user/alerting/alerting-scale-performance.asciidoc b/docs/user/alerting/alerting-scale-performance.asciidoc new file mode 100644 index 0000000000000..644a7143f8278 --- /dev/null +++ b/docs/user/alerting/alerting-scale-performance.asciidoc @@ -0,0 +1,28 @@ +[role="xpack"] +[[alerting-scale-performance]] +== Scale and performance + +{kib} alerting run both alert checks and actions as persistent background tasks. This has two major benefits: + +* *Persistence*: all task state and scheduling is stored in {es}, so if {kib} is restarted, alerts and actions will pick up where they left off. +* *Scaling*: multiple {kib} instances can read from and update the same task queue in {es}, allowing the alerting and action load to be distributed across instances. In cases where a {kib} instance no longer has capacity to run alert checks or actions, capacity can be increased by adding additional {kib} instances. + +[float] +=== Running background alert checks and actions + +{kib} background tasks are managed by: + +* Polling an {es} task index for overdue tasks at 3 second intervals. +* Tasks are then claiming them by updating them in the {es} index, using optimistic concurrency control to prevent conflicts. Each {kib} instance can run a maximum of 10 concurrent tasks, so a maximum of 10 tasks are claimed each interval. +* Tasks are run on the {kib} server. +* In the case of alerts which are recurring background checks, upon completion the task is scheduled again according to the <<defining-alerts-general-details, check interval>>. + +[IMPORTANT] +============================================== +Because tasks are polled at 3 second intervals and only 10 tasks can run concurrently per {kib} instance, it is possible for alert and action tasks to be run late. This can happen if: + +* Alerts use a small *check interval*. The lowest interval possible is 3 seconds, though intervals of 30 seconds or higher are recommended. +* Many alerts or actions must be *run at once*. In this case pending tasks will queue in {es}, and be pulled 10 at a time from the queue at 3 second intervals. +* *Long running tasks* occupy slots for an extended time, leaving fewer slots for other tasks. + +============================================== \ No newline at end of file diff --git a/docs/user/alerting/defining-alerts.asciidoc b/docs/user/alerting/defining-alerts.asciidoc new file mode 100644 index 0000000000000..89c4c88708d58 --- /dev/null +++ b/docs/user/alerting/defining-alerts.asciidoc @@ -0,0 +1,80 @@ +[role="xpack"] +[[defining-alerts]] +== Defining alerts + +{kib} alerts can be created in a variety of apps including <<xpack-apm,*APM*>>, <<xpack-infra,*Metrics*>>, <<xpack-siem,*SIEM*>>, <<xpack-uptime,*Uptime*>> and from <<management,*Management*>> UI. While alerting details may differ from app to app, they share a common interface for defining and configuring alerts that this section describes in more detail. + +[float] +=== Alert flyout + +When an alert is created in an app, the app will display a flyout panel with three main sections to configure: + +. <<defining-alerts-general-details, General alert details>> +. <<defining-alerts-type-conditions, Alert type and conditions>> +. <<defining-alerts-actions-details, Action type and action details>> + +image::images/alert-flyout-sections.png[The three sections of an alert definition] + +[float] +[[defining-alerts-general-details]] +=== General alert details + +All alert share the following four properties in common: + +[role="screenshot"] +image::images/alert-flyout-general-details.png[All alerts have name, tags, check every, and re-notify every properties in common] + +Name:: The name of the alert. While this name does not have to be unique, the name can be referenced in actions and also appears in the searchable alert listing in the management UI. A distinctive name can help identify and find an alert. +Tags:: A list of tag names that can be applied to an alert. Tags can help you organize and find alerts, because tags appear in the alert listing in the management UI which is searchable by tag. +Check every:: This value determines how frequently the alert conditions below are checked. Note that the timing of background alert checks are not guaranteed, particularly for intervals of less than 10 seconds. See <<alerting-scale-performance>> for more information. +Re-notify every:: This value limits how often actions are repeated when an alert instance remains active across alert checks. See <<alerting-concepts-suppressing-duplicate-notifications>> for more information. + +[float] +[[defining-alerts-type-conditions]] +=== Alert type and conditions + +Depending upon the {kib} app and context, you may be prompted to choose the type of alert you wish to create. Some apps will pre-select the type of alert for you. + +[role="screenshot"] +image::images/alert-flyout-alert-type-selection.png[Choosing the type of alert to create] + +Each alert type provides its own way of defining the conditions to detect, but an expression formed by a series of clauses is a common pattern. Each clause has a UI control that allows you to define the clause. For example, in an index threshold alert the `WHEN` clause allows you to select an aggregation operation to apply to a numeric field. + +[role="screenshot"] +image::images/alert-flyout-alert-conditions.png[UI for defining alert conditions on an index threshold alert] + +[float] +[[defining-alerts-actions-details]] +=== Action type and action details + +To add an action to an alert, you first select the type of action: + +[role="screenshot"] +image::images/alert-flyout-action-type-selection.png[UI for selecting an action type] + +Each action must specify a <<alerting-concepts-connectors, connector>> instance. If no connectors exist for that action type, click "Add new" to create one. + +Each action type exposes different properties. For example an email action allows you to set the recipients, the subject, and a message body in markdown format. See <<action-types>> for details on the types of actions provided by {kib} and their properties. + +[role="screenshot"] +image::images/alert-flyout-action-details.png[UI for defining an email action] + +Using the https://mustache.github.io/[Mustache] template syntax `{{variable name}}`, you can pass alert values at the time a condition is detected to an action. Available variables differ by alert type, and a list can be accessed using the "add variable" button at the right of the text box. + +[role="screenshot"] +image::images/alert-flyout-action-variables.png[Passing alert values to an action] + +You can attach more than one action. Clicking the "Add action" button will prompt you to select another alert type and repeat the above steps again. + +[role="screenshot"] +image::images/alert-flyout-add-action.png[You can add multiple actions on an alert] + +[NOTE] +============================================== +Actions are not required on alerts. In some cases you may want to run an alert without actions first to understand its behavior, and configure actions later. +============================================== + +[float] +=== Managing alerts + +To modify an alert after it was created, including muting or disabling it, use the <<alert-management, alert listing in the Management UI>>. \ No newline at end of file diff --git a/docs/user/alerting/images/alert-concepts-connectors.svg b/docs/user/alerting/images/alert-concepts-connectors.svg new file mode 100644 index 0000000000000..9ae4c21ee5870 --- /dev/null +++ b/docs/user/alerting/images/alert-concepts-connectors.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 756.2965879265092 405.96587926509187" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l756.2966 0l0 405.96588l-756.2966 0l0 -405.96588z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l756.2966 0l0 405.96588l-756.2966 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m13.120735 28.889763l164.37796 0l0 217.51181l-164.37796 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m13.120735 28.889763l164.37796 0l0 217.51181l-164.37796 0z" fill-rule="evenodd"/><path fill="#000000" d="m22.089485 55.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm12.507233 1.46875l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m17.565195 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m17.565195 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m35.174572 87.471115l1.390625 0.34375q-0.4375 1.703125 -1.578125 2.609375q-1.125 0.890625 -2.765625 0.890625q-1.6875019 0 -2.750002 -0.6875q-1.0625 -0.6875 -1.625 -2.0q-0.546875 -1.3125 -0.546875 -2.8125q0 -1.640625 0.625 -2.859375q0.625 -1.21875 1.78125 -1.84375q1.15625 -0.640625 2.546877 -0.640625q1.5625 0 2.640625 0.8125q1.078125 0.796875 1.5 2.25l-1.375 0.3125q-0.359375 -1.140625 -1.0625 -1.65625q-0.6875 -0.53125 -1.734375 -0.53125q-1.2187519 0 -2.031252 0.578125q-0.8125 0.578125 -1.140625 1.5625q-0.328125 0.96875 -0.328125 2.015625q0 1.328125 0.390625 2.328125q0.390625 1.0 1.21875 1.5q0.828125 0.484375 1.7812519 0.484375q1.171875 0 1.96875 -0.671875q0.8125 -0.671875 1.09375 -1.984375zm2.4592743 -0.125q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307358 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072983 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.291733 -5.21875l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686455 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594757 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717743 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307358 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m17.565195 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m17.565195 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m27.221445 123.56732l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.7968769 0 1.4062519 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.8750019 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.1718769 0 2.062502 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125019 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.7031269 0.375 2.328127 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015627 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.041231 0.59375l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm2.375 2.78125l0 -10.484375l1.28125 0l0 3.75q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354233 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104229 4.53125l0 -0.953125q-0.71875 1.125 -2.1249962 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6874962 0 1.2187462 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.062496 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.8437462 0 1.4374962 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.4843712 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.276104 3.796875l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm3.1354828 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.490524 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m17.565195 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m17.565195 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m26.54957 164.13766l4.015625 -10.484375l1.5000019 0l4.296875 10.484375l-1.578125 0l-1.234375 -3.171875l-4.375002 0l-1.15625 3.171875l-1.46875 0zm3.015625 -4.3125l3.562502 0l-1.09375 -2.90625q-0.5000019 -1.3125 -0.7500019 -2.171875q-0.203125 1.015625 -0.5625 2.0l-1.15625 3.078125zm12.697481 1.53125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594757 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717743 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307358 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6874962 0 1.2656212 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.3749962 -0.234375 -0.8906212 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm7.635479 -2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m30.065617 172.23885l125.79527 0l0 56.850388l-125.79527 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m30.065617 172.23885l125.79527 0l0 56.850388l-125.79527 0z" fill-rule="evenodd"/><path fill="#000000" d="m42.17499 191.60684l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.0937538 0.125q-0.25 0.953125 -0.9531288 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.7968788 0.84375 0.7968788 2.390625q0 0.09375 0 0.28125l-4.640629 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158207 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m113.39179 189.49747l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199211 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.0937424 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.3593674 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.0937424 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.7968674 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.9218674 0.078125 -1.3124924 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.5312424 0 1.0156174 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m46.128117 205.59122l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.9843788 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.6718788 0 -1.1718788 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923832 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m108.15742 208.60684l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339767 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.6562424 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.1562424 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.26561737 0.828125 -0.26561737 1.578125q0 0.796875 0.34374237 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m40.159367 221.60684l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m259.5328 278.57742l245.03937 0l0 113.5748l-245.03937 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m259.5328 278.57742l245.03937 0l0 113.5748l-245.03937 0z" fill-rule="evenodd"/><path fill="#000000" d="m270.11093 306.77744l0 -14.3125l10.359375 0l0 1.6875l-8.453125 0l0 4.375l7.90625 0l0 1.6875l-7.90625 0l0 4.875l8.78125 0l0 1.6875l-10.6875 0zm13.074219 0l0 -10.375l1.578125 0l0 1.453125q0.484375 -0.75 1.296875 -1.21875q0.8125 -0.46875 1.84375 -0.46875q1.15625 0 1.890625 0.484375q0.734375 0.46875 1.046875 1.328125q1.234375 -1.8125 3.203125 -1.8125q1.546875 0 2.375 0.859375q0.828125 0.859375 0.828125 2.625l0 7.125l-1.75 0l0 -6.53125q0 -1.0625 -0.171875 -1.515625q-0.171875 -0.46875 -0.625 -0.75q-0.4375 -0.28125 -1.046875 -0.28125q-1.09375 0 -1.828125 0.734375q-0.71875 0.71875 -0.71875 2.3125l0 6.03125l-1.75 0l0 -6.734375q0 -1.171875 -0.4375 -1.75q-0.421875 -0.59375 -1.40625 -0.59375q-0.734375 0 -1.375 0.390625q-0.625 0.390625 -0.90625 1.140625q-0.28125 0.75 -0.28125 2.171875l0 5.375l-1.765625 0zm23.441406 -1.28125q-0.984375 0.828125 -1.890625 1.171875q-0.90625 0.34375 -1.9375 0.34375q-1.703125 0 -2.625 -0.828125q-0.921875 -0.84375 -0.921875 -2.140625q0 -0.765625 0.34375 -1.390625q0.359375 -0.625 0.921875 -1.0q0.5625 -0.390625 1.265625 -0.59375q0.515625 -0.125 1.5625 -0.265625q2.125 -0.25 3.125 -0.59375q0.015625 -0.359375 0.015625 -0.46875q0 -1.0625 -0.5 -1.515625q-0.671875 -0.59375 -2.0 -0.59375q-1.25 0 -1.84375 0.4375q-0.578125 0.4375 -0.859375 1.546875l-1.71875 -0.234375q0.234375 -1.109375 0.765625 -1.78125q0.53125 -0.6875 1.546875 -1.046875q1.015625 -0.375 2.359375 -0.375q1.328125 0 2.15625 0.3125q0.828125 0.3125 1.21875 0.796875q0.390625 0.46875 0.546875 1.1875q0.09375 0.453125 0.09375 1.625l0 2.34375q0 2.453125 0.109375 3.109375q0.109375 0.640625 0.453125 1.234375l-1.84375 0q-0.265625 -0.546875 -0.34375 -1.28125zm-0.15625 -3.921875q-0.953125 0.390625 -2.875 0.65625q-1.078125 0.15625 -1.53125 0.359375q-0.4375 0.1875 -0.6875 0.5625q-0.25 0.375 -0.25 0.84375q0 0.703125 0.53125 1.171875q0.53125 0.46875 1.5625 0.46875q1.015625 0 1.796875 -0.4375q0.796875 -0.453125 1.171875 -1.21875q0.28125 -0.609375 0.28125 -1.765625l0 -0.640625zm4.513672 -7.09375l0 -2.015625l1.765625 0l0 2.015625l-1.765625 0zm0 12.296875l0 -10.375l1.765625 0l0 10.375l-1.765625 0zm4.3964844 0l0 -14.3125l1.75 0l0 14.3125l-1.75 0zm16.8125 -3.796875l1.71875 0.21875q-0.28125 1.796875 -1.453125 2.8125q-1.15625 1.0 -2.859375 1.0q-2.125 0 -3.421875 -1.390625q-1.296875 -1.390625 -1.296875 -3.984375q0 -1.6875 0.546875 -2.9375q0.5625 -1.265625 1.703125 -1.890625q1.140625 -0.640625 2.484375 -0.640625q1.6875 0 2.75 0.859375q1.078125 0.859375 1.390625 2.421875l-1.71875 0.265625q-0.234375 -1.046875 -0.859375 -1.5625q-0.625 -0.53125 -1.5 -0.53125q-1.328125 0 -2.15625 0.953125q-0.828125 0.953125 -0.828125 3.0q0 2.09375 0.796875 3.046875q0.796875 0.9375 2.09375 0.9375q1.03125 0 1.71875 -0.625q0.703125 -0.640625 0.890625 -1.953125zm2.578125 -1.390625q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875zm9.966797 5.1875l0 -10.375l1.59375 0l0 1.484375q1.140625 -1.71875 3.296875 -1.71875q0.9375 0 1.71875 0.34375q0.796875 0.328125 1.1875 0.875q0.390625 0.546875 0.546875 1.296875q0.09375 0.5 0.09375 1.71875l0 6.375l-1.765625 0l0 -6.3125q0 -1.078125 -0.203125 -1.609375q-0.203125 -0.53125 -0.734375 -0.84375q-0.515625 -0.3125 -1.21875 -0.3125q-1.125 0 -1.9375 0.71875q-0.8125 0.703125 -0.8125 2.6875l0 5.671875l-1.765625 0zm11.123047 0l0 -10.375l1.59375 0l0 1.484375q1.140625 -1.71875 3.296875 -1.71875q0.9375 0 1.71875 0.34375q0.796875 0.328125 1.1875 0.875q0.390625 0.546875 0.546875 1.296875q0.09375 0.5 0.09375 1.71875l0 6.375l-1.765625 0l0 -6.3125q0 -1.078125 -0.203125 -1.609375q-0.203125 -0.53125 -0.734375 -0.84375q-0.515625 -0.3125 -1.21875 -0.3125q-1.125 0 -1.9375 0.71875q-0.8125 0.703125 -0.8125 2.6875l0 5.671875l-1.765625 0zm18.232422 -3.34375l1.8125 0.234375q-0.421875 1.578125 -1.59375 2.46875q-1.15625 0.875 -2.96875 0.875q-2.265625 0 -3.609375 -1.390625q-1.328125 -1.40625 -1.328125 -3.9375q0 -2.625 1.34375 -4.0625q1.34375 -1.453125 3.5 -1.453125q2.078125 0 3.390625 1.421875q1.328125 1.40625 1.328125 3.984375q0 0.15625 -0.015625 0.46875l-7.734375 0q0.09375 1.703125 0.96875 2.609375q0.875 0.90625 2.171875 0.90625q0.96875 0 1.640625 -0.5q0.6875 -0.515625 1.09375 -1.625zm-5.78125 -2.84375l5.796875 0q-0.109375 -1.296875 -0.65625 -1.953125q-0.84375 -1.015625 -2.1875 -1.015625q-1.203125 0 -2.03125 0.8125q-0.828125 0.796875 -0.921875 2.15625zm16.576172 2.390625l1.71875 0.21875q-0.28125 1.796875 -1.453125 2.8125q-1.15625 1.0 -2.859375 1.0q-2.125 0 -3.421875 -1.390625q-1.296875 -1.390625 -1.296875 -3.984375q0 -1.6875 0.546875 -2.9375q0.5625 -1.265625 1.703125 -1.890625q1.140625 -0.640625 2.484375 -0.640625q1.6875 0 2.75 0.859375q1.078125 0.859375 1.390625 2.421875l-1.71875 0.265625q-0.234375 -1.046875 -0.859375 -1.5625q-0.625 -0.53125 -1.5 -0.53125q-1.328125 0 -2.15625 0.953125q-0.828125 0.953125 -0.828125 3.0q0 2.09375 0.796875 3.046875q0.796875 0.9375 2.09375 0.9375q1.03125 0 1.71875 -0.625q0.703125 -0.640625 0.890625 -1.953125zm7.0625 2.21875l0.25 1.5625q-0.734375 0.15625 -1.328125 0.15625q-0.953125 0 -1.484375 -0.296875q-0.515625 -0.3125 -0.734375 -0.796875q-0.21875 -0.5 -0.21875 -2.078125l0 -5.96875l-1.28125 0l0 -1.375l1.28125 0l0 -2.5625l1.75 -1.0625l0 3.625l1.765625 0l0 1.375l-1.765625 0l0 6.0625q0 0.75 0.09375 0.96875q0.09375 0.203125 0.296875 0.34375q0.21875 0.125 0.609375 0.125q0.28125 0 0.765625 -0.078125zm1.0722656 -3.609375q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875zm9.951172 5.1875l0 -10.375l1.578125 0l0 1.578125q0.609375 -1.109375 1.125 -1.453125q0.515625 -0.359375 1.125 -0.359375q0.890625 0 1.8125 0.5625l-0.609375 1.640625q-0.640625 -0.390625 -1.28125 -0.390625q-0.578125 0 -1.046875 0.359375q-0.453125 0.34375 -0.65625 0.953125q-0.28125 0.9375 -0.28125 2.046875l0 5.4375l-1.765625 0zm11.560547 -4.296875l0 -1.765625l5.390625 0l0 1.765625l-5.390625 0zm12.888672 4.296875l0 -10.375l1.578125 0l0 1.453125q0.484375 -0.75 1.296875 -1.21875q0.8125 -0.46875 1.84375 -0.46875q1.15625 0 1.890625 0.484375q0.734375 0.46875 1.046875 1.328125q1.234375 -1.8125 3.203125 -1.8125q1.546875 0 2.375 0.859375q0.828125 0.859375 0.828125 2.625l0 7.125l-1.75 0l0 -6.53125q0 -1.0625 -0.171875 -1.515625q-0.171875 -0.46875 -0.625 -0.75q-0.4375 -0.28125 -1.046875 -0.28125q-1.09375 0 -1.828125 0.734375q-0.71875 0.71875 -0.71875 2.3125l0 6.03125l-1.75 0l0 -6.734375q0 -1.171875 -0.4375 -1.75q-0.421875 -0.59375 -1.40625 -0.59375q-0.734375 0 -1.375 0.390625q-0.625 0.390625 -0.90625 1.140625q-0.28125 0.75 -0.28125 2.171875l0 5.375l-1.765625 0zm16.582031 4.0l-0.1875 -1.65625q0.578125 0.15625 1.0 0.15625q0.59375 0 0.9375 -0.203125q0.359375 -0.1875 0.578125 -0.53125q0.171875 -0.265625 0.546875 -1.3125q0.046875 -0.15625 0.15625 -0.4375l-3.9375 -10.390625l1.890625 0l2.15625 6.015625q0.421875 1.140625 0.75 2.390625q0.3125 -1.203125 0.71875 -2.359375l2.21875 -6.046875l1.765625 0l-3.953125 10.546875q-0.625 1.71875 -0.984375 2.359375q-0.46875 0.875 -1.078125 1.265625q-0.59375 0.40625 -1.4375 0.40625q-0.515625 0 -1.140625 -0.203125zm9.09375 -4.0l0 -2.0l2.0 0l0 2.0l-2.0 0zm11.837891 -3.796875l1.71875 0.21875q-0.28125 1.796875 -1.453125 2.8125q-1.15625 1.0 -2.859375 1.0q-2.125 0 -3.421875 -1.390625q-1.296875 -1.390625 -1.296875 -3.984375q0 -1.6875 0.546875 -2.9375q0.5625 -1.265625 1.703125 -1.890625q1.140625 -0.640625 2.484375 -0.640625q1.6875 0 2.75 0.859375q1.078125 0.859375 1.390625 2.421875l-1.71875 0.265625q-0.234375 -1.046875 -0.859375 -1.5625q-0.625 -0.53125 -1.5 -0.53125q-1.328125 0 -2.15625 0.953125q-0.828125 0.953125 -0.828125 3.0q0 2.09375 0.796875 3.046875q0.796875 0.9375 2.09375 0.9375q1.03125 0 1.71875 -0.625q0.703125 -0.640625 0.890625 -1.953125zm2.578125 -1.390625q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875z" fill-rule="nonzero"/><path fill="#000000" d="m288.13907 337.09744l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.861328 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533203 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm2.1933594 -4.15625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m364.92343 337.09744l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m287.60782 353.48804l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.298828 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm2.1933594 -4.15625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m365.37656 348.6443l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m292.37344 363.9724q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.5332031 -1.0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.46875 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm3.9960938 0l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm10.861328 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.0800781 3.15625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.574219 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm6.517578 -1.359375l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m364.92343 365.0974l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm10.640625 -3.53125q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.5332031 -1.0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.46875 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0z" fill-rule="nonzero"/><path fill="#000000" d="m287.60782 381.48804l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm9.298828 1.765625q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.1894531 1.03125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm6.0 0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm7.078125 2.125l-0.640625 -6.21875l1.015625 0l0.28125 2.796875l0.109375 1.5625q0.015625 0.171875 0.03125 0.703125q0.1875 -0.59375 0.296875 -0.90625q0.125 -0.328125 0.40625 -0.921875l1.46875 -3.234375l1.15625 0l0.203125 3.109375q0.046875 0.703125 0.0625 1.890625q0.296875 -0.78125 0.953125 -2.1875l1.34375 -2.8125l1.0625 0l-3.046875 6.21875l-1.09375 0l-0.234375 -3.65625q-0.03125 -0.328125 -0.046875 -1.3125q-0.234375 0.625 -0.5625 1.34375l-1.640625 3.625l-1.125 0zm7.6816406 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm8.183594 -0.90625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm6.720703 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m369.2203 376.8318l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.71875 2.265625l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm10.861328 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.0957031 3.15625l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm6.611328 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm9.970703 0.640625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.574219 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625z" fill-rule="nonzero"/><path fill="#ffffff" d="m200.14961 28.889763l164.37794 0l0 217.51181l-164.37794 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m200.14961 28.889763l164.37794 0l0 217.51181l-164.37794 0z" fill-rule="evenodd"/><path fill="#000000" d="m209.11836 55.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm14.944717 -0.109375l0 1.578125l-8.82811 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.1562347 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.9062347 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.1406097 -0.984375 3.0312347 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.42185974 0.4375 -0.68748474 0.875l6.5468597 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m204.59407 73.062996l152.0945 0l0 25.51181l-152.0945 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m204.59407 73.062996l152.0945 0l0 25.51181l-152.0945 0z" fill-rule="evenodd"/><path fill="#000000" d="m222.20345 87.471115l1.390625 0.34375q-0.4375 1.703125 -1.578125 2.609375q-1.125 0.890625 -2.765625 0.890625q-1.6875 0 -2.75 -0.6875q-1.0625 -0.6875 -1.625 -2.0q-0.546875 -1.3125 -0.546875 -2.8125q0 -1.640625 0.625 -2.859375q0.625 -1.21875 1.78125 -1.84375q1.15625 -0.640625 2.546875 -0.640625q1.5625 0 2.640625 0.8125q1.078125 0.796875 1.5 2.25l-1.375 0.3125q-0.359375 -1.140625 -1.0625 -1.65625q-0.6875 -0.53125 -1.734375 -0.53125q-1.21875 0 -2.03125 0.578125q-0.8125 0.578125 -1.140625 1.5625q-0.328125 0.96875 -0.328125 2.015625q0 1.328125 0.390625 2.328125q0.390625 1.0 1.21875 1.5q0.828125 0.484375 1.78125 0.484375q1.171875 0 1.96875 -0.671875q0.8125 -0.671875 1.09375 -1.984375zm2.4592743 -0.125q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307358 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072983 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.291733 -5.21875l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686493 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594604 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717896 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.3073425 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m204.59407 108.86232l152.0945 0l0 29.952759l-152.0945 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m204.59407 108.86232l152.0945 0l0 29.952759l-152.0945 0z" fill-rule="evenodd"/><path fill="#000000" d="m214.25032 123.56732l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.041229 0.59375l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm2.375 2.78125l0 -10.484375l1.28125 0l0 3.75q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354233 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104233 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.276108 3.796875l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm3.1354675 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.49054 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m204.59407 146.05766l152.0945 0l0 93.41733l-152.0945 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m204.59407 146.05766l152.0945 0l0 93.41733l-152.0945 0z" fill-rule="evenodd"/><path fill="#000000" d="m213.57845 164.13766l4.015625 -10.484375l1.5 0l4.296875 10.484375l-1.578125 0l-1.234375 -3.171875l-4.375 0l-1.15625 3.171875l-1.46875 0zm3.015625 -4.3125l3.5625 0l-1.09375 -2.90625q-0.5 -1.3125 -0.75 -2.171875q-0.203125 1.015625 -0.5625 2.0l-1.15625 3.078125zm12.697479 1.53125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594757 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717743 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307358 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm7.635483 -2.265625l1.2656097 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.54685974 -0.265625 -0.82810974 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.29685974 -0.21875 0.81248474 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.2656097 -0.609375q-0.765625 -0.625 -0.984375 -1.828125z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m217.09448 172.23885l125.79529 0l0 56.850388l-125.79529 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m217.09448 172.23885l125.79529 0l0 56.850388l-125.79529 0z" fill-rule="evenodd"/><path fill="#000000" d="m229.20386 191.60684l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m300.42065 189.49747l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m233.15698 205.59122l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m295.18628 208.60684l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m227.18823 221.60684l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m387.17847 28.889763l164.37799 0l0 217.51181l-164.37799 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m387.17847 28.889763l164.37799 0l0 217.51181l-164.37799 0z" fill-rule="evenodd"/><path fill="#000000" d="m396.14722 55.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816711 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm6.3353577 -2.0625l1.640625 -0.21875q0.28125 1.40625 0.953125 2.015625q0.6875 0.609375 1.65625 0.609375q1.15625 0 1.953125 -0.796875q0.796875 -0.796875 0.796875 -1.984375q0 -1.125 -0.734375 -1.859375q-0.734375 -0.734375 -1.875 -0.734375q-0.46875 0 -1.15625 0.171875l0.1875 -1.4375q0.15625 0.015625 0.265625 0.015625q1.046875 0 1.875 -0.546875q0.84375 -0.546875 0.84375 -1.671875q0 -0.90625 -0.609375 -1.5q-0.609375 -0.59375 -1.578125 -0.59375q-0.953125 0 -1.59375 0.609375q-0.640625 0.59375 -0.8125 1.796875l-1.640625 -0.296875q0.296875 -1.640625 1.359375 -2.546875q1.0625 -0.90625 2.65625 -0.90625q1.09375 0 2.0 0.46875q0.921875 0.46875 1.40625 1.28125q0.5 0.8125 0.5 1.71875q0 0.859375 -0.46875 1.578125q-0.46875 0.703125 -1.375 1.125q1.1875 0.28125 1.84375 1.140625q0.65625 0.859375 0.65625 2.15625q0 1.734375 -1.28125 2.953125q-1.265625 1.21875 -3.21875 1.21875q-1.765625 0 -2.921875 -1.046875q-1.15625 -1.046875 -1.328125 -2.71875z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m391.62292 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m391.62292 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m409.2323 87.471115l1.390625 0.34375q-0.4375 1.703125 -1.578125 2.609375q-1.125 0.890625 -2.765625 0.890625q-1.6875 0 -2.75 -0.6875q-1.0625 -0.6875 -1.625 -2.0q-0.546875 -1.3125 -0.546875 -2.8125q0 -1.640625 0.625 -2.859375q0.625 -1.21875 1.78125 -1.84375q1.15625 -0.640625 2.546875 -0.640625q1.5625 0 2.640625 0.8125q1.078125 0.796875 1.5 2.25l-1.375 0.3125q-0.359375 -1.140625 -1.0625 -1.65625q-0.6875 -0.53125 -1.734375 -0.53125q-1.21875 0 -2.03125 0.578125q-0.8125 0.578125 -1.140625 1.5625q-0.328125 0.96875 -0.328125 2.015625q0 1.328125 0.390625 2.328125q0.390625 1.0 1.21875 1.5q0.828125 0.484375 1.78125 0.484375q1.171875 0 1.96875 -0.671875q0.8125 -0.671875 1.09375 -1.984375zm2.4592896 -0.125q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.3073425 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072998 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.2917175 -5.21875l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686646 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594604 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717896 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.3073425 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m391.62292 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m391.62292 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m401.27917 123.56732l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.041229 0.59375l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm2.375 2.78125l0 -10.484375l1.28125 0l0 3.75q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354248 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104218 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.276123 3.796875l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm3.1354675 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.49054 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m391.62292 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m391.62292 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m400.6073 164.13766l4.015625 -10.484375l1.5 0l4.296875 10.484375l-1.578125 0l-1.234375 -3.171875l-4.375 0l-1.15625 3.171875l-1.46875 0zm3.015625 -4.3125l3.5625 0l-1.09375 -2.90625q-0.5 -1.3125 -0.75 -2.171875q-0.203125 1.015625 -0.5625 2.0l-1.15625 3.078125zm12.697479 1.53125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.259491 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.771759 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm7.6354675 -2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m404.12335 172.23885l125.79529 0l0 56.850388l-125.79529 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m404.12335 172.23885l125.79529 0l0 56.850388l-125.79529 0z" fill-rule="evenodd"/><path fill="#000000" d="m416.23273 191.60684l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m487.44952 189.49747l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m420.18585 205.59122l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m482.21515 208.60684l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m414.2171 221.60684l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m578.65094 28.889763l164.37793 0l0 217.51181l-164.37793 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m578.65094 28.889763l164.37793 0l0 217.51181l-164.37793 0z" fill-rule="evenodd"/><path fill="#000000" d="m587.6197 55.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.8029175 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816711 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.8063965 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm11.585388 1.46875l0 -3.203125l-5.796875 0l0 -1.5l6.09375 -8.65625l1.34375 0l0 8.65625l1.796875 0l0 1.5l-1.796875 0l0 3.203125l-1.640625 0zm0 -4.703125l0 -6.015625l-4.1875 6.015625l4.1875 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m583.0954 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m583.0954 73.062996l152.09448 0l0 25.51181l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m600.7048 87.471115l1.390625 0.34375q-0.4375 1.703125 -1.578125 2.609375q-1.125 0.890625 -2.765625 0.890625q-1.6875 0 -2.75 -0.6875q-1.0625 -0.6875 -1.625 -2.0q-0.546875 -1.3125 -0.546875 -2.8125q0 -1.640625 0.625 -2.859375q0.625 -1.21875 1.78125 -1.84375q1.15625 -0.640625 2.546875 -0.640625q1.5625 0 2.640625 0.8125q1.078125 0.796875 1.5 2.25l-1.375 0.3125q-0.359375 -1.140625 -1.0625 -1.65625q-0.6875 -0.53125 -1.734375 -0.53125q-1.21875 0 -2.03125 0.578125q-0.8125 0.578125 -1.140625 1.5625q-0.328125 0.96875 -0.328125 2.015625q0 1.328125 0.390625 2.328125q0.390625 1.0 1.21875 1.5q0.828125 0.484375 1.78125 0.484375q1.171875 0 1.96875 -0.671875q0.8125 -0.671875 1.09375 -1.984375zm2.4592285 -0.125q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072998 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.291748 -5.21875l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686035 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2595215 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717285 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m583.0954 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m583.0954 108.86232l152.09448 0l0 29.952759l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m592.75165 123.56732l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.041199 0.59375l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm2.375 2.78125l0 -10.484375l1.28125 0l0 3.75q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354248 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104248 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.276062 3.796875l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm3.135498 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.49054 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m583.0954 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m583.0954 146.05766l152.09448 0l0 93.41733l-152.09448 0z" fill-rule="evenodd"/><path fill="#000000" d="m592.0798 164.13766l4.015625 -10.484375l1.5 0l4.296875 10.484375l-1.578125 0l-1.234375 -3.171875l-4.375 0l-1.15625 3.171875l-1.46875 0zm3.015625 -4.3125l3.5625 0l-1.09375 -2.90625q-0.5 -1.3125 -0.75 -2.171875q-0.203125 1.015625 -0.5625 2.0l-1.15625 3.078125zm12.697449 1.53125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594604 -7.859375l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717896 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm7.635498 -2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m595.5958 172.23885l125.79523 0l0 56.850388l-125.79523 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m595.5958 172.23885l125.79523 0l0 56.850388l-125.79523 0z" fill-rule="evenodd"/><path fill="#000000" d="m607.7052 191.60684l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m678.922 189.49747l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m611.6583 205.59122l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m673.6876 208.60684l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m605.6896 221.60684l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3339844 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m124.698166 215.20735l257.3543 63.37007" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m124.698166 215.20735l257.3543 63.37007" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m307.37534 216.08923l74.677155 62.48819" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m307.37534 216.08923l74.677155 62.48819" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m495.28085 215.20735l-113.22836 63.37007" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m495.28085 215.20735l-113.22836 63.37007" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m685.76904 215.20735l-303.71655 63.37007" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m685.76904 215.20735l-303.71655 63.37007" fill-rule="evenodd"/></g></svg> \ No newline at end of file diff --git a/docs/user/alerting/images/alert-concepts-summary.svg b/docs/user/alerting/images/alert-concepts-summary.svg new file mode 100644 index 0000000000000..d11023b706418 --- /dev/null +++ b/docs/user/alerting/images/alert-concepts-summary.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 995.4120734908137 468.84776902887137" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l995.41205 0l0 468.84778l-995.41205 0l0 -468.84778z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l995.41205 0l0 468.84778l-995.41205 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m13.120735 52.889763l260.8819 0l0 266.61417l-260.8819 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m13.120735 52.889763l260.8819 0l0 266.61417l-260.8819 0z" fill-rule="evenodd"/><path fill="#000000" d="m22.089485 79.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 97.062996l233.00789 0l0 33.511803l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 97.062996l233.00789 0l0 33.511803l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m43.750084 117.40737l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9609375 -5.703125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m136.46883 120.39175q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm4.8671875 4.203125l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm5.828125 0.75l1.4375 0.140625q-0.015625 0.484375 0.109375 0.71875q0.140625 0.25 0.421875 0.375q0.390625 0.171875 1.0 0.171875q1.28125 0 1.84375 -0.65625q0.359375 -0.453125 0.671875 -1.953125l0.140625 -0.671875q-1.09375 1.125 -2.34375 1.125q-1.25 0 -2.109375 -0.921875q-0.84375 -0.9375 -0.84375 -2.625q0 -1.40625 0.671875 -2.578125q0.671875 -1.171875 1.59375 -1.765625q0.921875 -0.59375 1.890625 -0.59375q1.640625 0 2.515625 1.546875l0.28125 -1.359375l1.296875 0l-1.671875 8.0q-0.265625 1.328125 -0.71875 2.0625q-0.4375 0.75 -1.234375 1.15625q-0.796875 0.40625 -1.828125 0.40625q-1.0 0 -1.734375 -0.265625q-0.71875 -0.25 -1.078125 -0.75q-0.34375 -0.5 -0.34375 -1.140625q0 -0.1875 0.03125 -0.421875zm1.765625 -4.421875q0 0.84375 0.171875 1.28125q0.234375 0.59375 0.65625 0.921875q0.4375 0.3125 0.96875 0.3125q0.703125 0 1.390625 -0.484375q0.6875 -0.5 1.109375 -1.515625q0.421875 -1.03125 0.421875 -1.953125q0 -1.03125 -0.5625 -1.625q-0.5625 -0.609375 -1.40625 -0.609375q-0.515625 0 -1.0 0.28125q-0.484375 0.265625 -0.90625 0.84375q-0.40625 0.5625 -0.625 1.359375q-0.21875 0.78125 -0.21875 1.1875zm20.78125 -0.359375l1.515625 0.203125q-0.71875 1.984375 -2.09375 3.015625q-1.375 1.015625 -3.09375 1.015625q-2.078125 0 -3.3125 -1.28125q-1.21875 -1.28125 -1.21875 -3.65625q0 -3.09375 1.859375 -5.109375q1.65625 -1.8125 4.125 -1.8125q1.8125 0 2.9375 0.984375q1.140625 0.96875 1.3125 2.625l-1.421875 0.125q-0.234375 -1.234375 -0.9375 -1.84375q-0.703125 -0.625 -1.828125 -0.625q-2.09375 0 -3.390625 1.875q-1.125 1.609375 -1.125 3.8125q0 1.765625 0.859375 2.703125q0.875 0.921875 2.265625 0.921875q1.1875 0 2.140625 -0.765625q0.96875 -0.78125 1.40625 -2.1875zm2.5859375 4.03125l2.40625 -11.453125l4.78125 0q1.234375 0 1.859375 0.28125q0.625 0.28125 1.03125 0.984375q0.40625 0.6875 0.40625 1.546875q0 0.703125 -0.296875 1.4375q-0.28125 0.734375 -0.734375 1.21875q-0.4375 0.46875 -0.890625 0.71875q-0.453125 0.234375 -0.96875 0.359375q-1.09375 0.25 -2.21875 0.25l-2.875 0l-0.96875 4.65625l-1.53125 0zm2.78125 -5.953125l2.515625 0q1.46875 0 2.15625 -0.3125q0.6875 -0.3125 1.09375 -0.953125q0.421875 -0.65625 0.421875 -1.390625q0 -0.5625 -0.21875 -0.90625q-0.21875 -0.359375 -0.625 -0.53125q-0.390625 -0.171875 -1.515625 -0.171875l-2.9375 0l-0.890625 4.265625zm10.375 -5.5l1.53125 0l-1.46875 7.03125q-0.171875 0.875 -0.171875 1.296875q0 0.921875 0.71875 1.484375q0.734375 0.5625 1.828125 0.5625q0.875 0 1.625 -0.390625q0.765625 -0.40625 1.203125 -1.1875q0.4375 -0.78125 0.78125 -2.5l1.328125 -6.296875l1.53125 0l-1.40625 6.71875q-0.359375 1.71875 -0.953125 2.71875q-0.578125 1.0 -1.625 1.609375q-1.03125 0.609375 -2.40625 0.609375q-1.296875 0 -2.25 -0.421875q-0.9375 -0.4375 -1.421875 -1.1875q-0.46875 -0.765625 -0.46875 -1.734375q0 -0.59375 0.328125 -2.0625l1.296875 -6.25zm21.859375 6.4375l-7.59375 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.59375 3.203125l0 1.3125zm5.8984375 1.25q0 -1.453125 0.421875 -2.953125q0.4375 -1.5 0.96875 -2.390625q0.53125 -0.90625 1.09375 -1.40625q0.578125 -0.515625 1.125 -0.75q0.5625 -0.234375 1.234375 -0.234375q1.3125 0 2.1875 0.984375q0.875 0.96875 0.875 2.8125q0 1.890625 -0.609375 3.75q-0.71875 2.203125 -2.0 3.3125q-0.984375 0.84375 -2.234375 0.84375q-1.296875 0 -2.1875 -1.015625q-0.875 -1.015625 -0.875 -2.953125zm1.359375 0.359375q0 1.0625 0.359375 1.65625q0.46875 0.8125 1.40625 0.8125q0.828125 0 1.5 -0.734375q0.96875 -1.046875 1.453125 -3.0625q0.484375 -2.03125 0.484375 -3.3125q0 -1.234375 -0.46875 -1.78125q-0.46875 -0.546875 -1.25 -0.546875q-0.5625 0 -1.046875 0.296875q-0.484375 0.28125 -0.9375 0.984375q-0.625 1.0 -1.09375 2.96875q-0.40625 1.6875 -0.40625 2.71875zm7.3203125 3.40625l0.34375 -1.609375l1.59375 0l-0.34375 1.609375l-1.59375 0zm4.6015625 -2.625l1.328125 -0.140625q0.140625 0.96875 0.546875 1.375q0.421875 0.40625 0.984375 0.40625q0.8125 0 1.515625 -0.703125q1.015625 -1.03125 1.5 -2.96875q-0.703125 0.53125 -1.265625 0.765625q-0.546875 0.21875 -1.125 0.21875q-1.046875 0 -1.875 -0.703125q-1.09375 -0.90625 -1.09375 -2.625q0 -1.9375 1.265625 -3.3125q1.09375 -1.1875 2.671875 -1.1875q1.421875 0 2.359375 1.046875q0.9375 1.046875 0.9375 2.96875q0 1.875 -0.625 3.6875q-0.75 2.140625 -2.015625 3.15625q-1.03125 0.84375 -2.3125 0.84375q-1.1875 0 -1.953125 -0.734375q-0.75 -0.75 -0.84375 -2.09375zm1.890625 -4.53125q0 1.078125 0.5625 1.71875q0.578125 0.640625 1.375 0.640625q0.578125 0 1.15625 -0.390625q0.578125 -0.40625 0.984375 -1.203125q0.421875 -0.796875 0.421875 -1.625q0 -0.65625 -0.28125 -1.21875q-0.265625 -0.5625 -0.734375 -0.84375q-0.46875 -0.296875 -0.953125 -0.296875q-0.46875 0 -0.921875 0.25q-0.453125 0.25 -0.84375 0.734375q-0.390625 0.484375 -0.578125 1.125q-0.1875 0.625 -0.1875 1.109375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 144.07611l233.00789 0l0 39.3071l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 144.07611l233.00789 0l0 39.3071l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m35.062584 164.74861l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.421875 0.640625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3984375 4.140625l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875z" fill-rule="nonzero"/><path fill="#000000" d="m136.96883 165.60799l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm9.0078125 4.875l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm12.0 -2.828125l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm4.796875 3.203125l0.09375 -1.328125q0.4375 0.125 0.84375 0.125q0.4375 0 0.703125 -0.1875q0.34375 -0.265625 0.75 -0.96875l0.453125 -0.8125l-1.390625 -8.328125l1.390625 0l0.625 4.1875q0.1875 1.25 0.328125 2.484375l3.703125 -6.671875l1.484375 0l-5.296875 9.40625q-0.765625 1.375 -1.359375 1.8125q-0.59375 0.453125 -1.359375 0.453125q-0.5 0 -0.96875 -0.171875zm12.9765625 -3.203125l1.734375 -8.296875l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.34375l-1.40625 0l1.140625 -5.484375q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.03125l-1.421875 0l1.171875 -5.609375q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.921875l-1.40625 0zm15.34375 -9.859375l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859375l1.734375 -8.296875l1.40625 0l-1.734375 8.296875l-1.40625 0zm3.6015625 0l1.734375 -8.296875l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.03125l-1.40625 0l1.09375 -5.265625q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.859375l-1.421875 0zm14.5703125 -1.5q-1.5 1.6875 -3.0625 1.6875q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5625 -0.59375 -1.359375q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296875l-1.296875 0l0.3125 -1.5zm6.5390625 0.34375l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 192.92389l233.00789 0l0 112.12598l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 192.92389l233.00789 0l0 112.12598l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m34.312584 217.28389l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.859375 1.65625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m45.49346 236.11156l195.77954 0l0 53.48033l-195.77954 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m45.49346 236.11156l195.77954 0l0 53.48033l-195.77954 0z" fill-rule="evenodd"/><path fill="#000000" d="m55.446587 256.63156l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m61.55596 267.61594l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm6.3867188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm9.949219 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34374237 0 0.5468674 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.3749924 -6.234375l1.140625 0l1.2968674 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.8593674 0.25q-0.296875 0 -0.671875 -0.140625zm5.4531174 -2.390625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm7.0996094 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.546875 -0.828125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125z" fill-rule="nonzero"/><path fill="#000000" d="m59.08721 277.63156l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m103.84112 273.76828l58.04882 0l0 13.798828l-58.04882 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m104.34112 282.2253l0.3125 -1.40625q0.421875 -0.015625 0.671875 -0.125q0.25 -0.109375 0.453125 -0.375q0.21875 -0.265625 0.34375 -0.609375q0.140625 -0.34375 0.296875 -1.09375q0.21875 -1.0625 0.4375 -1.515625q0.234375 -0.453125 0.546875 -0.703125q0.328125 -0.25 0.890625 -0.40625q0.359375 -0.09375 1.125 -0.09375l0.3125 0l-0.3125 1.390625q-0.65625 0 -0.875 0.09375q-0.21875 0.078125 -0.328125 0.265625q-0.078125 0.109375 -0.265625 0.859375q-0.328125 1.296875 -0.4375 1.578125q-0.203125 0.515625 -0.5 0.828125q-0.28125 0.3125 -0.796875 0.609375q0.34375 0.234375 0.5 0.5625q0.171875 0.3125 0.171875 0.84375q0 0.203125 -0.078125 0.625q-0.1875 1.15625 -0.25 1.359375q-0.046875 0.21875 -0.046875 0.359375q0 0.15625 0.078125 0.265625q0.09375 0.109375 0.25 0.15625q0.171875 0.0625 0.75 0.0625l-0.3125 1.40625l-0.3125 0q-0.796875 0 -1.203125 -0.140625q-0.390625 -0.125 -0.609375 -0.4375q-0.21875 -0.296875 -0.21875 -0.78125q0 -0.390625 0.203125 -1.328125q0.203125 -0.9375 0.203125 -1.25q0 -0.5 -0.21875 -0.734375q-0.21875 -0.234375 -0.78125 -0.265625zm4.669922 0l0.3125 -1.40625q0.421875 -0.015625 0.671875 -0.125q0.25 -0.109375 0.453125 -0.375q0.21875 -0.265625 0.34375 -0.609375q0.140625 -0.34375 0.296875 -1.09375q0.21875 -1.0625 0.4375 -1.515625q0.234375 -0.453125 0.546875 -0.703125q0.328125 -0.25 0.890625 -0.40625q0.359375 -0.09375 1.125 -0.09375l0.3125 0l-0.3125 1.390625q-0.65625 0 -0.875 0.09375q-0.21875 0.078125 -0.328125 0.265625q-0.078125 0.109375 -0.265625 0.859375q-0.328125 1.296875 -0.4375 1.578125q-0.203125 0.515625 -0.5 0.828125q-0.28125 0.3125 -0.796875 0.609375q0.34375 0.234375 0.5 0.5625q0.171875 0.3125 0.171875 0.84375q0 0.203125 -0.078125 0.625q-0.1875 1.15625 -0.25 1.359375q-0.046875 0.21875 -0.046875 0.359375q0 0.15625 0.078125 0.265625q0.09375 0.109375 0.25 0.15625q0.171875 0.0625 0.75 0.0625l-0.3125 1.40625l-0.3125 0q-0.796875 0 -1.203125 -0.140625q-0.390625 -0.125 -0.609375 -0.4375q-0.21875 -0.296875 -0.21875 -0.78125q0 -0.390625 0.203125 -1.328125q0.203125 -0.9375 0.203125 -1.25q0 -0.5 -0.21875 -0.734375q-0.21875 -0.234375 -0.78125 -0.265625zm4.435547 0.671875l1.625 -0.265625q0.21875 0.515625 0.53125 0.734375q0.328125 0.203125 0.890625 0.203125q0.578125 0 0.921875 -0.25q0.234375 -0.171875 0.234375 -0.421875q0 -0.171875 -0.125 -0.3125q-0.125 -0.125 -0.6875 -0.3125q-1.53125 -0.5 -1.890625 -0.796875q-0.5625 -0.453125 -0.5625 -1.203125q0 -0.734375 0.546875 -1.265625q0.765625 -0.75 2.28125 -0.75q1.203125 0 1.8125 0.453125q0.609375 0.4375 0.78125 1.1875l-1.5625 0.265625q-0.109375 -0.34375 -0.390625 -0.515625q-0.375 -0.21875 -0.90625 -0.21875q-0.53125 0 -0.765625 0.171875q-0.21875 0.171875 -0.21875 0.40625q0 0.234375 0.234375 0.375q0.140625 0.09375 0.9375 0.328125q1.234375 0.359375 1.65625 0.703125q0.578125 0.5 0.578125 1.171875q0 0.890625 -0.75 1.546875q-0.734375 0.640625 -2.09375 0.640625q-1.34375 0 -2.078125 -0.484375q-0.734375 -0.5 -1.0 -1.390625zm12.955078 -0.859375l-4.21875 0q-0.015625 0.109375 -0.015625 0.15625q0 0.625 0.359375 1.0q0.359375 0.375 0.859375 0.375q0.84375 0 1.3125 -0.859375l1.5 0.25q-0.4375 0.90625 -1.171875 1.359375q-0.734375 0.453125 -1.65625 0.453125q-1.25 0 -2.03125 -0.78125q-0.78125 -0.796875 -0.78125 -2.109375q0 -1.28125 0.703125 -2.265625q0.96875 -1.359375 2.765625 -1.359375q1.140625 0 1.8125 0.71875q0.671875 0.703125 0.671875 1.96875q0 0.609375 -0.109375 1.09375zm-1.421875 -1.015625q0 -0.125 0 -0.171875q0 -0.703125 -0.3125 -1.046875q-0.3125 -0.34375 -0.828125 -0.34375q-0.515625 0 -0.9375 0.390625q-0.40625 0.390625 -0.5625 1.171875l2.640625 0zm3.2363205 -2.609375l1.578125 0l-0.265625 1.203125q0.890625 -1.359375 1.90625 -1.359375q0.375 0 0.78125 0.1875l-0.640625 1.375q-0.234375 -0.078125 -0.484375 -0.078125q-0.4375 0 -0.890625 0.328125q-0.4375 0.328125 -0.703125 0.875q-0.25 0.546875 -0.484375 1.734375l-0.421875 1.953125l-1.6718674 0l1.2968674 -6.21875zm6.576172 6.21875l-1.453125 0l-1.25 -6.21875l1.65625 0l0.4375 2.703125q0.1875 1.109375 0.21875 1.46875q0.046875 -0.09375 0.40625 -0.75q0.359375 -0.671875 0.453125 -0.796875l1.546875 -2.625l1.8125 0l-3.828125 6.21875zm9.626953 -2.59375l-4.21875 0q-0.015625 0.109375 -0.015625 0.15625q0 0.625 0.359375 1.0q0.359375 0.375 0.859375 0.375q0.84375 0 1.3125 -0.859375l1.5 0.25q-0.4375 0.90625 -1.171875 1.359375q-0.734375 0.453125 -1.65625 0.453125q-1.25 0 -2.03125 -0.78125q-0.78125 -0.796875 -0.78125 -2.109375q0 -1.28125 0.703125 -2.265625q0.96875 -1.359375 2.765625 -1.359375q1.140625 0 1.8125 0.71875q0.671875 0.703125 0.671875 1.96875q0 0.609375 -0.109375 1.09375zm-1.421875 -1.015625q0 -0.125 0 -0.171875q0 -0.703125 -0.3125 -1.046875q-0.3125 -0.34375 -0.828125 -0.34375q-0.515625 0 -0.9375 0.390625q-0.40625 0.390625 -0.5625 1.171875l2.640625 0zm3.2363281 -2.609375l1.578125 0l-0.265625 1.203125q0.890625 -1.359375 1.90625 -1.359375q0.375 0 0.78125 0.1875l-0.640625 1.375q-0.234375 -0.078125 -0.484375 -0.078125q-0.4375 0 -0.890625 0.328125q-0.4375 0.328125 -0.703125 0.875q-0.25 0.546875 -0.484375 1.734375l-0.421875 1.953125l-1.671875 0l1.296875 -6.21875zm7.044922 3.8125q-0.53125 0.03125 -0.828125 0.21875q-0.296875 0.1875 -0.515625 0.609375q-0.21875 0.40625 -0.4375 1.4375q-0.203125 1.015625 -0.4375 1.453125q-0.21875 0.453125 -0.546875 0.703125q-0.3125 0.25 -0.875 0.40625q-0.375 0.109375 -1.125 0.109375l-0.3125 0l0.296875 -1.40625q0.640625 0 0.859375 -0.09375q0.234375 -0.09375 0.359375 -0.265625q0.078125 -0.125 0.25 -0.84375q0.328125 -1.296875 0.421875 -1.546875q0.21875 -0.515625 0.53125 -0.875q0.3125 -0.359375 0.796875 -0.609375q-0.390625 -0.28125 -0.546875 -0.578125q-0.140625 -0.296875 -0.140625 -0.828125q0 -0.203125 0.078125 -0.625q0.1875 -1.125 0.234375 -1.34375q0.0625 -0.234375 0.0625 -0.390625q0 -0.15625 -0.078125 -0.25q-0.078125 -0.109375 -0.25 -0.15625q-0.15625 -0.0625 -0.75 -0.0625l0.3125 -1.390625l0.3125 0q0.796875 0 1.1875 0.140625q0.40625 0.125 0.625 0.421875q0.21875 0.296875 0.21875 0.78125q0 0.390625 -0.203125 1.328125q-0.203125 0.9375 -0.203125 1.25q0 0.5 0.21875 0.734375q0.21875 0.234375 0.78125 0.265625l-0.296875 1.40625zm4.669922 0q-0.53125 0.03125 -0.828125 0.21875q-0.296875 0.1875 -0.515625 0.609375q-0.21875 0.40625 -0.4375 1.4375q-0.203125 1.015625 -0.4375 1.453125q-0.21875 0.453125 -0.546875 0.703125q-0.3125 0.25 -0.875 0.40625q-0.375 0.109375 -1.125 0.109375l-0.3125 0l0.296875 -1.40625q0.640625 0 0.859375 -0.09375q0.234375 -0.09375 0.359375 -0.265625q0.078125 -0.125 0.25 -0.84375q0.328125 -1.296875 0.421875 -1.546875q0.21875 -0.515625 0.53125 -0.875q0.3125 -0.359375 0.796875 -0.609375q-0.390625 -0.28125 -0.546875 -0.578125q-0.140625 -0.296875 -0.140625 -0.828125q0 -0.203125 0.078125 -0.625q0.1875 -1.125 0.234375 -1.34375q0.0625 -0.234375 0.0625 -0.390625q0 -0.15625 -0.078125 -0.25q-0.078125 -0.109375 -0.25 -0.15625q-0.15625 -0.0625 -0.75 -0.0625l0.3125 -1.390625l0.3125 0q0.796875 0 1.1875 0.140625q0.40625 0.125 0.625 0.421875q0.21875 0.296875 0.21875 0.78125q0 0.390625 -0.203125 1.328125q-0.203125 0.9375 -0.203125 1.25q0 0.5 0.21875 0.734375q0.21875 0.234375 0.78125 0.265625l-0.296875 1.40625z" fill-rule="nonzero"/><path fill="#000000" d="m163.79619 277.24094l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m103.84112 285.41156l58.04882 0l0 1.0799866l-58.04882 0l0 -1.0799866z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m637.41473 52.889763l139.37012 0l0 56.598427l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m637.41473 52.889763l139.37012 0l0 56.598427l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m647.36786 73.40977l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m653.47723 84.39414l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm6.3867188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm9.949219 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm5.453125 -2.390625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm7.0996094 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.546875 -0.828125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125z" fill-rule="nonzero"/><path fill="#000000" d="m651.0085 94.40977l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m695.7624 90.546486l28.02539 0l0 13.798828l-28.02539 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m697.68427 101.40977l-2.28125 0l3.78125 -4.34375l-2.125 -4.25l1.84375 0l0.84375 1.609375q0.03125 0.09375 0.5625 1.1875q0.046875 0.0625 0.078125 0.171875q0.71875 -0.875 1.203125 -1.4375l1.359375 -1.53125l2.21875 0l-3.9375 4.53125l2.125 4.0625l-2.0 0l-0.640625 -1.296875q-0.5 -1.03125 -0.671875 -1.46875q-0.21875 0.34375 -1.171875 1.421875l-1.1875 1.34375zm7.5039062 -4.9375l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m729.028 94.01914l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m695.7624 102.189766l28.02539 0l0 1.0800018l-28.02539 0l0 -1.0800018z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 -32.62992" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l75.97275 -30.40084" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m334.93808 84.95158l3.5996704 -3.2194824l-4.826935 0.15245819z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 72.37795" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l77.05597 68.395" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m334.31122 183.4492l4.490448 1.7771912l-2.2975159 -4.2478027z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m352.57217 6.0367455l140.56693 0l0 33.51181l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m361.54092 32.956745l5.125 -13.359377l1.90625 0l5.46875 13.359377l-2.015625 0l-1.546875 -4.046877l-5.59375 0l-1.46875 4.046877l-1.875 0zm3.859375 -5.484377l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484377l0 -13.359377l1.640625 0l0 13.359377l-1.640625 0zm10.816711 -3.109377l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.312502q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.2968769q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765627l0 -9.671877l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.062502l-1.625 0zm9.806427 -1.4687519l0.234375 1.4531269q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.4687519 -0.203125 -1.9375019l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.2884827 1.4687519l0 -13.359377l1.765625 0l0 13.359377l-1.765625 0zm4.683319 0l0 -9.671877l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953127l-1.640625 0l0 -5.890627q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281252l-1.640625 0zm9.719452 -2.890627l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.7187519 -1.375 1.1250019q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.7812519 -1.25 -2.328127zm13.5625 1.421875l0.234375 1.4531269q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.4687519 -0.203125 -1.9375019l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917694 0.28125q-0.921875 0.7656269 -1.765625 1.0937519q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.7812519 -0.859375 -1.9843769q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.5937519 0.40625 1.1562519l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875019zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203827 4.859377l0 -9.671877l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953127l-1.640625 0l0 -5.890627q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281252l-1.640625 0zm16.688232 -3.546877l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609377q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.2968769q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.312502q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.2968769q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.90027 52.889763l139.37009 0l0 56.598427l-139.37009 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.90027 52.889763l139.37009 0l0 56.598427l-139.37009 0z" fill-rule="evenodd"/><path fill="#000000" d="m369.50748 82.893974l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm8.062012 0l4.0625 -5.46875l-3.578125 -5.015625l1.65625 0l1.890625 2.6875q0.59375 0.828125 0.84375 1.28125q0.359375 -0.5625 0.84375 -1.1875l2.109375 -2.78125l1.5 0l-3.6875 4.9375l3.984375 5.546875l-1.71875 0l-2.640625 -3.75q-0.21875 -0.3125 -0.46875 -0.6875q-0.34375 0.5625 -0.5 0.78125l-2.625 3.65625l-1.671875 0zm15.166229 0l-1.28125 0l0 -8.203125q-0.46875 0.4375 -1.21875 0.890625q-0.75 0.4375 -1.359375 0.65625l0 -1.25q1.078125 -0.5 1.890625 -1.21875q0.8125 -0.734375 1.140625 -1.40625l0.828125 0l0 10.53125zm10.072968 -1.234375l0 1.234375l-6.9375 0q-0.015625 -0.46875 0.15625 -0.890625q0.265625 -0.71875 0.84375 -1.40625q0.59375 -0.6875 1.6875 -1.578125q1.71875 -1.40625 2.3125 -2.21875q0.609375 -0.828125 0.609375 -1.5625q0 -0.765625 -0.5625 -1.28125q-0.546875 -0.53125 -1.421875 -0.53125q-0.921875 0 -1.484375 0.5625q-0.5625 0.5625 -0.5625 1.546875l-1.328125 -0.140625q0.140625 -1.484375 1.015625 -2.25q0.890625 -0.78125 2.390625 -0.78125q1.515625 0 2.390625 0.84375q0.875 0.828125 0.875 2.0625q0 0.640625 -0.265625 1.25q-0.25 0.59375 -0.84375 1.265625q-0.59375 0.671875 -1.984375 1.859375q-1.15625 0.96875 -1.484375 1.3125q-0.328125 0.34375 -0.546875 0.703125l5.140625 0zm1.385498 -1.53125l1.296875 -0.171875q0.21875 1.09375 0.75 1.578125q0.53125 0.484375 1.296875 0.484375q0.90625 0 1.53125 -0.625q0.640625 -0.640625 0.640625 -1.5625q0 -0.890625 -0.59375 -1.46875q-0.578125 -0.578125 -1.46875 -0.578125q-0.359375 0 -0.90625 0.140625l0.140625 -1.125q0.125 0.015625 0.203125 0.015625q0.828125 0 1.484375 -0.421875q0.65625 -0.4375 0.65625 -1.34375q0 -0.703125 -0.484375 -1.15625q-0.46875 -0.46875 -1.234375 -0.46875q-0.75 0 -1.25 0.46875q-0.5 0.46875 -0.640625 1.421875l-1.28125 -0.234375q0.234375 -1.296875 1.0625 -2.0q0.84375 -0.71875 2.09375 -0.71875q0.859375 0 1.578125 0.375q0.71875 0.359375 1.09375 1.0q0.390625 0.640625 0.390625 1.34375q0 0.6875 -0.375 1.25q-0.359375 0.546875 -1.0625 0.875q0.921875 0.21875 1.4375 0.90625q0.515625 0.671875 0.515625 1.6875q0 1.375 -1.0 2.328125q-1.0 0.953125 -2.53125 0.953125q-1.390625 0 -2.296875 -0.8125q-0.90625 -0.828125 -1.046875 -2.140625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.89764 157.89842l140.56693 0l0 56.59842l-140.56693 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.89764 157.89842l140.56693 0l0 56.59842l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m370.23578 187.90263l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm11.828278 0l0 -4.4375l-4.046875 -6.046875l1.6875 0l2.0625 3.15625q0.578125 0.890625 1.0625 1.78125q0.484375 -0.828125 1.15625 -1.859375l2.03125 -3.078125l1.609375 0l-4.1875 6.046875l0 4.4375l-1.375 0zm10.416229 0l0 -2.515625l-4.546875 0l0 -1.171875l4.78125 -6.796875l1.0625 0l0 6.796875l1.40625 0l0 1.171875l-1.40625 0l0 2.515625l-1.296875 0zm0 -3.6875l0 -4.734375l-3.28125 4.734375l3.28125 0zm4.0260925 0.9375l1.34375 -0.109375q0.15625 0.984375 0.703125 1.484375q0.546875 0.5 1.328125 0.5q0.921875 0 1.5625 -0.703125q0.65625 -0.703125 0.65625 -1.859375q0 -1.109375 -0.625 -1.734375q-0.625 -0.640625 -1.625 -0.640625q-0.625 0 -1.125 0.28125q-0.5 0.28125 -0.78125 0.734375l-1.203125 -0.15625l1.015625 -5.390625l5.21875 0l0 1.21875l-4.1875 0l-0.578125 2.828125q0.953125 -0.65625 1.984375 -0.65625q1.375 0 2.3125 0.953125q0.953125 0.953125 0.953125 2.4375q0 1.4375 -0.828125 2.46875q-1.015625 1.265625 -2.75 1.265625q-1.4375 0 -2.34375 -0.796875q-0.90625 -0.796875 -1.03125 -2.125zm14.838623 -5.171875l-1.28125 0.09375q-0.171875 -0.75 -0.484375 -1.09375q-0.53125 -0.546875 -1.296875 -0.546875q-0.609375 0 -1.078125 0.34375q-0.609375 0.4375 -0.96875 1.296875q-0.34375 0.84375 -0.359375 2.421875q0.46875 -0.71875 1.140625 -1.0625q0.671875 -0.34375 1.40625 -0.34375q1.296875 0 2.203125 0.953125q0.90625 0.953125 0.90625 2.453125q0 0.984375 -0.4375 1.84375q-0.421875 0.84375 -1.171875 1.296875q-0.734375 0.4375 -1.6875 0.4375q-1.609375 0 -2.625 -1.171875q-1.015625 -1.1875 -1.015625 -3.90625q0 -3.046875 1.125 -4.421875q0.984375 -1.203125 2.640625 -1.203125q1.234375 0 2.03125 0.703125q0.796875 0.6875 0.953125 1.90625zm-5.265625 4.515625q0 0.671875 0.28125 1.28125q0.28125 0.609375 0.78125 0.9375q0.515625 0.3125 1.078125 0.3125q0.8125 0 1.390625 -0.65625q0.59375 -0.671875 0.59375 -1.796875q0 -1.09375 -0.578125 -1.71875q-0.578125 -0.625 -1.453125 -0.625q-0.875 0 -1.484375 0.625q-0.609375 0.625 -0.609375 1.640625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.90027 261.96118l140.56693 0l0 56.59842l-140.56693 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.90027 261.96118l140.56693 0l0 56.59842l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m370.5174 291.9654l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm8.296387 0l0 -1.28125l5.375 -6.734375q0.5625 -0.703125 1.078125 -1.234375l-5.84375 0l0 -1.234375l7.515625 0l0 1.234375l-5.890625 7.28125l-0.640625 0.734375l6.703125 0l0 1.234375l-8.296875 0zm9.343231 -9.125l0 -1.234375l6.796875 0l0 1.0q-1.0 1.078125 -1.984375 2.84375q-0.984375 1.765625 -1.515625 3.625q-0.390625 1.328125 -0.5 2.890625l-1.328125 0q0.03125 -1.234375 0.484375 -2.984375q0.46875 -1.765625 1.34375 -3.390625q0.875 -1.625 1.84375 -2.75l-5.140625 0zm10.057373 3.4375q-0.796875 -0.296875 -1.1875 -0.84375q-0.390625 -0.546875 -0.390625 -1.296875q0 -1.140625 0.8125 -1.921875q0.828125 -0.78125 2.203125 -0.78125q1.375 0 2.203125 0.796875q0.84375 0.796875 0.84375 1.9375q0 0.734375 -0.390625 1.28125q-0.375 0.53125 -1.15625 0.828125q0.96875 0.3125 1.46875 1.015625q0.5 0.703125 0.5 1.671875q0 1.34375 -0.953125 2.265625q-0.9375 0.90625 -2.5 0.90625q-1.546875 0 -2.5 -0.90625q-0.953125 -0.921875 -0.953125 -2.296875q0 -1.03125 0.515625 -1.71875q0.515625 -0.6875 1.484375 -0.9375zm-0.265625 -2.1875q0 0.75 0.484375 1.21875q0.484375 0.46875 1.25 0.46875q0.734375 0 1.203125 -0.46875q0.484375 -0.46875 0.484375 -1.140625q0 -0.71875 -0.5 -1.1875q-0.484375 -0.484375 -1.203125 -0.484375q-0.734375 0 -1.234375 0.46875q-0.484375 0.46875 -0.484375 1.125zm-0.40625 4.84375q0 0.5625 0.25 1.078125q0.265625 0.5 0.78125 0.796875q0.515625 0.28125 1.109375 0.28125q0.921875 0 1.515625 -0.59375q0.609375 -0.59375 0.609375 -1.515625q0 -0.9375 -0.625 -1.53125q-0.609375 -0.609375 -1.546875 -0.609375q-0.90625 0 -1.5 0.609375q-0.59375 0.59375 -0.59375 1.484375zm7.0260925 0.609375l1.25 -0.125q0.15625 0.875 0.59375 1.28125q0.4375 0.390625 1.140625 0.390625q0.59375 0 1.03125 -0.265625q0.453125 -0.28125 0.734375 -0.734375q0.296875 -0.453125 0.484375 -1.21875q0.1875 -0.78125 0.1875 -1.59375q0 -0.078125 0 -0.25q-0.390625 0.609375 -1.0625 1.0q-0.65625 0.375 -1.4375 0.375q-1.3125 0 -2.21875 -0.9375q-0.890625 -0.953125 -0.890625 -2.484375q0 -1.609375 0.9375 -2.578125q0.9375 -0.96875 2.359375 -0.96875q1.03125 0 1.875 0.546875q0.84375 0.546875 1.28125 1.578125q0.4375 1.015625 0.4375 2.953125q0 2.0 -0.4375 3.203125q-0.421875 1.1875 -1.296875 1.8125q-0.859375 0.609375 -2.015625 0.609375q-1.234375 0 -2.015625 -0.671875q-0.78125 -0.6875 -0.9375 -1.921875zm5.28125 -4.640625q0 -1.109375 -0.59375 -1.75q-0.59375 -0.65625 -1.421875 -0.65625q-0.859375 0 -1.5 0.703125q-0.625 0.703125 -0.625 1.8125q0 1.0 0.59375 1.640625q0.609375 0.625 1.5 0.625q0.890625 0 1.46875 -0.625q0.578125 -0.640625 0.578125 -1.75z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 176.44095" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l79.026184 170.99445" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m335.87854 285.50632l3.4031677 3.4264832l-0.40444946 -4.812378z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m661.33215 6.0367227l140.5669 0l0 33.51181l-140.5669 0z" fill-rule="evenodd"/><path fill="#000000" d="m670.3009 32.956722l5.125 -13.359377l1.90625 0l5.46875 13.359377l-2.015625 0l-1.546875 -4.046877l-5.59375 0l-1.46875 4.046877l-1.875 0zm3.859375 -5.484377l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm16.162292 1.9375l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609377q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.2968769q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.4531269q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.4687519 -0.203125 -1.9375019l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.468752l0 -9.671877l1.640625 0l0 9.671877l-1.640625 0zm3.5354004 -4.843752q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.6562519q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.2968769q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.843752l0 -9.671877l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953127l-1.640625 0l0 -5.890627q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281252l-1.640625 0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m637.4121 157.89842l139.37012 0l0 56.59842l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m637.4121 157.89842l139.37012 0l0 56.59842l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m647.36523 178.41843l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m653.4746 189.4028l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm6.3867188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm9.949219 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm5.453125 -2.390625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm7.0996094 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.546875 -0.828125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125z" fill-rule="nonzero"/><path fill="#000000" d="m651.00586 199.41843l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m695.75977 195.55515l8.003906 0l0 13.798828l-8.003906 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m700.57227 206.41843l-1.765625 0l0.703125 -3.34375l-2.375 -5.25l1.890625 0l1.0625 2.421875q0.375 0.875 0.5 1.265625q0.21875 -0.375 0.515625 -0.8125l0.8125 -1.125l1.203125 -1.75l2.0625 0l-3.9375 5.40625l-0.671875 3.1875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m703.7637 195.55515l20.021484 0l0 13.798828l-20.021484 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m705.18555 201.48093l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m729.0254 199.0278l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m695.75977 207.19843l28.02539 0l0 1.0800018l-28.02539 0l0 -1.0800018z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m637.41473 261.96167l139.37012 0l0 56.59842l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m637.41473 261.96167l139.37012 0l0 56.59842l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m647.36786 282.4817l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m653.47723 293.46606l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2929688 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm6.3867188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm9.949219 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm5.453125 -2.390625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm7.0996094 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.546875 -0.828125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125z" fill-rule="nonzero"/><path fill="#000000" d="m651.0085 303.4817l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m695.7624 299.6184l7.330078 0l0 13.798828l-7.330078 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m696.05927 310.4817l0.28125 -1.359375l4.953125 -5.796875l-4.0 0l0.296875 -1.4375l6.1875 0l-0.25 1.34375l-5.0 5.84375q0.796875 -0.015625 0.921875 -0.015625q0.5625 0 1.546875 -0.015625l2.03125 0l-0.296875 1.4375l-6.671875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m703.09247 299.6184l20.021484 0l0 13.798828l-20.021484 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m704.51434 305.5442l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m728.3542 303.09106l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m695.7624 311.2617l27.351562 0l0 1.0799866l-27.351562 0l0 -1.0799866z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m480.46457 186.19763l156.94485 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m480.46457 186.19763l150.94485 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m631.4094 187.84937l4.538147 -1.6517334l-4.538147 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m479.27036 81.18898l158.1417 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.27036 81.18898l152.1417 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m631.41205 82.840706l4.538147 -1.6517258l-4.538147 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m480.4672 290.2604l156.94485 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m480.4672 290.2604l150.94485 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m631.41205 291.91214l4.538147 -1.6517334l-4.538147 -1.6517334z" fill-rule="evenodd"/><path fill="#ffffff" d="m829.90027 157.89764l139.37006 0l0 56.59842l-139.37006 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m829.90027 157.89764l139.37006 0l0 56.59842l-139.37006 0z" fill-rule="evenodd"/><path fill="#000000" d="m862.00665 182.27686l0 -7.59375l1.15625 0l0 1.0625q0.34375 -0.5625 0.9375 -0.890625q0.609375 -0.34375 1.359375 -0.34375q0.84375 0 1.375 0.34375q0.546875 0.34375 0.765625 0.984375q0.90625 -1.328125 2.359375 -1.328125q1.125 0 1.734375 0.625q0.609375 0.625 0.609375 1.921875l0 5.21875l-1.28125 0l0 -4.78125q0 -0.78125 -0.125 -1.109375q-0.125 -0.34375 -0.453125 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.796875 0 -1.328125 0.53125q-0.53125 0.53125 -0.53125 1.703125l0 4.421875l-1.28125 0l0 -4.9375q0 -0.859375 -0.3125 -1.28125q-0.3125 -0.4375 -1.03125 -0.4375q-0.546875 0 -1.015625 0.296875q-0.453125 0.28125 -0.671875 0.828125q-0.203125 0.546875 -0.203125 1.59375l0 3.9375l-1.28125 0zm12.14624 2.921875l-0.140625 -1.203125q0.421875 0.109375 0.734375 0.109375q0.4375 0 0.6875 -0.140625q0.265625 -0.140625 0.421875 -0.40625q0.125 -0.1875 0.390625 -0.953125q0.046875 -0.109375 0.125 -0.3125l-2.890625 -7.609375l1.390625 0l1.578125 4.390625q0.3125 0.84375 0.546875 1.765625q0.234375 -0.890625 0.53125 -1.734375l1.625 -4.421875l1.296875 0l-2.890625 7.71875q-0.46875 1.25 -0.734375 1.734375q-0.34375 0.625 -0.78125 0.921875q-0.4375 0.296875 -1.0625 0.296875q-0.375 0 -0.828125 -0.15625zm6.661499 -2.921875l0 -1.46875l1.46875 0l0 1.46875l-1.46875 0zm8.66571 -2.78125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm1.890625 -1.015625q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm16.582458 1.34375l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.182373 4.53125l0 -7.59375l1.15625 0l0 1.0625q0.34375 -0.5625 0.9375 -0.890625q0.609375 -0.34375 1.359375 -0.34375q0.84375 0 1.375 0.34375q0.546875 0.34375 0.765625 0.984375q0.90625 -1.328125 2.359375 -1.328125q1.125 0 1.734375 0.625q0.609375 0.625 0.609375 1.921875l0 5.21875l-1.28125 0l0 -4.78125q0 -0.78125 -0.125 -1.109375q-0.125 -0.34375 -0.453125 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.796875 0 -1.328125 0.53125q-0.53125 0.53125 -0.53125 1.703125l0 4.421875l-1.28125 0l0 -4.9375q0 -0.859375 -0.3125 -1.28125q-0.3125 -0.4375 -1.03125 -0.4375q-0.546875 0 -1.015625 0.296875q-0.453125 0.28125 -0.671875 0.828125q-0.203125 0.546875 -0.203125 1.59375l0 3.9375l-1.28125 0zm17.161865 -0.9375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm3.307373 -5.203125l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm3.2249146 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0z" fill-rule="nonzero"/><path fill="#000000" d="m876.8267 198.01123l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125zm13.046875 -0.1875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.005615 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm5.21875 -9.015625l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm8.20929 -2.78125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm7.578125 0.328125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m776.78485 81.18898l53.102356 105.00787" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m776.78485 81.18898l50.394714 99.653564" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m825.70557 181.58794l3.5219116 3.3043365l-0.5739136 -4.7951202z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m776.7822 186.19763l53.102356 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m776.7822 186.19763l47.102356 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m823.8846 187.84937l4.538086 -1.6517334l-4.538086 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m776.78485 290.2609l53.102356 -104.063" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m776.78485 290.2609l50.375183 -98.71861" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m828.6313 192.29305l0.59143066 -4.792984l-3.5339355 3.2914581z" fill-rule="evenodd"/><path fill="#ffffff" d="m25.338583 342.32285l233.00789 0l0 105.00787l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.338583 342.32285l233.00789 0l0 105.00787l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m46.104206 365.5072l1.890625 0.46875q-0.59375 2.34375 -2.140625 3.578125q-1.546875 1.21875 -3.796875 1.21875q-2.3125 0 -3.765625 -0.9375q-1.4375 -0.953125 -2.203125 -2.734375q-0.75 -1.796875 -0.75 -3.84375q0 -2.234375 0.84375 -3.890625q0.859375 -1.671875 2.4375 -2.53125q1.578125 -0.875 3.46875 -0.875q2.15625 0 3.609375 1.09375q1.46875 1.09375 2.046875 3.078125l-1.859375 0.4375q-0.5 -1.5625 -1.453125 -2.265625q-0.9375 -0.71875 -2.375 -0.71875q-1.65625 0 -2.765625 0.796875q-1.109375 0.78125 -1.5625 2.125q-0.4375 1.328125 -0.4375 2.734375q0 1.828125 0.53125 3.203125q0.53125 1.359375 1.65625 2.03125q1.125 0.671875 2.421875 0.671875q1.59375 0 2.703125 -0.921875q1.109375 -0.921875 1.5 -2.71875zm3.3496094 -0.171875q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875zm9.966797 5.1875l0 -10.375l1.59375 0l0 1.484375q1.140625 -1.71875 3.2968788 -1.71875q0.9375 0 1.71875 0.34375q0.796875 0.328125 1.1875 0.875q0.390625 0.546875 0.546875 1.296875q0.09375 0.5 0.09375 1.71875l0 6.375l-1.765625 0l0 -6.3125q0 -1.078125 -0.203125 -1.609375q-0.203125 -0.53125 -0.734375 -0.84375q-0.515625 -0.3125 -1.21875 -0.3125q-1.125 0 -1.9375038 0.71875q-0.8125 0.703125 -0.8125 2.6875l0 5.671875l-1.765625 0zm11.123051 0l0 -10.375l1.59375 0l0 1.484375q1.140625 -1.71875 3.296875 -1.71875q0.9375 0 1.71875 0.34375q0.796875 0.328125 1.1875 0.875q0.390625 0.546875 0.546875 1.296875q0.09375 0.5 0.09375 1.71875l0 6.375l-1.765625 0l0 -6.3125q0 -1.078125 -0.203125 -1.609375q-0.203125 -0.53125 -0.734375 -0.84375q-0.515625 -0.3125 -1.21875 -0.3125q-1.125 0 -1.9375 0.71875q-0.8125 0.703125 -0.8125 2.6875l0 5.671875l-1.765625 0zm18.232422 -3.34375l1.8125 0.234375q-0.421875 1.578125 -1.59375 2.46875q-1.15625 0.875 -2.96875 0.875q-2.265625 0 -3.609375 -1.390625q-1.328125 -1.40625 -1.328125 -3.9375q0 -2.625 1.34375 -4.0625q1.34375 -1.453125 3.5 -1.453125q2.078125 0 3.390625 1.421875q1.328125 1.40625 1.328125 3.984375q0 0.15625 -0.015625 0.46875l-7.734375 0q0.09375 1.703125 0.96875 2.609375q0.875 0.90625 2.171875 0.90625q0.96875 0 1.640625 -0.5q0.6875 -0.515625 1.09375 -1.625zm-5.78125 -2.84375l5.796875 0q-0.109375 -1.296875 -0.65625 -1.953125q-0.84375 -1.015625 -2.1875 -1.015625q-1.203125 0 -2.03125 0.8125q-0.828125 0.796875 -0.921875 2.15625zm16.576172 2.390625l1.71875 0.21875q-0.28125 1.796875 -1.453125 2.8125q-1.15625 1.0 -2.859375 1.0q-2.125 0 -3.421875 -1.390625q-1.296875 -1.390625 -1.296875 -3.984375q0 -1.6875 0.546875 -2.9375q0.5625 -1.265625 1.703125 -1.890625q1.140625 -0.640625 2.484375 -0.640625q1.6875 0 2.75 0.859375q1.078125 0.859375 1.390625 2.421875l-1.71875 0.265625q-0.234375 -1.046875 -0.859375 -1.5625q-0.625 -0.53125 -1.5 -0.53125q-1.328125 0 -2.15625 0.953125q-0.828125 0.953125 -0.828125 3.0q0 2.09375 0.796875 3.046875q0.796875 0.9375 2.09375 0.9375q1.03125 0 1.71875 -0.625q0.703125 -0.640625 0.890625 -1.953125zm7.0625 2.21875l0.25 1.5625q-0.734375 0.15625 -1.328125 0.15625q-0.953125 0 -1.484375 -0.296875q-0.515625 -0.3125 -0.734375 -0.796875q-0.21875 -0.5 -0.21875 -2.078125l0 -5.96875l-1.28125 0l0 -1.375l1.28125 0l0 -2.5625l1.75 -1.0625l0 3.625l1.765625 0l0 1.375l-1.765625 0l0 6.0625q0 0.75 0.09375 0.96875q0.09375 0.203125 0.296875 0.34375q0.21875 0.125 0.609375 0.125q0.28125 0 0.765625 -0.078125zm1.0722656 -3.609375q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875zm9.951172 5.1875l0 -10.375l1.578125 0l0 1.578125q0.609375 -1.109375 1.125 -1.453125q0.515625 -0.359375 1.125 -0.359375q0.890625 0 1.8125 0.5625l-0.609375 1.640625q-0.640625 -0.390625 -1.28125 -0.390625q-0.578125 0 -1.046875 0.359375q-0.453125 0.34375 -0.65625 0.953125q-0.28125 0.9375 -0.28125 2.046875l0 5.4375l-1.765625 0zm11.560539 -4.296875l0 -1.765625l5.390625 0l0 1.765625l-5.390625 0zm12.888672 4.296875l0 -10.375l1.578125 0l0 1.453125q0.484375 -0.75 1.296875 -1.21875q0.8125 -0.46875 1.84375 -0.46875q1.15625 0 1.890625 0.484375q0.734375 0.46875 1.046875 1.328125q1.234375 -1.8125 3.203125 -1.8125q1.546875 0 2.375 0.859375q0.828125 0.859375 0.828125 2.625l0 7.125l-1.75 0l0 -6.53125q0 -1.0625 -0.171875 -1.515625q-0.171875 -0.46875 -0.625 -0.75q-0.4375 -0.28125 -1.046875 -0.28125q-1.09375 0 -1.828125 0.734375q-0.71875 0.71875 -0.71875 2.3125l0 6.03125l-1.75 0l0 -6.734375q0 -1.171875 -0.4375 -1.75q-0.421875 -0.59375 -1.40625 -0.59375q-0.734375 0 -1.375 0.390625q-0.625 0.390625 -0.90625 1.140625q-0.28125 0.75 -0.28125 2.171875l0 5.375l-1.765625 0zm16.582031 4.0l-0.1875 -1.65625q0.578125 0.15625 1.0 0.15625q0.59375 0 0.9375 -0.203125q0.359375 -0.1875 0.578125 -0.53125q0.171875 -0.265625 0.546875 -1.3125q0.046875 -0.15625 0.15625 -0.4375l-3.9375 -10.390625l1.890625 0l2.15625 6.015625q0.421875 1.140625 0.75 2.390625q0.3125 -1.203125 0.71875 -2.359375l2.21875 -6.046875l1.765625 0l-3.953125 10.546875q-0.625 1.71875 -0.984375 2.359375q-0.46875 0.875 -1.078125 1.265625q-0.59375 0.40625 -1.4375 0.40625q-0.515625 0 -1.140625 -0.203125zm9.09375 -4.0l0 -2.0l2.0 0l0 2.0l-2.0 0zm11.837891 -3.796875l1.71875 0.21875q-0.28125 1.796875 -1.453125 2.8125q-1.15625 1.0 -2.859375 1.0q-2.125 0 -3.421875 -1.390625q-1.296875 -1.390625 -1.296875 -3.984375q0 -1.6875 0.546875 -2.9375q0.5625 -1.265625 1.703125 -1.890625q1.140625 -0.640625 2.484375 -0.640625q1.6875 0 2.75 0.859375q1.078125 0.859375 1.390625 2.421875l-1.71875 0.265625q-0.234375 -1.046875 -0.859375 -1.5625q-0.625 -0.53125 -1.5 -0.53125q-1.328125 0 -2.15625 0.953125q-0.828125 0.953125 -0.828125 3.0q0 2.09375 0.796875 3.046875q0.796875 0.9375 2.09375 0.9375q1.03125 0 1.71875 -0.625q0.703125 -0.640625 0.890625 -1.953125zm2.578125 -1.390625q0 -2.875 1.59375 -4.265625q1.34375 -1.15625 3.265625 -1.15625q2.140625 0 3.484375 1.40625q1.359375 1.40625 1.359375 3.875q0 2.0 -0.59375 3.15625q-0.59375 1.140625 -1.75 1.78125q-1.140625 0.625 -2.5 0.625q-2.1875 0 -3.53125 -1.390625q-1.328125 -1.40625 -1.328125 -4.03125zm1.796875 0q0 2.0 0.859375 2.984375q0.875 0.984375 2.203125 0.984375q1.3125 0 2.171875 -0.984375q0.875 -1.0 0.875 -3.046875q0 -1.921875 -0.875 -2.90625q-0.875 -1.0 -2.171875 -1.0q-1.328125 0 -2.203125 1.0q-0.859375 0.984375 -0.859375 2.96875z" fill-rule="nonzero"/><path fill="#000000" d="m53.94483 392.84283l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.5156212 -0.25 1.0624962 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.0937462 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.8613243 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.3281288 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875038 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.6718788 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5000038 0 -0.9062538 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533207 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm2.1933594 -4.15625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m130.7292 392.84283l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m53.41358 409.23346l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4374962 -0.21875 0.9218712 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.9843712 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.9218712 0 1.4843712 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.4062462 0 -0.7499962 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.2988243 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.3281288 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875038 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.6718788 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5000038 0 -0.9062538 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439457 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm2.1933594 -4.15625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m131.18233 404.3897l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m58.179203 419.71783q-1.1093712 1.265625 -2.2812462 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4374962 -0.21875 0.7343712 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.5332031 -1.0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.7031288 0 1.0468788 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625038 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.1718788 0 1.7812538 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625038 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.2187538 0.53125 1.5312538 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.3750038 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.468754 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm3.9960938 0l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm10.861328 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.0800781 3.15625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.574219 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm6.517578 -1.359375l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m130.7292 420.84283l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm10.640625 -3.53125q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.5332031 -1.0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.46875 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0z" fill-rule="nonzero"/><path fill="#000000" d="m53.41358 437.23346l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4374962 -0.21875 0.9218712 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.9843712 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.9218712 0 1.4843712 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.4062462 0 -0.7499962 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm9.298828 1.765625q-0.546875 0.484375 -1.0625038 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0000038 -0.046875 1.4218788 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.6718788 0 -1.0937538 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.7968788 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.8437538 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.4843788 -0.28125 0.7656288 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.1894531 1.03125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm6.0 0l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm7.078125 2.125l-0.640625 -6.21875l1.015625 0l0.28125 2.796875l0.109375 1.5625q0.015625 0.171875 0.03125 0.703125q0.1875 -0.59375 0.296875 -0.90625q0.125 -0.328125 0.40625 -0.921875l1.46875 -3.234375l1.15625 0l0.203125 3.109375q0.046875 0.703125 0.0625 1.890625q0.296875 -0.78125 0.953125 -2.1875l1.34375 -2.8125l1.0625 0l-3.046875 6.21875l-1.09375 0l-0.234375 -3.65625q-0.03125 -0.328125 -0.046875 -1.3125q-0.234375 0.625 -0.5625 1.34375l-1.640625 3.625l-1.125 0zm7.6816406 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm8.183594 -0.90625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm6.720703 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm-1.046875 5.015625l0.25 -1.203125l1.203125 0l-0.265625 1.203125l-1.1875 0z" fill-rule="nonzero"/><path fill="#000000" d="m135.02608 432.5772l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.71875 2.265625l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm10.861328 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm2.0957031 3.15625l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm6.611328 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm9.970703 0.640625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.574219 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625z" fill-rule="nonzero"/><path fill="#666666" d="m152.55838 267.70898l0 0c0 -1.800354 1.3678284 -3.2598267 3.0551147 -3.2598267l0 0c0.8102722 0 1.5873566 0.34344482 2.1602936 0.95477295c0.5729523 0.61135864 0.89482117 1.4404907 0.89482117 2.3050537l0 0c0 1.8003845 -1.3678131 3.2598572 -3.0551147 3.2598572l0 0c-1.6872864 0 -3.0551147 -1.4594727 -3.0551147 -3.2598572z" fill-rule="evenodd"/><path fill="#666666" d="m639.8609 292.85303l0 0c0 -1.8003845 1.3677979 -3.2598572 3.0551147 -3.2598572l0 0c0.8102417 0 1.5873413 0.34344482 2.1602783 0.95480347c0.572937 0.6113281 0.8948364 1.4404907 0.8948364 2.3050537l0 0c0 1.800354 -1.3677979 3.2598267 -3.0551147 3.2598267l0 0c-1.6873169 0 -3.0551147 -1.4594727 -3.0551147 -3.2598267z" fill-rule="evenodd"/><path fill="#666666" d="m639.8609 189.4567l0 0c0 -1.8003693 1.3677979 -3.259842 3.0551147 -3.259842l0 0c0.8102417 0 1.5873413 0.34344482 2.1602783 0.9547882c0.572937 0.6113281 0.8948364 1.4404907 0.8948364 2.3050537l0 0c0 1.800354 -1.3677979 3.259842 -3.0551147 3.259842l0 0c-1.6873169 0 -3.0551147 -1.4594879 -3.0551147 -3.259842z" fill-rule="evenodd"/><path fill="#666666" d="m639.8609 83.031494l0 0c0 -1.8003616 1.3677979 -3.259842 3.0551147 -3.259842l0 0c0.8102417 0 1.5873413 0.34344482 2.1602783 0.9547882c0.572937 0.61133575 0.8948364 1.4404907 0.8948364 2.3050537l0 0c0 1.8003616 -1.3677979 3.259842 -3.0551147 3.259842l0 0c-1.6873169 0 -3.0551147 -1.4594803 -3.0551147 -3.259842z" fill-rule="evenodd"/><path fill="#999999" d="m244.2231 392.55905l0 0c0 -1.800354 1.3678284 -3.2598267 3.0551147 -3.2598267l0 0c0.8102722 0 1.5873566 0.34344482 2.1602936 0.95477295c0.5729523 0.6113281 0.89482117 1.4404907 0.89482117 2.3050537l0 0c0 1.800354 -1.3678131 3.2598572 -3.0551147 3.2598572l0 0c-1.6872864 0 -3.0551147 -1.4595032 -3.0551147 -3.2598572z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m158.66861 267.70898c44.299225 0 88.598434 60.787415 88.598434 121.57483" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m158.66861 267.70898c44.299225 0 88.598434 60.787415 88.598434 121.57483" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m250.33333 392.55905c196.29921 0 392.59845 -48.22046 392.59845 -96.44095" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m250.33333 392.55905c196.29921 0 392.59845 -48.22046 392.59845 -96.44095" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m250.33333 392.55905c195.2126 0 390.42523 -100.39371 390.42523 -200.7874" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m250.33333 392.55905c195.2126 0 390.42523 -100.39371 390.42523 -200.7874" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m250.33333 392.55905c196.29921 0 392.59845 -153.13385 392.59845 -306.2677" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m250.33333 392.55905c196.29921 0 392.59845 -153.13385 392.59845 -306.2677" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m844.39624 4.631458l111.590515 0l0 33.51181l-111.590515 0z" fill-rule="evenodd"/><path fill="#000000" d="m855.1306 31.551456l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.6832886 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953857 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.828857 6.5625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.313232 5.015625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5407715 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.5354614 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"/></g></svg> \ No newline at end of file diff --git a/docs/user/alerting/images/alert-flyout-action-details.png b/docs/user/alerting/images/alert-flyout-action-details.png new file mode 100644 index 0000000000000..06287ed1837d2 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-action-details.png differ diff --git a/docs/user/alerting/images/alert-flyout-action-type-selection.png b/docs/user/alerting/images/alert-flyout-action-type-selection.png new file mode 100644 index 0000000000000..e4448ca5f3fcd Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-action-type-selection.png differ diff --git a/docs/user/alerting/images/alert-flyout-action-variables.png b/docs/user/alerting/images/alert-flyout-action-variables.png new file mode 100644 index 0000000000000..73fc1fe9dea63 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-action-variables.png differ diff --git a/docs/user/alerting/images/alert-flyout-add-action.png b/docs/user/alerting/images/alert-flyout-add-action.png new file mode 100644 index 0000000000000..159dbd5c1e449 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-add-action.png differ diff --git a/docs/user/alerting/images/alert-flyout-alert-conditions.png b/docs/user/alerting/images/alert-flyout-alert-conditions.png new file mode 100644 index 0000000000000..f3e8f42ff0f37 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-alert-conditions.png differ diff --git a/docs/user/alerting/images/alert-flyout-alert-type-selection.png b/docs/user/alerting/images/alert-flyout-alert-type-selection.png new file mode 100644 index 0000000000000..a0a25dc5f1bbc Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-alert-type-selection.png differ diff --git a/docs/user/alerting/images/alert-flyout-general-details.png b/docs/user/alerting/images/alert-flyout-general-details.png new file mode 100644 index 0000000000000..db56c16c1c308 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-general-details.png differ diff --git a/docs/user/alerting/images/alert-flyout-sections.png b/docs/user/alerting/images/alert-flyout-sections.png new file mode 100644 index 0000000000000..8fa4bfffe39a3 Binary files /dev/null and b/docs/user/alerting/images/alert-flyout-sections.png differ diff --git a/docs/user/alerting/images/alert-instances.svg b/docs/user/alerting/images/alert-instances.svg new file mode 100644 index 0000000000000..b7b0bd4996053 --- /dev/null +++ b/docs/user/alerting/images/alert-instances.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 722.8110236220473 331.005249343832" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l722.81104 0l0 331.00525l-722.81104 0l0 -331.00525z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l722.81104 0l0 331.00525l-722.81104 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m13.120735 52.889763l268.7874 0l0 266.61417l-268.7874 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m13.120735 52.889763l268.7874 0l0 266.61417l-268.7874 0z" fill-rule="evenodd"/><path fill="#000000" d="m22.089485 79.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 97.062996l233.00789 0l0 33.511803l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 97.062996l233.00789 0l0 33.511803l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m43.750084 117.40737l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9609375 -5.703125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m136.46883 120.39175q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm4.8671875 4.203125l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm5.828125 0.75l1.4375 0.140625q-0.015625 0.484375 0.109375 0.71875q0.140625 0.25 0.421875 0.375q0.390625 0.171875 1.0 0.171875q1.28125 0 1.84375 -0.65625q0.359375 -0.453125 0.671875 -1.953125l0.140625 -0.671875q-1.09375 1.125 -2.34375 1.125q-1.25 0 -2.109375 -0.921875q-0.84375 -0.9375 -0.84375 -2.625q0 -1.40625 0.671875 -2.578125q0.671875 -1.171875 1.59375 -1.765625q0.921875 -0.59375 1.890625 -0.59375q1.640625 0 2.515625 1.546875l0.28125 -1.359375l1.296875 0l-1.671875 8.0q-0.265625 1.328125 -0.71875 2.0625q-0.4375 0.75 -1.234375 1.15625q-0.796875 0.40625 -1.828125 0.40625q-1.0 0 -1.734375 -0.265625q-0.71875 -0.25 -1.078125 -0.75q-0.34375 -0.5 -0.34375 -1.140625q0 -0.1875 0.03125 -0.421875zm1.765625 -4.421875q0 0.84375 0.171875 1.28125q0.234375 0.59375 0.65625 0.921875q0.4375 0.3125 0.96875 0.3125q0.703125 0 1.390625 -0.484375q0.6875 -0.5 1.109375 -1.515625q0.421875 -1.03125 0.421875 -1.953125q0 -1.03125 -0.5625 -1.625q-0.5625 -0.609375 -1.40625 -0.609375q-0.515625 0 -1.0 0.28125q-0.484375 0.265625 -0.90625 0.84375q-0.40625 0.5625 -0.625 1.359375q-0.21875 0.78125 -0.21875 1.1875zm20.78125 -0.359375l1.515625 0.203125q-0.71875 1.984375 -2.09375 3.015625q-1.375 1.015625 -3.09375 1.015625q-2.078125 0 -3.3125 -1.28125q-1.21875 -1.28125 -1.21875 -3.65625q0 -3.09375 1.859375 -5.109375q1.65625 -1.8125 4.125 -1.8125q1.8125 0 2.9375 0.984375q1.140625 0.96875 1.3125 2.625l-1.421875 0.125q-0.234375 -1.234375 -0.9375 -1.84375q-0.703125 -0.625 -1.828125 -0.625q-2.09375 0 -3.390625 1.875q-1.125 1.609375 -1.125 3.8125q0 1.765625 0.859375 2.703125q0.875 0.921875 2.265625 0.921875q1.1875 0 2.140625 -0.765625q0.96875 -0.78125 1.40625 -2.1875zm2.5859375 4.03125l2.40625 -11.453125l4.78125 0q1.234375 0 1.859375 0.28125q0.625 0.28125 1.03125 0.984375q0.40625 0.6875 0.40625 1.546875q0 0.703125 -0.296875 1.4375q-0.28125 0.734375 -0.734375 1.21875q-0.4375 0.46875 -0.890625 0.71875q-0.453125 0.234375 -0.96875 0.359375q-1.09375 0.25 -2.21875 0.25l-2.875 0l-0.96875 4.65625l-1.53125 0zm2.78125 -5.953125l2.515625 0q1.46875 0 2.15625 -0.3125q0.6875 -0.3125 1.09375 -0.953125q0.421875 -0.65625 0.421875 -1.390625q0 -0.5625 -0.21875 -0.90625q-0.21875 -0.359375 -0.625 -0.53125q-0.390625 -0.171875 -1.515625 -0.171875l-2.9375 0l-0.890625 4.265625zm10.375 -5.5l1.53125 0l-1.46875 7.03125q-0.171875 0.875 -0.171875 1.296875q0 0.921875 0.71875 1.484375q0.734375 0.5625 1.828125 0.5625q0.875 0 1.625 -0.390625q0.765625 -0.40625 1.203125 -1.1875q0.4375 -0.78125 0.78125 -2.5l1.328125 -6.296875l1.53125 0l-1.40625 6.71875q-0.359375 1.71875 -0.953125 2.71875q-0.578125 1.0 -1.625 1.609375q-1.03125 0.609375 -2.40625 0.609375q-1.296875 0 -2.25 -0.421875q-0.9375 -0.4375 -1.421875 -1.1875q-0.46875 -0.765625 -0.46875 -1.734375q0 -0.59375 0.328125 -2.0625l1.296875 -6.25zm21.859375 6.4375l-7.59375 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.59375 3.203125l0 1.3125zm5.8984375 1.25q0 -1.453125 0.421875 -2.953125q0.4375 -1.5 0.96875 -2.390625q0.53125 -0.90625 1.09375 -1.40625q0.578125 -0.515625 1.125 -0.75q0.5625 -0.234375 1.234375 -0.234375q1.3125 0 2.1875 0.984375q0.875 0.96875 0.875 2.8125q0 1.890625 -0.609375 3.75q-0.71875 2.203125 -2.0 3.3125q-0.984375 0.84375 -2.234375 0.84375q-1.296875 0 -2.1875 -1.015625q-0.875 -1.015625 -0.875 -2.953125zm1.359375 0.359375q0 1.0625 0.359375 1.65625q0.46875 0.8125 1.40625 0.8125q0.828125 0 1.5 -0.734375q0.96875 -1.046875 1.453125 -3.0625q0.484375 -2.03125 0.484375 -3.3125q0 -1.234375 -0.46875 -1.78125q-0.46875 -0.546875 -1.25 -0.546875q-0.5625 0 -1.046875 0.296875q-0.484375 0.28125 -0.9375 0.984375q-0.625 1.0 -1.09375 2.96875q-0.40625 1.6875 -0.40625 2.71875zm7.3203125 3.40625l0.34375 -1.609375l1.59375 0l-0.34375 1.609375l-1.59375 0zm4.6015625 -2.625l1.328125 -0.140625q0.140625 0.96875 0.546875 1.375q0.421875 0.40625 0.984375 0.40625q0.8125 0 1.515625 -0.703125q1.015625 -1.03125 1.5 -2.96875q-0.703125 0.53125 -1.265625 0.765625q-0.546875 0.21875 -1.125 0.21875q-1.046875 0 -1.875 -0.703125q-1.09375 -0.90625 -1.09375 -2.625q0 -1.9375 1.265625 -3.3125q1.09375 -1.1875 2.671875 -1.1875q1.421875 0 2.359375 1.046875q0.9375 1.046875 0.9375 2.96875q0 1.875 -0.625 3.6875q-0.75 2.140625 -2.015625 3.15625q-1.03125 0.84375 -2.3125 0.84375q-1.1875 0 -1.953125 -0.734375q-0.75 -0.75 -0.84375 -2.09375zm1.890625 -4.53125q0 1.078125 0.5625 1.71875q0.578125 0.640625 1.375 0.640625q0.578125 0 1.15625 -0.390625q0.578125 -0.40625 0.984375 -1.203125q0.421875 -0.796875 0.421875 -1.625q0 -0.65625 -0.28125 -1.21875q-0.265625 -0.5625 -0.734375 -0.84375q-0.46875 -0.296875 -0.953125 -0.296875q-0.46875 0 -0.921875 0.25q-0.453125 0.25 -0.84375 0.734375q-0.390625 0.484375 -0.578125 1.125q-0.1875 0.625 -0.1875 1.109375z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 144.07611l233.00789 0l0 39.3071l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 144.07611l233.00789 0l0 39.3071l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m35.062584 164.74861l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.421875 0.640625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3984375 4.140625l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875z" fill-rule="nonzero"/><path fill="#000000" d="m136.96883 165.60799l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm9.0078125 4.875l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm12.0 -2.828125l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm4.796875 3.203125l0.09375 -1.328125q0.4375 0.125 0.84375 0.125q0.4375 0 0.703125 -0.1875q0.34375 -0.265625 0.75 -0.96875l0.453125 -0.8125l-1.390625 -8.328125l1.390625 0l0.625 4.1875q0.1875 1.25 0.328125 2.484375l3.703125 -6.671875l1.484375 0l-5.296875 9.40625q-0.765625 1.375 -1.359375 1.8125q-0.59375 0.453125 -1.359375 0.453125q-0.5 0 -0.96875 -0.171875zm12.9765625 -3.203125l1.734375 -8.296875l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.34375l-1.40625 0l1.140625 -5.484375q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.03125l-1.421875 0l1.171875 -5.609375q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.921875l-1.40625 0zm15.34375 -9.859375l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859375l1.734375 -8.296875l1.40625 0l-1.734375 8.296875l-1.40625 0zm3.6015625 0l1.734375 -8.296875l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.03125l-1.40625 0l1.09375 -5.265625q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.859375l-1.421875 0zm14.5703125 -1.5q-1.5 1.6875 -3.0625 1.6875q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5625 -0.59375 -1.359375q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296875l-1.296875 0l0.3125 -1.5zm6.5390625 0.34375l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 192.92389l233.00789 0l0 112.12598l-233.00789 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 192.92389l233.00789 0l0 112.12598l-233.00789 0z" fill-rule="evenodd"/><path fill="#000000" d="m34.312584 217.28389l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.859375 1.65625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m45.49346 236.11156l195.77954 0l0 53.48033l-195.77954 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m45.49346 236.11156l195.77954 0l0 53.48033l-195.77954 0z" fill-rule="evenodd"/><path fill="#000000" d="m55.446587 256.63156l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm10.09375 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm6.767578 0.84375l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0z" fill-rule="nonzero"/><path fill="#000000" d="m59.08721 263.63156l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m103.84112 259.76828l58.04882 0l0 13.798828l-58.04882 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m104.34112 268.2253l0.3125 -1.40625q0.421875 -0.015625 0.671875 -0.125q0.25 -0.109375 0.453125 -0.375q0.21875 -0.265625 0.34375 -0.609375q0.140625 -0.34375 0.296875 -1.09375q0.21875 -1.0625 0.4375 -1.515625q0.234375 -0.453125 0.546875 -0.703125q0.328125 -0.25 0.890625 -0.40625q0.359375 -0.09375 1.125 -0.09375l0.3125 0l-0.3125 1.390625q-0.65625 0 -0.875 0.09375q-0.21875 0.078125 -0.328125 0.265625q-0.078125 0.109375 -0.265625 0.859375q-0.328125 1.296875 -0.4375 1.578125q-0.203125 0.515625 -0.5 0.828125q-0.28125 0.3125 -0.796875 0.609375q0.34375 0.234375 0.5 0.5625q0.171875 0.3125 0.171875 0.84375q0 0.203125 -0.078125 0.625q-0.1875 1.15625 -0.25 1.359375q-0.046875 0.21875 -0.046875 0.359375q0 0.15625 0.078125 0.265625q0.09375 0.109375 0.25 0.15625q0.171875 0.0625 0.75 0.0625l-0.3125 1.40625l-0.3125 0q-0.796875 0 -1.203125 -0.140625q-0.390625 -0.125 -0.609375 -0.4375q-0.21875 -0.296875 -0.21875 -0.78125q0 -0.390625 0.203125 -1.328125q0.203125 -0.9375 0.203125 -1.25q0 -0.5 -0.21875 -0.734375q-0.21875 -0.234375 -0.78125 -0.265625zm4.669922 0l0.3125 -1.40625q0.421875 -0.015625 0.671875 -0.125q0.25 -0.109375 0.453125 -0.375q0.21875 -0.265625 0.34375 -0.609375q0.140625 -0.34375 0.296875 -1.09375q0.21875 -1.0625 0.4375 -1.515625q0.234375 -0.453125 0.546875 -0.703125q0.328125 -0.25 0.890625 -0.40625q0.359375 -0.09375 1.125 -0.09375l0.3125 0l-0.3125 1.390625q-0.65625 0 -0.875 0.09375q-0.21875 0.078125 -0.328125 0.265625q-0.078125 0.109375 -0.265625 0.859375q-0.328125 1.296875 -0.4375 1.578125q-0.203125 0.515625 -0.5 0.828125q-0.28125 0.3125 -0.796875 0.609375q0.34375 0.234375 0.5 0.5625q0.171875 0.3125 0.171875 0.84375q0 0.203125 -0.078125 0.625q-0.1875 1.15625 -0.25 1.359375q-0.046875 0.21875 -0.046875 0.359375q0 0.15625 0.078125 0.265625q0.09375 0.109375 0.25 0.15625q0.171875 0.0625 0.75 0.0625l-0.3125 1.40625l-0.3125 0q-0.796875 0 -1.203125 -0.140625q-0.390625 -0.125 -0.609375 -0.4375q-0.21875 -0.296875 -0.21875 -0.78125q0 -0.390625 0.203125 -1.328125q0.203125 -0.9375 0.203125 -1.25q0 -0.5 -0.21875 -0.734375q-0.21875 -0.234375 -0.78125 -0.265625zm4.435547 0.671875l1.625 -0.265625q0.21875 0.515625 0.53125 0.734375q0.328125 0.203125 0.890625 0.203125q0.578125 0 0.921875 -0.25q0.234375 -0.171875 0.234375 -0.421875q0 -0.171875 -0.125 -0.3125q-0.125 -0.125 -0.6875 -0.3125q-1.53125 -0.5 -1.890625 -0.796875q-0.5625 -0.453125 -0.5625 -1.203125q0 -0.734375 0.546875 -1.265625q0.765625 -0.75 2.28125 -0.75q1.203125 0 1.8125 0.453125q0.609375 0.4375 0.78125 1.1875l-1.5625 0.265625q-0.109375 -0.34375 -0.390625 -0.515625q-0.375 -0.21875 -0.90625 -0.21875q-0.53125 0 -0.765625 0.171875q-0.21875 0.171875 -0.21875 0.40625q0 0.234375 0.234375 0.375q0.140625 0.09375 0.9375 0.328125q1.234375 0.359375 1.65625 0.703125q0.578125 0.5 0.578125 1.171875q0 0.890625 -0.75 1.546875q-0.734375 0.640625 -2.09375 0.640625q-1.34375 0 -2.078125 -0.484375q-0.734375 -0.5 -1.0 -1.390625zm12.955078 -0.859375l-4.21875 0q-0.015625 0.109375 -0.015625 0.15625q0 0.625 0.359375 1.0q0.359375 0.375 0.859375 0.375q0.84375 0 1.3125 -0.859375l1.5 0.25q-0.4375 0.90625 -1.171875 1.359375q-0.734375 0.453125 -1.65625 0.453125q-1.25 0 -2.03125 -0.78125q-0.78125 -0.796875 -0.78125 -2.109375q0 -1.28125 0.703125 -2.265625q0.96875 -1.359375 2.765625 -1.359375q1.140625 0 1.8125 0.71875q0.671875 0.703125 0.671875 1.96875q0 0.609375 -0.109375 1.09375zm-1.421875 -1.015625q0 -0.125 0 -0.171875q0 -0.703125 -0.3125 -1.046875q-0.3125 -0.34375 -0.828125 -0.34375q-0.515625 0 -0.9375 0.390625q-0.40625 0.390625 -0.5625 1.171875l2.640625 0zm3.2363205 -2.609375l1.578125 0l-0.265625 1.203125q0.890625 -1.359375 1.90625 -1.359375q0.375 0 0.78125 0.1875l-0.640625 1.375q-0.234375 -0.078125 -0.484375 -0.078125q-0.4375 0 -0.890625 0.328125q-0.4375 0.328125 -0.703125 0.875q-0.25 0.546875 -0.484375 1.734375l-0.421875 1.953125l-1.6718674 0l1.2968674 -6.21875zm6.576172 6.21875l-1.453125 0l-1.25 -6.21875l1.65625 0l0.4375 2.703125q0.1875 1.109375 0.21875 1.46875q0.046875 -0.09375 0.40625 -0.75q0.359375 -0.671875 0.453125 -0.796875l1.546875 -2.625l1.8125 0l-3.828125 6.21875zm9.626953 -2.59375l-4.21875 0q-0.015625 0.109375 -0.015625 0.15625q0 0.625 0.359375 1.0q0.359375 0.375 0.859375 0.375q0.84375 0 1.3125 -0.859375l1.5 0.25q-0.4375 0.90625 -1.171875 1.359375q-0.734375 0.453125 -1.65625 0.453125q-1.25 0 -2.03125 -0.78125q-0.78125 -0.796875 -0.78125 -2.109375q0 -1.28125 0.703125 -2.265625q0.96875 -1.359375 2.765625 -1.359375q1.140625 0 1.8125 0.71875q0.671875 0.703125 0.671875 1.96875q0 0.609375 -0.109375 1.09375zm-1.421875 -1.015625q0 -0.125 0 -0.171875q0 -0.703125 -0.3125 -1.046875q-0.3125 -0.34375 -0.828125 -0.34375q-0.515625 0 -0.9375 0.390625q-0.40625 0.390625 -0.5625 1.171875l2.640625 0zm3.2363281 -2.609375l1.578125 0l-0.265625 1.203125q0.890625 -1.359375 1.90625 -1.359375q0.375 0 0.78125 0.1875l-0.640625 1.375q-0.234375 -0.078125 -0.484375 -0.078125q-0.4375 0 -0.890625 0.328125q-0.4375 0.328125 -0.703125 0.875q-0.25 0.546875 -0.484375 1.734375l-0.421875 1.953125l-1.671875 0l1.296875 -6.21875zm7.044922 3.8125q-0.53125 0.03125 -0.828125 0.21875q-0.296875 0.1875 -0.515625 0.609375q-0.21875 0.40625 -0.4375 1.4375q-0.203125 1.015625 -0.4375 1.453125q-0.21875 0.453125 -0.546875 0.703125q-0.3125 0.25 -0.875 0.40625q-0.375 0.109375 -1.125 0.109375l-0.3125 0l0.296875 -1.40625q0.640625 0 0.859375 -0.09375q0.234375 -0.09375 0.359375 -0.265625q0.078125 -0.125 0.25 -0.84375q0.328125 -1.296875 0.421875 -1.546875q0.21875 -0.515625 0.53125 -0.875q0.3125 -0.359375 0.796875 -0.609375q-0.390625 -0.28125 -0.546875 -0.578125q-0.140625 -0.296875 -0.140625 -0.828125q0 -0.203125 0.078125 -0.625q0.1875 -1.125 0.234375 -1.34375q0.0625 -0.234375 0.0625 -0.390625q0 -0.15625 -0.078125 -0.25q-0.078125 -0.109375 -0.25 -0.15625q-0.15625 -0.0625 -0.75 -0.0625l0.3125 -1.390625l0.3125 0q0.796875 0 1.1875 0.140625q0.40625 0.125 0.625 0.421875q0.21875 0.296875 0.21875 0.78125q0 0.390625 -0.203125 1.328125q-0.203125 0.9375 -0.203125 1.25q0 0.5 0.21875 0.734375q0.21875 0.234375 0.78125 0.265625l-0.296875 1.40625zm4.669922 0q-0.53125 0.03125 -0.828125 0.21875q-0.296875 0.1875 -0.515625 0.609375q-0.21875 0.40625 -0.4375 1.4375q-0.203125 1.015625 -0.4375 1.453125q-0.21875 0.453125 -0.546875 0.703125q-0.3125 0.25 -0.875 0.40625q-0.375 0.109375 -1.125 0.109375l-0.3125 0l0.296875 -1.40625q0.640625 0 0.859375 -0.09375q0.234375 -0.09375 0.359375 -0.265625q0.078125 -0.125 0.25 -0.84375q0.328125 -1.296875 0.421875 -1.546875q0.21875 -0.515625 0.53125 -0.875q0.3125 -0.359375 0.796875 -0.609375q-0.390625 -0.28125 -0.546875 -0.578125q-0.140625 -0.296875 -0.140625 -0.828125q0 -0.203125 0.078125 -0.625q0.1875 -1.125 0.234375 -1.34375q0.0625 -0.234375 0.0625 -0.390625q0 -0.15625 -0.078125 -0.25q-0.078125 -0.109375 -0.25 -0.15625q-0.15625 -0.0625 -0.75 -0.0625l0.3125 -1.390625l0.3125 0q0.796875 0 1.1875 0.140625q0.40625 0.125 0.625 0.421875q0.21875 0.296875 0.21875 0.78125q0 0.390625 -0.203125 1.328125q-0.203125 0.9375 -0.203125 1.25q0 0.5 0.21875 0.734375q0.21875 0.234375 0.78125 0.265625l-0.296875 1.40625z" fill-rule="nonzero"/><path fill="#000000" d="m163.79619 263.24094l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m103.84112 271.41156l58.04882 0l0 1.0799866l-58.04882 0l0 -1.0799866z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m557.41504 68.88976l139.37012 0l0 44.15748l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m557.41504 68.88976l139.37012 0l0 44.15748l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m567.36816 89.40977l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m571.0088 96.40977l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m615.7627 92.546486l28.02539 0l0 13.798828l-28.02539 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m617.6846 103.40977l-2.28125 0l3.78125 -4.34375l-2.125 -4.25l1.84375 0l0.84375 1.609375q0.03125 0.09375 0.5625 1.1875q0.046875 0.0625 0.078125 0.171875q0.71875 -0.875 1.203125 -1.4375l1.359375 -1.53125l2.21875 0l-3.9375 4.53125l2.125 4.0625l-2.0 0l-0.640625 -1.296875q-0.5 -1.03125 -0.671875 -1.46875q-0.21875 0.34375 -1.171875 1.421875l-1.1875 1.34375zm7.5039062 -4.9375l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m649.0283 96.01914l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m615.7627 104.189766l28.02539 0l0 1.0800018l-28.02539 0l0 -1.0800018z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 -22.834648" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l75.765564 -21.216705" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m334.56268 94.19274l3.924591 -2.8142776l-4.815399 -0.36681366z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 69.35433" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l76.97284 65.46705" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m334.25443 180.54414l4.527008 1.6819458l-2.3867493 -4.1983337z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m352.57217 6.0367455l140.56693 0l0 33.51181l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m361.54092 32.956745l5.125 -13.359377l1.90625 0l5.46875 13.359377l-2.015625 0l-1.546875 -4.046877l-5.59375 0l-1.46875 4.046877l-1.875 0zm3.859375 -5.484377l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484377l0 -13.359377l1.640625 0l0 13.359377l-1.640625 0zm10.816711 -3.109377l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.312502q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.2968769q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765627l0 -9.671877l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.062502l-1.625 0zm9.806427 -1.4687519l0.234375 1.4531269q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.4687519 -0.203125 -1.9375019l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.2884827 1.4687519l0 -13.359377l1.765625 0l0 13.359377l-1.765625 0zm4.683319 0l0 -9.671877l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953127l-1.640625 0l0 -5.890627q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281252l-1.640625 0zm9.719452 -2.890627l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.7187519 -1.375 1.1250019q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.7812519 -1.25 -2.328127zm13.5625 1.421875l0.234375 1.4531269q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.4687519 -0.203125 -1.9375019l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917694 0.28125q-0.921875 0.7656269 -1.765625 1.0937519q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.7812519 -0.859375 -1.9843769q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.5937519 0.40625 1.1562519l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875019zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203827 4.859377l0 -9.671877l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953127l-1.640625 0l0 -5.890627q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281252l-1.640625 0zm16.688232 -3.546877l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609377q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.2968769q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.312502q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.2968769q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.90027 68.88976l139.37009 0l0 44.15748l-139.37009 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.90027 68.88976l139.37009 0l0 44.15748l-139.37009 0z" fill-rule="evenodd"/><path fill="#000000" d="m369.50748 92.67351l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm8.062012 0l4.0625 -5.46875l-3.578125 -5.015625l1.65625 0l1.890625 2.6875q0.59375 0.828125 0.84375 1.28125q0.359375 -0.5625 0.84375 -1.1875l2.109375 -2.78125l1.5 0l-3.6875 4.9375l3.984375 5.546875l-1.71875 0l-2.640625 -3.75q-0.21875 -0.3125 -0.46875 -0.6875q-0.34375 0.5625 -0.5 0.78125l-2.625 3.65625l-1.671875 0zm15.166229 0l-1.28125 0l0 -8.203125q-0.46875 0.4375 -1.21875 0.890625q-0.75 0.4375 -1.359375 0.65625l0 -1.25q1.078125 -0.5 1.890625 -1.21875q0.8125 -0.734375 1.140625 -1.40625l0.828125 0l0 10.53125zm10.072968 -1.234375l0 1.234375l-6.9375 0q-0.015625 -0.46875 0.15625 -0.890625q0.265625 -0.71875 0.84375 -1.40625q0.59375 -0.6875 1.6875 -1.578125q1.71875 -1.40625 2.3125 -2.21875q0.609375 -0.828125 0.609375 -1.5625q0 -0.765625 -0.5625 -1.28125q-0.546875 -0.53125 -1.421875 -0.53125q-0.921875 0 -1.484375 0.5625q-0.5625 0.5625 -0.5625 1.546875l-1.328125 -0.140625q0.140625 -1.484375 1.015625 -2.25q0.890625 -0.78125 2.390625 -0.78125q1.515625 0 2.390625 0.84375q0.875 0.828125 0.875 2.0625q0 0.640625 -0.265625 1.25q-0.25 0.59375 -0.84375 1.265625q-0.59375 0.671875 -1.984375 1.859375q-1.15625 0.96875 -1.484375 1.3125q-0.328125 0.34375 -0.546875 0.703125l5.140625 0zm1.385498 -1.53125l1.296875 -0.171875q0.21875 1.09375 0.75 1.578125q0.53125 0.484375 1.296875 0.484375q0.90625 0 1.53125 -0.625q0.640625 -0.640625 0.640625 -1.5625q0 -0.890625 -0.59375 -1.46875q-0.578125 -0.578125 -1.46875 -0.578125q-0.359375 0 -0.90625 0.140625l0.140625 -1.125q0.125 0.015625 0.203125 0.015625q0.828125 0 1.484375 -0.421875q0.65625 -0.4375 0.65625 -1.34375q0 -0.703125 -0.484375 -1.15625q-0.46875 -0.46875 -1.234375 -0.46875q-0.75 0 -1.25 0.46875q-0.5 0.46875 -0.640625 1.421875l-1.28125 -0.234375q0.234375 -1.296875 1.0625 -2.0q0.84375 -0.71875 2.09375 -0.71875q0.859375 0 1.578125 0.375q0.71875 0.359375 1.09375 1.0q0.390625 0.640625 0.390625 1.34375q0 0.6875 -0.375 1.25q-0.359375 0.546875 -1.0625 0.875q0.921875 0.21875 1.4375 0.90625q0.515625 0.671875 0.515625 1.6875q0 1.375 -1.0 2.328125q-1.0 0.953125 -2.53125 0.953125q-1.390625 0 -2.296875 -0.8125q-0.90625 -0.828125 -1.046875 -2.140625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.90027 161.08923l140.56693 0l0 44.157486l-140.56693 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.90027 161.08923l140.56693 0l0 44.157486l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m370.2384 184.87299l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm11.828278 0l0 -4.4375l-4.046875 -6.046875l1.6875 0l2.0625 3.15625q0.578125 0.890625 1.0625 1.78125q0.484375 -0.828125 1.15625 -1.859375l2.03125 -3.078125l1.609375 0l-4.1875 6.046875l0 4.4375l-1.375 0zm10.416229 0l0 -2.515625l-4.546875 0l0 -1.171875l4.78125 -6.796875l1.0625 0l0 6.796875l1.40625 0l0 1.171875l-1.40625 0l0 2.515625l-1.296875 0zm0 -3.6875l0 -4.734375l-3.28125 4.734375l3.28125 0zm4.0260925 0.9375l1.34375 -0.109375q0.15625 0.984375 0.703125 1.484375q0.546875 0.5 1.328125 0.5q0.921875 0 1.5625 -0.703125q0.65625 -0.703125 0.65625 -1.859375q0 -1.109375 -0.625 -1.734375q-0.625 -0.640625 -1.625 -0.640625q-0.625 0 -1.125 0.28125q-0.5 0.28125 -0.78125 0.734375l-1.203125 -0.15625l1.015625 -5.390625l5.21875 0l0 1.21875l-4.1875 0l-0.578125 2.828125q0.953125 -0.65625 1.984375 -0.65625q1.375 0 2.3125 0.953125q0.953125 0.953125 0.953125 2.4375q0 1.4375 -0.828125 2.46875q-1.015625 1.265625 -2.75 1.265625q-1.4375 0 -2.34375 -0.796875q-0.90625 -0.796875 -1.03125 -2.125zm14.838623 -5.171875l-1.28125 0.09375q-0.171875 -0.75 -0.484375 -1.09375q-0.53125 -0.546875 -1.296875 -0.546875q-0.609375 0 -1.078125 0.34375q-0.609375 0.4375 -0.96875 1.296875q-0.34375 0.84375 -0.359375 2.421875q0.46875 -0.71875 1.140625 -1.0625q0.671875 -0.34375 1.40625 -0.34375q1.296875 0 2.203125 0.953125q0.90625 0.953125 0.90625 2.453125q0 0.984375 -0.4375 1.84375q-0.421875 0.84375 -1.171875 1.296875q-0.734375 0.4375 -1.6875 0.4375q-1.609375 0 -2.625 -1.171875q-1.015625 -1.1875 -1.015625 -3.90625q0 -3.046875 1.125 -4.421875q0.984375 -1.203125 2.640625 -1.203125q1.234375 0 2.03125 0.703125q0.796875 0.6875 0.953125 1.90625zm-5.265625 4.515625q0 0.671875 0.28125 1.28125q0.28125 0.609375 0.78125 0.9375q0.515625 0.3125 1.078125 0.3125q0.8125 0 1.390625 -0.65625q0.59375 -0.671875 0.59375 -1.796875q0 -1.09375 -0.578125 -1.71875q-0.578125 -0.625 -1.453125 -0.625q-0.875 0 -1.484375 0.625q-0.609375 0.625 -0.609375 1.640625z" fill-rule="nonzero"/><path fill="#ffffff" d="m339.90027 260.88937l140.56693 0l0 44.15747l-140.56693 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m339.90027 260.88937l140.56693 0l0 44.15747l-140.56693 0z" fill-rule="evenodd"/><path fill="#000000" d="m370.5174 284.67313l1.3125 -0.109375q0.09375 0.78125 0.421875 1.296875q0.34375 0.5 1.0625 0.8125q0.71875 0.3125 1.609375 0.3125q0.796875 0 1.40625 -0.234375q0.609375 -0.234375 0.90625 -0.640625q0.296875 -0.421875 0.296875 -0.90625q0 -0.5 -0.296875 -0.859375q-0.28125 -0.375 -0.9375 -0.625q-0.421875 -0.171875 -1.875 -0.515625q-1.4375 -0.34375 -2.015625 -0.65625q-0.75 -0.390625 -1.125 -0.96875q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.796875 0.4375 -1.484375q0.453125 -0.6875 1.3125 -1.046875q0.875 -0.359375 1.9375 -0.359375q1.171875 0 2.0625 0.375q0.890625 0.375 1.359375 1.109375q0.484375 0.734375 0.515625 1.65625l-1.328125 0.09375q-0.109375 -1.0 -0.734375 -1.5q-0.609375 -0.515625 -1.8125 -0.515625q-1.265625 0 -1.84375 0.46875q-0.578125 0.46875 -0.578125 1.109375q0 0.5625 0.421875 0.9375q0.390625 0.359375 2.078125 0.75q1.703125 0.375 2.328125 0.65625q0.921875 0.421875 1.359375 1.078125q0.4375 0.640625 0.4375 1.484375q0 0.84375 -0.484375 1.59375q-0.484375 0.734375 -1.390625 1.140625q-0.890625 0.40625 -2.015625 0.40625q-1.421875 0 -2.390625 -0.40625q-0.953125 -0.421875 -1.5 -1.25q-0.546875 -0.828125 -0.578125 -1.890625zm15.291229 0.921875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.0056458 0l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.421875 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.1667175 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm8.296387 0l0 -1.28125l5.375 -6.734375q0.5625 -0.703125 1.078125 -1.234375l-5.84375 0l0 -1.234375l7.515625 0l0 1.234375l-5.890625 7.28125l-0.640625 0.734375l6.703125 0l0 1.234375l-8.296875 0zm9.343231 -9.125l0 -1.234375l6.796875 0l0 1.0q-1.0 1.078125 -1.984375 2.84375q-0.984375 1.765625 -1.515625 3.625q-0.390625 1.328125 -0.5 2.890625l-1.328125 0q0.03125 -1.234375 0.484375 -2.984375q0.46875 -1.765625 1.34375 -3.390625q0.875 -1.625 1.84375 -2.75l-5.140625 0zm10.057373 3.4375q-0.796875 -0.296875 -1.1875 -0.84375q-0.390625 -0.546875 -0.390625 -1.296875q0 -1.140625 0.8125 -1.921875q0.828125 -0.78125 2.203125 -0.78125q1.375 0 2.203125 0.796875q0.84375 0.796875 0.84375 1.9375q0 0.734375 -0.390625 1.28125q-0.375 0.53125 -1.15625 0.828125q0.96875 0.3125 1.46875 1.015625q0.5 0.703125 0.5 1.671875q0 1.34375 -0.953125 2.265625q-0.9375 0.90625 -2.5 0.90625q-1.546875 0 -2.5 -0.90625q-0.953125 -0.921875 -0.953125 -2.296875q0 -1.03125 0.515625 -1.71875q0.515625 -0.6875 1.484375 -0.9375zm-0.265625 -2.1875q0 0.75 0.484375 1.21875q0.484375 0.46875 1.25 0.46875q0.734375 0 1.203125 -0.46875q0.484375 -0.46875 0.484375 -1.140625q0 -0.71875 -0.5 -1.1875q-0.484375 -0.484375 -1.203125 -0.484375q-0.734375 0 -1.234375 0.46875q-0.484375 0.46875 -0.484375 1.125zm-0.40625 4.84375q0 0.5625 0.25 1.078125q0.265625 0.5 0.78125 0.796875q0.515625 0.28125 1.109375 0.28125q0.921875 0 1.515625 -0.59375q0.609375 -0.59375 0.609375 -1.515625q0 -0.9375 -0.625 -1.53125q-0.609375 -0.609375 -1.546875 -0.609375q-0.90625 0 -1.5 0.609375q-0.59375 0.59375 -0.59375 1.484375zm7.0260925 0.609375l1.25 -0.125q0.15625 0.875 0.59375 1.28125q0.4375 0.390625 1.140625 0.390625q0.59375 0 1.03125 -0.265625q0.453125 -0.28125 0.734375 -0.734375q0.296875 -0.453125 0.484375 -1.21875q0.1875 -0.78125 0.1875 -1.59375q0 -0.078125 0 -0.25q-0.390625 0.609375 -1.0625 1.0q-0.65625 0.375 -1.4375 0.375q-1.3125 0 -2.21875 -0.9375q-0.890625 -0.953125 -0.890625 -2.484375q0 -1.609375 0.9375 -2.578125q0.9375 -0.96875 2.359375 -0.96875q1.03125 0 1.875 0.546875q0.84375 0.546875 1.28125 1.578125q0.4375 1.015625 0.4375 2.953125q0 2.0 -0.4375 3.203125q-0.421875 1.1875 -1.296875 1.8125q-0.859375 0.609375 -2.015625 0.609375q-1.234375 0 -2.015625 -0.671875q-0.78125 -0.6875 -0.9375 -1.921875zm5.28125 -4.640625q0 -1.109375 -0.59375 -1.75q-0.59375 -0.65625 -1.421875 -0.65625q-0.859375 0 -1.5 0.703125q-0.625 0.703125 -0.625 1.8125q0 1.0 0.59375 1.640625q0.609375 0.625 1.5 0.625q0.890625 0 1.46875 -0.625q0.578125 -0.640625 0.578125 -1.75z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m258.3517 113.8189l81.543304 169.13385" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m258.3517 113.8189l78.93759 163.72919" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m335.80145 278.2654l3.4586792 3.3704834l-0.4829712 -4.8051147z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m581.33215 2.6403973l140.5669 0l0 33.511814l-140.5669 0z" fill-rule="evenodd"/><path fill="#000000" d="m590.3009 29.560396l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm16.162292 1.9375l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.5354004 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m557.41504 161.08923l139.37012 0l0 44.157486l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m557.41504 161.08923l139.37012 0l0 44.157486l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m567.36816 181.60924l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m571.0088 188.60924l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m615.7627 184.74596l8.003906 0l0 13.798828l-8.003906 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m620.5752 195.60924l-1.765625 0l0.703125 -3.34375l-2.375 -5.25l1.890625 0l1.0625 2.421875q0.375 0.875 0.5 1.265625q0.21875 -0.375 0.515625 -0.8125l0.8125 -1.125l1.203125 -1.75l2.0625 0l-3.9375 5.40625l-0.671875 3.1875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m623.7666 184.74596l20.021484 0l0 13.798828l-20.021484 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m625.1885 190.67174l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m649.0283 188.21861l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m615.7627 196.38924l28.02539 0l0 1.0800018l-28.02539 0l0 -1.0800018z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m557.41504 260.88977l139.37012 0l0 44.15747l-139.37012 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m557.41504 260.88977l139.37012 0l0 44.15747l-139.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m567.36816 281.40976l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm7.8476562 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.058594 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 -4.25l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6347656 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m571.0088 288.40976l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m615.7627 284.54648l7.330078 0l0 13.798828l-7.330078 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m616.0596 295.40976l0.28125 -1.359375l4.953125 -5.796875l-4.0 0l0.296875 -1.4375l6.1875 0l-0.25 1.34375l-5.0 5.84375q0.796875 -0.015625 0.921875 -0.015625q0.5625 0 1.546875 -0.015625l2.03125 0l-0.296875 1.4375l-6.671875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m623.0928 284.54648l20.021484 0l0 13.798828l-20.021484 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m624.51465 290.47226l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m648.3545 288.01913l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m615.7627 296.18976l27.351562 0l0 1.0800171l-27.351562 0l0 -1.0800171z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m480.4672 183.16798l76.944855 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m480.4672 183.16798l70.944855 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m551.41205 184.81972l4.538147 -1.6517334l-4.538147 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m479.27036 90.968506l78.14169 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.27036 90.968506l72.14169 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m551.41205 92.62024l4.538147 -1.6517334l-4.538147 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m480.4672 282.9681l76.944855 0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m480.4672 282.9681l70.944855 0" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m551.41205 284.61984l4.538147 -1.6517334l-4.538147 -1.6517334z" fill-rule="evenodd"/></g></svg> \ No newline at end of file diff --git a/docs/user/alerting/images/alert-types-index-threshold-conditions.png b/docs/user/alerting/images/alert-types-index-threshold-conditions.png new file mode 100644 index 0000000000000..356732dfb9777 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-conditions.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-aggregation.png b/docs/user/alerting/images/alert-types-index-threshold-example-aggregation.png new file mode 100644 index 0000000000000..fc40da7436547 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-aggregation.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-comparison.png b/docs/user/alerting/images/alert-types-index-threshold-example-comparison.png new file mode 100644 index 0000000000000..5e7c65e1247d8 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-comparison.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-grouping.png b/docs/user/alerting/images/alert-types-index-threshold-example-grouping.png new file mode 100644 index 0000000000000..ea3a3849c8927 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-grouping.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-index.png b/docs/user/alerting/images/alert-types-index-threshold-example-index.png new file mode 100644 index 0000000000000..8f818f7001278 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-index.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-preview.png b/docs/user/alerting/images/alert-types-index-threshold-example-preview.png new file mode 100644 index 0000000000000..b5d9c38d99810 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-preview.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-threshold.png b/docs/user/alerting/images/alert-types-index-threshold-example-threshold.png new file mode 100644 index 0000000000000..9c51807b8d219 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-threshold.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-timefield.png b/docs/user/alerting/images/alert-types-index-threshold-example-timefield.png new file mode 100644 index 0000000000000..24e4e03f829ce Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-timefield.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-example-window.png b/docs/user/alerting/images/alert-types-index-threshold-example-window.png new file mode 100644 index 0000000000000..5405415958485 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-example-window.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-preview.png b/docs/user/alerting/images/alert-types-index-threshold-preview.png new file mode 100644 index 0000000000000..3709f162b612b Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-preview.png differ diff --git a/docs/user/alerting/images/alert-types-index-threshold-select.png b/docs/user/alerting/images/alert-types-index-threshold-select.png new file mode 100644 index 0000000000000..0c2776e01b962 Binary files /dev/null and b/docs/user/alerting/images/alert-types-index-threshold-select.png differ diff --git a/docs/user/alerting/images/alerting-overview.png b/docs/user/alerting/images/alerting-overview.png new file mode 100644 index 0000000000000..383bc8c2ce015 Binary files /dev/null and b/docs/user/alerting/images/alerting-overview.png differ diff --git a/docs/user/alerting/images/what-is-an-action.svg b/docs/user/alerting/images/what-is-an-action.svg new file mode 100644 index 0000000000000..7675f717a6c84 --- /dev/null +++ b/docs/user/alerting/images/what-is-an-action.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 985.5511811023622 337.08923884514434" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l985.5512 0l0 337.08923l-985.5512 0l0 -337.08923z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l985.5512 0l0 337.08923l-985.5512 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m13.120735 28.889763l451.9685 0l0 282.2677l-451.9685 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m13.120735 28.889763l451.9685 0l0 282.2677l-451.9685 0z" fill-rule="evenodd"/><path fill="#000000" d="m22.089485 55.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 73.062996l418.2677 0l0 33.51181l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 73.062996l418.2677 0l0 33.51181l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m43.750084 93.40737l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9609375 -5.703125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m131.0157 94.57925l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125zm13.953125 0.015625l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm7.421875 0l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm12.0 -2.828125l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm15.3671875 -1.03125q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm4.8671875 4.203125l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm5.828125 0.75l1.4375 0.140625q-0.015625 0.484375 0.109375 0.71875q0.140625 0.25 0.421875 0.375q0.390625 0.171875 1.0 0.171875q1.28125 0 1.84375 -0.65625q0.359375 -0.453125 0.671875 -1.953125l0.140625 -0.671875q-1.09375 1.125 -2.34375 1.125q-1.25 0 -2.109375 -0.921875q-0.84375 -0.9375 -0.84375 -2.625q0 -1.40625 0.671875 -2.578125q0.671875 -1.171875 1.59375 -1.765625q0.921875 -0.59375 1.890625 -0.59375q1.640625 0 2.515625 1.546875l0.28125 -1.359375l1.296875 0l-1.671875 8.0q-0.265625 1.328125 -0.71875 2.0625q-0.4375 0.75 -1.234375 1.15625q-0.796875 0.40625 -1.828125 0.40625q-1.0 0 -1.734375 -0.265625q-0.71875 -0.25 -1.078125 -0.75q-0.34375 -0.5 -0.34375 -1.140625q0 -0.1875 0.03125 -0.421875zm1.765625 -4.421875q0 0.84375 0.171875 1.28125q0.234375 0.59375 0.65625 0.921875q0.4375 0.3125 0.96875 0.3125q0.703125 0 1.390625 -0.484375q0.6875 -0.5 1.109375 -1.515625q0.421875 -1.03125 0.421875 -1.953125q0 -1.03125 -0.5625 -1.625q-0.5625 -0.609375 -1.40625 -0.609375q-0.515625 0 -1.0 0.28125q-0.484375 0.265625 -0.90625 0.84375q-0.40625 0.5625 -0.625 1.359375q-0.21875 0.78125 -0.21875 1.1875zm20.78125 -0.359375l1.515625 0.203125q-0.71875 1.984375 -2.09375 3.015625q-1.375 1.015625 -3.09375 1.015625q-2.078125 0 -3.3125 -1.28125q-1.21875 -1.28125 -1.21875 -3.65625q0 -3.09375 1.859375 -5.109375q1.65625 -1.8125 4.125 -1.8125q1.8125 0 2.9375 0.984375q1.140625 0.96875 1.3125 2.625l-1.421875 0.125q-0.234375 -1.234375 -0.9375 -1.84375q-0.703125 -0.625 -1.828125 -0.625q-2.09375 0 -3.390625 1.875q-1.125 1.609375 -1.125 3.8125q0 1.765625 0.859375 2.703125q0.875 0.921875 2.265625 0.921875q1.1875 0 2.140625 -0.765625q0.96875 -0.78125 1.40625 -2.1875zm2.5859375 4.03125l2.40625 -11.453125l4.78125 0q1.234375 0 1.859375 0.28125q0.625 0.28125 1.03125 0.984375q0.40625 0.6875 0.40625 1.546875q0 0.703125 -0.296875 1.4375q-0.28125 0.734375 -0.734375 1.21875q-0.4375 0.46875 -0.890625 0.71875q-0.453125 0.234375 -0.96875 0.359375q-1.09375 0.25 -2.21875 0.25l-2.875 0l-0.96875 4.65625l-1.53125 0zm2.78125 -5.953125l2.515625 0q1.46875 0 2.15625 -0.3125q0.6875 -0.3125 1.09375 -0.953125q0.421875 -0.65625 0.421875 -1.390625q0 -0.5625 -0.21875 -0.90625q-0.21875 -0.359375 -0.625 -0.53125q-0.390625 -0.171875 -1.515625 -0.171875l-2.9375 0l-0.890625 4.265625zm10.375 -5.5l1.53125 0l-1.46875 7.03125q-0.171875 0.875 -0.171875 1.296875q0 0.921875 0.71875 1.484375q0.734375 0.5625 1.828125 0.5625q0.875 0 1.625 -0.390625q0.765625 -0.40625 1.203125 -1.1875q0.4375 -0.78125 0.78125 -2.5l1.328125 -6.296875l1.53125 0l-1.40625 6.71875q-0.359375 1.71875 -0.953125 2.71875q-0.578125 1.0 -1.625 1.609375q-1.03125 0.609375 -2.40625 0.609375q-1.296875 0 -2.25 -0.421875q-0.9375 -0.4375 -1.421875 -1.1875q-0.46875 -0.765625 -0.46875 -1.734375q0 -0.59375 0.328125 -2.0625l1.296875 -6.25zm21.85939 6.4375l-7.5937653 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.5937653 3.203125l0 1.3125zm5.8984375 1.25q0 -1.453125 0.421875 -2.953125q0.4375 -1.5 0.96875 -2.390625q0.53125 -0.90625 1.09375 -1.40625q0.578125 -0.515625 1.125 -0.75q0.5625 -0.234375 1.234375 -0.234375q1.3125 0 2.1875 0.984375q0.875 0.96875 0.875 2.8125q0 1.890625 -0.609375 3.75q-0.71875 2.203125 -2.0 3.3125q-0.984375 0.84375 -2.234375 0.84375q-1.296875 0 -2.1875 -1.015625q-0.875 -1.015625 -0.875 -2.953125zm1.359375 0.359375q0 1.0625 0.359375 1.65625q0.46875 0.8125 1.40625 0.8125q0.828125 0 1.5 -0.734375q0.96875 -1.046875 1.453125 -3.0625q0.484375 -2.03125 0.484375 -3.3125q0 -1.234375 -0.46875 -1.78125q-0.46875 -0.546875 -1.25 -0.546875q-0.5625 0 -1.046875 0.296875q-0.484375 0.28125 -0.9375 0.984375q-0.625 1.0 -1.09375 2.96875q-0.40625 1.6875 -0.40625 2.71875zm7.3203125 3.40625l0.34375 -1.609375l1.59375 0l-0.34375 1.609375l-1.59375 0zm4.6015625 -2.625l1.328125 -0.140625q0.140625 0.96875 0.546875 1.375q0.421875 0.40625 0.984375 0.40625q0.8125 0 1.515625 -0.703125q1.015625 -1.03125 1.5 -2.96875q-0.703125 0.53125 -1.265625 0.765625q-0.546875 0.21875 -1.125 0.21875q-1.046875 0 -1.875 -0.703125q-1.09375 -0.90625 -1.09375 -2.625q0 -1.9375 1.265625 -3.3125q1.09375 -1.1875 2.671875 -1.1875q1.421875 0 2.359375 1.046875q0.9375 1.046875 0.9375 2.96875q0 1.875 -0.625 3.6875q-0.75 2.140625 -2.015625 3.15625q-1.03125 0.84375 -2.3125 0.84375q-1.1875 0 -1.953125 -0.734375q-0.75 -0.75 -0.84375 -2.09375zm1.890625 -4.53125q0 1.078125 0.5625 1.71875q0.578125 0.640625 1.375 0.640625q0.578125 0 1.15625 -0.390625q0.578125 -0.40625 0.984375 -1.203125q0.421875 -0.796875 0.421875 -1.625q0 -0.65625 -0.28125 -1.21875q-0.265625 -0.5625 -0.734375 -0.84375q-0.46875 -0.296875 -0.953125 -0.296875q-0.46875 0 -0.921875 0.25q-0.453125 0.25 -0.84375 0.734375q-0.390625 0.484375 -0.578125 1.125q-0.1875 0.625 -0.1875 1.109375zm11.109375 7.15625l1.5 -7.203125l-1.265625 0l0.234375 -1.09375l1.265625 0l0.234375 -1.1875q0.1875 -0.875 0.390625 -1.265625q0.203125 -0.390625 0.640625 -0.640625q0.453125 -0.265625 1.234375 -0.265625q0.53125 0 1.5625 0.234375l-0.265625 1.234375q-0.71875 -0.1875 -1.203125 -0.1875q-0.40625 0 -0.625 0.203125q-0.21875 0.203125 -0.375 0.984375l-0.1875 0.890625l1.578125 0l-0.21875 1.09375l-1.578125 0l-1.515625 7.203125l-1.40625 0zm4.4921875 -3.15625q0 -2.421875 1.4375 -4.015625q1.171875 -1.3125 3.09375 -1.3125q1.5 0 2.40625 0.9375q0.921875 0.9375 0.921875 2.53125q0 1.421875 -0.578125 2.65625q-0.578125 1.234375 -1.640625 1.890625q-1.0625 0.65625 -2.25 0.65625q-0.96875 0 -1.765625 -0.40625q-0.78125 -0.421875 -1.203125 -1.171875q-0.421875 -0.765625 -0.421875 -1.765625zm1.421875 -0.140625q0 1.171875 0.5625 1.78125q0.5625 0.609375 1.421875 0.609375q0.453125 0 0.890625 -0.1875q0.453125 -0.1875 0.828125 -0.5625q0.390625 -0.375 0.65625 -0.84375q0.28125 -0.484375 0.4375 -1.046875q0.25 -0.765625 0.25 -1.484375q0 -1.125 -0.578125 -1.734375q-0.5625 -0.625 -1.421875 -0.625q-0.65625 0 -1.203125 0.3125q-0.546875 0.3125 -1.0 0.921875q-0.4375 0.609375 -0.640625 1.421875q-0.203125 0.8125 -0.203125 1.4375zm7.2265625 3.296875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm9.6640625 0l2.390625 -11.453125l1.421875 0l-2.390625 11.453125l-1.421875 0zm9.2578125 -1.03125q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm2.9140625 1.359375l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125zm11.171875 1.6875l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm5.984375 1.15625q0.21875 -1.03125 0.609375 -1.71875q0.390625 -0.6875 1.03125 -1.3125q0.640625 -0.625 2.46875 -2.078125q1.109375 -0.890625 1.515625 -1.3125q0.578125 -0.609375 0.84375 -1.1875q0.1875 -0.40625 0.1875 -0.875q0 -0.78125 -0.5625 -1.328125q-0.5625 -0.5625 -1.375 -0.5625q-0.796875 0 -1.40625 0.5625q-0.59375 0.5625 -0.859375 1.796875l-1.375 -0.203125q0.203125 -1.53125 1.171875 -2.40625q0.984375 -0.875 2.453125 -0.875q0.96875 0 1.765625 0.40625q0.796875 0.40625 1.1875 1.140625q0.40625 0.734375 0.40625 1.515625q0 1.140625 -0.8125 2.1875q-0.5 0.65625 -2.9375 2.59375q-1.046875 0.828125 -1.5625 1.359375q-0.515625 0.53125 -0.765625 1.0l5.125 0l-0.28125 1.296875l-6.828125 0zm12.9375 0l1.734375 -8.296875l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.34375l-1.40625 0l1.140625 -5.484375q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.03125l-1.421875 0l1.171875 -5.609375q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.921875l-1.40625 0zm15.34375 -9.859375l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859375l1.734375 -8.296875l1.40625 0l-1.734375 8.296875l-1.40625 0zm3.6015625 0l1.734375 -8.296875l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.03125l-1.40625 0l1.09375 -5.265625q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.859375l-1.421875 0zm14.5703125 -1.5q-1.5 1.6875 -3.0625 1.6875q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5625 -0.59375 -1.359375q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296875l-1.296875 0l0.3125 -1.5zm6.5390625 0.34375l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm7.0546875 2.03125l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 120.07612l418.2677 0l0 39.30709l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 120.07612l418.2677 0l0 39.30709l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m35.062584 140.74861l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.421875 0.640625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3984375 4.140625l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875z" fill-rule="nonzero"/><path fill="#000000" d="m136.96883 141.60799l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm9.0078125 4.875l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm12.0 -2.828125l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm4.796875 3.203125l0.09375 -1.328125q0.4375 0.125 0.84375 0.125q0.4375 0 0.703125 -0.1875q0.34375 -0.265625 0.75 -0.96875l0.453125 -0.8125l-1.390625 -8.328125l1.390625 0l0.625 4.1875q0.1875 1.25 0.328125 2.484375l3.703125 -6.671875l1.484375 0l-5.296875 9.40625q-0.765625 1.375 -1.359375 1.8125q-0.59375 0.453125 -1.359375 0.453125q-0.5 0 -0.96875 -0.171875zm12.9765625 -3.203125l1.734375 -8.296875l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.34375l-1.40625 0l1.140625 -5.484375q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.03125l-1.421875 0l1.171875 -5.609375q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.921875l-1.40625 0zm15.34375 -9.859375l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859375l1.734375 -8.296875l1.40625 0l-1.734375 8.296875l-1.40625 0zm3.6015625 0l1.734375 -8.296875l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.03125l-1.40625 0l1.09375 -5.265625q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.859375l-1.421875 0zm14.5703125 -1.5q-1.5 1.6875 -3.0625 1.6875q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5625 -0.59375 -1.359375q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296875l-1.296875 0l0.3125 -1.5zm6.5390625 0.34375l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 168.92389l418.2677 0l0 129.07086l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 168.92389l418.2677 0l0 129.07086l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m34.312584 193.28389l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.859375 1.65625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m131.97372 179.3517l296.9449 0l0 106.92915l-296.9449 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m131.97372 179.3517l296.9449 0l0 106.92915l-296.9449 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.0831 199.8717l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m241.94247 197.76233l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m148.03622 215.85608l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.955078 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m237.37997 218.8717l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.861328 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533203 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm3.9824219 2.4375l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m236.84872 235.26233l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.298828 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm4.435547 -0.015625l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m141.8956 252.8717l0 -8.59375l3.25 0q0.84375 0 1.296875 0.078125q0.640625 0.109375 1.0625 0.40625q0.4375 0.296875 0.6875 0.828125q0.265625 0.53125 0.265625 1.171875q0 1.09375 -0.703125 1.859375q-0.6875 0.75 -2.515625 0.75l-2.203125 0l0 3.5l-1.140625 0zm1.140625 -4.5l2.21875 0q1.109375 0 1.5625 -0.40625q0.46875 -0.421875 0.46875 -1.171875q0 -0.53125 -0.28125 -0.90625q-0.265625 -0.390625 -0.703125 -0.515625q-0.296875 -0.078125 -1.0625 -0.078125l-2.203125 0l0 3.078125zm6.7226562 4.5l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m237.47372 250.7467l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.140625 1.0q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.4394531 1.125l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm6.611328 -4.828125l0.25 -1.203125l1.046875 0l-0.25 1.203125l-1.046875 0zm-3.359375 9.734375l0.1875 -0.90625q0.359375 0.09375 0.640625 0.09375q0.34375 0 0.546875 -0.234375q0.203125 -0.21875 0.421875 -1.234375l1.296875 -6.28125l1.0625 0l-1.34375 6.46875q-0.25 1.21875 -0.578125 1.65625q-0.4375 0.578125 -1.234375 0.578125q-0.40625 0 -1.0 -0.140625zm9.087891 -4.453125l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm9.470703 1.390625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm4.1875 1.40625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm1.6835938 7.0l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm16.835938 -3.03125l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm7.9160156 1.234375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m237.37997 266.8717l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm5.298828 0.203125q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm9.626953 1.5625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm4.986328 5.015625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm16.083984 -7.453125l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm10.4296875 -3.59375q0.453125 0 0.78125 -0.234375q0.34375 -0.234375 0.546875 -0.703125q0.171875 -0.34375 0.375 -1.3125q0.21875 -0.984375 0.34375 -1.34375q0.15625 -0.484375 0.375 -0.78125q0.21875 -0.3125 0.46875 -0.46875q0.25 -0.171875 0.625 -0.25q0.203125 -0.046875 0.671875 -0.046875l0.328125 0l-0.203125 0.921875l-0.171875 0q-0.5 0 -0.71875 0.125q-0.21875 0.109375 -0.34375 0.375q-0.109375 0.25 -0.3125 1.125q-0.234375 1.171875 -0.453125 1.6875q-0.203125 0.5 -0.53125 0.828125q-0.3125 0.3125 -0.90625 0.5625q0.421875 0.203125 0.625 0.53125q0.203125 0.328125 0.203125 0.875q0 0.453125 -0.265625 1.671875q-0.1875 0.859375 -0.1875 1.078125q0 0.21875 0.09375 0.34375q0.0625 0.109375 0.21875 0.15625q0.171875 0.0625 0.703125 0.0625l-0.1875 0.921875l-0.328125 0q-0.546875 0 -0.765625 -0.078125q-0.34375 -0.125 -0.546875 -0.40625q-0.1875 -0.265625 -0.1875 -0.734375q0 -0.390625 0.265625 -1.671875q0.203125 -0.96875 0.203125 -1.3125q0 -0.46875 -0.234375 -0.703125q-0.234375 -0.25 -0.6875 -0.25l0.203125 -0.96875zm4.0078125 0q0.453125 0 0.78125 -0.234375q0.34375 -0.234375 0.546875 -0.703125q0.171875 -0.34375 0.375 -1.3125q0.21875 -0.984375 0.34375 -1.34375q0.15625 -0.484375 0.375 -0.78125q0.21875 -0.3125 0.46875 -0.46875q0.25 -0.171875 0.625 -0.25q0.203125 -0.046875 0.671875 -0.046875l0.328125 0l-0.203125 0.921875l-0.171875 0q-0.5 0 -0.71875 0.125q-0.21875 0.109375 -0.34375 0.375q-0.109375 0.25 -0.3125 1.125q-0.234375 1.171875 -0.453125 1.6875q-0.203125 0.5 -0.53125 0.828125q-0.3125 0.3125 -0.90625 0.5625q0.421875 0.203125 0.625 0.53125q0.203125 0.328125 0.203125 0.875q0 0.453125 -0.265625 1.671875q-0.1875 0.859375 -0.1875 1.078125q0 0.21875 0.09375 0.34375q0.0625 0.109375 0.21875 0.15625q0.171875 0.0625 0.703125 0.0625l-0.1875 0.921875l-0.328125 0q-0.546875 0 -0.765625 -0.078125q-0.34375 -0.125 -0.546875 -0.40625q-0.1875 -0.265625 -0.1875 -0.734375q0 -0.390625 0.265625 -1.671875q0.203125 -0.96875 0.203125 -1.3125q0 -0.46875 -0.234375 -0.703125q-0.234375 -0.25 -0.6875 -0.25l0.203125 -0.96875zm3.6796875 1.46875l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.46875 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm5.5585938 0l-1.015625 -6.21875l1.03125 0l0.53125 3.421875q0.09375 0.5625 0.21875 1.828125q0.296875 -0.65625 0.78125 -1.515625l2.078125 -3.734375l1.109375 0l-3.5625 6.21875l-1.171875 0zm9.0 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm7.2929688 -3.59375l-0.203125 0.96875q-0.4375 0 -0.78125 0.234375q-0.328125 0.234375 -0.515625 0.640625q-0.1875 0.40625 -0.40625 1.390625q-0.21875 0.984375 -0.3125 1.3125q-0.171875 0.5 -0.390625 0.796875q-0.21875 0.3125 -0.484375 0.46875q-0.25 0.171875 -0.609375 0.265625q-0.203125 0.046875 -0.6875 0.046875l-0.328125 0l0.203125 -0.921875l0.1875 0q0.5 0 0.71875 -0.125q0.21875 -0.125 0.359375 -0.421875q0.09375 -0.21875 0.28125 -1.09375q0.234375 -1.109375 0.40625 -1.546875q0.234375 -0.59375 0.59375 -0.953125q0.359375 -0.359375 0.890625 -0.578125q-0.453125 -0.234375 -0.640625 -0.546875q-0.171875 -0.3125 -0.171875 -0.859375q0 -0.453125 0.25 -1.671875q0.1875 -0.84375 0.1875 -1.078125q0 -0.296875 -0.15625 -0.421875q-0.15625 -0.125 -0.671875 -0.125l-0.1875 0l0.203125 -0.921875l0.328125 0q0.546875 0 0.765625 0.078125q0.34375 0.109375 0.53125 0.390625q0.203125 0.265625 0.203125 0.734375q0 0.390625 -0.203125 1.296875q-0.28125 1.359375 -0.28125 1.6875q0 0.46875 0.234375 0.71875q0.234375 0.234375 0.6875 0.234375zm4.0078125 0l-0.203125 0.96875q-0.4375 0 -0.78125 0.234375q-0.328125 0.234375 -0.515625 0.640625q-0.1875 0.40625 -0.40625 1.390625q-0.21875 0.984375 -0.3125 1.3125q-0.171875 0.5 -0.390625 0.796875q-0.21875 0.3125 -0.484375 0.46875q-0.25 0.171875 -0.609375 0.265625q-0.203125 0.046875 -0.6875 0.046875l-0.328125 0l0.203125 -0.921875l0.1875 0q0.5 0 0.71875 -0.125q0.21875 -0.125 0.359375 -0.421875q0.09375 -0.21875 0.28125 -1.09375q0.234375 -1.109375 0.40625 -1.546875q0.234375 -0.59375 0.59375 -0.953125q0.359375 -0.359375 0.890625 -0.578125q-0.453125 -0.234375 -0.640625 -0.546875q-0.171875 -0.3125 -0.171875 -0.859375q0 -0.453125 0.25 -1.671875q0.1875 -0.84375 0.1875 -1.078125q0 -0.296875 -0.15625 -0.421875q-0.15625 -0.125 -0.671875 -0.125l-0.1875 0l0.203125 -0.921875l0.328125 0q0.546875 0 0.765625 0.078125q0.34375 0.109375 0.53125 0.390625q0.203125 0.265625 0.203125 0.734375q0 0.390625 -0.203125 1.296875q-0.28125 1.359375 -0.28125 1.6875q0 0.46875 0.234375 0.71875q0.234375 0.234375 0.6875 0.234375zm5.544922 -3.796875l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m673.95276 96.70677l283.68506 0l0 106.92914l-283.68506 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m673.95276 96.70677l283.68506 0l0 106.92914l-283.68506 0z" fill-rule="evenodd"/><path fill="#000000" d="m686.06213 117.22677l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m783.9215 115.11739l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m690.01526 133.21115l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.5156326 2.09375 -0.5156326q1.28125 0 2.15625 0.6562576q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.6250076l0 2.1718826l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.2187576l1.0625 0l0 1.2187576l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.955078 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m779.359 136.22678l1.78125 -8.593758l1.0625 0l-0.6875 3.2968826q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.861328 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533203 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.7343826l-0.46875 2.2656326l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm3.9824219 2.4375l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m778.82776 152.6174l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.298828 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm4.435547 -0.015625l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m683.87463 170.22676l0 -8.59375l3.25 0q0.84375 0 1.296875 0.078125q0.640625 0.109375 1.0625 0.40625q0.4375 0.296875 0.6875 0.828125q0.265625 0.53125 0.265625 1.171875q0 1.09375 -0.703125 1.859375q-0.6875 0.75 -2.515625 0.75l-2.203125 0l0 3.5l-1.140625 0zm1.140625 -4.5l2.21875 0q1.109375 0 1.5625 -0.40625q0.46875 -0.421875 0.46875 -1.171875q0 -0.53125 -0.28125 -0.90625q-0.265625 -0.390625 -0.703125 -0.515625q-0.296875 -0.078125 -1.0625 -0.078125l-2.203125 0l0 3.078125zm6.7226562 4.5l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m779.45276 168.10176l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.140625 1.0q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.4394531 1.125l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm6.611328 -4.828125l0.25 -1.203125l1.046875 0l-0.25 1.203125l-1.046875 0zm-3.359375 9.734375l0.1875 -0.90625q0.359375 0.09375 0.640625 0.09375q0.34375 0 0.546875 -0.234375q0.203125 -0.21875 0.421875 -1.234375l1.296875 -6.28125l1.0625 0l-1.34375 6.46875q-0.25 1.21875 -0.578125 1.65625q-0.4375 0.578125 -1.234375 0.578125q-0.40625 0 -1.0 -0.140625zm9.087891 -4.453125l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm9.470703 1.390625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm4.1875 1.40625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm1.6835938 7.0l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm16.835938 -3.03125l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm7.9160156 1.234375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m779.359 184.22676l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm5.298828 0.203125q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm9.626953 1.5625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm4.986328 5.015625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm16.083984 -7.453125l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m867.9977 173.36348l28.02539 0l0 13.798828l-28.02539 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m869.91956 184.22676l-2.28125 0l3.78125 -4.34375l-2.125 -4.25l1.84375 0l0.84375 1.609375q0.03125 0.09375 0.5625 1.1875q0.046875 0.0625 0.078125 0.171875q0.71875 -0.875 1.203125 -1.4375l1.359375 -1.53125l2.21875 0l-3.9375 4.53125l2.125 4.0625l-2.0 0l-0.640625 -1.296875q-0.5 -1.03125 -0.671875 -1.46875q-0.21875 0.34375 -1.171875 1.421875l-1.1875 1.34375zm7.5039062 -4.9375l0.3125 -1.5q2.1875 -0.953125 3.375 -2.203125l1.015625 0l-1.8125 8.640625l-1.6875 0l1.25 -5.953125q-0.53125 0.34375 -1.21875 0.625q-0.6875 0.28125 -1.234375 0.390625zm8.423828 -0.96875l-1.640625 -0.25q0.1875 -1.203125 0.921875 -1.828125q0.734375 -0.640625 1.828125 -0.640625q1.203125 0 1.875 0.65625q0.6875 0.640625 0.6875 1.640625q0 0.515625 -0.21875 1.03125q-0.203125 0.515625 -0.671875 1.078125q-0.34375 0.390625 -1.140625 1.125q-0.78125 0.71875 -1.046875 1.0q-0.25 0.265625 -0.484375 0.5625l2.984375 0l-0.3125 1.53125l-5.21875 0q0.078125 -0.640625 0.359375 -1.203125q0.296875 -0.578125 0.71875 -1.0625q0.4375 -0.5 1.59375 -1.59375q0.875 -0.828125 1.09375 -1.078125q0.421875 -0.453125 0.5625 -0.78125q0.15625 -0.34375 0.15625 -0.609375q0 -0.4375 -0.25 -0.703125q-0.25 -0.28125 -0.65625 -0.28125q-0.390625 0 -0.6875 0.3125q-0.296875 0.296875 -0.453125 1.09375zm4.111328 3.65625l1.609375 -0.1875q0.109375 0.6875 0.359375 0.953125q0.265625 0.265625 0.703125 0.265625q0.5625 0 0.9375 -0.390625q0.390625 -0.390625 0.390625 -1.0q0 -0.515625 -0.3125 -0.828125q-0.296875 -0.3125 -0.8125 -0.3125q-0.125 0 -0.265625 0.03125l0.28125 -1.40625q0.09375 0.015625 0.171875 0.015625q0.671875 0 1.015625 -0.34375q0.359375 -0.34375 0.359375 -0.921875q0 -0.421875 -0.234375 -0.65625q-0.234375 -0.25 -0.625 -0.25q-0.359375 0 -0.65625 0.265625q-0.28125 0.265625 -0.453125 0.921875l-1.53125 -0.3125q0.296875 -0.953125 0.8125 -1.453125q0.796875 -0.765625 1.953125 -0.765625q1.171875 0 1.78125 0.65625q0.625 0.65625 0.625 1.578125q0 0.671875 -0.390625 1.21875q-0.390625 0.53125 -1.078125 0.78125q0.546875 0.28125 0.796875 0.75q0.265625 0.453125 0.265625 0.953125q0 0.953125 -0.671875 1.75q-0.921875 1.078125 -2.375 1.078125q-1.09375 0 -1.796875 -0.625q-0.703125 -0.625 -0.859375 -1.765625z" fill-rule="nonzero"/><path fill="#000000" d="m901.2633 176.83614l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m867.9977 185.00676l28.02539 0l0 1.0800018l-28.02539 0l0 -1.0800018z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m673.95276 213.52304l283.68506 0l0 106.92914l-283.68506 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m673.95276 213.52304l283.68506 0l0 106.92914l-283.68506 0z" fill-rule="evenodd"/><path fill="#000000" d="m686.06213 234.04305l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m783.9215 231.93367l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m690.01526 250.02742l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.955078 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m779.359 253.04305l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.861328 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533203 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm3.9824219 2.4375l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m778.82776 269.43365l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.298828 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm4.435547 -0.015625l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m683.87463 287.04303l0 -8.59375l3.25 0q0.84375 0 1.296875 0.078125q0.640625 0.109375 1.0625 0.40625q0.4375 0.296875 0.6875 0.828125q0.265625 0.53125 0.265625 1.171875q0 1.09375 -0.703125 1.859375q-0.6875 0.75 -2.515625 0.75l-2.203125 0l0 3.5l-1.140625 0zm1.140625 -4.5l2.21875 0q1.109375 0 1.5625 -0.40625q0.46875 -0.421875 0.46875 -1.171875q0 -0.53125 -0.28125 -0.90625q-0.265625 -0.390625 -0.703125 -0.515625q-0.296875 -0.078125 -1.0625 -0.078125l-2.203125 0l0 3.078125zm6.7226562 4.5l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m779.45276 284.91803l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.140625 1.0q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.4394531 1.125l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm6.611328 -4.828125l0.25 -1.203125l1.046875 0l-0.25 1.203125l-1.046875 0zm-3.359375 9.734375l0.1875 -0.90625q0.359375 0.09375 0.640625 0.09375q0.34375 0 0.546875 -0.234375q0.203125 -0.21875 0.421875 -1.234375l1.296875 -6.28125l1.0625 0l-1.34375 6.46875q-0.25 1.21875 -0.578125 1.65625q-0.4375 0.578125 -1.234375 0.578125q-0.40625 0 -1.0 -0.140625zm9.087891 -4.453125l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm9.470703 1.390625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm4.1875 1.40625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm1.6835938 7.0l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm16.835938 -3.03125l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm7.9160156 1.234375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m779.359 301.04303l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm5.298828 0.203125q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm9.626953 1.5625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm4.986328 5.015625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm16.083984 -7.453125l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m867.9977 290.17975l28.02539 0l0 13.798828l-28.02539 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000000" d="m872.8102 301.04303l-1.765625 0l0.703125 -3.34375l-2.375 -5.25l1.890625 0l1.0625 2.421875q0.375 0.875 0.5 1.265625q0.21875 -0.375 0.515625 -0.8125l0.8125 -1.125l1.203125 -1.75l2.0625 0l-3.9375 5.40625l-0.671875 3.1875zm6.8945312 -1.75l-3.375 0l0.296875 -1.40625l4.640625 -5.4375l1.453125 0l-1.125 5.40625l1.046875 0l-0.3125 1.4375l-1.03125 0l-0.375 1.75l-1.578125 0l0.359375 -1.75zm0.3125 -1.4375l0.546875 -2.671875l-2.265625 2.671875l1.71875 0zm3.4238281 0.71875l1.625 -0.140625q0 0.125 0 0.171875q0 0.609375 0.265625 0.90625q0.265625 0.296875 0.703125 0.296875q0.59375 0 1.078125 -0.5625q0.484375 -0.578125 0.484375 -1.59375q0 -0.59375 -0.28125 -0.890625q-0.265625 -0.3125 -0.71875 -0.3125q-0.328125 0 -0.640625 0.15625q-0.296875 0.140625 -0.59375 0.453125l-1.375 -0.09375l1.296875 -4.390625l4.328125 0l-0.328125 1.53125l-2.84375 0l-0.390625 1.328125q0.234375 -0.109375 0.484375 -0.171875q0.25 -0.0625 0.484375 -0.0625q0.984375 0 1.609375 0.671875q0.640625 0.65625 0.640625 1.765625q0 0.890625 -0.4375 1.765625q-0.4375 0.859375 -1.234375 1.328125q-0.78125 0.453125 -1.640625 0.453125q-1.09375 0 -1.796875 -0.703125q-0.703125 -0.703125 -0.71875 -1.90625zm12.814453 -4.03125l-1.578125 0.140625q-0.046875 -0.515625 -0.25 -0.71875q-0.1875 -0.203125 -0.515625 -0.203125q-0.4375 0 -0.765625 0.34375q-0.46875 0.484375 -0.765625 1.5625q0.546875 -0.359375 1.15625 -0.359375q1.0 0 1.640625 0.6875q0.640625 0.671875 0.640625 1.84375q0 0.9375 -0.453125 1.765625q-0.4375 0.828125 -1.125 1.21875q-0.671875 0.375 -1.421875 0.375q-0.71875 0 -1.296875 -0.359375q-0.578125 -0.359375 -0.890625 -1.046875q-0.3125 -0.703125 -0.3125 -1.859375q0 -2.3125 1.015625 -3.90625q1.03125 -1.609375 2.703125 -1.609375q0.953125 0 1.515625 0.53125q0.578125 0.515625 0.703125 1.59375zm-4.3125 3.96875q0 0.6875 0.265625 1.015625q0.265625 0.3125 0.671875 0.3125q0.484375 0 0.84375 -0.453125q0.46875 -0.625 0.46875 -1.65625q0 -0.671875 -0.265625 -0.984375q-0.265625 -0.328125 -0.640625 -0.328125q-0.328125 0 -0.65625 0.25q-0.328125 0.25 -0.515625 0.78125q-0.171875 0.515625 -0.171875 1.0625z" fill-rule="nonzero"/><path fill="#000000" d="m901.2633 293.6524l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m867.9977 301.82303l28.02539 0l0 1.0800171l-28.02539 0l0 -1.0800171z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m428.9186 232.81627l245.03934 -82.64566" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.9186 232.81627l245.03934 -82.64566" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m428.9186 232.81627l245.03934 34.173233" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.9186 232.81627l245.03934 34.173233" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m667.3228 18.233574l296.9449 0l0 28.031494l-296.9449 0z" fill-rule="evenodd"/><path fill="#000000" d="m679.29156 41.313572l-2.796875 -10.484373l1.4375 0l1.59375 6.874998q0.25 1.078125 0.4375 2.140625q0.40625 -1.6875 0.46875 -1.9375l2.0 -7.078123l1.671875 0l1.5 5.296873q0.578125 1.984375 0.828125 3.71875q0.203125 -1.0 0.515625 -2.28125l1.640625 -6.734373l1.40625 0l-2.875 10.484373l-1.34375 0l-2.203125 -8.0q-0.28125 -1.0 -0.34375 -1.21875q-0.15625 0.71875 -0.296875 1.21875l-2.234375 8.0l-1.40625 0zm11.833313 0l0 -10.484373l1.28125 0l0 3.749998q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354187 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.182373 4.53125l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm17.176208 -0.9375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm12.3324585 1.03125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm1.890625 -1.015625q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072998 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.749998l1.28125 0l0 10.484373l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.291687 -5.21875l0 -1.4687481l1.296875 0l0 1.4687481l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686646 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.8906231l1.28125 -0.765625l0 2.656248l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594604 -7.859375l0 -1.4687481l1.296875 0l0 1.4687481l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717896 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm12.2230835 -9.015625l0 -1.4687481l1.296875 0l0 1.4687481l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7405396 -2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125zm16.837585 2.265625l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.749998l1.28125 0l0 10.484373l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.494873 1.34375l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm9.994812 3.375l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.8906231l1.28125 -0.765625l0 2.656248l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm6.4626465 -1.296875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.135437 1.75l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.8906231l1.28125 -0.765625l0 2.656248l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm6.4626465 -1.296875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104187 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.749998l1.28125 0l0 10.484373l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.619873 3.796875l0 -1.46875l1.46875 0l0 1.46875q0 0.8125 -0.28125 1.296875q-0.28125 0.5 -0.90625 0.78125l-0.359375 -0.546875q0.40625 -0.1875 0.59375 -0.53125q0.203125 -0.34375 0.21875 -1.0l-0.734375 0zm10.628357 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.8906231l1.28125 -0.765625l0 2.656248l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2594604 1.15625l0 -10.484373l1.28125 0l0 3.749998q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm13.354248 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm16.207458 3.59375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm8.260437 1.03125l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm5.1875 1.625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.8906231l1.28125 -0.765625l0 2.656248l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2595215 -7.859375l0 -1.4687481l1.296875 0l0 1.4687481l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7717285 -3.796875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 3.796875l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm12.2230835 -9.015625l0 -1.4687481l1.296875 0l0 1.4687481l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm2.7405396 -2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125z" fill-rule="nonzero"/><path fill="#000000" d="m677.29156 62.219826l0 -10.5l1.171875 0l0 0.984375q0.421875 -0.578125 0.9375 -0.859375q0.515625 -0.296875 1.265625 -0.296875q0.96875 0 1.71875 0.5q0.75 0.5 1.125 1.421875q0.375 0.90625 0.375 1.984375q0 1.171875 -0.421875 2.109375q-0.40625 0.921875 -1.21875 1.421875q-0.796875 0.5 -1.671875 0.5q-0.640625 0 -1.15625 -0.265625q-0.515625 -0.28125 -0.84375 -0.6875l0 3.6875l-1.28125 0zm1.15625 -6.65625q0 1.453125 0.59375 2.15625q0.609375 0.703125 1.453125 0.703125q0.859375 0 1.46875 -0.71875q0.609375 -0.734375 0.609375 -2.25q0 -1.453125 -0.609375 -2.171875q-0.59375 -0.734375 -1.421875 -0.734375q-0.8125 0 -1.453125 0.78125q-0.640625 0.765625 -0.640625 2.234375zm6.510498 -0.046875q0 -2.109375 1.171875 -3.125q0.984375 -0.84375 2.390625 -0.84375q1.578125 0 2.5625 1.03125q1.0 1.015625 1.0 2.828125q0 1.46875 -0.4375 2.3125q-0.4375 0.828125 -1.28125 1.296875q-0.84375 0.46875 -1.84375 0.46875q-1.59375 0 -2.578125 -1.015625q-0.984375 -1.03125 -0.984375 -2.953125zm1.328125 0q0 1.453125 0.625 2.1875q0.640625 0.71875 1.609375 0.71875q0.96875 0 1.59375 -0.71875q0.640625 -0.734375 0.640625 -2.234375q0 -1.40625 -0.640625 -2.125q-0.640625 -0.734375 -1.59375 -0.734375q-0.96875 0 -1.609375 0.71875q-0.625 0.71875 -0.625 2.1875zm7.307373 6.703125l0 -10.5l1.171875 0l0 0.984375q0.421875 -0.578125 0.9375 -0.859375q0.515625 -0.296875 1.265625 -0.296875q0.96875 0 1.71875 0.5q0.75 0.5 1.125 1.421875q0.375 0.90625 0.375 1.984375q0 1.171875 -0.421875 2.109375q-0.40625 0.921875 -1.21875 1.421875q-0.796875 0.5 -1.671875 0.5q-0.640625 0 -1.15625 -0.265625q-0.515625 -0.28125 -0.84375 -0.6875l0 3.6875l-1.28125 0zm1.15625 -6.65625q0 1.453125 0.59375 2.15625q0.609375 0.703125 1.453125 0.703125q0.859375 0 1.46875 -0.71875q0.609375 -0.734375 0.609375 -2.25q0 -1.453125 -0.609375 -2.171875q-0.59375 -0.734375 -1.421875 -0.734375q-0.8125 0 -1.453125 0.78125q-0.640625 0.765625 -0.640625 2.234375zm11.979248 3.75l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm3.135437 0l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.24054 -0.9375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm6.119873 2.65625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm6.4625854 -1.296875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104248 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm12.7699585 3.796875l-2.328125 -7.59375l1.328125 0l1.203125 4.375l0.453125 1.640625q0.03125 -0.125 0.390625 -1.578125l1.21875 -4.4375l1.328125 0l1.125 4.40625l0.390625 1.453125l0.4375 -1.46875l1.296875 -4.390625l1.25 0l-2.375 7.59375l-1.34375 0l-1.203125 -4.546875l-0.296875 -1.296875l-1.53125 5.84375l-1.34375 0zm9.17804 -9.015625l0 -1.46875l1.296875 0l0 1.46875l-1.296875 0zm0 9.015625l0 -7.59375l1.296875 0l0 7.59375l-1.296875 0zm6.0686035 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm1.2595215 1.15625l0 -10.484375l1.28125 0l0 3.75q0.90625 -1.03125 2.28125 -1.03125q0.84375 0 1.46875 0.328125q0.625 0.328125 0.890625 0.921875q0.265625 0.578125 0.265625 1.703125l0 4.8125l-1.28125 0l0 -4.8125q0 -0.96875 -0.421875 -1.40625q-0.421875 -0.4375 -1.1875 -0.4375q-0.578125 0 -1.078125 0.296875q-0.5 0.296875 -0.71875 0.8125q-0.21875 0.5 -0.21875 1.390625l0 4.15625l-1.28125 0zm17.176208 -0.9375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm3.276062 3.8125l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.49054 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm7.166748 4.53125l0 -7.59375l1.15625 0l0 1.140625q0.453125 -0.796875 0.828125 -1.046875q0.375 -0.265625 0.8125 -0.265625q0.65625 0 1.328125 0.40625l-0.4375 1.203125q-0.46875 -0.28125 -0.953125 -0.28125q-0.421875 0 -0.765625 0.25q-0.328125 0.25 -0.46875 0.703125q-0.21875 0.6875 -0.21875 1.5l0 3.984375l-1.28125 0zm7.70874 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm7.440857 1.15625l-2.890625 -7.59375l1.359375 0l1.625 4.546875q0.265625 0.734375 0.5 1.53125q0.15625 -0.609375 0.46875 -1.453125l1.6875 -4.625l1.328125 0l-2.875 7.59375l-1.203125 0zm10.171875 -0.9375q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm3.276123 3.8125l0 -10.484375l1.28125 0l0 10.484375l-1.28125 0zm8.2717285 0l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm8.369873 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm6.666748 2.265625l1.265625 -0.203125q0.109375 0.765625 0.59375 1.171875q0.5 0.40625 1.375 0.40625q0.890625 0 1.3125 -0.359375q0.4375 -0.359375 0.4375 -0.84375q0 -0.4375 -0.375 -0.6875q-0.265625 -0.171875 -1.3125 -0.4375q-1.421875 -0.359375 -1.96875 -0.609375q-0.546875 -0.265625 -0.828125 -0.734375q-0.28125 -0.46875 -0.28125 -1.015625q0 -0.515625 0.21875 -0.9375q0.234375 -0.4375 0.640625 -0.734375q0.296875 -0.21875 0.8125 -0.359375q0.53125 -0.15625 1.125 -0.15625q0.890625 0 1.5625 0.265625q0.671875 0.25 1.0 0.6875q0.328125 0.4375 0.4375 1.171875l-1.25 0.171875q-0.09375 -0.578125 -0.5 -0.90625q-0.40625 -0.34375 -1.15625 -0.34375q-0.890625 0 -1.28125 0.296875q-0.375 0.296875 -0.375 0.6875q0 0.25 0.15625 0.453125q0.15625 0.203125 0.5 0.34375q0.1875 0.078125 1.140625 0.328125q1.359375 0.359375 1.890625 0.59375q0.546875 0.234375 0.859375 0.6875q0.3125 0.4375 0.3125 1.09375q0 0.640625 -0.375 1.21875q-0.375 0.5625 -1.09375 0.875q-0.703125 0.3125 -1.59375 0.3125q-1.484375 0 -2.265625 -0.609375q-0.765625 -0.625 -0.984375 -1.828125zm14.368835 5.34375q-1.0625 -1.34375 -1.796875 -3.140625q-0.734375 -1.8125 -0.734375 -3.734375q0 -1.703125 0.546875 -3.265625q0.640625 -1.8125 1.984375 -3.609375l0.921875 0q-0.859375 1.484375 -1.140625 2.125q-0.4375 0.984375 -0.6875 2.0625q-0.296875 1.34375 -0.296875 2.6875q0 3.453125 2.125 6.875l-0.921875 0zm5.5932617 -3.078125l4.0625 -5.46875l-3.578125 -5.015625l1.65625 0l1.890625 2.6875q0.59375 0.828125 0.84375 1.28125q0.359375 -0.5625 0.84375 -1.1875l2.109375 -2.78125l1.5 0l-3.6875 4.9375l3.984375 5.546875l-1.71875 0l-2.640625 -3.75q-0.21875 -0.3125 -0.46875 -0.6875q-0.34375 0.5625 -0.5 0.78125l-2.625 3.65625l-1.671875 0zm15.166199 0l-1.28125 0l0 -8.203125q-0.46875 0.4375 -1.21875 0.890625q-0.75 0.4375 -1.359375 0.65625l0 -1.25q1.078125 -0.5 1.890625 -1.21875q0.8125 -0.734375 1.140625 -1.40625l0.828125 0l0 10.53125zm10.072998 -1.234375l0 1.234375l-6.9375 0q-0.015625 -0.46875 0.15625 -0.890625q0.265625 -0.71875 0.84375 -1.40625q0.59375 -0.6875 1.6875 -1.578125q1.71875 -1.40625 2.3125 -2.21875q0.609375 -0.828125 0.609375 -1.5625q0 -0.765625 -0.5625 -1.28125q-0.546875 -0.53125 -1.421875 -0.53125q-0.921875 0 -1.484375 0.5625q-0.5625 0.5625 -0.5625 1.546875l-1.328125 -0.140625q0.140625 -1.484375 1.015625 -2.25q0.890625 -0.78125 2.390625 -0.78125q1.515625 0 2.390625 0.84375q0.875 0.828125 0.875 2.0625q0 0.640625 -0.265625 1.25q-0.25 0.59375 -0.84375 1.265625q-0.59375 0.671875 -1.984375 1.859375q-1.15625 0.96875 -1.484375 1.3125q-0.328125 0.34375 -0.546875 0.703125l5.140625 0zm1.385498 -1.53125l1.296875 -0.171875q0.21875 1.09375 0.75 1.578125q0.53125 0.484375 1.296875 0.484375q0.90625 0 1.53125 -0.625q0.640625 -0.640625 0.640625 -1.5625q0 -0.890625 -0.59375 -1.46875q-0.578125 -0.578125 -1.46875 -0.578125q-0.359375 0 -0.90625 0.140625l0.140625 -1.125q0.125 0.015625 0.203125 0.015625q0.828125 0 1.484375 -0.421875q0.65625 -0.4375 0.65625 -1.34375q0 -0.703125 -0.484375 -1.15625q-0.46875 -0.46875 -1.234375 -0.46875q-0.75 0 -1.25 0.46875q-0.5 0.46875 -0.640625 1.421875l-1.28125 -0.234375q0.234375 -1.296875 1.0625 -2.0q0.84375 -0.71875 2.09375 -0.71875q0.859375 0 1.578125 0.375q0.71875 0.359375 1.09375 1.0q0.390625 0.640625 0.390625 1.34375q0 0.6875 -0.375 1.25q-0.359375 0.546875 -1.0625 0.875q0.921875 0.21875 1.4375 0.90625q0.515625 0.671875 0.515625 1.6875q0 1.375 -1.0 2.328125q-1.0 0.953125 -2.53125 0.953125q-1.390625 0 -2.296875 -0.8125q-0.90625 -0.828125 -1.046875 -2.140625zm17.535583 1.828125q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm3.307373 3.8125l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072937 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125z" fill-rule="nonzero"/><path fill="#000000" d="m680.41656 77.313576l0 -4.4375l-4.046875 -6.046875l1.6875 0l2.0625 3.15625q0.578125 0.890625 1.0625 1.78125q0.484375 -0.828125 1.15625 -1.859375l2.03125 -3.078125l1.609375 0l-4.1875 6.046875l0 4.4375l-1.375 0zm10.41626 0l0 -2.515625l-4.546875 0l0 -1.171875l4.78125 -6.796875l1.0625 0l0 6.796875l1.40625 0l0 1.171875l-1.40625 0l0 2.515625l-1.296875 0zm0 -3.6875l0 -4.734375l-3.28125 4.734375l3.28125 0zm4.026123 0.9375l1.34375 -0.109375q0.15625 0.984375 0.703125 1.484375q0.546875 0.5 1.328125 0.5q0.921875 0 1.5625 -0.703125q0.65625 -0.703125 0.65625 -1.859375q0 -1.109375 -0.625 -1.734375q-0.625 -0.640625 -1.625 -0.640625q-0.625 0 -1.125 0.28125q-0.5 0.28125 -0.78125 0.734375l-1.203125 -0.15625l1.015625 -5.390625l5.21875 0l0 1.21875l-4.1875 0l-0.578125 2.828125q0.953125 -0.65625 1.984375 -0.65625q1.375 0 2.3125 0.953125q0.953125 0.953125 0.953125 2.4375q0 1.4375 -0.828125 2.46875q-1.015625 1.265625 -2.75 1.265625q-1.4375 0 -2.34375 -0.796875q-0.90625 -0.796875 -1.03125 -2.125zm14.838562 -5.171875l-1.28125 0.09375q-0.171875 -0.75 -0.484375 -1.09375q-0.53125 -0.546875 -1.296875 -0.546875q-0.609375 0 -1.078125 0.34375q-0.609375 0.4375 -0.96875 1.296875q-0.34375 0.84375 -0.359375 2.421875q0.46875 -0.71875 1.140625 -1.0625q0.671875 -0.34375 1.40625 -0.34375q1.296875 0 2.203125 0.953125q0.90625 0.953125 0.90625 2.453125q0 0.984375 -0.4375 1.84375q-0.421875 0.84375 -1.171875 1.296875q-0.734375 0.4375 -1.6875 0.4375q-1.609375 0 -2.625 -1.171875q-1.015625 -1.1875 -1.015625 -3.90625q0 -3.046875 1.125 -4.421875q0.984375 -1.203125 2.640625 -1.203125q1.234375 0 2.03125 0.703125q0.796875 0.6875 0.953125 1.90625zm-5.265625 4.515625q0 0.671875 0.28125 1.28125q0.28125 0.609375 0.78125 0.9375q0.515625 0.3125 1.078125 0.3125q0.8125 0 1.390625 -0.65625q0.59375 -0.671875 0.59375 -1.796875q0 -1.09375 -0.578125 -1.71875q-0.578125 -0.625 -1.453125 -0.625q-0.875 0 -1.484375 0.625q-0.609375 0.625 -0.609375 1.640625zm7.932373 6.484375l-0.921875 0q2.140625 -3.421875 2.140625 -6.875q0 -1.34375 -0.3125 -2.671875q-0.25 -1.0625 -0.671875 -2.046875q-0.28125 -0.65625 -1.15625 -2.15625l0.921875 0q1.34375 1.796875 1.984375 3.609375q0.546875 1.5625 0.546875 3.265625q0 1.921875 -0.734375 3.734375q-0.734375 1.796875 -1.796875 3.140625zm13.062012 -4.015625q-0.71875 0.609375 -1.375 0.859375q-0.65625 0.25 -1.421875 0.25q-1.25 0 -1.921875 -0.609375q-0.671875 -0.609375 -0.671875 -1.5625q0 -0.5625 0.25 -1.015625q0.25 -0.46875 0.65625 -0.75q0.421875 -0.28125 0.9375 -0.421875q0.375 -0.09375 1.140625 -0.1875q1.5625 -0.1875 2.296875 -0.453125q0.015625 -0.265625 0.015625 -0.328125q0 -0.796875 -0.375 -1.109375q-0.484375 -0.4375 -1.453125 -0.4375q-0.921875 0 -1.359375 0.328125q-0.421875 0.3125 -0.625 1.109375l-1.265625 -0.171875q0.171875 -0.796875 0.5625 -1.296875q0.390625 -0.5 1.140625 -0.765625q0.75 -0.265625 1.71875 -0.265625q0.984375 0 1.59375 0.234375q0.609375 0.21875 0.890625 0.5625q0.28125 0.34375 0.40625 0.875q0.0625 0.328125 0.0625 1.1875l0 1.71875q0 1.796875 0.078125 2.28125q0.078125 0.46875 0.328125 0.90625l-1.34375 0q-0.203125 -0.40625 -0.265625 -0.9375zm-0.109375 -2.875q-0.703125 0.28125 -2.09375 0.484375q-0.796875 0.109375 -1.125 0.265625q-0.328125 0.140625 -0.515625 0.421875q-0.171875 0.265625 -0.171875 0.59375q0 0.515625 0.390625 0.859375q0.390625 0.34375 1.140625 0.34375q0.734375 0 1.3125 -0.3125q0.59375 -0.328125 0.859375 -0.890625q0.203125 -0.4375 0.203125 -1.296875l0 -0.46875zm3.307373 3.8125l0 -7.59375l1.15625 0l0 1.078125q0.84375 -1.25 2.421875 -1.25q0.6875 0 1.265625 0.25q0.578125 0.234375 0.859375 0.640625q0.28125 0.40625 0.40625 0.953125q0.0625 0.359375 0.0625 1.25l0 4.671875l-1.28125 0l0 -4.625q0 -0.78125 -0.15625 -1.171875q-0.15625 -0.390625 -0.546875 -0.625q-0.375 -0.234375 -0.890625 -0.234375q-0.8125 0 -1.421875 0.53125q-0.59375 0.515625 -0.59375 1.96875l0 4.15625l-1.28125 0zm13.072937 0l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm16.566833 1.34375l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm6.322998 4.53125l2.78125 -3.953125l-2.578125 -3.640625l1.609375 0l1.171875 1.78125q0.328125 0.5 0.53125 0.84375q0.3125 -0.46875 0.578125 -0.828125l1.28125 -1.796875l1.53125 0l-2.625 3.578125l2.828125 4.015625l-1.578125 0l-1.5625 -2.359375l-0.40625 -0.640625l-2.0 3.0l-1.5625 0zm13.390625 -2.453125l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.135498 1.75l1.265625 0.15625q-0.203125 1.3125 -1.0625 2.0625q-0.84375 0.734375 -2.09375 0.734375q-1.5625 0 -2.515625 -1.015625q-0.9375 -1.03125 -0.9375 -2.921875q0 -1.234375 0.40625 -2.15625q0.40625 -0.921875 1.234375 -1.375q0.84375 -0.46875 1.8125 -0.46875q1.25 0 2.03125 0.625q0.78125 0.625 1.015625 1.765625l-1.265625 0.203125q-0.171875 -0.765625 -0.625 -1.15625q-0.453125 -0.390625 -1.09375 -0.390625q-0.984375 0 -1.59375 0.703125q-0.609375 0.703125 -0.609375 2.203125q0 1.53125 0.578125 2.234375q0.59375 0.6875 1.546875 0.6875q0.75 0 1.265625 -0.453125q0.515625 -0.46875 0.640625 -1.4375zm7.359375 2.78125l0 -1.109375q-0.890625 1.28125 -2.421875 1.28125q-0.671875 0 -1.25 -0.25q-0.578125 -0.265625 -0.875 -0.65625q-0.28125 -0.390625 -0.390625 -0.953125q-0.078125 -0.375 -0.078125 -1.203125l0 -4.703125l1.28125 0l0 4.203125q0 1.015625 0.078125 1.359375q0.125 0.515625 0.515625 0.8125q0.40625 0.28125 0.984375 0.28125q0.578125 0 1.078125 -0.296875q0.515625 -0.296875 0.71875 -0.8125q0.21875 -0.515625 0.21875 -1.484375l0 -4.0625l1.28125 0l0 7.59375l-1.140625 0zm5.979248 -1.15625l0.1875 1.140625q-0.546875 0.109375 -0.984375 0.109375q-0.6875 0 -1.078125 -0.21875q-0.390625 -0.21875 -0.546875 -0.578125q-0.15625 -0.359375 -0.15625 -1.515625l0 -4.375l-0.953125 0l0 -1.0l0.953125 0l0 -1.890625l1.28125 -0.765625l0 2.65625l1.296875 0l0 1.0l-1.296875 0l0 4.4375q0 0.546875 0.0625 0.71875q0.078125 0.15625 0.21875 0.25q0.15625 0.078125 0.453125 0.078125q0.203125 0 0.5625 -0.046875zm6.4625854 -1.296875l1.328125 0.171875q-0.3125 1.171875 -1.171875 1.8125q-0.84375 0.640625 -2.171875 0.640625q-1.671875 0 -2.65625 -1.015625q-0.96875 -1.03125 -0.96875 -2.890625q0 -1.921875 0.984375 -2.96875q1.0 -1.0625 2.578125 -1.0625q1.515625 0 2.484375 1.03125q0.96875 1.03125 0.96875 2.921875q0 0.109375 -0.015625 0.34375l-5.65625 0q0.0625 1.25 0.703125 1.921875q0.640625 0.65625 1.59375 0.65625q0.703125 0 1.203125 -0.359375q0.5 -0.375 0.796875 -1.203125zm-4.234375 -2.078125l4.25 0q-0.09375 -0.953125 -0.484375 -1.4375q-0.625 -0.75 -1.609375 -0.75q-0.875 0 -1.484375 0.59375q-0.609375 0.59375 -0.671875 1.59375zm12.104248 4.53125l0 -0.953125q-0.71875 1.125 -2.125 1.125q-0.90625 0 -1.671875 -0.5q-0.75 -0.5 -1.171875 -1.390625q-0.421875 -0.90625 -0.421875 -2.078125q0 -1.140625 0.375 -2.0625q0.390625 -0.921875 1.140625 -1.40625q0.765625 -0.5 1.703125 -0.5q0.6875 0 1.21875 0.296875q0.53125 0.28125 0.875 0.734375l0 -3.75l1.28125 0l0 10.484375l-1.203125 0zm-4.0625 -3.796875q0 1.46875 0.609375 2.1875q0.625 0.71875 1.453125 0.71875q0.84375 0 1.4375 -0.6875q0.59375 -0.6875 0.59375 -2.109375q0 -1.5625 -0.609375 -2.28125q-0.59375 -0.734375 -1.484375 -0.734375q-0.84375 0 -1.421875 0.703125q-0.578125 0.703125 -0.578125 2.203125zm7.651062 3.796875l0 -1.46875l1.46875 0l0 1.46875l-1.46875 0z" fill-rule="nonzero"/></g></svg> \ No newline at end of file diff --git a/docs/user/alerting/images/what-is-an-alert.svg b/docs/user/alerting/images/what-is-an-alert.svg new file mode 100644 index 0000000000000..b4dc02fae39a5 --- /dev/null +++ b/docs/user/alerting/images/what-is-an-alert.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 484.2257217847769 307.87139107611546" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l484.2257 0l0 307.8714l-484.2257 0l0 -307.8714z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l484.2257 0l0 307.8714l-484.2257 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m13.120735 12.889764l451.9685 0l0 282.2677l-451.9685 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m13.120735 12.889764l451.9685 0l0 282.2677l-451.9685 0z" fill-rule="evenodd"/><path fill="#000000" d="m22.089485 39.80976l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm9.802948 5.484375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816696 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 57.062992l418.2677 0l0 33.511814l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 57.062992l418.2677 0l0 33.511814l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m43.750084 77.40737l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9609375 -5.703125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m131.0157 78.57925l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125zm13.953125 0.015625l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm7.421875 0l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm12.0 -2.828125l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm15.3671875 -1.03125q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm4.8671875 4.203125l-1.359375 -8.296875l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296875l-1.578125 0zm5.828125 0.75l1.4375 0.140625q-0.015625 0.484375 0.109375 0.71875q0.140625 0.25 0.421875 0.375q0.390625 0.171875 1.0 0.171875q1.28125 0 1.84375 -0.65625q0.359375 -0.453125 0.671875 -1.953125l0.140625 -0.671875q-1.09375 1.125 -2.34375 1.125q-1.25 0 -2.109375 -0.921875q-0.84375 -0.9375 -0.84375 -2.625q0 -1.40625 0.671875 -2.578125q0.671875 -1.171875 1.59375 -1.765625q0.921875 -0.59375 1.890625 -0.59375q1.640625 0 2.515625 1.546875l0.28125 -1.359375l1.296875 0l-1.671875 8.0q-0.265625 1.328125 -0.71875 2.0625q-0.4375 0.75 -1.234375 1.15625q-0.796875 0.40625 -1.828125 0.40625q-1.0 0 -1.734375 -0.265625q-0.71875 -0.25 -1.078125 -0.75q-0.34375 -0.5 -0.34375 -1.140625q0 -0.1875 0.03125 -0.421875zm1.765625 -4.421875q0 0.84375 0.171875 1.28125q0.234375 0.59375 0.65625 0.921875q0.4375 0.3125 0.96875 0.3125q0.703125 0 1.390625 -0.484375q0.6875 -0.5 1.109375 -1.515625q0.421875 -1.03125 0.421875 -1.953125q0 -1.03125 -0.5625 -1.625q-0.5625 -0.609375 -1.40625 -0.609375q-0.515625 0 -1.0 0.28125q-0.484375 0.265625 -0.90625 0.84375q-0.40625 0.5625 -0.625 1.359375q-0.21875 0.78125 -0.21875 1.1875zm20.78125 -0.359375l1.515625 0.203125q-0.71875 1.984375 -2.09375 3.015625q-1.375 1.015625 -3.09375 1.015625q-2.078125 0 -3.3125 -1.28125q-1.21875 -1.28125 -1.21875 -3.65625q0 -3.09375 1.859375 -5.109375q1.65625 -1.8125 4.125 -1.8125q1.8125 0 2.9375 0.984375q1.140625 0.96875 1.3125 2.625l-1.421875 0.125q-0.234375 -1.234375 -0.9375 -1.84375q-0.703125 -0.625 -1.828125 -0.625q-2.09375 0 -3.390625 1.875q-1.125 1.609375 -1.125 3.8125q0 1.765625 0.859375 2.703125q0.875 0.921875 2.265625 0.921875q1.1875 0 2.140625 -0.765625q0.96875 -0.78125 1.40625 -2.1875zm2.5859375 4.03125l2.40625 -11.453125l4.78125 0q1.234375 0 1.859375 0.28125q0.625 0.28125 1.03125 0.984375q0.40625 0.6875 0.40625 1.546875q0 0.703125 -0.296875 1.4375q-0.28125 0.734375 -0.734375 1.21875q-0.4375 0.46875 -0.890625 0.71875q-0.453125 0.234375 -0.96875 0.359375q-1.09375 0.25 -2.21875 0.25l-2.875 0l-0.96875 4.65625l-1.53125 0zm2.78125 -5.953125l2.515625 0q1.46875 0 2.15625 -0.3125q0.6875 -0.3125 1.09375 -0.953125q0.421875 -0.65625 0.421875 -1.390625q0 -0.5625 -0.21875 -0.90625q-0.21875 -0.359375 -0.625 -0.53125q-0.390625 -0.171875 -1.515625 -0.171875l-2.9375 0l-0.890625 4.265625zm10.375 -5.5l1.53125 0l-1.46875 7.03125q-0.171875 0.875 -0.171875 1.296875q0 0.921875 0.71875 1.484375q0.734375 0.5625 1.828125 0.5625q0.875 0 1.625 -0.390625q0.765625 -0.40625 1.203125 -1.1875q0.4375 -0.78125 0.78125 -2.5l1.328125 -6.296875l1.53125 0l-1.40625 6.71875q-0.359375 1.71875 -0.953125 2.71875q-0.578125 1.0 -1.625 1.609375q-1.03125 0.609375 -2.40625 0.609375q-1.296875 0 -2.25 -0.421875q-0.9375 -0.4375 -1.421875 -1.1875q-0.46875 -0.765625 -0.46875 -1.734375q0 -0.59375 0.328125 -2.0625l1.296875 -6.25zm21.85939 6.4375l-7.5937653 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.5937653 3.203125l0 1.3125zm5.8984375 1.25q0 -1.453125 0.421875 -2.953125q0.4375 -1.5 0.96875 -2.390625q0.53125 -0.90625 1.09375 -1.40625q0.578125 -0.515625 1.125 -0.75q0.5625 -0.234375 1.234375 -0.234375q1.3125 0 2.1875 0.984375q0.875 0.96875 0.875 2.8125q0 1.890625 -0.609375 3.75q-0.71875 2.203125 -2.0 3.3125q-0.984375 0.84375 -2.234375 0.84375q-1.296875 0 -2.1875 -1.015625q-0.875 -1.015625 -0.875 -2.953125zm1.359375 0.359375q0 1.0625 0.359375 1.65625q0.46875 0.8125 1.40625 0.8125q0.828125 0 1.5 -0.734375q0.96875 -1.046875 1.453125 -3.0625q0.484375 -2.03125 0.484375 -3.3125q0 -1.234375 -0.46875 -1.78125q-0.46875 -0.546875 -1.25 -0.546875q-0.5625 0 -1.046875 0.296875q-0.484375 0.28125 -0.9375 0.984375q-0.625 1.0 -1.09375 2.96875q-0.40625 1.6875 -0.40625 2.71875zm7.3203125 3.40625l0.34375 -1.609375l1.59375 0l-0.34375 1.609375l-1.59375 0zm4.6015625 -2.625l1.328125 -0.140625q0.140625 0.96875 0.546875 1.375q0.421875 0.40625 0.984375 0.40625q0.8125 0 1.515625 -0.703125q1.015625 -1.03125 1.5 -2.96875q-0.703125 0.53125 -1.265625 0.765625q-0.546875 0.21875 -1.125 0.21875q-1.046875 0 -1.875 -0.703125q-1.09375 -0.90625 -1.09375 -2.625q0 -1.9375 1.265625 -3.3125q1.09375 -1.1875 2.671875 -1.1875q1.421875 0 2.359375 1.046875q0.9375 1.046875 0.9375 2.96875q0 1.875 -0.625 3.6875q-0.75 2.140625 -2.015625 3.15625q-1.03125 0.84375 -2.3125 0.84375q-1.1875 0 -1.953125 -0.734375q-0.75 -0.75 -0.84375 -2.09375zm1.890625 -4.53125q0 1.078125 0.5625 1.71875q0.578125 0.640625 1.375 0.640625q0.578125 0 1.15625 -0.390625q0.578125 -0.40625 0.984375 -1.203125q0.421875 -0.796875 0.421875 -1.625q0 -0.65625 -0.28125 -1.21875q-0.265625 -0.5625 -0.734375 -0.84375q-0.46875 -0.296875 -0.953125 -0.296875q-0.46875 0 -0.921875 0.25q-0.453125 0.25 -0.84375 0.734375q-0.390625 0.484375 -0.578125 1.125q-0.1875 0.625 -0.1875 1.109375zm11.109375 7.15625l1.5 -7.203125l-1.265625 0l0.234375 -1.09375l1.265625 0l0.234375 -1.1875q0.1875 -0.875 0.390625 -1.265625q0.203125 -0.390625 0.640625 -0.640625q0.453125 -0.265625 1.234375 -0.265625q0.53125 0 1.5625 0.234375l-0.265625 1.234375q-0.71875 -0.1875 -1.203125 -0.1875q-0.40625 0 -0.625 0.203125q-0.21875 0.203125 -0.375 0.984375l-0.1875 0.890625l1.578125 0l-0.21875 1.09375l-1.578125 0l-1.515625 7.203125l-1.40625 0zm4.4921875 -3.15625q0 -2.421875 1.4375 -4.015625q1.171875 -1.3125 3.09375 -1.3125q1.5 0 2.40625 0.9375q0.921875 0.9375 0.921875 2.53125q0 1.421875 -0.578125 2.65625q-0.578125 1.234375 -1.640625 1.890625q-1.0625 0.65625 -2.25 0.65625q-0.96875 0 -1.765625 -0.40625q-0.78125 -0.421875 -1.203125 -1.171875q-0.421875 -0.765625 -0.421875 -1.765625zm1.421875 -0.140625q0 1.171875 0.5625 1.78125q0.5625 0.609375 1.421875 0.609375q0.453125 0 0.890625 -0.1875q0.453125 -0.1875 0.828125 -0.5625q0.390625 -0.375 0.65625 -0.84375q0.28125 -0.484375 0.4375 -1.046875q0.25 -0.765625 0.25 -1.484375q0 -1.125 -0.578125 -1.734375q-0.5625 -0.625 -1.421875 -0.625q-0.65625 0 -1.203125 0.3125q-0.546875 0.3125 -1.0 0.921875q-0.4375 0.609375 -0.640625 1.421875q-0.203125 0.8125 -0.203125 1.4375zm7.2265625 3.296875l1.734375 -8.296875l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.328125l-1.34375 0zm9.6640625 0l2.390625 -11.453125l1.421875 0l-2.390625 11.453125l-1.421875 0zm9.2578125 -1.03125q-0.734375 0.625 -1.421875 0.921875q-0.671875 0.296875 -1.4375 0.296875q-1.15625 0 -1.859375 -0.671875q-0.703125 -0.6875 -0.703125 -1.734375q0 -0.703125 0.3125 -1.234375q0.328125 -0.53125 0.84375 -0.859375q0.53125 -0.328125 1.28125 -0.46875q0.484375 -0.09375 1.8125 -0.140625q1.328125 -0.0625 1.90625 -0.28125q0.171875 -0.578125 0.171875 -0.96875q0 -0.484375 -0.359375 -0.765625q-0.5 -0.390625 -1.4375 -0.390625q-0.890625 0 -1.46875 0.390625q-0.5625 0.390625 -0.8125 1.125l-1.4375 -0.125q0.4375 -1.234375 1.390625 -1.890625q0.953125 -0.65625 2.390625 -0.65625q1.546875 0 2.4375 0.734375q0.6875 0.546875 0.6875 1.421875q0 0.65625 -0.1875 1.53125l-0.46875 2.0625q-0.21875 0.984375 -0.21875 1.609375q0 0.390625 0.171875 1.125l-1.421875 0q-0.125 -0.40625 -0.171875 -1.03125zm0.53125 -3.171875q-0.296875 0.109375 -0.640625 0.171875q-0.34375 0.0625 -1.140625 0.140625q-1.234375 0.109375 -1.75 0.28125q-0.5 0.15625 -0.765625 0.53125q-0.25 0.359375 -0.25 0.8125q0 0.59375 0.40625 0.984375q0.421875 0.375 1.171875 0.375q0.703125 0 1.34375 -0.375q0.65625 -0.375 1.03125 -1.03125q0.375 -0.671875 0.59375 -1.890625zm2.9140625 1.359375l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125zm11.171875 1.6875l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm5.984375 1.15625q0.21875 -1.03125 0.609375 -1.71875q0.390625 -0.6875 1.03125 -1.3125q0.640625 -0.625 2.46875 -2.078125q1.109375 -0.890625 1.515625 -1.3125q0.578125 -0.609375 0.84375 -1.1875q0.1875 -0.40625 0.1875 -0.875q0 -0.78125 -0.5625 -1.328125q-0.5625 -0.5625 -1.375 -0.5625q-0.796875 0 -1.40625 0.5625q-0.59375 0.5625 -0.859375 1.796875l-1.375 -0.203125q0.203125 -1.53125 1.171875 -2.40625q0.984375 -0.875 2.453125 -0.875q0.96875 0 1.765625 0.40625q0.796875 0.40625 1.1875 1.140625q0.40625 0.734375 0.40625 1.515625q0 1.140625 -0.8125 2.1875q-0.5 0.65625 -2.9375 2.59375q-1.046875 0.828125 -1.5625 1.359375q-0.515625 0.53125 -0.765625 1.0l5.125 0l-0.28125 1.296875l-6.828125 0zm12.9375 0l1.734375 -8.296875l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.34375l-1.40625 0l1.140625 -5.484375q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.03125l-1.421875 0l1.171875 -5.609375q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.921875l-1.40625 0zm15.34375 -9.859375l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859375l1.734375 -8.296875l1.40625 0l-1.734375 8.296875l-1.40625 0zm3.6015625 0l1.734375 -8.296875l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.03125l-1.40625 0l1.09375 -5.265625q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.859375l-1.421875 0zm14.5703125 -1.5q-1.5 1.6875 -3.0625 1.6875q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5625 -0.59375 -1.359375q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296875l-1.296875 0l0.3125 -1.5zm6.5390625 0.34375l-0.234375 1.171875q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.3125 -0.375 -0.84375q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.921875 -2.546875 0.921875q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.4375 -1.171875 -1.25q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm7.0546875 2.03125l1.40625 -0.078125q0 0.609375 0.1875 1.046875q0.1875 0.421875 0.6875 0.703125q0.515625 0.265625 1.1875 0.265625q0.9375 0 1.40625 -0.375q0.46875 -0.375 0.46875 -0.890625q0 -0.359375 -0.28125 -0.6875q-0.296875 -0.328125 -1.421875 -0.8125q-1.109375 -0.484375 -1.421875 -0.671875q-0.53125 -0.328125 -0.796875 -0.75q-0.265625 -0.4375 -0.265625 -1.0q0 -0.984375 0.78125 -1.6875q0.78125 -0.703125 2.1875 -0.703125q1.5625 0 2.375 0.71875q0.828125 0.71875 0.859375 1.90625l-1.390625 0.09375q-0.03125 -0.75 -0.53125 -1.1875q-0.5 -0.4375 -1.40625 -0.4375q-0.734375 0 -1.140625 0.34375q-0.40625 0.328125 -0.40625 0.71875q0 0.390625 0.34375 0.6875q0.234375 0.203125 1.21875 0.625q1.625 0.703125 2.046875 1.109375q0.671875 0.640625 0.671875 1.578125q0 0.609375 -0.390625 1.203125q-0.375 0.59375 -1.15625 0.953125q-0.765625 0.359375 -1.828125 0.359375q-1.4375 0 -2.4375 -0.71875q-1.015625 -0.703125 -0.953125 -2.3125z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 104.07612l418.2677 0l0 39.30709l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 104.07612l418.2677 0l0 39.30709l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m35.062584 124.74862l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.2656174q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46874237 -1.65625 -1.3749924q-0.59375 -0.90625 -0.625 -2.0625zm16.421875 0.640625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8124924 -2.28125 0.8124924q-1.703125 0 -2.75 -1.1093674q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.0468674l0 -11.453117l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.2656174l-1.40625 0l0 -5.2656174q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.5468674l-1.40625 0zm14.5703125 -2.6718674l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.7031174 -2.359375 0.7031174q-1.828125 0 -2.890625 -1.1249924q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.9531174l0 -1.0468674q-0.78125 1.2343674 -2.3125 1.2343674q-1.0 0 -1.828125 -0.546875q-0.828125 -0.5468674 -1.296875 -1.5312424q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453117l-1.3125 0zm-4.4375 -4.1406174q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3984375 4.1406174l0 -1.2187424q-0.96875 1.4062424 -2.640625 1.4062424q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.7031174q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296867l-1.25 0zm3.4296875 0l0 -11.453117l1.40625 0l0 11.453117l-1.40625 0zm9.2578125 -2.6718674l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.7031174 -2.359375 0.7031174q-1.828125 0 -2.890625 -1.1249924q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875z" fill-rule="nonzero"/><path fill="#000000" d="m136.96883 125.607994l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.9218674 -2.546875 0.9218674q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.43749237 -1.171875 -1.2499924q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm9.0078125 4.8749924l-1.359375 -8.296867l1.375 0l0.71875 4.5625q0.109375 0.75 0.28125 2.453125q0.40625 -0.890625 1.046875 -2.03125l2.765625 -4.984375l1.5 0l-4.75 8.296867l-1.578125 0zm12.0 -2.8281174l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.9218674 -2.546875 0.9218674q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.43749237 -1.171875 -1.2499924q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625zm6.9140625 4.8749924l1.734375 -8.296867l1.25 0l-0.34375 1.6875q0.640625 -0.953125 1.25 -1.40625q0.609375 -0.46875 1.25 -0.46875q0.421875 0 1.046875 0.296875l-0.578125 1.3125q-0.375 -0.265625 -0.8125 -0.265625q-0.734375 0 -1.515625 0.828125q-0.78125 0.828125 -1.234375 2.984375l-0.703125 3.3281174l-1.34375 0zm4.796875 3.203125l0.09375 -1.328125q0.4375 0.125 0.84375 0.125q0.4375 0 0.703125 -0.1875q0.34375 -0.265625 0.75 -0.96875l0.453125 -0.8125l-1.390625 -8.328117l1.390625 0l0.625 4.1875q0.1875 1.25 0.328125 2.484375l3.703125 -6.671875l1.484375 0l-5.296875 9.406242q-0.765625 1.375 -1.359375 1.8125q-0.59375 0.453125 -1.359375 0.453125q-0.5 0 -0.96875 -0.171875zm12.9765625 -3.203125l1.734375 -8.296867l1.40625 0l-0.28125 1.359375q0.78125 -0.875 1.40625 -1.203125q0.625 -0.34375 1.34375 -0.34375q0.78125 0 1.296875 0.40625q0.515625 0.40625 0.6875 1.140625q0.625 -0.78125 1.328125 -1.15625q0.703125 -0.390625 1.46875 -0.390625q1.046875 0 1.5625 0.5q0.515625 0.484375 0.515625 1.375q0 0.375 -0.171875 1.265625l-1.125 5.3437424l-1.40625 0l1.140625 -5.4843674q0.140625 -0.671875 0.140625 -0.96875q0 -0.40625 -0.265625 -0.640625q-0.25 -0.234375 -0.71875 -0.234375q-0.625 0 -1.28125 0.390625q-0.65625 0.375 -1.03125 1.0q-0.359375 0.625 -0.625 1.90625l-0.84375 4.0312424l-1.421875 0l1.171875 -5.6093674q0.125 -0.5625 0.125 -0.8125q0 -0.40625 -0.25 -0.65625q-0.25 -0.25 -0.65625 -0.25q-0.609375 0 -1.265625 0.390625q-0.65625 0.375 -1.078125 1.0625q-0.40625 0.6875 -0.671875 1.953125l-0.828125 3.9218674l-1.40625 0zm15.34375 -9.859367l0.328125 -1.59375l1.40625 0l-0.328125 1.59375l-1.40625 0zm-2.0625 9.859367l1.734375 -8.296867l1.40625 0l-1.734375 8.296867l-1.40625 0zm3.6015625 0l1.734375 -8.296867l1.28125 0l-0.296875 1.4375q0.828125 -0.84375 1.546875 -1.234375q0.734375 -0.390625 1.5 -0.390625q1.0 0 1.578125 0.546875q0.578125 0.546875 0.578125 1.453125q0 0.46875 -0.203125 1.453125l-1.0625 5.0312424l-1.40625 0l1.09375 -5.2656174q0.171875 -0.765625 0.171875 -1.125q0 -0.421875 -0.296875 -0.671875q-0.28125 -0.265625 -0.8125 -0.265625q-1.09375 0 -1.9375 0.78125q-0.84375 0.78125 -1.25 2.6875l-0.796875 3.8593674l-1.421875 0zm14.5703125 -1.4999924q-1.5 1.6874924 -3.0625 1.6874924q-0.953125 0 -1.546875 -0.546875q-0.59375 -0.5624924 -0.59375 -1.3593674q0 -0.515625 0.265625 -1.796875l1.0 -4.78125l1.421875 0l-1.109375 5.296875q-0.140625 0.671875 -0.140625 1.03125q0 0.46875 0.28125 0.734375q0.28125 0.265625 0.84375 0.265625q0.59375 0 1.15625 -0.28125q0.5625 -0.296875 0.96875 -0.78125q0.421875 -0.5 0.671875 -1.171875q0.171875 -0.4375 0.40625 -1.515625l0.75 -3.578125l1.40625 0l-1.734375 8.296867l-1.296875 0l0.3125 -1.4999924zm6.5390625 0.34375l-0.234375 1.1718674q-0.515625 0.125 -0.984375 0.125q-0.84375 0 -1.34375 -0.421875q-0.375 -0.31249237 -0.375 -0.8437424q0 -0.28125 0.203125 -1.265625l1.0 -4.8125l-1.109375 0l0.21875 -1.09375l1.125 0l0.421875 -2.046875l1.625 -0.96875l-0.640625 3.015625l1.390625 0l-0.234375 1.09375l-1.375 0l-0.96875 4.578125q-0.171875 0.875 -0.171875 1.046875q0 0.25 0.140625 0.390625q0.140625 0.125 0.46875 0.125q0.46875 0 0.84375 -0.09375zm7.2265625 -1.671875l1.375 0.140625q-0.296875 1.03125 -1.359375 1.953125q-1.0625 0.9218674 -2.546875 0.9218674q-0.921875 0 -1.6875 -0.421875q-0.765625 -0.43749237 -1.171875 -1.2499924q-0.40625 -0.8125 -0.40625 -1.84375q0 -1.359375 0.625 -2.640625q0.640625 -1.28125 1.640625 -1.890625q1.0 -0.625 2.15625 -0.625q1.484375 0 2.375 0.921875q0.890625 0.921875 0.890625 2.515625q0 0.609375 -0.109375 1.25l-6.109375 0q-0.03125 0.234375 -0.03125 0.4375q0 1.15625 0.53125 1.78125q0.53125 0.609375 1.3125 0.609375q0.71875 0 1.421875 -0.46875q0.703125 -0.484375 1.09375 -1.390625zm-4.109375 -2.046875l4.65625 0q0.015625 -0.21875 0.015625 -0.3125q0 -1.0625 -0.53125 -1.625q-0.53125 -0.578125 -1.375 -0.578125q-0.90625 0 -1.65625 0.625q-0.734375 0.625 -1.109375 1.890625z" fill-rule="nonzero"/><path fill="#f3f3f3" d="m25.343832 152.92389l418.2677 0l0 129.07086l-418.2677 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m25.343832 152.92389l418.2677 0l0 129.07086l-418.2677 0z" fill-rule="evenodd"/><path fill="#000000" d="m34.312584 177.28389l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.859375 1.65625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m131.97372 163.3517l296.9449 0l0 106.92915l-296.9449 0z" fill-rule="evenodd"/><path stroke="#999999" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m131.97372 163.3517l296.9449 0l0 106.92915l-296.9449 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.0831 183.8717l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.3085938 2.390625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm6.046875 0l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.158203 -1.3125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m241.94247 181.76233l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.173828 3.65625l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm14.199219 -0.78125q-0.546875 0.484375 -1.0625 0.703125q-0.5 0.21875 -1.09375 0.21875q-0.859375 0 -1.390625 -0.5q-0.515625 -0.515625 -0.515625 -1.3125q0 -0.515625 0.234375 -0.90625q0.234375 -0.40625 0.625 -0.640625q0.390625 -0.25 0.96875 -0.359375q0.359375 -0.078125 1.359375 -0.109375q1.0 -0.046875 1.421875 -0.21875q0.125 -0.4375 0.125 -0.71875q0 -0.375 -0.265625 -0.578125q-0.375 -0.296875 -1.078125 -0.296875q-0.671875 0 -1.09375 0.296875q-0.421875 0.296875 -0.625 0.84375l-1.0625 -0.09375q0.328125 -0.921875 1.03125 -1.40625q0.71875 -0.5 1.796875 -0.5q1.15625 0 1.828125 0.546875q0.515625 0.40625 0.515625 1.0625q0 0.5 -0.140625 1.15625l-0.34375 1.546875q-0.171875 0.734375 -0.171875 1.203125q0 0.296875 0.140625 0.84375l-1.078125 0q-0.09375 -0.3125 -0.125 -0.78125zm0.390625 -2.375q-0.21875 0.09375 -0.484375 0.140625q-0.25 0.046875 -0.84375 0.09375q-0.921875 0.078125 -1.3125 0.21875q-0.375 0.125 -0.578125 0.40625q-0.1875 0.265625 -0.1875 0.59375q0 0.453125 0.3125 0.734375q0.3125 0.28125 0.875 0.28125q0.53125 0 1.015625 -0.265625q0.484375 -0.28125 0.765625 -0.78125q0.28125 -0.5 0.4375 -1.421875zm3.5957031 -4.234375l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6191406 0l1.796875 -8.59375l1.0625 0l-1.796875 8.59375l-1.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m148.03622 199.85608l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.673828 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.939453 1.421875l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm4.234375 1.34375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.955078 -5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm0 5.015625l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" d="m237.37997 202.8717l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm6.861328 -2.359375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.533203 0.34375l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm8.375 1.265625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm3.9824219 2.4375l1.296875 -6.21875l1.0625 0l-0.21875 1.015625q0.59375 -0.65625 1.0625 -0.90625q0.46875 -0.25 1.015625 -0.25q0.578125 0 0.96875 0.3125q0.390625 0.296875 0.515625 0.84375q0.46875 -0.578125 0.984375 -0.859375q0.53125 -0.296875 1.109375 -0.296875q0.78125 0 1.171875 0.375q0.390625 0.359375 0.390625 1.03125q0 0.28125 -0.140625 0.9375l-0.828125 4.015625l-1.0625 0l0.859375 -4.109375q0.109375 -0.515625 0.109375 -0.71875q0 -0.3125 -0.203125 -0.484375q-0.1875 -0.171875 -0.53125 -0.171875q-0.484375 0 -0.984375 0.28125q-0.484375 0.28125 -0.765625 0.75q-0.265625 0.46875 -0.46875 1.4375l-0.625 3.015625l-1.0625 0l0.875 -4.203125q0.09375 -0.421875 0.09375 -0.609375q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.5 -0.1875q-0.453125 0 -0.953125 0.28125q-0.484375 0.28125 -0.796875 0.796875q-0.3125 0.515625 -0.515625 1.46875l-0.609375 2.9375l-1.0625 0zm9.605469 2.40625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm5.796875 -2.40625l0.25 -1.203125l1.203125 0l-0.25 1.203125l-1.203125 0zm7.3339844 -2.265625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm1.90625 -0.09375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125z" fill-rule="nonzero"/><path fill="#000000" d="m236.84872 219.26233l1.796875 -8.609375l0.984375 0l-0.1875 0.859375q0.546875 -0.5625 0.96875 -0.78125q0.4375 -0.21875 0.921875 -0.21875q0.890625 0 1.46875 0.65625q0.59375 0.640625 0.59375 1.84375q0 0.96875 -0.328125 1.765625q-0.3125 0.796875 -0.78125 1.296875q-0.46875 0.484375 -0.953125 0.71875q-0.484375 0.21875 -0.984375 0.21875q-1.125 0 -1.734375 -1.140625l-0.703125 3.390625l-1.0625 0zm2.09375 -4.9375q0 0.703125 0.109375 0.96875q0.140625 0.375 0.46875 0.609375q0.34375 0.234375 0.78125 0.234375q0.921875 0 1.484375 -1.015625q0.5625 -1.03125 0.5625 -2.109375q0 -0.78125 -0.390625 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.40625 0 -0.75 0.21875q-0.34375 0.21875 -0.640625 0.640625q-0.296875 0.421875 -0.5 1.046875q-0.1875 0.609375 -0.1875 1.0625zm5.298828 0.1875q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm6.4648438 -0.859375l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm4.435547 -0.015625l1.078125 -0.109375q-0.015625 0.234375 -0.015625 0.28125q0 0.375 0.1875 0.78125q0.203125 0.390625 0.53125 0.59375q0.34375 0.203125 0.71875 0.203125q0.5 0 1.0 -0.328125q0.515625 -0.34375 0.828125 -0.984375q0.3125 -0.65625 0.3125 -1.296875q0 -0.71875 -0.421875 -1.15625q-0.421875 -0.4375 -1.109375 -0.4375q-0.46875 0 -0.890625 0.234375q-0.40625 0.21875 -0.765625 0.65625l-0.921875 -0.0625l1.296875 -4.390625l4.203125 0l-0.21875 0.96875l-3.25 0l-0.65625 2.1875q0.375 -0.265625 0.75 -0.390625q0.390625 -0.140625 0.796875 -0.140625q0.984375 0 1.609375 0.65625q0.640625 0.640625 0.640625 1.78125q0 0.984375 -0.4375 1.828125q-0.4375 0.828125 -1.203125 1.28125q-0.75 0.4375 -1.625 0.4375q-0.75 0 -1.3125 -0.328125q-0.5625 -0.328125 -0.859375 -0.90625q-0.28125 -0.59375 -0.28125 -1.1875q0 -0.0625 0.015625 -0.171875zm8.533203 -2.265625q-0.46875 -0.265625 -0.71875 -0.671875q-0.234375 -0.421875 -0.234375 -0.890625q0 -0.78125 0.5625 -1.453125q0.75 -0.890625 2.03125 -0.890625q1.125 0 1.78125 0.609375q0.65625 0.609375 0.65625 1.484375q0 0.625 -0.359375 1.125q-0.34375 0.5 -1.09375 0.8125q0.515625 0.3125 0.734375 0.671875q0.28125 0.484375 0.28125 1.109375q0 1.15625 -0.8125 2.0625q-0.8125 0.90625 -2.171875 0.90625q-1.09375 0 -1.78125 -0.671875q-0.6875 -0.671875 -0.6875 -1.671875q0 -0.9375 0.484375 -1.609375q0.5 -0.6875 1.328125 -0.921875zm0.09375 -1.515625q0 0.546875 0.34375 0.890625q0.359375 0.328125 0.984375 0.328125q0.71875 0 1.171875 -0.4375q0.453125 -0.453125 0.453125 -1.09375q0 -0.546875 -0.359375 -0.890625q-0.34375 -0.34375 -0.96875 -0.34375q-0.46875 0 -0.859375 0.21875q-0.390625 0.21875 -0.578125 0.59375q-0.1875 0.375 -0.1875 0.734375zm-0.828125 4.140625q0 0.359375 0.171875 0.6875q0.171875 0.328125 0.515625 0.515625q0.359375 0.1875 0.8125 0.1875q0.859375 0 1.390625 -0.796875q0.421875 -0.640625 0.421875 -1.375q0 -0.59375 -0.390625 -0.96875q-0.390625 -0.390625 -1.015625 -0.390625q-0.796875 0 -1.359375 0.59375q-0.546875 0.59375 -0.546875 1.546875zm6.439453 2.09375q0.140625 -0.875 0.609375 -2.09375q0.546875 -1.46875 1.421875 -2.90625q0.890625 -1.453125 1.96875 -2.5l-4.28125 0l0.203125 -0.96875l5.484375 0l-0.203125 0.96875q-1.390625 1.21875 -2.4375 3.15625q-1.203125 2.234375 -1.65625 4.34375l-1.109375 0z" fill-rule="nonzero"/><path fill="#000000" d="m141.8956 236.8717l0 -8.59375l3.25 0q0.84375 0 1.296875 0.078125q0.640625 0.109375 1.0625 0.40625q0.4375 0.296875 0.6875 0.828125q0.265625 0.53125 0.265625 1.171875q0 1.09375 -0.703125 1.859375q-0.6875 0.75 -2.515625 0.75l-2.203125 0l0 3.5l-1.140625 0zm1.140625 -4.5l2.21875 0q1.109375 0 1.5625 -0.40625q0.46875 -0.421875 0.46875 -1.171875q0 -0.53125 -0.28125 -0.90625q-0.265625 -0.390625 -0.703125 -0.515625q-0.296875 -0.078125 -1.0625 -0.078125l-2.203125 0l0 3.078125zm6.7226562 4.5l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.970703 1.078125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m237.47372 234.7467l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.140625 1.0q-1.109375 1.265625 -2.28125 1.265625q-0.71875 0 -1.171875 -0.40625q-0.4375 -0.421875 -0.4375 -1.015625q0 -0.390625 0.203125 -1.34375l0.75 -3.59375l1.0625 0l-0.84375 3.96875q-0.09375 0.5 -0.09375 0.78125q0 0.34375 0.203125 0.546875q0.21875 0.1875 0.640625 0.1875q0.4375 0 0.859375 -0.203125q0.4375 -0.21875 0.734375 -0.59375q0.3125 -0.375 0.5 -0.875q0.140625 -0.3125 0.296875 -1.125l0.5625 -2.6875l1.0625 0l-1.296875 6.21875l-0.984375 0l0.234375 -1.125zm2.4394531 1.125l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm6.611328 -4.828125l0.25 -1.203125l1.046875 0l-0.25 1.203125l-1.046875 0zm-3.359375 9.734375l0.1875 -0.90625q0.359375 0.09375 0.640625 0.09375q0.34375 0 0.546875 -0.234375q0.203125 -0.21875 0.421875 -1.234375l1.296875 -6.28125l1.0625 0l-1.34375 6.46875q-0.25 1.21875 -0.578125 1.65625q-0.4375 0.578125 -1.234375 0.578125q-0.40625 0 -1.0 -0.140625zm9.087891 -4.453125l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm9.470703 1.390625l1.0625 0.109375q-0.390625 1.171875 -1.125 1.734375q-0.734375 0.5625 -1.671875 0.5625q-1.015625 0 -1.65625 -0.65625q-0.625 -0.65625 -0.625 -1.828125q0 -1.03125 0.40625 -2.015625q0.40625 -0.984375 1.15625 -1.484375q0.75 -0.515625 1.71875 -0.515625q1.0 0 1.578125 0.5625q0.59375 0.5625 0.59375 1.5l-1.03125 0.0625q-0.015625 -0.59375 -0.359375 -0.921875q-0.328125 -0.328125 -0.875 -0.328125q-0.640625 0 -1.109375 0.40625q-0.46875 0.390625 -0.734375 1.21875q-0.265625 0.828125 -0.265625 1.578125q0 0.796875 0.34375 1.203125q0.359375 0.390625 0.875 0.390625q0.515625 0 0.984375 -0.390625q0.46875 -0.390625 0.734375 -1.1875zm4.1875 1.40625l-0.171875 0.859375q-0.375 0.109375 -0.734375 0.109375q-0.640625 0 -1.015625 -0.3125q-0.28125 -0.234375 -0.28125 -0.640625q0 -0.203125 0.15625 -0.9375l0.75 -3.625l-0.828125 0l0.171875 -0.8125l0.828125 0l0.328125 -1.53125l1.203125 -0.734375l-0.46875 2.265625l1.046875 0l-0.171875 0.8125l-1.046875 0l-0.71875 3.4375q-0.140625 0.65625 -0.140625 0.796875q0 0.1875 0.109375 0.28125q0.109375 0.09375 0.359375 0.09375q0.359375 0 0.625 -0.0625zm10.542969 -4.1875l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm1.6835938 7.0l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm16.835938 -3.03125l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm7.9160156 1.234375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m237.37997 250.8717l1.78125 -8.59375l1.0625 0l-0.640625 3.078125q0.515625 -0.46875 0.921875 -0.65625q0.40625 -0.1875 0.859375 -0.1875q0.859375 0 1.4375 0.65625q0.59375 0.640625 0.59375 1.875q0 0.828125 -0.234375 1.515625q-0.234375 0.6875 -0.578125 1.15625q-0.34375 0.46875 -0.71875 0.75q-0.359375 0.265625 -0.75 0.40625q-0.390625 0.140625 -0.75 0.140625q-0.609375 0 -1.078125 -0.328125q-0.46875 -0.328125 -0.734375 -0.984375l-0.25 1.171875l-0.921875 0zm1.5625 -2.5625l0 0.203125q0 0.796875 0.375 1.21875q0.375 0.40625 0.953125 0.40625q0.546875 0 1.015625 -0.375q0.46875 -0.390625 0.765625 -1.21875q0.296875 -0.828125 0.296875 -1.53125q0 -0.78125 -0.375 -1.21875q-0.375 -0.4375 -0.9375 -0.4375q-0.5625 0 -1.046875 0.453125q-0.484375 0.4375 -0.8125 1.359375q-0.234375 0.6875 -0.234375 1.140625zm5.298828 0.203125q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm9.626953 1.5625q-0.90625 1.046875 -1.890625 1.046875q-0.890625 0 -1.484375 -0.65625q-0.578125 -0.65625 -0.578125 -1.890625q0 -1.140625 0.453125 -2.078125q0.46875 -0.9375 1.171875 -1.40625q0.703125 -0.46875 1.40625 -0.46875q1.15625 0 1.75 1.109375l0.703125 -3.34375l1.046875 0l-1.78125 8.59375l-0.984375 0l0.1875 -0.90625zm-2.90625 -1.703125q0 0.65625 0.125 1.03125q0.140625 0.375 0.4375 0.625q0.3125 0.25 0.75 0.25q0.71875 0 1.3125 -0.75q0.78125 -1.0 0.78125 -2.46875q0 -0.734375 -0.390625 -1.140625q-0.390625 -0.421875 -0.96875 -0.421875q-0.375 0 -0.703125 0.171875q-0.3125 0.15625 -0.625 0.5625q-0.296875 0.40625 -0.515625 1.046875q-0.203125 0.625 -0.203125 1.09375zm4.986328 5.015625l0.0625 -1.0q0.328125 0.09375 0.640625 0.09375q0.328125 0 0.515625 -0.140625q0.265625 -0.203125 0.5625 -0.734375l0.34375 -0.609375l-1.03125 -6.234375l1.046875 0l0.46875 3.140625q0.140625 0.9375 0.234375 1.859375l2.78125 -5.0l1.109375 0l-3.96875 7.046875q-0.578125 1.03125 -1.03125 1.359375q-0.4375 0.34375 -1.015625 0.34375q-0.359375 0 -0.71875 -0.125zm16.083984 -7.453125l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm0 2.609375l-5.671875 0l0 -0.984375l5.671875 0l0 0.984375zm8.185547 -4.5625l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.1875 -0.953125 0.609375 -1.390625q0.421875 -0.4375 0.984375 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.921875 1.28125l0.65625 0zm-1.875 0l-0.25 1.203125l-1.203125 0l0.21875 -1.046875q0.203125 -0.953125 0.609375 -1.390625q0.421875 -0.4375 1.0 -0.5l-0.09375 0.453125q-0.6875 0.1875 -0.9375 1.28125l0.65625 0zm8.511719 3.96875l1.140625 0.171875q-0.546875 1.484375 -1.578125 2.25q-1.03125 0.75 -2.3125 0.75q-1.5625 0 -2.484375 -0.953125q-0.90625 -0.953125 -0.90625 -2.734375q0 -2.3125 1.390625 -3.84375q1.25 -1.34375 3.09375 -1.34375q1.359375 0 2.203125 0.734375q0.84375 0.734375 0.984375 1.96875l-1.078125 0.09375q-0.15625 -0.9375 -0.6875 -1.390625q-0.53125 -0.453125 -1.375 -0.453125q-1.578125 0 -2.546875 1.390625q-0.84375 1.203125 -0.84375 2.875q0 1.3125 0.640625 2.015625q0.65625 0.703125 1.703125 0.703125q0.890625 0 1.609375 -0.578125q0.71875 -0.59375 1.046875 -1.65625zm1.9472656 3.03125l1.796875 -8.59375l3.59375 0q0.921875 0 1.390625 0.21875q0.46875 0.21875 0.765625 0.734375q0.3125 0.515625 0.3125 1.15625q0 0.53125 -0.21875 1.09375q-0.21875 0.546875 -0.546875 0.90625q-0.328125 0.359375 -0.671875 0.546875q-0.34375 0.171875 -0.71875 0.25q-0.828125 0.203125 -1.671875 0.203125l-2.15625 0l-0.71875 3.484375l-1.15625 0zm2.078125 -4.453125l1.890625 0q1.109375 0 1.625 -0.234375q0.515625 -0.25 0.828125 -0.734375q0.3125 -0.484375 0.3125 -1.03125q0 -0.421875 -0.171875 -0.6875q-0.15625 -0.265625 -0.46875 -0.390625q-0.296875 -0.125 -1.140625 -0.125l-2.203125 0l-0.671875 3.203125zm7.7851562 -4.140625l1.15625 0l-1.109375 5.28125q-0.125 0.65625 -0.125 0.96875q0 0.703125 0.53125 1.125q0.546875 0.421875 1.375 0.421875q0.65625 0 1.21875 -0.296875q0.578125 -0.3125 0.90625 -0.890625q0.328125 -0.59375 0.59375 -1.875l0.984375 -4.734375l1.140625 0l-1.046875 5.046875q-0.265625 1.28125 -0.703125 2.046875q-0.4375 0.75 -1.21875 1.203125q-0.78125 0.453125 -1.8125 0.453125q-0.96875 0 -1.6875 -0.328125q-0.703125 -0.328125 -1.0625 -0.890625q-0.359375 -0.5625 -0.359375 -1.28125q0 -0.453125 0.25 -1.5625l0.96875 -4.6875zm10.21875 6.234375q0 -1.828125 1.0625 -3.015625q0.890625 -0.984375 2.328125 -0.984375q1.125 0 1.8125 0.703125q0.6875 0.703125 0.6875 1.890625q0 1.078125 -0.4375 2.0q-0.4375 0.921875 -1.234375 1.421875q-0.796875 0.484375 -1.6875 0.484375q-0.71875 0 -1.3125 -0.3125q-0.59375 -0.3125 -0.90625 -0.875q-0.3125 -0.578125 -0.3125 -1.3125zm1.046875 -0.109375q0 0.875 0.421875 1.328125q0.421875 0.453125 1.078125 0.453125q0.34375 0 0.671875 -0.125q0.34375 -0.140625 0.625 -0.421875q0.28125 -0.28125 0.484375 -0.640625q0.203125 -0.359375 0.328125 -0.78125q0.1875 -0.578125 0.1875 -1.109375q0 -0.84375 -0.4375 -1.3125q-0.421875 -0.46875 -1.0625 -0.46875q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.75 0.6875q-0.328125 0.453125 -0.484375 1.0625q-0.15625 0.609375 -0.15625 1.078125zm5.439453 2.46875l1.296875 -6.21875l0.953125 0l-0.21875 1.078125q0.625 -0.640625 1.171875 -0.921875q0.546875 -0.296875 1.109375 -0.296875q0.75 0 1.171875 0.40625q0.4375 0.40625 0.4375 1.09375q0 0.34375 -0.140625 1.09375l-0.796875 3.765625l-1.0625 0l0.828125 -3.9375q0.125 -0.578125 0.125 -0.859375q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.8125 0 -1.453125 0.59375q-0.640625 0.578125 -0.9375 2.0l-0.609375 2.890625l-1.046875 0zm10.4296875 -3.59375q0.453125 0 0.78125 -0.234375q0.34375 -0.234375 0.546875 -0.703125q0.171875 -0.34375 0.375 -1.3125q0.21875 -0.984375 0.34375 -1.34375q0.15625 -0.484375 0.375 -0.78125q0.21875 -0.3125 0.46875 -0.46875q0.25 -0.171875 0.625 -0.25q0.203125 -0.046875 0.671875 -0.046875l0.328125 0l-0.203125 0.921875l-0.171875 0q-0.5 0 -0.71875 0.125q-0.21875 0.109375 -0.34375 0.375q-0.109375 0.25 -0.3125 1.125q-0.234375 1.171875 -0.453125 1.6875q-0.203125 0.5 -0.53125 0.828125q-0.3125 0.3125 -0.90625 0.5625q0.421875 0.203125 0.625 0.53125q0.203125 0.328125 0.203125 0.875q0 0.453125 -0.265625 1.671875q-0.1875 0.859375 -0.1875 1.078125q0 0.21875 0.09375 0.34375q0.0625 0.109375 0.21875 0.15625q0.171875 0.0625 0.703125 0.0625l-0.1875 0.921875l-0.328125 0q-0.546875 0 -0.765625 -0.078125q-0.34375 -0.125 -0.546875 -0.40625q-0.1875 -0.265625 -0.1875 -0.734375q0 -0.390625 0.265625 -1.671875q0.203125 -0.96875 0.203125 -1.3125q0 -0.46875 -0.234375 -0.703125q-0.234375 -0.25 -0.6875 -0.25l0.203125 -0.96875zm4.0078125 0q0.453125 0 0.78125 -0.234375q0.34375 -0.234375 0.546875 -0.703125q0.171875 -0.34375 0.375 -1.3125q0.21875 -0.984375 0.34375 -1.34375q0.15625 -0.484375 0.375 -0.78125q0.21875 -0.3125 0.46875 -0.46875q0.25 -0.171875 0.625 -0.25q0.203125 -0.046875 0.671875 -0.046875l0.328125 0l-0.203125 0.921875l-0.171875 0q-0.5 0 -0.71875 0.125q-0.21875 0.109375 -0.34375 0.375q-0.109375 0.25 -0.3125 1.125q-0.234375 1.171875 -0.453125 1.6875q-0.203125 0.5 -0.53125 0.828125q-0.3125 0.3125 -0.90625 0.5625q0.421875 0.203125 0.625 0.53125q0.203125 0.328125 0.203125 0.875q0 0.453125 -0.265625 1.671875q-0.1875 0.859375 -0.1875 1.078125q0 0.21875 0.09375 0.34375q0.0625 0.109375 0.21875 0.15625q0.171875 0.0625 0.703125 0.0625l-0.1875 0.921875l-0.328125 0q-0.546875 0 -0.765625 -0.078125q-0.34375 -0.125 -0.546875 -0.40625q-0.1875 -0.265625 -0.1875 -0.734375q0 -0.390625 0.265625 -1.671875q0.203125 -0.96875 0.203125 -1.3125q0 -0.46875 -0.234375 -0.703125q-0.234375 -0.25 -0.6875 -0.25l0.203125 -0.96875zm3.6796875 1.46875l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm10.46875 0.015625l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm5.5585938 0l-1.015625 -6.21875l1.03125 0l0.53125 3.421875q0.09375 0.5625 0.21875 1.828125q0.296875 -0.65625 0.78125 -1.515625l2.078125 -3.734375l1.109375 0l-3.5625 6.21875l-1.171875 0zm9.0 -2.109375l1.03125 0.09375q-0.21875 0.765625 -1.03125 1.46875q-0.796875 0.6875 -1.890625 0.6875q-0.703125 0 -1.28125 -0.3125q-0.578125 -0.328125 -0.875 -0.9375q-0.296875 -0.609375 -0.296875 -1.390625q0 -1.015625 0.46875 -1.96875q0.46875 -0.96875 1.21875 -1.421875q0.75 -0.46875 1.625 -0.46875q1.109375 0 1.765625 0.6875q0.671875 0.6875 0.671875 1.890625q0 0.453125 -0.078125 0.9375l-4.578125 0q-0.03125 0.171875 -0.03125 0.328125q0 0.875 0.40625 1.328125q0.40625 0.453125 0.984375 0.453125q0.546875 0 1.0625 -0.34375q0.53125 -0.359375 0.828125 -1.03125zm-3.078125 -1.546875l3.484375 0q0.015625 -0.171875 0.015625 -0.234375q0 -0.796875 -0.40625 -1.21875q-0.390625 -0.421875 -1.015625 -0.421875q-0.6875 0 -1.25 0.46875q-0.5625 0.46875 -0.828125 1.40625zm5.189453 3.65625l1.296875 -6.21875l0.9375 0l-0.265625 1.265625q0.484375 -0.71875 0.9375 -1.0625q0.46875 -0.34375 0.9375 -0.34375q0.328125 0 0.78125 0.21875l-0.4375 0.984375q-0.265625 -0.1875 -0.59375 -0.1875q-0.5625 0 -1.15625 0.625q-0.578125 0.609375 -0.90625 2.21875l-0.53125 2.5l-1.0 0zm7.2929688 -3.59375l-0.203125 0.96875q-0.4375 0 -0.78125 0.234375q-0.328125 0.234375 -0.515625 0.640625q-0.1875 0.40625 -0.40625 1.390625q-0.21875 0.984375 -0.3125 1.3125q-0.171875 0.5 -0.390625 0.796875q-0.21875 0.3125 -0.484375 0.46875q-0.25 0.171875 -0.609375 0.265625q-0.203125 0.046875 -0.6875 0.046875l-0.328125 0l0.203125 -0.921875l0.1875 0q0.5 0 0.71875 -0.125q0.21875 -0.125 0.359375 -0.421875q0.09375 -0.21875 0.28125 -1.09375q0.234375 -1.109375 0.40625 -1.546875q0.234375 -0.59375 0.59375 -0.953125q0.359375 -0.359375 0.890625 -0.578125q-0.453125 -0.234375 -0.640625 -0.546875q-0.171875 -0.3125 -0.171875 -0.859375q0 -0.453125 0.25 -1.671875q0.1875 -0.84375 0.1875 -1.078125q0 -0.296875 -0.15625 -0.421875q-0.15625 -0.125 -0.671875 -0.125l-0.1875 0l0.203125 -0.921875l0.328125 0q0.546875 0 0.765625 0.078125q0.34375 0.109375 0.53125 0.390625q0.203125 0.265625 0.203125 0.734375q0 0.390625 -0.203125 1.296875q-0.28125 1.359375 -0.28125 1.6875q0 0.46875 0.234375 0.71875q0.234375 0.234375 0.6875 0.234375zm4.0078125 0l-0.203125 0.96875q-0.4375 0 -0.78125 0.234375q-0.328125 0.234375 -0.515625 0.640625q-0.1875 0.40625 -0.40625 1.390625q-0.21875 0.984375 -0.3125 1.3125q-0.171875 0.5 -0.390625 0.796875q-0.21875 0.3125 -0.484375 0.46875q-0.25 0.171875 -0.609375 0.265625q-0.203125 0.046875 -0.6875 0.046875l-0.328125 0l0.203125 -0.921875l0.1875 0q0.5 0 0.71875 -0.125q0.21875 -0.125 0.359375 -0.421875q0.09375 -0.21875 0.28125 -1.09375q0.234375 -1.109375 0.40625 -1.546875q0.234375 -0.59375 0.59375 -0.953125q0.359375 -0.359375 0.890625 -0.578125q-0.453125 -0.234375 -0.640625 -0.546875q-0.171875 -0.3125 -0.171875 -0.859375q0 -0.453125 0.25 -1.671875q0.1875 -0.84375 0.1875 -1.078125q0 -0.296875 -0.15625 -0.421875q-0.15625 -0.125 -0.671875 -0.125l-0.1875 0l0.203125 -0.921875l0.328125 0q0.546875 0 0.765625 0.078125q0.34375 0.109375 0.53125 0.390625q0.203125 0.265625 0.203125 0.734375q0 0.390625 -0.203125 1.296875q-0.28125 1.359375 -0.28125 1.6875q0 0.46875 0.234375 0.71875q0.234375 0.234375 0.6875 0.234375zm5.544922 -3.796875l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.8066406 -2.125l1.0625 -0.0625q0 0.453125 0.140625 0.78125q0.140625 0.3125 0.515625 0.515625q0.375 0.203125 0.875 0.203125q0.703125 0 1.046875 -0.28125q0.359375 -0.28125 0.359375 -0.65625q0 -0.28125 -0.203125 -0.515625q-0.21875 -0.25 -1.0625 -0.609375q-0.84375 -0.359375 -1.078125 -0.515625q-0.390625 -0.234375 -0.59375 -0.5625q-0.1875 -0.328125 -0.1875 -0.75q0 -0.734375 0.578125 -1.25q0.59375 -0.53125 1.640625 -0.53125q1.171875 0 1.78125 0.546875q0.625 0.53125 0.640625 1.421875l-1.03125 0.0625q-0.03125 -0.5625 -0.40625 -0.890625q-0.375 -0.328125 -1.0625 -0.328125q-0.546875 0 -0.859375 0.25q-0.296875 0.25 -0.296875 0.546875q0 0.296875 0.265625 0.515625q0.171875 0.15625 0.90625 0.46875q1.21875 0.53125 1.53125 0.828125q0.515625 0.5 0.515625 1.1875q0 0.46875 -0.296875 0.921875q-0.28125 0.4375 -0.859375 0.703125q-0.578125 0.265625 -1.375 0.265625q-1.078125 0 -1.828125 -0.53125q-0.765625 -0.53125 -0.71875 -1.734375zm9.240234 2.125l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm8.173828 -7.390625l0.25 -1.203125l1.0625 0l-0.265625 1.203125l-1.046875 0zm-1.546875 7.390625l1.296875 -6.21875l1.0625 0l-1.296875 6.21875l-1.0625 0zm2.6503906 0.5625l1.0625 0.09375q0 0.375 0.09375 0.546875q0.09375 0.1875 0.3125 0.28125q0.296875 0.140625 0.75 0.140625q0.953125 0 1.375 -0.5q0.28125 -0.34375 0.515625 -1.453125l0.109375 -0.515625q-0.828125 0.84375 -1.765625 0.84375q-0.9375 0 -1.578125 -0.6875q-0.625 -0.703125 -0.625 -1.96875q0 -1.046875 0.5 -1.921875q0.5 -0.890625 1.1875 -1.328125q0.6875 -0.453125 1.421875 -0.453125q1.21875 0 1.890625 1.15625l0.203125 -1.015625l0.984375 0l-1.265625 6.0q-0.203125 1.0 -0.546875 1.546875q-0.328125 0.546875 -0.921875 0.84375q-0.59375 0.3125 -1.375 0.3125q-0.75 0 -1.296875 -0.1875q-0.53125 -0.1875 -0.796875 -0.5625q-0.265625 -0.375 -0.265625 -0.859375q0 -0.140625 0.03125 -0.3125zm1.328125 -3.3125q0 0.640625 0.109375 0.953125q0.1875 0.453125 0.5 0.6875q0.328125 0.234375 0.734375 0.234375q0.515625 0 1.03125 -0.359375q0.515625 -0.359375 0.828125 -1.125q0.328125 -0.78125 0.328125 -1.46875q0 -0.765625 -0.421875 -1.21875q-0.421875 -0.46875 -1.046875 -0.46875q-0.390625 0 -0.765625 0.21875q-0.359375 0.203125 -0.671875 0.625q-0.3125 0.421875 -0.46875 1.015625q-0.15625 0.59375 -0.15625 0.90625zm5.408203 2.75l1.78125 -8.59375l1.0625 0l-0.6875 3.296875q0.59375 -0.5625 1.09375 -0.8125q0.515625 -0.25 1.0625 -0.25q0.765625 0 1.1875 0.40625q0.4375 0.40625 0.4375 1.078125q0 0.328125 -0.1875 1.203125l-0.765625 3.671875l-1.0625 0l0.796875 -3.765625q0.171875 -0.828125 0.171875 -1.03125q0 -0.3125 -0.21875 -0.5q-0.203125 -0.1875 -0.609375 -0.1875q-0.578125 0 -1.09375 0.296875q-0.515625 0.296875 -0.8125 0.828125q-0.296875 0.515625 -0.546875 1.6875l-0.5625 2.671875l-1.046875 0zm7.892578 -7.359375l0.25 -1.203125l1.203125 0l-0.21875 1.0625q-0.203125 0.9375 -0.625 1.375q-0.40625 0.4375 -0.984375 0.515625l0.109375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0zm1.921875 0l0.25 -1.203125l1.21875 0l-0.234375 1.0625q-0.1875 0.9375 -0.609375 1.375q-0.421875 0.4375 -0.984375 0.515625l0.09375 -0.46875q0.6875 -0.1875 0.921875 -1.28125l-0.65625 0z" fill-rule="nonzero"/></g></svg> \ No newline at end of file diff --git a/docs/user/alerting/index.asciidoc b/docs/user/alerting/index.asciidoc new file mode 100644 index 0000000000000..b4f7e6af3d61c --- /dev/null +++ b/docs/user/alerting/index.asciidoc @@ -0,0 +1,202 @@ +[role="xpack"] +[[alerting-getting-started]] += Alerting and Actions + +beta[] + +-- + +Alerting allows you to detect complex conditions within different {kib} apps and trigger actions when those conditions are met. Alerting is integrated with <<xpack-apm,*APM*>>, <<xpack-infra,*Metrics*>>, <<xpack-siem,*SIEM*>>, <<xpack-uptime,*Uptime*>>, can be centrally managed from the <<management,*Management*>> UI, and provides a set of built-in <<action-types, actions>> and <<alert-types, alerts>> for you to use. + +image::images/alerting-overview.png[Alerts and actions UI] + +[IMPORTANT] +============================================== +To make sure you can access alerting and actions, see the <<alerting-setup-prerequisites, setup and pre-requisites>> section. +============================================== + +[float] +== Concepts and terminology + +*Alerts* work by running checks on a schedule to detect conditions. When a condition is met, the alert tracks it as an *alert instance* and responds by triggering one or more *actions*. +Actions typically involve interaction with {kib} services or third party integrations. *Connectors* allow actions to talk to these services and integrations. +This section describes all of these elements and how they operate together. + +[float] +=== What is an alert? + +An alert specifies a background task that runs on the {kib} server to check for specific conditions. It consists of three main parts: + +* *Conditions*: what needs to be detected? +* *Schedule*: when/how often should detection checks run? +* *Actions*: what happens when a condition is detected? + +For example, when monitoring a set of servers, an alert might check for average CPU usage > 0.9 on each server for the two minutes (condition), checked every minute (schedule), sending a warning email message via SMTP with subject `CPU on {{server}} is high` (action). + +image::images/what-is-an-alert.svg[Three components of an alert] + +The following sections each part of the alert is described in more detail. + +[float] +[[alerting-concepts-conditions]] +==== Conditions + +Under the hood, {kib} alerts detect conditions by running javascript function on the {kib} server, which gives it flexibility to support a wide range of detections, anything from the results of a simple {es} query to heavy computations involving data from multiple sources or external systems. + +These detections are packaged and exposed as *alert types*. An alert type hides the underlying details of the detection, and exposes a set of parameters +to control the details of the conditions to detect. + +For example, an <<alert-types, index threshold alert type>> lets you specify the index to query, an aggregation field, and a time window, but the details of the underlying {es} query are hidden. + +See <<alert-types>> for the types of alerts provided by {kib} and how they express their conditions. + +[float] +[[alerting-concepts-scheduling]] +==== Schedule + +Alert schedules are defined as an interval between subsequent checks, and can range from a few seconds to months. + +[IMPORTANT] +============================================== +The intervals of alert checks in {kib} are approximate, their timing of their execution is affected by factors such as the frequency at which tasks are claimed and the task load on the system. See <<alerting-scale-performance>> for more information. +============================================== + +[float] +[[alerting-concepts-actions]] +==== Actions + +Actions are invocations of {kib} services or integrations with third-party systems, that run as background tasks on the {kib} server when alert conditions are met. + +When defining actions in an alert, you specify +* the *action type*: the type of service or integration to use> +* the connection for that type by referencing a <<alerting-concepts-connectors, connector>>. +* a mapping of alert values to properties exposed for that type of action. + +The result is a template: all the parameters needed to invoke a service are supplied except for specific values that are only known at the time the alert condition is detected. + +In the server monitoring example, the `email` action type is used, and `server` is mapped to the body of the email, using the template string `CPU on {{server}} is high`. + +When the alert detects the condition, it creates an <<alerting-concepts-alert-instances, alert instance>> containing the details of the condition, renders the template with these details such as server name, and executes the action on the {kib} server by invoking the `email` action type. + +image::images/what-is-an-action.svg[Actions are like templates that are rendered when an alert detects a condition] + +See <<action-types>> for details on the types of actions provided by {kib}. + +[float] +[[alerting-concepts-alert-instances]] +=== Alert instances + +When checking for a condition, an alert might identify multiple occurrences of the condition. {kib} tracks each of these *alert instances* separately and takes action per instance. + +Using the server monitoring example, each server with average CPU > 0.9 is tracked as an alert instance. This means a separate email is sent for each server that exceeds the threshold. + +image::images/alert-instances.svg[{kib} tracks each detected condition as an alert instance and takes action on each instance] + +[float] +[[alerting-concepts-suppressing-duplicate-notifications]] +=== Suppressing duplicate notifications + +Since actions are taken per instance, alerts can end up generating a large number of actions. Take the following example where an alert is monitoring three servers every minute for CPU usage > 0.9: + +* Minute 1: server X123 > 0.9. *One email* is sent for server X123. +* Minute 2: X123 and Y456 > 0.9. *Two emails* are sent, on for X123 and one for Y456. +* Minute 3: X123, Y456, Z789 > 0.9. *Three emails* are sent, one for each of X123, Y456, Z789. + +In the above example, three emails are sent for server X123 in the span of 3 minutes for the same condition. Often it's desirable to suppress frequent re-notification. Operations like muting and re-notification throttling can be applied at the instance level. If we set the alert re-notify interval to 5 minutes, we reduce noise by only getting emails for new servers that exceed the threshold: + +* Minute 1: server X123 > 0.9. *One email* is sent for server X123. +* Minute 2: X123 and Y456 > 0.9. *One email* is sent for Y456 +* Minute 3: X123, Y456, Z789 > 0.9. *One email* is sent for Z789. + +[float] +[[alerting-concepts-connectors]] +=== Connectors + +Actions often involve connecting with services inside {kib} or integrations with third-party systems. +Rather than repeatedly entering connection information and credentials for each action, {kib} simplifies action setup using *connectors*. + +*Connectors* provide a central place to store connection information for services and integrations. For example if four alerts send email notifications via the same SMTP service, +they all reference the same SMTP connector. When the SMTP settings change they are updated once in the connector, instead of having to update four alerts. + +image::images/alert-concepts-connectors.svg[Connectors provide a central place to store service connection settings] + +[float] +=== Summary + +An _alert_ consists of conditions, _actions_, and a schedule. When conditions are met, _alert instances_ are created that render _actions_ and invoke them. To make action setup and update easier, actions refer to _connectors_ that centralize the information used to connect with {kib} services and third-party integrations. + +image::images/alert-concepts-summary.svg[Alerts, actions, alert instances and connectors work together to convert detection into action] + +* *Alert*: a specification of the conditions to be detected, the schedule for detection, and the response when detection occurs. +* *Action*: the response to a detected condition defined in the alert. Typically actions specify a service or third party integration along with alert details that will be sent to it. +* *Alert instance*: state tracked by {kib} for every occurrence of a detected condition. Actions as well as controls like muting and re-notification are controlled at the instance level. +* *Connector*: centralized configurations for services and third party integration that are referenced by actions. + +[float] +[[alerting-concepts-differences]] +== Differences from Watcher + +{kib} alerting and <<watcher-ui, {es} alerting>> are both used to detect conditions and can trigger actions in response, but they are completely independent alerting systems. + +This section will clarify some of the important differences in the function and intent of the two systems. + +Functionally, {kib} alerting differs in that: + +* Scheduled checks are run on {kib} instead of {es} +* {kib} <<alerting-concepts-conditions, alerts hide the details of detecting conditions>> through *alert types*, whereas watches provide low-level control over inputs, conditions, and transformations. +* {kib} alerts tracks and persists the state of each detected condition through *alert instances*. This makes it possible to mute and throttle individual instances, and detect changes in state such as resolution. +* Actions are linked to *alert instances* in {kib} alerting. Actions are fired for each occurrence of a detected condition, rather than for the entire alert. + +At a higher level, {kib} alerts allow rich integrations across use cases like <<xpack-apm,*APM*>>, <<xpack-infra,*Metrics*>>, <<xpack-siem,*SIEM*>>, and <<xpack-uptime,*Uptime*>>. +Pre-packaged *alert types* simplify setup, hide the details complex domain-specific detections, while providing a consistent interface across {kib}. + +[float] +[[alerting-setup-prerequisites]] +== Setup and prerequisites + +If you are using an *on-premises* Elastic Stack deployment with <<using-kibana-with-security, *security*>>: + +* TLS must be configured for communication <<configuring-tls-kib-es, between {es} and {kib}>>. {kib} alerting uses <<api-keys, API keys>> to secure background alert checks and actions, and API keys require {ref}/configuring-tls.html#tls-http[TLS on the HTTP interface]. +* In the kibana.yml configuration file, add the <<alert-action-settings-kb,`xpack.encrypted_saved_objects.encryptionKey` setting>> + +[float] +[[alerting-security]] +== Security + +To access alerting in a space, a user must have access to one of the following features: +* <<xpack-apm,*APM*>> +* <<xpack-infra,*Metrics*>> +* <<xpack-siem,*SIEM*>> +* <<xpack-uptime,*Uptime*>> + +See <<kibana-feature-privileges, feature privileges>> for more information on configuring roles that provide access to these features. + +[float] +[[alerting-spaces]] +=== Space isolation + +Alerts and connectors are isolated to the {kib} space in which they were created. An alert or connector created in one space will not be visible in another. + +[float] +[[alerting-authorization]] +=== Authorization + +Alerts, including all background detection and the actions they generate are authorized using an <<api-keys, API key>> associated with the last user to edit the alert. Upon creating or modifying an alert, an API key is generated for that user, capturing a snapshot of their privileges at that moment in time. The API key is then used to run all background tasks associated with the alert including detection checks and executing actions. + +[IMPORTANT] +============================================== +If an alert requires certain privileges to run such as index privileges, keep in mind that if a user without those privileges updates the alert, the alert will no longer function. +============================================== + +[float] +[[alerting-restricting-actions]] +=== Restricting actions + +For security reasons you may wish to limit the extent to which {kib} can connect to external services. <<action-settings>> allows you to disable certain <<action-types>> and whitelist the hostnames that {kib} can connect with. + +-- + +include::defining-alerts.asciidoc[] +include::action-types.asciidoc[] +include::alert-types.asciidoc[] +include::alerting-scale-performance.asciidoc[] diff --git a/docs/user/canvas.asciidoc b/docs/user/canvas.asciidoc index 5c5f5c2f80bf9..98033c5a87f6f 100644 --- a/docs/user/canvas.asciidoc +++ b/docs/user/canvas.asciidoc @@ -31,14 +31,8 @@ include::{kib-repo-dir}/canvas/canvas-tutorial.asciidoc[] include::{kib-repo-dir}/canvas/canvas-workpad.asciidoc[] -include::{kib-repo-dir}/canvas/canvas-elements.asciidoc[] - -include::{kib-repo-dir}/canvas/canvas-present-workpad.asciidoc[] - -include::{kib-repo-dir}/canvas/canvas-share-workpad.asciidoc[] - include::{kib-repo-dir}/canvas/canvas-expression-lifecycle.asciidoc[] include::{kib-repo-dir}/canvas/canvas-function-reference.asciidoc[] -include::{kib-repo-dir}/canvas/canvas-tinymath-functions.asciidoc[] \ No newline at end of file +include::{kib-repo-dir}/canvas/canvas-tinymath-functions.asciidoc[] diff --git a/docs/user/index.asciidoc b/docs/user/index.asciidoc index ff100d0763368..0f53497716552 100644 --- a/docs/user/index.asciidoc +++ b/docs/user/index.asciidoc @@ -40,6 +40,8 @@ include::management.asciidoc[] include::reporting/index.asciidoc[] +include::alerting/index.asciidoc[] + include::api.asciidoc[] include::plugins.asciidoc[] diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc index 34a3790529ca3..fa34802abe2a9 100644 --- a/docs/user/management.asciidoc +++ b/docs/user/management.asciidoc @@ -83,6 +83,10 @@ a| <<advanced-options, *Advanced Settings*>> Customize {kib} to suit your needs. Change the format for displaying dates, turn on dark mode, set the timespan for notification messages, and much more. +| <<managing-alerts-and-actions, *Alerts and Actions*>> + +Centrally manage your alerts from across {kib}. Create and manage re-usable connectors for triggering actions. + | <<managing-fields, *Index Patterns*>> Create and manage the index patterns that help you retrieve your data from {es}. @@ -111,6 +115,14 @@ so you can tailor it to your needs without impacting others. include::{kib-repo-dir}/management/advanced-options.asciidoc[] +include::{kib-repo-dir}/management/alerting/alerts-and-actions-intro.asciidoc[] + +include::{kib-repo-dir}/management/alerting/alert-management.asciidoc[] + +include::{kib-repo-dir}/management/alerting/alert-details.asciidoc[] + +include::{kib-repo-dir}/management/alerting/connector-management.asciidoc[] + include::{kib-repo-dir}/management/managing-beats.asciidoc[] include::{kib-repo-dir}/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc[] diff --git a/package.json b/package.json index b5da10c71a1a1..c2763f098b984 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "uiFramework:documentComponent": "cd packages/kbn-ui-framework && yarn documentComponent", "kbn:watch": "node scripts/kibana --dev --logging.json=false", "build:types": "tsc --p tsconfig.types.json", - "docs:acceptApiChanges": "node scripts/check_published_api_changes.js --accept", + "docs:acceptApiChanges": "node --max-old-space-size=6144 scripts/check_published_api_changes.js --accept", "kbn:bootstrap": "yarn build:types && node scripts/register_git_hook", "spec_to_console": "node scripts/spec_to_console", "backport-skip-ci": "backport --prDescription \"[skip-ci]\"", @@ -118,7 +118,7 @@ "@babel/core": "^7.9.0", "@babel/register": "^7.9.0", "@elastic/apm-rum": "^4.6.0", - "@elastic/charts": "^18.1.0", + "@elastic/charts": "^18.1.1", "@elastic/datemath": "5.0.2", "@elastic/ems-client": "7.7.1", "@elastic/eui": "21.0.1", @@ -170,8 +170,8 @@ "deepmerge": "^4.2.2", "del": "^5.1.0", "elastic-apm-node": "^3.2.0", - "elasticsearch": "^16.5.0", - "elasticsearch-browser": "^16.5.0", + "elasticsearch": "^16.7.0", + "elasticsearch-browser": "^16.7.0", "execa": "^4.0.0", "expiry-js": "0.1.7", "fast-deep-equal": "^3.1.1", @@ -180,7 +180,7 @@ "fp-ts": "^2.3.1", "getos": "^3.1.0", "glob": "^7.1.2", - "glob-all": "^3.1.0", + "glob-all": "^3.2.1", "globby": "^8.0.1", "h2o2": "^8.1.2", "handlebars": "4.5.3", @@ -290,7 +290,7 @@ "@elastic/eslint-config-kibana": "0.15.0", "@elastic/eslint-plugin-eui": "0.0.2", "@elastic/github-checks-reporter": "0.0.20b3", - "@elastic/makelogs": "^5.0.0", + "@elastic/makelogs": "^5.0.1", "@kbn/dev-utils": "1.0.0", "@kbn/es": "1.0.0", "@kbn/eslint-import-resolver-kibana": "2.0.0", @@ -330,11 +330,13 @@ "@types/glob": "^7.1.1", "@types/globby": "^8.0.0", "@types/graphql": "^0.13.2", + "@types/h2o2": "^8.1.1", "@types/hapi": "^17.0.18", "@types/hapi-auth-cookie": "^9.1.0", "@types/has-ansi": "^3.0.0", "@types/history": "^4.7.3", "@types/hoek": "^4.1.3", + "@types/inert": "^5.1.2", "@types/jest": "24.0.19", "@types/joi": "^13.4.2", "@types/jquery": "^3.3.31", diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 5d8ef7626f630..dabfed7f9725c 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -131,12 +131,21 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) { loader: 'resolve-url-loader', options: { join: (_: string, __: any) => (uri: string, base?: string) => { - if (!base) { + // apply only to legacy platform styles + if (!base || !parseDirPath(base).dirs.includes('legacy')) { return null; } + if (uri.startsWith('ui/assets')) { + return Path.resolve( + worker.repoRoot, + 'src/core/server/core_app/', + uri.replace('ui/', '') + ); + } + // manually force ui/* urls in legacy styles to resolve to ui/legacy/public - if (uri.startsWith('ui/') && parseDirPath(base).dirs.includes('legacy')) { + if (uri.startsWith('ui/')) { return Path.resolve( worker.repoRoot, 'src/legacy/ui/public', diff --git a/packages/kbn-plugin-generator/integration_tests/generate_plugin.test.js b/packages/kbn-plugin-generator/integration_tests/generate_plugin.test.js index d7d4dc14519c3..f434d09c6bf81 100644 --- a/packages/kbn-plugin-generator/integration_tests/generate_plugin.test.js +++ b/packages/kbn-plugin-generator/integration_tests/generate_plugin.test.js @@ -17,163 +17,46 @@ * under the License. */ -/* eslint-disable no-restricted-syntax */ import { spawn } from 'child_process'; +import Fs from 'fs'; import { resolve } from 'path'; -import util from 'util'; -import { stat, readFileSync } from 'fs'; -import { snakeCase } from 'lodash'; +import { promisify } from 'util'; + import del from 'del'; -import { ProcRunner, ToolingLog } from '@kbn/dev-utils'; -import { createLegacyEsTestCluster } from '@kbn/test'; -import execa from 'execa'; +import { snakeCase } from 'lodash'; -const statP = util.promisify(stat); +const statAsync = promisify(Fs.stat); const ROOT_DIR = resolve(__dirname, '../../../'); -const oneMinute = 60000; - -describe(`running the plugin-generator via 'node scripts/generate_plugin.js plugin-name' with default config`, () => { - const pluginName = 'ispec-plugin'; - const snakeCased = snakeCase(pluginName); - const generatedPath = resolve(ROOT_DIR, `plugins/${snakeCased}`); - const collect = xs => data => xs.push(data + ''); // Coerce from Buffer to String - - beforeAll(() => { - jest.setTimeout(oneMinute * 10); - }); - - beforeAll(done => { - const create = spawn(process.execPath, ['scripts/generate_plugin.js', pluginName], { - cwd: ROOT_DIR, - }); - create.stdout.on('data', function selectDefaults() { - create.stdin.write('\n'); // Generate a plugin with default options. - }); - create.on('close', done); - }); - - afterAll(() => { - del.sync(generatedPath, { force: true }); - }); - - it(`should succeed on creating a plugin in a directory named 'plugins/${snakeCased}`, async () => { - const stats = await statP(generatedPath); - expect(stats.isDirectory()).toBe(true); - }); - // skipped until internationalization is re-introduced - it.skip(`should create an internationalization config file with a blank line appended to satisfy the parser`, async () => { - // Link to the error that happens when the blank line is not there: - // https://github.com/elastic/kibana/pull/45044#issuecomment-530092627 - const intlFile = `${generatedPath}/.i18nrc.json`; - expect(readFileSync(intlFile, 'utf8').endsWith('\n\n')).toBe(true); - }); - - describe(`then running`, () => { - it(`'yarn test:karma' should exit 0`, async () => { - await execa('yarn', ['test:karma'], { - cwd: generatedPath, - env: { - DISABLE_JUNIT_REPORTER: '1', - }, - }); - }); - - it.skip(`'yarn build' should exit 0`, async () => { - await execa('yarn', ['build'], { cwd: generatedPath }); - }); +const pluginName = 'ispec-plugin'; +const snakeCased = snakeCase(pluginName); +const generatedPath = resolve(ROOT_DIR, `plugins/${snakeCased}`); - describe('with es instance', () => { - const log = new ToolingLog({ - level: 'verbose', - writeTo: process.stdout, - }); - const pr = new ProcRunner(log); - - const es = createLegacyEsTestCluster({ license: 'basic', log }); - beforeAll(es.start); - afterAll(es.stop); - afterAll(() => pr.teardown()); +beforeAll(async () => { + await del(generatedPath, { force: true }); +}); - it(`'yarn start' should result in the spec plugin being initialized on kibana's stdout`, async () => { - await pr.run('kibana', { - cmd: 'yarn', - args: [ - 'start', - '--optimize.enabled=false', - '--logging.json=false', - '--logging.verbose=true', - '--migrations.skip=true', - ], - cwd: generatedPath, - wait: new RegExp('\\[ispecPlugin\\]\\[plugins\\] Setting up plugin'), - }); - await pr.stop('kibana'); - }); - }); +afterAll(async () => { + await del(generatedPath, { force: true }); +}); - it(`'yarn preinstall' should exit 0`, async () => { - await execa('yarn', ['preinstall'], { cwd: generatedPath }); +it('generates a plugin', async () => { + await new Promise((resolve, reject) => { + const proc = spawn(process.execPath, ['scripts/generate_plugin.js', pluginName], { + cwd: ROOT_DIR, + stdio: 'pipe', }); - it.skip(`'yarn lint' should exit 0`, async () => { - await execa('yarn', ['lint'], { cwd: generatedPath }); + proc.stdout.on('data', function selectDefaults() { + proc.stdin.write('\n'); // Generate a plugin with default options. }); - it(`'yarn kbn --help' should print out the kbn help msg`, done => { - const helpMsg = ` -usage: kbn <command> [<args>] - -By default commands are run for Kibana itself, all packages in the 'packages/' -folder and for all plugins in './plugins' and '../kibana-extra'. - -Available commands: - - bootstrap - Install dependencies and crosslink projects - clean - Remove the node_modules and target directories from all projects. - run - Run script defined in package.json in each package that contains that script. - watch - Runs \`kbn:watch\` script for every project. - -Global options: - - -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. - -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. - --oss Do not include the x-pack when running command. - --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. -`; - const outData = []; - const kbnHelp = spawn('yarn', ['kbn', '--help'], { cwd: generatedPath }); - kbnHelp.stdout.on('data', collect(outData)); - kbnHelp.on('close', () => { - expect(outData.join('\n')).toContain(helpMsg); - done(); - }); - }); - - it(`'yarn es --help' should print out the es help msg`, done => { - const helpMsg = ` -usage: es <command> [<args>] - -Assists with running Elasticsearch for Kibana development - -Available commands: - - snapshot - Downloads and run from a nightly snapshot - source - Build and run from source - archive - Install and run from an Elasticsearch tar - build_snapshots - Build and collect ES snapshots - -Global options: - - --help -`; - const outData = []; - const kbnHelp = spawn('yarn', ['es', '--help'], { cwd: generatedPath }); - kbnHelp.stdout.on('data', collect(outData)); - kbnHelp.on('close', () => { - expect(outData.join('\n')).toContain(helpMsg); - done(); - }); - }); + proc.on('close', resolve); + proc.on('error', reject); }); + + const stats = await statAsync(generatedPath); + if (!stats.isDirectory()) { + throw new Error(`Expected [${generatedPath}] to be a directory`); + } }); diff --git a/packages/kbn-storybook/storybook_config/middleware.js b/packages/kbn-storybook/storybook_config/middleware.js index f517477b405bd..046758948b2cf 100644 --- a/packages/kbn-storybook/storybook_config/middleware.js +++ b/packages/kbn-storybook/storybook_config/middleware.js @@ -22,5 +22,5 @@ const path = require('path'); // Extend the Storybook Middleware to include a route to access Legacy UI assets module.exports = function(router) { - router.get('/ui', serve(path.resolve(__dirname, '../../../../src/legacy/ui/public/assets'))); + router.get('/ui', serve(path.resolve(__dirname, '../../../src/core/server/core_app/assets'))); }; diff --git a/packages/kbn-test/src/index.ts b/packages/kbn-test/src/index.ts index cfbd1ee0fe64c..57cdc8ffd494f 100644 --- a/packages/kbn-test/src/index.ts +++ b/packages/kbn-test/src/index.ts @@ -58,3 +58,5 @@ export { export { runFailedTestsReporterCli } from './failed_tests_reporter'; export { makeJunitReportPath } from './junit_report_path'; + +export { CI_PARALLEL_PROCESS_PREFIX } from './ci_parallel_process_prefix'; diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 1e9ceb42433f0..c76e909d2adbc 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -9,7 +9,7 @@ "kbn:watch": "node scripts/build --watch" }, "devDependencies": { - "@elastic/charts": "^18.1.0", + "@elastic/charts": "^18.1.1", "abortcontroller-polyfill": "^1.4.0", "@elastic/eui": "21.0.1", "@kbn/babel-preset": "1.0.0", diff --git a/src/core/MIGRATION.md b/src/core/MIGRATION.md index 50fd1f716ba37..5d7b467052029 100644 --- a/src/core/MIGRATION.md +++ b/src/core/MIGRATION.md @@ -43,6 +43,7 @@ - [Core services](#core-services-1) - [Plugin services](#plugin-services) - [UI Exports](#ui-exports) + - [Plugin Spec](#plugin-spec) - [How to](#how-to) - [Configure plugin](#configure-plugin) - [Handle plugin configuration deprecations](#handle-plugin-configuration-deprecations) @@ -1152,12 +1153,12 @@ _See also: [Public's CoreStart API Docs](/docs/development/core/public/kibana-pl ##### Plugins for shared application services -In client code, we have a series of plugins which house shared application services that are being built in the shape of the new platform, but for the time being, are only available in legacy. So if your plugin depends on any of the APIs below, you'll need build your plugin as a legacy plugin that shims the new platform. Once these API's have been moved to the new platform you can migrate your plugin and declare a dependency on the plugin that owns the API's you require. +In client code, we have a series of plugins which house shared application services which are not technically part of `core`, but are often used in Kibana plugins. -The contracts for these plugins are exposed for you to consume in your own plugin; we have created dedicated exports for the `setup` and `start` contracts in a file called `legacy`. By passing these contracts to your plugin's `setup` and `start` methods, you can mimic the functionality that will eventually be provided in the new platform. +This table maps some of the most commonly used legacy items to their new platform locations. ```ts -import { setup, start } from '../core_plugins/visualizations/public/legacy'; +import { npStart: { plugins } } from 'ui/new_platform'; ``` | Legacy Platform | New Platform | Notes | @@ -1264,40 +1265,19 @@ This table shows where these uiExports have moved to in the New Platform. In mos | `visTypes` | `plugins.visualizations.types` | | | `visualize` | | | -Examples: - -- **uiSettingDefaults** - -Before: - -```js -uiExports: { - uiSettingDefaults: { - 'my-plugin:my-setting': { - name: 'just-work', - value: true, - description: 'make it work', - category: ['my-category'], - }, - } -} -``` - -After: - -```ts -// src/plugins/my-plugin/server/plugin.ts -setup(core: CoreSetup){ - core.uiSettings.register({ - 'my-plugin:my-setting': { - name: 'just-work', - value: true, - description: 'make it work', - category: ['my-category'], - }, - }) -} -``` +#### Plugin Spec +| Legacy Platform | New Platform | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `id` | [`manifest.id`](/docs/development/core/server/kibana-plugin-core-server.pluginmanifest.md) | +| `require` | [`manifest.requiredPlugins`](/docs/development/core/server/kibana-plugin-core-server.pluginmanifest.md) | +| `version` | [`manifest.version`](/docs/development/core/server/kibana-plugin-core-server.pluginmanifest.md) | +| `kibanaVersion` | [`manifest.kibanaVersion`](/docs/development/core/server/kibana-plugin-core-server.pluginmanifest.md) | +| `configPrefix` | [`manifest.configPath`](/docs/development/core/server/kibana-plugin-core-server.pluginmanifest.md) | +| `config` | [export config](#configure-plugin) | +| `deprecations` | [export config](#handle-plugin-configuration-deprecations) | +| `uiExports` | `N/A`. Use platform & plugin public contracts | +| `publicDir` | `N/A`. Platform serves static assets from `/public/assets` folder under `/plugins/{id}/assets/{path*}` URL. | +| `preInit`, `init`, `postInit` | `N/A`. Use NP [lifecycle events](#services) | ## How to diff --git a/src/core/MIGRATION_EXAMPLES.md b/src/core/MIGRATION_EXAMPLES.md index 29edef476d7c3..37d0b9297ed3c 100644 --- a/src/core/MIGRATION_EXAMPLES.md +++ b/src/core/MIGRATION_EXAMPLES.md @@ -20,6 +20,7 @@ APIs to their New Platform equivalents. - [Chromeless Applications](#chromeless-applications) - [Render HTML Content](#render-html-content) - [Saved Objects types](#saved-objects-types) + - [UiSettings](#uisettings) ## Configuration @@ -975,4 +976,37 @@ const migration: SavedObjectMigrationFn = (doc, { log }) => {...} The `registerType` API will throw if called after the service has started, and therefor cannot be used from legacy plugin code. Legacy plugins should use the legacy savedObjects service and the legacy way to register -saved object types until migrated. \ No newline at end of file +saved object types until migrated. + +## UiSettings +UiSettings defaults registration performed during `setup` phase via `core.uiSettings.register` API. + +```js +// Before: +uiExports: { + uiSettingDefaults: { + 'my-plugin:my-setting': { + name: 'just-work', + value: true, + description: 'make it work', + category: ['my-category'], + }, + } +} +``` + +```ts +// After: +// src/plugins/my-plugin/server/plugin.ts +setup(core: CoreSetup){ + core.uiSettings.register({ + 'my-plugin:my-setting': { + name: 'just-work', + value: true, + description: 'make it work', + category: ['my-category'], + schema: schema.boolean(), + }, + }) +} +``` \ No newline at end of file diff --git a/src/legacy/ui/public/assets/favicons/android-chrome-192x192.png b/src/core/server/core_app/assets/favicons/android-chrome-192x192.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/android-chrome-192x192.png rename to src/core/server/core_app/assets/favicons/android-chrome-192x192.png diff --git a/src/legacy/ui/public/assets/favicons/android-chrome-256x256.png b/src/core/server/core_app/assets/favicons/android-chrome-256x256.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/android-chrome-256x256.png rename to src/core/server/core_app/assets/favicons/android-chrome-256x256.png diff --git a/src/legacy/ui/public/assets/favicons/android-chrome-512x512.png b/src/core/server/core_app/assets/favicons/android-chrome-512x512.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/android-chrome-512x512.png rename to src/core/server/core_app/assets/favicons/android-chrome-512x512.png diff --git a/src/legacy/ui/public/assets/favicons/apple-touch-icon.png b/src/core/server/core_app/assets/favicons/apple-touch-icon.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/apple-touch-icon.png rename to src/core/server/core_app/assets/favicons/apple-touch-icon.png diff --git a/src/legacy/ui/public/assets/favicons/browserconfig.xml b/src/core/server/core_app/assets/favicons/browserconfig.xml similarity index 100% rename from src/legacy/ui/public/assets/favicons/browserconfig.xml rename to src/core/server/core_app/assets/favicons/browserconfig.xml diff --git a/src/legacy/ui/public/assets/favicons/favicon-16x16.png b/src/core/server/core_app/assets/favicons/favicon-16x16.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/favicon-16x16.png rename to src/core/server/core_app/assets/favicons/favicon-16x16.png diff --git a/src/legacy/ui/public/assets/favicons/favicon-32x32.png b/src/core/server/core_app/assets/favicons/favicon-32x32.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/favicon-32x32.png rename to src/core/server/core_app/assets/favicons/favicon-32x32.png diff --git a/src/legacy/ui/public/assets/favicons/favicon.ico b/src/core/server/core_app/assets/favicons/favicon.ico similarity index 100% rename from src/legacy/ui/public/assets/favicons/favicon.ico rename to src/core/server/core_app/assets/favicons/favicon.ico diff --git a/src/legacy/ui/public/assets/favicons/manifest.json b/src/core/server/core_app/assets/favicons/manifest.json similarity index 100% rename from src/legacy/ui/public/assets/favicons/manifest.json rename to src/core/server/core_app/assets/favicons/manifest.json diff --git a/src/legacy/ui/public/assets/favicons/mstile-144x144.png b/src/core/server/core_app/assets/favicons/mstile-144x144.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/mstile-144x144.png rename to src/core/server/core_app/assets/favicons/mstile-144x144.png diff --git a/src/legacy/ui/public/assets/favicons/mstile-150x150.png b/src/core/server/core_app/assets/favicons/mstile-150x150.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/mstile-150x150.png rename to src/core/server/core_app/assets/favicons/mstile-150x150.png diff --git a/src/legacy/ui/public/assets/favicons/mstile-310x150.png b/src/core/server/core_app/assets/favicons/mstile-310x150.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/mstile-310x150.png rename to src/core/server/core_app/assets/favicons/mstile-310x150.png diff --git a/src/legacy/ui/public/assets/favicons/mstile-310x310.png b/src/core/server/core_app/assets/favicons/mstile-310x310.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/mstile-310x310.png rename to src/core/server/core_app/assets/favicons/mstile-310x310.png diff --git a/src/legacy/ui/public/assets/favicons/mstile-70x70.png b/src/core/server/core_app/assets/favicons/mstile-70x70.png similarity index 100% rename from src/legacy/ui/public/assets/favicons/mstile-70x70.png rename to src/core/server/core_app/assets/favicons/mstile-70x70.png diff --git a/src/legacy/ui/public/assets/favicons/safari-pinned-tab.svg b/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg similarity index 100% rename from src/legacy/ui/public/assets/favicons/safari-pinned-tab.svg rename to src/core/server/core_app/assets/favicons/safari-pinned-tab.svg diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Black.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Black.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Black.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Black.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Black.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Black.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Black.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Black.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BlackItalic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Bold.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Bold.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Bold.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Bold.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Bold.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Bold.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Bold.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Bold.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-BoldItalic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBold.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraBoldItalic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLight-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ExtraLightItalic-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Italic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Italic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Italic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Italic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Italic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Italic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Italic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Italic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Light-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-LightItalic-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Medium.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Medium.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Medium.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Medium.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Medium.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Medium.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Medium.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Medium.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-MediumItalic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Regular.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Regular.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Regular.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Regular.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Regular.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Regular.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Regular.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Regular.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBold.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBold.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBold.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBold.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBold.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBold.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBold.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBold.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-SemiBoldItalic.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-Thin-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-ThinItalic-BETA.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-italic.var.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-italic.var.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-italic.var.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-italic.var.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-upright.var.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-upright.var.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI-upright.var.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI-upright.var.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI.var.woff2 b/src/core/server/core_app/assets/fonts/inter_ui/Inter-UI.var.woff2 similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/Inter-UI.var.woff2 rename to src/core/server/core_app/assets/fonts/inter_ui/Inter-UI.var.woff2 diff --git a/src/legacy/ui/public/assets/fonts/inter_ui/LICENSE.txt b/src/core/server/core_app/assets/fonts/inter_ui/LICENSE.txt similarity index 100% rename from src/legacy/ui/public/assets/fonts/inter_ui/LICENSE.txt rename to src/core/server/core_app/assets/fonts/inter_ui/LICENSE.txt diff --git a/src/legacy/ui/public/assets/fonts/readme.md b/src/core/server/core_app/assets/fonts/readme.md similarity index 100% rename from src/legacy/ui/public/assets/fonts/readme.md rename to src/core/server/core_app/assets/fonts/readme.md diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/LICENSE.txt b/src/core/server/core_app/assets/fonts/roboto_mono/LICENSE.txt similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/LICENSE.txt rename to src/core/server/core_app/assets/fonts/roboto_mono/LICENSE.txt diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Bold.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Bold.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Bold.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Bold.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-BoldItalic.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-BoldItalic.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-BoldItalic.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-BoldItalic.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Italic.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Italic.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Italic.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Italic.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Light.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Light.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Light.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Light.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-LightItalic.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-LightItalic.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-LightItalic.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-LightItalic.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Medium.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Medium.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Medium.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Medium.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-MediumItalic.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-MediumItalic.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-MediumItalic.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-MediumItalic.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Regular.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Regular.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Regular.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Regular.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Thin.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Thin.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-Thin.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-Thin.ttf diff --git a/src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-ThinItalic.ttf b/src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-ThinItalic.ttf similarity index 100% rename from src/legacy/ui/public/assets/fonts/roboto_mono/RobotoMono-ThinItalic.ttf rename to src/core/server/core_app/assets/fonts/roboto_mono/RobotoMono-ThinItalic.ttf diff --git a/src/legacy/ui/public/assets/images/bg_bottom_branded.svg b/src/core/server/core_app/assets/images/bg_bottom_branded.svg similarity index 100% rename from src/legacy/ui/public/assets/images/bg_bottom_branded.svg rename to src/core/server/core_app/assets/images/bg_bottom_branded.svg diff --git a/src/legacy/ui/public/assets/images/bg_bottom_branded_dark.svg b/src/core/server/core_app/assets/images/bg_bottom_branded_dark.svg similarity index 100% rename from src/legacy/ui/public/assets/images/bg_bottom_branded_dark.svg rename to src/core/server/core_app/assets/images/bg_bottom_branded_dark.svg diff --git a/src/legacy/ui/public/assets/images/bg_top_branded.svg b/src/core/server/core_app/assets/images/bg_top_branded.svg similarity index 100% rename from src/legacy/ui/public/assets/images/bg_top_branded.svg rename to src/core/server/core_app/assets/images/bg_top_branded.svg diff --git a/src/legacy/ui/public/assets/images/bg_top_branded_dark.svg b/src/core/server/core_app/assets/images/bg_top_branded_dark.svg similarity index 100% rename from src/legacy/ui/public/assets/images/bg_top_branded_dark.svg rename to src/core/server/core_app/assets/images/bg_top_branded_dark.svg diff --git a/src/legacy/ui/public/assets/images/kibana.svg b/src/core/server/core_app/assets/images/kibana.svg similarity index 100% rename from src/legacy/ui/public/assets/images/kibana.svg rename to src/core/server/core_app/assets/images/kibana.svg diff --git a/src/core/server/core_app/core_app.ts b/src/core/server/core_app/core_app.ts index 2f8c85f47a76e..5e1a3794632ee 100644 --- a/src/core/server/core_app/core_app.ts +++ b/src/core/server/core_app/core_app.ts @@ -16,6 +16,9 @@ * specific language governing permissions and limitations * under the License. */ +import Path from 'path'; +import { fromRoot } from '../../../core/server/utils'; + import { InternalCoreSetup } from '../internal_types'; import { CoreContext } from '../core_context'; import { Logger } from '../logging'; @@ -29,6 +32,7 @@ export class CoreApp { setup(coreSetup: InternalCoreSetup) { this.logger.debug('Setting up core app.'); this.registerDefaultRoutes(coreSetup); + this.registerStaticDirs(coreSetup); } private registerDefaultRoutes(coreSetup: InternalCoreSetup) { @@ -49,4 +53,12 @@ export class CoreApp { res.ok({ body: { version: '0.0.1' } }) ); } + private registerStaticDirs(coreSetup: InternalCoreSetup) { + coreSetup.http.registerStaticDir('/ui/{path*}', Path.resolve(__dirname, './assets')); + + coreSetup.http.registerStaticDir( + '/node_modules/@kbn/ui-framework/dist/{path*}', + fromRoot('node_modules/@kbn/ui-framework/dist') + ); + } } diff --git a/src/core/server/core_app/integration_tests/static_assets.test.ts b/src/core/server/core_app/integration_tests/static_assets.test.ts new file mode 100644 index 0000000000000..aad2510ef8c0e --- /dev/null +++ b/src/core/server/core_app/integration_tests/static_assets.test.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import * as kbnTestServer from '../../../../test_utils/kbn_server'; +import { Root } from '../../root'; + +describe('Platform assets', function() { + let root: Root; + + beforeAll(async function() { + root = kbnTestServer.createRoot(); + + await root.setup(); + await root.start(); + }); + + afterAll(async function() { + await root.shutdown(); + }); + + it('exposes static assets', async () => { + await kbnTestServer.request.get(root, '/ui/favicons/favicon.ico').expect(200); + }); + + it('returns 404 if not found', async function() { + await kbnTestServer.request.get(root, '/ui/favicons/not-a-favicon.ico').expect(404); + }); + + it('does not expose folder content', async function() { + await kbnTestServer.request.get(root, '/ui/favicons/').expect(403); + }); + + it('does not allow file tree traversing', async function() { + await kbnTestServer.request.get(root, '/ui/../../../../../README.md').expect(404); + }); +}); diff --git a/src/core/server/http/base_path_proxy_server.ts b/src/core/server/http/base_path_proxy_server.ts index e418726465efa..acefbd00ae2be 100644 --- a/src/core/server/http/base_path_proxy_server.ts +++ b/src/core/server/http/base_path_proxy_server.ts @@ -23,6 +23,7 @@ import { Agent as HttpsAgent, ServerOptions as TlsOptions } from 'https'; import apm from 'elastic-apm-node'; import { ByteSizeValue } from '@kbn/config-schema'; import { Server, Request, ResponseToolkit } from 'hapi'; +import HapiProxy from 'h2o2'; import { sample } from 'lodash'; import BrowserslistUserAgent from 'browserslist-useragent'; import * as Rx from 'rxjs'; @@ -102,7 +103,7 @@ export class BasePathProxyServer { // Register hapi plugin that adds proxying functionality. It can be configured // through the route configuration object (see { handler: { proxy: ... } }). - await this.server.register({ plugin: require('h2o2') }); + await this.server.register([HapiProxy]); if (this.httpConfig.ssl.enabled) { const tlsOptions = serverOptions.tls as TlsOptions; @@ -166,7 +167,8 @@ export class BasePathProxyServer { host: this.server.info.host, passThrough: true, port: this.devConfig.basePathProxyTargetPort, - protocol: this.server.info.protocol, + // typings mismatch. h2o2 doesn't support "socket" + protocol: this.server.info.protocol as HapiProxy.ProxyHandlerOptions['protocol'], xforward: true, }, }, @@ -195,7 +197,7 @@ export class BasePathProxyServer { agent: this.httpsAgent, passThrough: true, xforward: true, - mapUri: (request: Request) => ({ + mapUri: async (request: Request) => ({ uri: Url.format({ hostname: request.server.info.host, port: this.devConfig.basePathProxyTargetPort, diff --git a/src/core/server/http/http_server.ts b/src/core/server/http/http_server.ts index f898ed0ea1a99..77d3d99fb48cb 100644 --- a/src/core/server/http/http_server.ts +++ b/src/core/server/http/http_server.ts @@ -17,6 +17,7 @@ * under the License. */ import { Server } from 'hapi'; +import HapiStaticFiles from 'inert'; import url from 'url'; import { Logger, LoggerFactory } from '../logging'; @@ -44,6 +45,7 @@ export interface HttpServerSetup { * @param router {@link IRouter} - a router with registered route handlers. */ registerRouter: (router: IRouter) => void; + registerStaticDir: (path: string, dirPath: string) => void; basePath: HttpServiceSetup['basePath']; csp: HttpServiceSetup['csp']; createCookieSessionStorageFactory: HttpServiceSetup['createCookieSessionStorageFactory']; @@ -97,10 +99,11 @@ export class HttpServer { this.registeredRouters.add(router); } - public setup(config: HttpConfig): HttpServerSetup { + public async setup(config: HttpConfig): Promise<HttpServerSetup> { const serverOptions = getServerOptions(config); const listenerOptions = getListenerOptions(config); this.server = createServer(serverOptions, listenerOptions); + await this.server.register([HapiStaticFiles]); this.config = config; const basePathService = new BasePath(config.basePath); @@ -109,6 +112,7 @@ export class HttpServer { return { registerRouter: this.registerRouter.bind(this), + registerStaticDir: this.registerStaticDir.bind(this), registerOnPreAuth: this.registerOnPreAuth.bind(this), registerOnPostAuth: this.registerOnPostAuth.bind(this), registerOnPreResponse: this.registerOnPreResponse.bind(this), @@ -339,4 +343,23 @@ export class HttpServer { return t.next({ headers: authResponseHeaders }); }); } + + private registerStaticDir(path: string, dirPath: string) { + if (this.server === undefined) { + throw new Error('Http server is not setup up yet'); + } + + this.server.route({ + path, + method: 'GET', + handler: { + directory: { + path: dirPath, + listing: false, + lookupCompressed: true, + }, + }, + options: { auth: false }, + }); + } } diff --git a/src/core/server/http/http_service.mock.ts b/src/core/server/http/http_service.mock.ts index 442bc93190d86..0788a8f2af7a1 100644 --- a/src/core/server/http/http_service.mock.ts +++ b/src/core/server/http/http_service.mock.ts @@ -72,6 +72,7 @@ const createSetupContractMock = () => { registerRouteHandlerContext: jest.fn(), registerOnPreResponse: jest.fn(), createRouter: jest.fn().mockImplementation(() => mockRouter.create({})), + registerStaticDir: jest.fn(), basePath: createBasePathMock(), csp: CspConfig.DEFAULT, auth: createAuthMock(), diff --git a/src/core/server/http/http_tools.test.ts b/src/core/server/http/http_tools.test.ts index c1322a5aa94db..bdaab4f2999ed 100644 --- a/src/core/server/http/http_tools.test.ts +++ b/src/core/server/http/http_tools.test.ts @@ -18,6 +18,8 @@ */ jest.mock('fs', () => ({ + // Hapi Inert patches native methods + ...jest.requireActual('fs'), readFileSync: jest.fn(), })); diff --git a/src/core/server/http/types.ts b/src/core/server/http/types.ts index 6327844108055..4be7e59acb7b9 100644 --- a/src/core/server/http/types.ts +++ b/src/core/server/http/types.ts @@ -265,6 +265,7 @@ export interface InternalHttpServiceSetup auth: HttpServerSetup['auth']; server: HttpServerSetup['server']; createRouter: (path: string, plugin?: PluginOpaqueId) => IRouter; + registerStaticDir: (path: string, dirPath: string) => void; getAuthHeaders: GetAuthHeaders; registerRouteHandlerContext: <T extends keyof RequestHandlerContext>( pluginOpaqueId: PluginOpaqueId, diff --git a/src/core/server/legacy/legacy_service.test.ts b/src/core/server/legacy/legacy_service.test.ts index ef31be559b30b..c6860086e7784 100644 --- a/src/core/server/legacy/legacy_service.test.ts +++ b/src/core/server/legacy/legacy_service.test.ts @@ -91,7 +91,15 @@ beforeEach(() => { contracts: new Map([['plugin-id', 'plugin-value']]), uiPlugins: { public: new Map([['plugin-id', {} as DiscoveredPlugin]]), - internal: new Map([['plugin-id', { publicTargetDir: 'path/to/target/public' }]]), + internal: new Map([ + [ + 'plugin-id', + { + publicTargetDir: 'path/to/target/public', + publicAssetsDir: '/plugins/name/assets/', + }, + ], + ]), browserConfigs: new Map(), }, }, diff --git a/src/core/server/legacy/legacy_service.ts b/src/core/server/legacy/legacy_service.ts index 361fade6a4d0c..bb5f6d5617aae 100644 --- a/src/core/server/legacy/legacy_service.ts +++ b/src/core/server/legacy/legacy_service.ts @@ -334,6 +334,9 @@ export class LegacyService implements CoreService { plugins: startDeps.plugins, }, __internals: { + http: { + registerStaticDir: setupDeps.core.http.registerStaticDir, + }, hapiServer: setupDeps.core.http.server, kibanaMigrator: startDeps.core.savedObjects.migrator, uiPlugins: setupDeps.core.plugins.uiPlugins, diff --git a/src/core/server/plugins/plugins_service.test.ts b/src/core/server/plugins/plugins_service.test.ts index 4f69a2b4156be..14147ab9f2a8d 100644 --- a/src/core/server/plugins/plugins_service.test.ts +++ b/src/core/server/plugins/plugins_service.test.ts @@ -540,13 +540,15 @@ describe('PluginsService', () => { it('includes disabled plugins', async () => { config$.next({ plugins: { initialize: true }, plugin1: { enabled: false } }); await pluginsService.discover(); - const { uiPlugins } = await pluginsService.setup({} as any); + const { uiPlugins } = await pluginsService.setup(setupDeps); expect(uiPlugins.internal).toMatchInlineSnapshot(` Map { "plugin-1" => Object { + "publicAssetsDir": <absolute path>/path-1/public/assets, "publicTargetDir": <absolute path>/path-1/target/public, }, "plugin-2" => Object { + "publicAssetsDir": <absolute path>/path-2/public/assets, "publicTargetDir": <absolute path>/path-2/target/public, }, } @@ -558,7 +560,7 @@ describe('PluginsService', () => { it('does initialize if plugins.initialize is true', async () => { config$.next({ plugins: { initialize: true } }); await pluginsService.discover(); - const { initialized } = await pluginsService.setup({} as any); + const { initialized } = await pluginsService.setup(setupDeps); expect(mockPluginSystem.setupPlugins).toHaveBeenCalled(); expect(initialized).toBe(true); }); @@ -566,7 +568,7 @@ describe('PluginsService', () => { it('does not initialize if plugins.initialize is false', async () => { config$.next({ plugins: { initialize: false } }); await pluginsService.discover(); - const { initialized } = await pluginsService.setup({} as any); + const { initialized } = await pluginsService.setup(setupDeps); expect(mockPluginSystem.setupPlugins).not.toHaveBeenCalled(); expect(initialized).toBe(false); }); diff --git a/src/core/server/plugins/plugins_service.ts b/src/core/server/plugins/plugins_service.ts index 9987d1633c502..a0ecee47c675f 100644 --- a/src/core/server/plugins/plugins_service.ts +++ b/src/core/server/plugins/plugins_service.ts @@ -110,6 +110,7 @@ export class PluginsService implements CoreService<PluginsServiceSetup, PluginsS const initialize = config.initialize && !this.coreContext.env.isDevClusterMaster; if (initialize) { contracts = await this.pluginsSystem.setupPlugins(deps); + this.registerPluginStaticDirs(deps); } else { this.log.info('Plugin initialization disabled.'); } @@ -223,6 +224,7 @@ export class PluginsService implements CoreService<PluginsServiceSetup, PluginsS if (plugin.includesUiPlugin) { this.uiPluginInternalInfo.set(plugin.name, { publicTargetDir: Path.resolve(plugin.path, 'target/public'), + publicAssetsDir: Path.resolve(plugin.path, 'public/assets'), }); } @@ -262,4 +264,13 @@ export class PluginsService implements CoreService<PluginsServiceSetup, PluginsS ) ); } + + private registerPluginStaticDirs(deps: PluginsServiceSetupDeps) { + for (const [pluginName, pluginInfo] of this.uiPluginInternalInfo) { + deps.http.registerStaticDir( + `/plugins/${pluginName}/assets/{path*}`, + pluginInfo.publicAssetsDir + ); + } + } } diff --git a/src/core/server/plugins/types.ts b/src/core/server/plugins/types.ts index 100e3c2288dbf..4fa4e1780e596 100644 --- a/src/core/server/plugins/types.ts +++ b/src/core/server/plugins/types.ts @@ -194,6 +194,10 @@ export interface InternalPluginInfo { * served */ readonly publicTargetDir: string; + /** + * Path to the plugin assets directory. + */ + readonly publicAssetsDir: string; } /** diff --git a/src/core/server/saved_objects/index.ts b/src/core/server/saved_objects/index.ts index 0af8ea7d0e830..b50e47b9eab73 100644 --- a/src/core/server/saved_objects/index.ts +++ b/src/core/server/saved_objects/index.ts @@ -21,8 +21,6 @@ export * from './service'; export { SavedObjectsSchema } from './schema'; -export { SavedObjectsManagement } from './management'; - export * from './import'; export { diff --git a/src/core/server/saved_objects/service/index.ts b/src/core/server/saved_objects/service/index.ts index 9f625b4732e26..f44824238aa21 100644 --- a/src/core/server/saved_objects/service/index.ts +++ b/src/core/server/saved_objects/service/index.ts @@ -36,6 +36,7 @@ export interface SavedObjectsLegacyService { getScopedSavedObjectsClient: SavedObjectsClientProvider['getClient']; SavedObjectsClient: typeof SavedObjectsClient; types: string[]; + importAndExportableTypes: string[]; schema: SavedObjectsSchema; getSavedObjectsRepository(...rest: any[]): any; importExport: { diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 9317481ae2f8f..e4e2b8d7adbb7 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -2028,6 +2028,8 @@ export interface SavedObjectsLegacyService { // (undocumented) getScopedSavedObjectsClient: SavedObjectsClientProvider['getClient']; // (undocumented) + importAndExportableTypes: string[]; + // (undocumented) importExport: { objectLimit: number; importSavedObjects(options: SavedObjectsImportOptions): Promise<SavedObjectsImportResponse>; @@ -2348,8 +2350,8 @@ export const validBodyOutput: readonly ["data", "stream"]; // src/core/server/legacy/types.ts:165:3 - (ae-forgotten-export) The symbol "LegacyAppSpec" needs to be exported by the entry point index.d.ts // src/core/server/legacy/types.ts:166:16 - (ae-forgotten-export) The symbol "LegacyPluginSpec" needs to be exported by the entry point index.d.ts // src/core/server/plugins/plugins_service.ts:47:5 - (ae-forgotten-export) The symbol "InternalPluginInfo" needs to be exported by the entry point index.d.ts -// src/core/server/plugins/types.ts:226:3 - (ae-forgotten-export) The symbol "KibanaConfigType" needs to be exported by the entry point index.d.ts -// src/core/server/plugins/types.ts:226:3 - (ae-forgotten-export) The symbol "SharedGlobalConfigKeys" needs to be exported by the entry point index.d.ts -// src/core/server/plugins/types.ts:228:3 - (ae-forgotten-export) The symbol "PathConfigType" needs to be exported by the entry point index.d.ts +// src/core/server/plugins/types.ts:230:3 - (ae-forgotten-export) The symbol "KibanaConfigType" needs to be exported by the entry point index.d.ts +// src/core/server/plugins/types.ts:230:3 - (ae-forgotten-export) The symbol "SharedGlobalConfigKeys" needs to be exported by the entry point index.d.ts +// src/core/server/plugins/types.ts:232:3 - (ae-forgotten-export) The symbol "PathConfigType" needs to be exported by the entry point index.d.ts ``` diff --git a/src/dev/build/tasks/nodejs/__tests__/download.js b/src/dev/build/tasks/nodejs/__tests__/download.js index c76ff15b89289..81ed7a6195ae7 100644 --- a/src/dev/build/tasks/nodejs/__tests__/download.js +++ b/src/dev/build/tasks/nodejs/__tests__/download.js @@ -18,27 +18,39 @@ */ import { createServer } from 'http'; -import { resolve } from 'path'; -import { readFileSync } from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; +import { mkdirp, readFileSync } from 'fs-extra'; import del from 'del'; import sinon from 'sinon'; +import { CI_PARALLEL_PROCESS_PREFIX } from '@kbn/test'; import expect from '@kbn/expect'; import Wreck from '@hapi/wreck'; import { ToolingLog } from '@kbn/dev-utils'; import { download } from '../download'; -const TMP_DESTINATION = resolve(__dirname, '__tmp__'); -beforeEach(async () => { - await del(TMP_DESTINATION); -}); -after(async () => { - await del(TMP_DESTINATION); -}); +const getTempFolder = async () => { + const dir = join(tmpdir(), CI_PARALLEL_PROCESS_PREFIX, 'download-js-test-tmp-dir'); + console.log(dir); + await mkdirp(dir); + return dir; +}; describe('src/dev/build/tasks/nodejs/download', () => { const sandbox = sinon.createSandbox(); + let TMP_DESTINATION; + let TMP_DIR; + + beforeEach(async () => { + TMP_DIR = await getTempFolder(); + TMP_DESTINATION = join(TMP_DIR, '__tmp_download_js_test_file__'); + }); + + afterEach(async () => { + await del(TMP_DIR, { force: true }); + }); afterEach(() => sandbox.reset()); const onLogLine = sandbox.stub(); diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index ef114f51f3100..1b5110a61cbc4 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -41,7 +41,7 @@ export const IGNORE_FILE_GLOBS = [ '**/.*', '**/{webpackShims,__mocks__}/**/*', 'x-pack/docs/**/*', - 'src/legacy/ui/public/assets/fonts/**/*', + 'src/core/server/core_app/assets/fonts/**/*', 'packages/kbn-utility-types/test-d/**/*', '**/Jenkinsfile*', 'Dockerfile*', @@ -123,18 +123,18 @@ export const TEMPORARILY_IGNORED_PATHS = [ 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/tlConfig.js', 'src/fixtures/config_upgrade_from_4.0.0_to_4.0.1-snapshot.json', 'src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/lib/fixtures/mock_data/terms/_seriesMultiple.js', - 'src/legacy/ui/public/assets/favicons/android-chrome-192x192.png', - 'src/legacy/ui/public/assets/favicons/android-chrome-256x256.png', - 'src/legacy/ui/public/assets/favicons/android-chrome-512x512.png', - 'src/legacy/ui/public/assets/favicons/apple-touch-icon.png', - 'src/legacy/ui/public/assets/favicons/favicon-16x16.png', - 'src/legacy/ui/public/assets/favicons/favicon-32x32.png', - 'src/legacy/ui/public/assets/favicons/mstile-70x70.png', - 'src/legacy/ui/public/assets/favicons/mstile-144x144.png', - 'src/legacy/ui/public/assets/favicons/mstile-150x150.png', - 'src/legacy/ui/public/assets/favicons/mstile-310x150.png', - 'src/legacy/ui/public/assets/favicons/mstile-310x310.png', - 'src/legacy/ui/public/assets/favicons/safari-pinned-tab.svg', + 'src/core/server/core_app/assets/favicons/android-chrome-192x192.png', + 'src/core/server/core_app/assets/favicons/android-chrome-256x256.png', + 'src/core/server/core_app/assets/favicons/android-chrome-512x512.png', + 'src/core/server/core_app/assets/favicons/apple-touch-icon.png', + 'src/core/server/core_app/assets/favicons/favicon-16x16.png', + 'src/core/server/core_app/assets/favicons/favicon-32x32.png', + 'src/core/server/core_app/assets/favicons/mstile-70x70.png', + 'src/core/server/core_app/assets/favicons/mstile-144x144.png', + 'src/core/server/core_app/assets/favicons/mstile-150x150.png', + 'src/core/server/core_app/assets/favicons/mstile-310x150.png', + 'src/core/server/core_app/assets/favicons/mstile-310x310.png', + 'src/core/server/core_app/assets/favicons/safari-pinned-tab.svg', 'src/legacy/ui/public/styles/bootstrap/component-animations.less', 'src/legacy/ui/public/styles/bootstrap/input-groups.less', 'src/legacy/ui/public/styles/bootstrap/list-group.less', diff --git a/src/legacy/core_plugins/input_control_vis/index.ts b/src/legacy/core_plugins/input_control_vis/index.ts index d67472ac4b95f..0529aa24dffd7 100644 --- a/src/legacy/core_plugins/input_control_vis/index.ts +++ b/src/legacy/core_plugins/input_control_vis/index.ts @@ -25,7 +25,7 @@ import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy const inputControlVisPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => new Plugin({ id: 'input_control_vis', - require: ['kibana', 'elasticsearch', 'visualizations', 'interpreter'], + require: ['kibana', 'elasticsearch', 'interpreter'], publicDir: resolve(__dirname, 'public'), uiExports: { styleSheetPaths: resolve(__dirname, 'public/index.scss'), diff --git a/src/legacy/core_plugins/input_control_vis/public/components/editor/controls_tab.test.tsx b/src/legacy/core_plugins/input_control_vis/public/components/editor/controls_tab.test.tsx index d7a62e07b26f3..db2af742c70bc 100644 --- a/src/legacy/core_plugins/input_control_vis/public/components/editor/controls_tab.test.tsx +++ b/src/legacy/core_plugins/input_control_vis/public/components/editor/controls_tab.test.tsx @@ -23,7 +23,7 @@ import { shallowWithIntl, mountWithIntl } from 'test_utils/enzyme_helpers'; import { findTestSubject } from '@elastic/eui/lib/test'; import { getDepsMock, getIndexPatternMock } from '../../test_utils'; import { ControlsTab, ControlsTabUiProps } from './controls_tab'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../plugins/visualizations/public'; const indexPatternsMock = { get: getIndexPatternMock, diff --git a/src/legacy/core_plugins/input_control_vis/public/components/editor/options_tab.test.tsx b/src/legacy/core_plugins/input_control_vis/public/components/editor/options_tab.test.tsx index 8c77f1b7c4b4f..639e3d2f68c75 100644 --- a/src/legacy/core_plugins/input_control_vis/public/components/editor/options_tab.test.tsx +++ b/src/legacy/core_plugins/input_control_vis/public/components/editor/options_tab.test.tsx @@ -21,7 +21,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../plugins/visualizations/public'; import { OptionsTab, OptionsTabProps } from './options_tab'; describe('OptionsTab', () => { diff --git a/src/legacy/core_plugins/input_control_vis/public/legacy.ts b/src/legacy/core_plugins/input_control_vis/public/legacy.ts index 438cdffdb323a..67299068819e8 100644 --- a/src/legacy/core_plugins/input_control_vis/public/legacy.ts +++ b/src/legacy/core_plugins/input_control_vis/public/legacy.ts @@ -26,21 +26,17 @@ import { InputControlVisPluginSetupDependencies, InputControlVisPluginStartDependencies, } from './plugin'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../visualizations/public/np_ready/public/legacy'; const setupPlugins: Readonly<InputControlVisPluginSetupDependencies> = { expressions: npSetup.plugins.expressions, data: npSetup.plugins.data, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, }; const startPlugins: Readonly<InputControlVisPluginStartDependencies> = { expressions: npStart.plugins.expressions, data: npStart.plugins.data, - visualizations: visualizationsStart, + visualizations: npStart.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/input_control_vis/public/plugin.ts b/src/legacy/core_plugins/input_control_vis/public/plugin.ts index c45e0d17872ec..b743468065430 100644 --- a/src/legacy/core_plugins/input_control_vis/public/plugin.ts +++ b/src/legacy/core_plugins/input_control_vis/public/plugin.ts @@ -20,7 +20,10 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'kibana/p import { DataPublicPluginSetup, DataPublicPluginStart } from 'src/plugins/data/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup, VisualizationsStart } from '../../visualizations/public'; +import { + VisualizationsSetup, + VisualizationsStart, +} from '../../../../plugins/visualizations/public'; import { createInputControlVisFn } from './input_control_fn'; import { createInputControlVisTypeDefinition } from './input_control_vis_type'; diff --git a/src/legacy/core_plugins/input_control_vis/public/vis_controller.tsx b/src/legacy/core_plugins/input_control_vis/public/vis_controller.tsx index c0ab235c1b9d1..c4a7d286850e3 100644 --- a/src/legacy/core_plugins/input_control_vis/public/vis_controller.tsx +++ b/src/legacy/core_plugins/input_control_vis/public/vis_controller.tsx @@ -31,7 +31,7 @@ import { RangeControl } from './control/range_control_factory'; import { ListControl } from './control/list_control_factory'; import { InputControlVisDependencies } from './plugin'; import { FilterManager, Filter } from '../../../../plugins/data/public'; -import { VisParams, Vis } from '../../visualizations/public'; +import { VisParams, Vis } from '../../../../plugins/visualizations/public'; export const createInputControlVisController = (deps: InputControlVisDependencies) => { return class InputControlVisController { diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 1d772536fa1ea..cac9ef30fba4f 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -24,7 +24,6 @@ import { promisify } from 'util'; import { migrations } from './migrations'; import { importApi } from './server/routes/api/import'; import { exportApi } from './server/routes/api/export'; -import { managementApi } from './server/routes/api/management'; import mappings from './mappings.json'; import { getUiSettingDefaults } from './ui_setting_defaults'; import { registerCspCollector } from './server/lib/csp_usage_collector'; @@ -259,7 +258,6 @@ export default function(kibana) { // routes importApi(server); exportApi(server); - managementApi(server); registerCspCollector(usageCollection, server); server.injectUiAppVars('kibana', () => injectVars(server)); }, diff --git a/src/legacy/core_plugins/kibana/inject_vars.js b/src/legacy/core_plugins/kibana/inject_vars.js index 01623341e4d38..76d1704907ab5 100644 --- a/src/legacy/core_plugins/kibana/inject_vars.js +++ b/src/legacy/core_plugins/kibana/inject_vars.js @@ -20,12 +20,7 @@ export function injectVars(server) { const serverConfig = server.config(); - // Get types that are import and exportable, by default yes unless isImportableAndExportable is set to false - const { types: allTypes } = server.savedObjects; - const savedObjectsManagement = server.getSavedObjectsManagement(); - const importAndExportableTypes = allTypes.filter(type => - savedObjectsManagement.isImportAndExportable(type) - ); + const { importAndExportableTypes } = server.savedObjects; return { importAndExportableTypes, diff --git a/src/legacy/core_plugins/kibana/public/discover/build_services.ts b/src/legacy/core_plugins/kibana/public/discover/build_services.ts index f881eb96e4e81..180ff13cdddc0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/build_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/build_services.ts @@ -36,7 +36,7 @@ import { import { DiscoverStartPlugins } from './plugin'; import { SharePluginStart } from '../../../../../plugins/share/public'; import { ChartsPluginStart } from '../../../../../plugins/charts/public'; -import { VisualizationsStart } from '../../../visualizations/public'; +import { VisualizationsStart } from '../../../../../plugins/visualizations/public'; import { createSavedSearchesLoader, DocViewerComponent, diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index e1ff274911284..2ceb06f325a9e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -47,10 +47,15 @@ export function setServices(newServices: any) { services = newServices; } +export const [getUrlTracker, setUrlTracker] = createGetterSetter<{ + setTrackedUrl: (url: string) => void; +}>('urlTracker'); + // EXPORT legacy static dependencies, should be migrated when available in a new version; export { angular }; export { wrapInI18nContext } from 'ui/i18n'; import { search } from '../../../../../plugins/data/public'; +import { createGetterSetter } from '../../../../../plugins/kibana_utils/common'; export const { getRequestInspectorStats, getResponseInspectorStats, tabifyAggResponse } = search; export { unhashUrl, diff --git a/src/legacy/core_plugins/kibana/public/discover/legacy.ts b/src/legacy/core_plugins/kibana/public/discover/legacy.ts index a1ef646f4fe85..f08fd22c71850 100644 --- a/src/legacy/core_plugins/kibana/public/discover/legacy.ts +++ b/src/legacy/core_plugins/kibana/public/discover/legacy.ts @@ -20,18 +20,8 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; import { plugin } from './index'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../../../core_plugins/visualizations/public/np_ready/public/legacy'; // Legacy compatibility part - to be removed at cutover, replaced by a kibana.json file export const pluginInstance = plugin({} as PluginInitializerContext); -export const setup = pluginInstance.setup(npSetup.core, { - ...npSetup.plugins, - visualizations: visualizationsSetup, -}); -export const start = pluginInstance.start(npStart.core, { - ...npStart.plugins, - visualizations: visualizationsStart, -}); +export const setup = pluginInstance.setup(npSetup.core, npSetup.plugins); +export const start = pluginInstance.start(npStart.core, npStart.plugins); diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html index 2334e33deadba..e9338b8bd57cc 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html @@ -1,4 +1,4 @@ -<discover-app class="app-container"> +<discover-app class="app-container" data-fetch-counter="{{fetchCounter}}"> <h1 class="euiScreenReaderOnly">{{screenTitle}}</h1> <!-- Local nav. --> diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index 8e4e77b2d18a6..630ba22d4f3a6 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -44,6 +44,7 @@ import { getRequestInspectorStats, getResponseInspectorStats, getServices, + getUrlTracker, unhashUrl, subscribeWithScope, tabifyAggResponse, @@ -160,6 +161,9 @@ app.config($routeProvider => { '/management/kibana/objects/savedSearches/' + $route.current.params.id, }, toastNotifications, + onBeforeRedirect() { + getUrlTracker().setTrackedUrl('/discover'); + }, }) ), }); @@ -194,6 +198,8 @@ function discoverController( const savedSearch = $route.current.locals.savedObjects.savedSearch; $scope.searchSource = savedSearch.searchSource; $scope.indexPattern = resolveIndexPatternLoading(); + //used for functional testing + $scope.fetchCounter = 0; const getTimeField = () => { return isDefaultType($scope.indexPattern) ? $scope.indexPattern.timeFieldName : undefined; @@ -275,6 +281,7 @@ function discoverController( filterManager.getUpdates$(), { next: () => { + $scope.state.filters = filterManager.getAppFilters(); $scope.updateDataSource(); }, }, @@ -784,7 +791,7 @@ function discoverController( $scope.opts.fetch = $scope.fetch = function() { // ignore requests to fetch before the app inits if (!init.complete) return; - + $scope.fetchCounter++; $scope.fetchError = undefined; // Abort any in-progress requests before fetching again @@ -821,9 +828,11 @@ function discoverController( }); }; - $scope.updateQuery = function({ query }) { - setAppState({ query }); - $fetchObservable.next(); + $scope.updateQuery = function({ query }, isUpdate = true) { + if (!_.isEqual(query, appStateContainer.getState().query) || isUpdate === false) { + setAppState({ query }); + $fetchObservable.next(); + } }; $scope.updateSavedQueryId = newSavedQueryId => { diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/field_chooser/lib/visualize_url_utils.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/field_chooser/lib/visualize_url_utils.ts index 7ea1863693e0d..21e8e9f5e39a0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/field_chooser/lib/visualize_url_utils.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/field_chooser/lib/visualize_url_utils.ts @@ -84,6 +84,7 @@ export function getMapsAppUrl( // create initial layer descriptor const hasColumns = columns && columns.length && columns[0] !== '_source'; + const supportsClustering = field.aggregatable; mapAppParams.set( 'initialLayers', // @ts-ignore @@ -97,9 +98,10 @@ export function getMapsAppUrl( geoField: field.name, tooltipProperties: hasColumns ? columns : [], indexPatternId: indexPattern.id, + scalingType: supportsClustering ? 'CLUSTERS' : 'LIMIT', }, visible: true, - type: 'VECTOR', + type: supportsClustering ? 'BLENDED_VECTOR' : 'VECTOR', }, ]) ); diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index 42f3ec6726097..fcac7aa74f54a 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -31,7 +31,7 @@ import { registerFeature } from './np_ready/register_feature'; import './kibana_services'; import { EmbeddableStart, EmbeddableSetup } from '../../../../../plugins/embeddable/public'; import { getInnerAngularModule, getInnerAngularModuleEmbeddable } from './get_inner_angular'; -import { setAngularModule, setServices } from './kibana_services'; +import { setAngularModule, setServices, setUrlTracker } from './kibana_services'; import { NavigationPublicPluginStart as NavigationStart } from '../../../../../plugins/navigation/public'; import { ChartsPluginStart } from '../../../../../plugins/charts/public'; import { buildServices } from './build_services'; @@ -45,7 +45,7 @@ import { HomePublicPluginSetup } from '../../../../../plugins/home/public'; import { VisualizationsStart, VisualizationsSetup, -} from '../../../visualizations/public/np_ready/public'; +} from '../../../../../plugins/visualizations/public'; import { createKbnUrlTracker } from '../../../../../plugins/kibana_utils/public'; export interface DiscoverSetupPlugins { @@ -92,7 +92,12 @@ export class DiscoverPlugin implements Plugin<void, void> { public initializeServices?: () => Promise<{ core: CoreStart; plugins: DiscoverStartPlugins }>; setup(core: CoreSetup<DiscoverStartPlugins, void>, plugins: DiscoverSetupPlugins) { - const { appMounted, appUnMounted, stop: stopUrlTracker } = createKbnUrlTracker({ + const { + appMounted, + appUnMounted, + stop: stopUrlTracker, + setActiveUrl: setTrackedUrl, + } = createKbnUrlTracker({ baseUrl: core.http.basePath.prepend('/app/kibana'), defaultSubUrl: '#/discover', storageKey: 'lastUrl:discover', @@ -113,6 +118,7 @@ export class DiscoverPlugin implements Plugin<void, void> { }, ], }); + setUrlTracker({ setTrackedUrl }); this.stopUrlTracking = () => { stopUrlTracker(); }; diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/activemq.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/activemq.svg index 20694ba6e62c7..8d525c23e6801 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/activemq.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/activemq.svg @@ -1,31 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 128 128"> - <defs> - <filter id="a" color-interpolation-filters="sRGB"> - <feFlood flood-opacity=".498" flood-color="#000" result="flood" /> - <feComposite in="flood" in2="SourceGraphic" operator="in" result="composite1" /> - <feGaussianBlur in="composite1" stdDeviation=".2" result="blur" /> - <feOffset dx="1" dy="1" result="offset" /> - <feComposite in="SourceGraphic" in2="offset" result="composite2" /> - </filter> - </defs> - <g filter="url(#a)" fill="#fff" transform="matrix(2.8 0 0 2.8 -90 -305)"> - <path d="M64.697 153.552l-8.352-.05-4.133-7.257 4.218-7.208 8.352.049 4.134 7.257z" /> - <path d="M52.632 146.553l-8.352-.049-4.133-7.257 4.218-7.209 8.352.05 4.134 7.257z" /> - <path d="M64.771 139.589l-8.352-.05-4.133-7.257 4.218-7.208 8.352.05 4.134 7.257z" /> - <path d="M64.765 125.702l-8.351-.049-4.134-7.257 4.219-7.209 8.352.05 4.133 7.257z" /> - <path d="M52.696 132.676l-8.352-.049-4.133-7.257 4.218-7.209 8.352.05 4.133 7.257z" /> - </g> - <g transform="matrix(2.8 0 0 2.8 -90 -305)"> - <path d="M64.266 138.661l-7.296-.022-3.628-6.33L57.009 126l7.297.023 3.628 6.33z" fill="#c12766" /> - <path d="M52.127 145.626l-7.296-.023-3.628-6.33 3.667-6.307 7.296.022 3.629 6.33z" fill="#3e489f" /> - <path d="M64.19 152.624l-7.295-.023-3.629-6.33 3.668-6.307 7.296.023 3.629 6.33z" fill="#714099" /> - <path d="M52.191 131.749l-7.296-.023-3.629-6.33 3.668-6.307 7.296.022 3.629 6.33z" fill="#78932c" /> - <path d="M64.26 124.775l-7.296-.023-3.628-6.33 3.668-6.307 7.296.022 3.628 6.33z" fill="#cf242a" /> - <circle cy="146.294" cx="60.564" r="1.6" fill="#fff" /> - <path d="M61.748 117.71l-14.267 8.174M48.514 124.197l.048 16.442M47.525 138.715l14.136 8.397M60.59 117.133l.048 16.442M60.657 131.093l.048 16.442M61.766 131.708l-14.267 8.174M47.564 124.84l14.136 8.398" fill="none" stroke="#fff" stroke-width=".524" /> - <circle cy="139.242" cx="48.334" r="1.6" fill="#fff" /> - <circle cy="132.486" cx="60.901" r="1.6" fill="#fff" /> - <circle cy="125.419" cx="48.563" r="1.6" fill="#fff" /> - <circle cy="118.445" cx="60.632" r="1.6" fill="#fff" /> - </g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 128 128"><defs><filter id="a" color-interpolation-filters="sRGB"><feFlood flood-opacity=".498" flood-color="#000" result="flood"/><feComposite in="flood" in2="SourceGraphic" operator="in" result="composite1"/><feGaussianBlur in="composite1" stdDeviation=".2" result="blur"/><feOffset dx="1" dy="1" result="offset"/><feComposite in="SourceGraphic" in2="offset" result="composite2"/></filter></defs><g filter="url(#a)" fill="#fff" transform="matrix(2.8 0 0 2.8 -90 -305)"><path d="M64.697 153.552l-8.352-.05-4.133-7.257 4.218-7.208 8.352.049 4.134 7.257z"/><path d="M52.632 146.553l-8.352-.049-4.133-7.257 4.218-7.209 8.352.05 4.134 7.257z"/><path d="M64.771 139.589l-8.352-.05-4.133-7.257 4.218-7.208 8.352.05 4.134 7.257z"/><path d="M64.765 125.702l-8.351-.049-4.134-7.257 4.219-7.209 8.352.05 4.133 7.257z"/><path d="M52.696 132.676l-8.352-.049-4.133-7.257 4.218-7.209 8.352.05 4.133 7.257z"/></g><g transform="matrix(2.8 0 0 2.8 -90 -305)"><path d="M64.266 138.661l-7.296-.022-3.628-6.33L57.009 126l7.297.023 3.628 6.33z" fill="#c12766"/><path d="M52.127 145.626l-7.296-.023-3.628-6.33 3.667-6.307 7.296.022 3.629 6.33z" fill="#3e489f"/><path d="M64.19 152.624l-7.295-.023-3.629-6.33 3.668-6.307 7.296.023 3.629 6.33z" fill="#714099"/><path d="M52.191 131.749l-7.296-.023-3.629-6.33 3.668-6.307 7.296.022 3.629 6.33z" fill="#78932c"/><path d="M64.26 124.775l-7.296-.023-3.628-6.33 3.668-6.307 7.296.022 3.628 6.33z" fill="#cf242a"/><circle cy="146.294" cx="60.564" r="1.6" fill="#fff"/><path d="M61.748 117.71l-14.267 8.174m1.033-1.687l.048 16.442m-1.037-1.924l14.136 8.397m-1.071-29.979l.048 16.442m.019-2.482l.048 16.442m1.061-15.827l-14.267 8.174m.065-15.042l14.136 8.398" fill="none" stroke="#fff" stroke-width=".524"/><circle cy="139.242" cx="48.334" r="1.6" fill="#fff"/><circle cy="132.486" cx="60.901" r="1.6" fill="#fff"/><circle cy="125.419" cx="48.563" r="1.6" fill="#fff"/><circle cy="118.445" cx="60.632" r="1.6" fill="#fff"/></g></svg> \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/azure.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/azure.svg index f8df12ba05c50..a93c83b4b4ae0 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/azure.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/azure.svg @@ -1,17 +1 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" - "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> -<svg version="1.0" xmlns="http://www.w3.org/2000/svg" - width="251.000000pt" height="200.000000pt" viewBox="0 0 251.000000 200.000000" - preserveAspectRatio="xMidYMid meet"> - -<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)" -fill="#000000" stroke="none"> -<path d="M993 1670 l-358 -311 -309 -552 c-169 -304 -310 -558 -313 -564 -4 --10 55 -13 275 -13 l279 0 363 803 c200 441 378 835 397 875 18 39 31 72 29 -72 -2 0 -165 -140 -363 -310z"/> -<path d="M1462 1819 c-5 -13 -76 -212 -157 -441 l-147 -417 300 -378 c192 --241 297 -380 289 -384 -7 -3 -260 -48 -564 -100 l-552 -94 931 -3 c512 -1 -933 0 936 2 2 3 -228 417 -512 922 -450 800 -517 914 -524 893z"/> -</g> -</svg> +<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="334.667" height="266.667" viewBox="0 0 251 200"><path d="M99.3 33L63.5 64.1l-30.9 55.2c-16.9 30.4-31 55.8-31.3 56.4-.4 1 5.5 1.3 27.5 1.3h27.9L93 96.7c20-44.1 37.8-83.5 39.7-87.5 1.8-3.9 3.1-7.2 2.9-7.2-.2 0-16.5 14-36.3 31zM146.2 18.1c-.5 1.3-7.6 21.2-15.7 44.1l-14.7 41.7 30 37.8c19.2 24.1 29.7 38 28.9 38.4-.7.3-26 4.8-56.4 10l-55.2 9.4 93.1.3c51.2.1 93.3 0 93.6-.2.2-.3-22.8-41.7-51.2-92.2-45-80-51.7-91.4-52.4-89.3z"/></svg> \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cisco.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cisco.svg new file mode 100644 index 0000000000000..20ebebf19741e --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cisco.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216" height="216" fill="#049fd9"><g transform="translate(0 50.059)"><path d="M106.48 76.238c-.282-.077-4.621-1.196-9.232-1.196-8.73 0-13.986 4.714-13.986 11.734 0 6.214 4.397 9.313 9.674 10.98.585.193 1.447.463 2.021.653 2.349.739 4.224 1.837 4.224 3.739 0 2.127-2.167 3.504-6.878 3.504-4.14 0-8.109-1.184-8.945-1.395v8.637c.466.099 5.183 1.025 10.222 1.025 7.248 0 15.539-3.167 15.539-12.595 0-4.573-2.8-8.783-8.947-10.737l-2.613-.832c-1.559-.492-4.342-1.289-4.342-3.574 0-1.805 2.062-3.076 5.859-3.076 3.276 0 7.263 1.101 7.404 1.145zm80.041 18.243c0 5.461-4.183 9.879-9.796 9.879-5.619 0-9.791-4.418-9.791-9.879 0-5.45 4.172-9.87 9.791-9.87 5.613 0 9.796 4.42 9.796 9.87m-9.796-19.427c-11.544 0-19.823 8.707-19.823 19.427 0 10.737 8.279 19.438 19.823 19.438 11.543 0 19.834-8.701 19.834-19.438 0-10.72-8.291-19.427-19.834-19.427M70.561 113.251h-9.472V75.719h9.472"/><path id="a" d="M48.07 76.399c-.89-.264-4.18-1.345-8.636-1.345-11.526 0-19.987 8.218-19.987 19.427 0 12.093 9.34 19.438 19.987 19.438 4.23 0 7.459-1.002 8.636-1.336v-10.075c-.407.226-3.503 1.992-7.957 1.992-6.31 0-10.38-4.441-10.38-10.019 0-5.748 4.246-10.011 10.38-10.011 4.53 0 7.576 1.805 7.957 2.004"/><use transform="translate(98.86)" xlink:href="#a" width="100%" height="100%"/><g id="c"><path id="b" d="M61.061 4.759c0-2.587-2.113-4.685-4.703-4.685-2.589 0-4.702 2.098-4.702 4.685v49.84a4.701 4.701 0 004.702 4.699 4.701 4.701 0 004.703-4.699zM35.232 22.451c0-2.586-2.112-4.687-4.702-4.687s-4.702 2.101-4.702 4.687v22.785a4.701 4.701 0 004.702 4.699 4.701 4.701 0 004.702-4.699zM9.404 35.383c0-2.587-2.112-4.684-4.702-4.684C2.115 30.699 0 32.796 0 35.383v9.853a4.703 4.703 0 009.404 0"/><use transform="matrix(-1 0 0 1 112.717 0)" xlink:href="#b" width="100%" height="100%"/></g><use transform="matrix(-1 0 0 1 216 0)" xlink:href="#c" width="100%" height="100%"/></g></svg> \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cockroachdb.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cockroachdb.svg index 72f0958f52824..08a4bdabb380f 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cockroachdb.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/cockroachdb.svg @@ -1,666 +1 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> - -<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" - version="1.1" - id="Layer_1" - x="0px" - y="0px" - viewBox="-12.06 13.62 35.251247 35.398594" - xml:space="preserve" - sodipodi:docname="cockroachdb-logo.svg" - width="35.251247" - height="35.398594" - inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata - id="metadata32"><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></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs30"> - - <defs - id="defs9"> - <filter - height="71.5" - width="56.200001" - y="41.400002" - x="555.70001" - filterUnits="userSpaceOnUse" - id="Adobe_OpacityMaskFilter"> - <feColorMatrix - id="feColorMatrix6" - values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" - type="matrix" /> - </filter> - </defs> - <mask - id="b_1_" - height="71.5" - width="56.2" - y="41.4" - x="555.7" - maskUnits="userSpaceOnUse"> - <g - style="filter:url(#Adobe_OpacityMaskFilter)" - id="g12" - class="st549"> - <path - style="fill:#ffffff" - inkscape:connector-curvature="0" - d="M 306.3,12.4 H 0.8 V 133.3 H 611.9 V 12.4 Z" - class="st550" - id="a_1_" /> - </g> - </mask> - - - - - -</defs><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1025" - id="namedview28" - showgrid="false" - inkscape:zoom="3.2474375" - inkscape:cx="122.58339" - inkscape:cy="-49.295899" - inkscape:window-x="6" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="Layer_1" - fit-margin-top="1" - fit-margin-left="1" - fit-margin-right="1" - fit-margin-bottom="1" /> -<style - type="text/css" - id="style2"> - .st0{fill:#4A8FE1;} - .st1{fill:#FEFEFE;} - .st2{fill:#716F73;} - .st3{fill:#4D8951;} - .st4{fill:#A6D3EA;} - .st5{fill:#3A3868;} - .st6{fill:#717073;} - .st7{fill:#1B995A;} - .st8{fill:#717B83;} - .st9{fill:#2BA3A4;} - .st10{fill:#717074;} - .st11{fill:#717173;} - .st12{fill:#707B83;} - .st13{fill:#67A3D1;} - .st14{fill:#2B5B68;} - .st15{fill:#B9DCF3;} - .st16{fill:#2A4B38;} - .st17{fill:#83939F;} - .st18{fill:#9DCCE8;} - .st19{fill:#85939C;} - .st20{fill:#82929C;} - .st21{fill:#40A6D5;} - .st22{fill:#2B4B39;} - .st23{fill:#28493A;} - .st24{fill:#2EA3A7;} - .st25{fill:#F8FCFC;} - .st26{fill:#568F52;} - .st27{fill:#94C453;} - .st28{fill:#206289;} - .st29{fill:#F1FBFD;} - .st30{fill:#F6FDFE;} - .st31{fill:#F8FCFB;} - .st32{fill:#FAFDFB;} - .st33{fill:#F4FCFD;} - .st34{fill:#65AC62;} - .st35{fill:#F8FAF3;} - .st36{fill:#5EAD5A;} - .st37{fill:#F6FCFA;} - .st38{fill:#85C5B8;} - .st39{fill:#3CA0D5;} - .st40{fill:#727A80;} - .st41{fill:#F6FCFD;} - .st42{fill:#FEFEFA;} - .st43{fill:#459ED2;} - .st44{fill:#5DAE5B;} - .st45{fill:#5E7F47;} - .st46{fill:#FCFCFC;} - .st47{fill:#C1DBED;} - .st48{fill:#FBFDF8;} - .st49{fill:#EBF5F7;} - .st50{fill:#294949;} - .st51{fill:#8FC8E5;} - .st52{fill:#F7FCFC;} - .st53{fill:#FCFEFA;} - .st54{fill:#4E8A56;} - .st55{fill:#64BDE8;} - .st56{fill:#FEFDFA;} - .st57{fill:#FBFDFC;} - .st58{fill:#449DD5;} - .st59{fill:#F6FBF7;} - .st60{fill:#279A5B;} - .st61{fill:#30493D;} - .st62{fill:#F5FBF9;} - .st63{fill:#35583B;} - .st64{fill:#323C62;} - .st65{fill:#F8FBF9;} - .st66{fill:#E7EFF2;} - .st67{fill:#8DC1B6;} - .st68{fill:#FAFCFA;} - .st69{fill:#F1FBF9;} - .st70{fill:#F7FEFE;} - .st71{fill:#FDFEFA;} - .st72{fill:#31A1A1;} - .st73{fill:#F9FEFD;} - .st74{fill:#FAFAFC;} - .st75{fill:#FDFCF8;} - .st76{fill:#2D5C60;} - .st77{fill:#FDFCF9;} - .st78{fill:#F9FDFB;} - .st79{fill:#FBFBFB;} - .st80{fill:#518B58;} - .st81{fill:#5A82AF;} - .st82{fill:#FDFEF8;} - .st83{fill:#244C40;} - .st84{fill:#266495;} - .st85{fill:#42A0D3;} - .st86{fill:#5B80A9;} - .st87{fill:#2E5B63;} - .st88{fill:#FDFBF9;} - .st89{fill:#F8FDFB;} - .st90{fill:#FDFDF7;} - .st91{fill:#F3F9FB;} - .st92{fill:#309F96;} - .st93{fill:#93C367;} - .st94{fill:#3B3C68;} - .st95{fill:#E0F1F9;} - .st96{fill:#E4F6F9;} - .st97{fill:#FEFEF9;} - .st98{fill:#224C38;} - .st99{fill:#498AB2;} - .st100{fill:#FDFDF9;} - .st101{fill:#F9FEFE;} - .st102{fill:#F6FCF2;} - .st103{fill:#FEFCF9;} - .st104{fill:#EEFCFE;} - .st105{fill:#FDFDF8;} - .st106{fill:#FBFDFA;} - .st107{fill:#275962;} - .st108{fill:#FDFEF9;} - .st109{fill:#F2F8F2;} - .st110{fill:#F8FBFB;} - .st111{fill:#8A8A8A;} - .st112{fill:#F7FEFD;} - .st113{fill:#EFF8FB;} - .st114{fill:#FAFCFB;} - .st115{fill:#E5F3F8;} - .st116{fill:#ECF7FA;} - .st117{fill:#FDFDF6;} - .st118{fill:#F5FDFD;} - .st119{fill:#7799BF;} - .st120{fill:#5C8055;} - .st121{fill:#6EAECC;} - .st122{fill:#FEFEF7;} - .st123{fill:#3282B5;} - .st124{fill:#F3FCF5;} - .st125{fill:#F4FAFB;} - .st126{fill:#FEF8FA;} - .st127{fill:#F5FCF9;} - .st128{fill:#3C9392;} - .st129{fill:#EBF6F6;} - .st130{fill:#98BFD6;} - .st131{fill:#FEFDF7;} - .st132{fill:#658796;} - .st133{fill:#EEF7F6;} - .st134{fill:#FAFBF5;} - .st135{fill:#F8FCF9;} - .st136{fill:#FDFDF4;} - .st137{fill:#FDFBF8;} - .st138{fill:#FDFDF5;} - .st139{fill:#EFF9FD;} - .st140{fill:#FDFEF6;} - .st141{fill:#37586D;} - .st142{fill:#FDFEF5;} - .st143{fill:#FDFBF6;} - .st144{fill:#324A49;} - .st145{fill:#F8F8F9;} - .st146{fill:#CDF5CD;} - .st147{fill:#FEFDF3;} - .st148{fill:#ECFBFE;} - .st149{fill:#858585;} - .st150{fill:#C5C5C5;} - .st151{fill:#6C6C6C;} - .st152{fill:#498B4F;} - .st153{fill:#478A4D;} - .st154{fill:#4A884D;} - .st155{fill:#429169;} - .st156{fill:#3CA29D;} - .st157{fill:#518654;} - .st158{fill:#51855F;} - .st159{fill:#289FA0;} - .st160{fill:#448E49;} - .st161{fill:#458B55;} - .st162{fill:#568356;} - .st163{fill:#89C9ED;} - .st164{fill:#246081;} - .st165{fill:#206186;} - .st166{fill:#8EC8E9;} - .st167{fill:#2B5D7D;} - .st168{fill:#215F80;} - .st169{fill:#A0D4EF;} - .st170{fill:#A4D3F2;} - .st171{fill:#245E84;} - .st172{fill:#69BADA;} - .st173{fill:#9AC9D1;} - .st174{fill:#9AC7DD;} - .st175{fill:#3B396C;} - .st176{fill:#3A376D;} - .st177{fill:#3D366C;} - .st178{fill:#6A9BC9;} - .st179{fill:#57B156;} - .st180{fill:#2A9762;} - .st181{fill:#139C59;} - .st182{fill:#169A5E;} - .st183{fill:#139C5D;} - .st184{fill:#129652;} - .st185{fill:#61839B;} - .st186{fill:#637F92;} - .st187{fill:#289193;} - .st188{fill:#288F8D;} - .st189{fill:#34A3A8;} - .st190{fill:#23A7A5;} - .st191{fill:#36A2A8;} - .st192{fill:#32A1A0;} - .st193{fill:#23A7A2;} - .st194{fill:#249A96;} - .st195{fill:#FCFCFD;} - .st196{fill:#FDFDFD;} - .st197{fill:#6B7B8C;} - .st198{fill:#4C84B0;} - .st199{fill:#4F81BA;} - .st200{fill:#5280B6;} - .st201{fill:#6CA1CE;} - .st202{fill:#6CA0CF;} - .st203{fill:#7AA4CC;} - .st204{fill:#71A3D5;} - .st205{fill:#6AA3C9;} - .st206{fill:#6EA5D6;} - .st207{fill:#6C97B9;} - .st208{fill:#4F6684;} - .st209{fill:#2D5D62;} - .st210{fill:#275C5E;} - .st211{fill:#2B5859;} - .st212{fill:#285C5E;} - .st213{fill:#9FCCE5;} - .st214{fill:#BCDBEF;} - .st215{fill:#B5DDF9;} - .st216{fill:#234D37;} - .st217{fill:#2E483A;} - .st218{fill:#8294A2;} - .st219{fill:#256286;} - .st220{fill:#8095A3;} - .st221{fill:#3FA6DA;} - .st222{fill:#62BEEC;} - .st223{fill:#40A7D6;} - .st224{fill:#43A3DF;} - .st225{fill:#274C3B;} - .st226{fill:#4C9FC8;} - .st227{fill:#234D32;} - .st228{fill:#2C473D;} - .st229{fill:#27572D;} - .st230{fill:#2D473F;} - .st231{fill:#22A69E;} - .st232{fill:#22A1A1;} - .st233{fill:#378E8D;} - .st234{fill:#268C8A;} - .st235{fill:#40817E;} - .st236{fill:#528E4D;} - .st237{fill:#94C15C;} - .st238{fill:#518D4F;} - .st239{fill:#4B954A;} - .st240{fill:#95C350;} - .st241{fill:#93C451;} - .st242{fill:#90C147;} - .st243{fill:#90B254;} - .st244{fill:#1A6292;} - .st245{fill:#2F82B5;} - .st246{fill:#3FA7DA;} - .st247{fill:#43A5D7;} - .st248{fill:#51ADD8;} - .st249{fill:#57B0E2;} - .st250{fill:#4C95B8;} - .st251{fill:#7BC2EB;} - .st252{fill:#7BC2E8;} - .st253{fill:#439DCE;} - .st254{fill:#1A66A0;} - .st255{fill:#429FD0;} - .st256{fill:#22669E;} - .st257{fill:#42A1D2;} - .st258{fill:#42A6D7;} - .st259{fill:#4EA6CD;} - .st260{fill:#90B15F;} - .st261{fill:#5EAF59;} - .st262{fill:#1568A3;} - .st263{fill:#44A4D8;} - .st264{fill:#2D5F86;} - .st265{fill:#82C6B7;} - .st266{fill:#93C6B3;} - .st267{fill:#81C7BD;} - .st268{fill:#8CC3BB;} - .st269{fill:#3EA0D1;} - .st270{fill:#429ED2;} - .st271{fill:#449DD7;} - .st272{fill:#3AA1DA;} - .st273{fill:#3D9FD7;} - .st274{fill:#439DD3;} - .st275{fill:#69A46E;} - .st276{fill:#74B273;} - .st277{fill:#58AB52;} - .st278{fill:#325946;} - .st279{fill:#214A49;} - .st280{fill:#244B3F;} - .st281{fill:#3181B4;} - .st282{fill:#1DA3A4;} - .st283{fill:#346E9F;} - .st284{fill:#869197;} - .st285{fill:#53B0EA;} - .st286{fill:#5181C0;} - .st287{fill:#1767A6;} - .st288{fill:#3F9FD5;} - .st289{fill:#399291;} - .st290{fill:#27A2A7;} - .st291{fill:#81969C;} - .st292{fill:#46A4D7;} - .st293{fill:#C7DCB8;} - .st294{fill:#B5B5B5;} - .st295{fill:#4F9A83;} - .st296{fill:#63BDE8;} - .st297{fill:#95C3E7;} - .st298{fill:#1D618B;} - .st299{fill:#1D6286;} - .st300{fill:#3181B5;} - .st301{fill:#249190;} - .st302{fill:#2C9096;} - .st303{fill:#23918E;} - .st304{fill:#2E939A;} - .st305{fill:#469DD6;} - .st306{fill:#40A0D2;} - .st307{fill:#4B82C0;} - .st308{fill:#809398;} - .st309{fill:#69BCE2;} - .st310{fill:#5BBFEB;} - .st311{fill:#5DBEF5;} - .st312{fill:#42A6D8;} - .st313{fill:#39A4DC;} - .st314{fill:#94C356;} - .st315{fill:#95C446;} - .st316{fill:#2B83B5;} - .st317{fill:#2A83B8;} - .st318{fill:#3EA7DE;} - .st319{fill:#37A8DF;} - .st320{fill:#7CC9F7;} - .st321{fill:#1568A7;} - .st322{fill:#3EA7DD;} - .st323{fill:#3AA9DA;} - .st324{fill:#55B0E2;} - .st325{fill:#5FAF60;} - .st326{fill:#16639A;} - .st327{fill:#16689E;} - .st328{fill:#419FCE;} - .st329{fill:#216186;} - .st330{fill:#21607D;} - .st331{fill:#3BA7DD;} - .st332{fill:#6E408A;} - .st333{fill:#3A3A3C;} - .st334{fill:none;} - .st335{fill:#44546A;} - .st336{fill:#E67C0C;} - .st337{fill:#922A50;} - .st338{fill:#E67C0D;} - .st339{fill:#4471CD;} - .st340{fill:#922B50;} - .st341{fill:#45556B;} - .st342{fill:#922B51;} - .st343{fill:#4571CD;} - .st344{fill:#46556B;} - .st345{fill:#45556A;} - .st346{fill:#F0B272;} - .st347{fill:#1D94D2;} - .st348{fill:#3C3F3F;} - .st349{fill:#080809;} - .st350{fill:#048DC9;} - .st351{fill:#7496A2;} - .st352{fill:#9DAAC1;} - .st353{fill:#868689;} - .st354{fill:#052C50;} - .st355{fill:#101214;} - .st356{fill:#191C1E;} - .st357{fill:#242C35;} - .st358{fill:#343C42;} - .st359{fill:#343B44;} - .st360{fill:#3D4A5B;} - .st361{fill:#73AAFE;} - .st362{fill:#4CCAFE;} - .st363{fill:#CFE1FD;} - .st364{fill:#87DCFE;} - .st365{fill:#0090CC;} - .st366{fill:#008FCC;} - .st367{fill:none;stroke:#407DCC;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;} - .st368{fill:#407DCC;} - .st369{fill:#15191E;} - .st370{fill:#10191F;} - .st371{fill:#12161B;} - .st372{fill:#0E181E;} - .st373{fill:#121D24;} - .st374{fill:#3F7BC7;} - .st375{fill:#222932;} - .st376{fill:#22404E;} - .st377{fill:#202831;} - .st378{fill:#010101;} - .st379{fill:#161A1F;} - .st380{fill:#323C47;} - .st381{fill:#303B48;} - .st382{fill:#14181B;} - .st383{fill:#353F4A;} - .st384{fill:#194691;} - .st385{fill:#164C96;} - .st386{fill:#184893;} - .st387{fill:#174A94;} - .st388{fill:#184792;} - .st389{fill:#184892;} - .st390{fill:#0090CD;} - .st391{fill:#018CCA;} - .st392{fill:#FDBB87;} - .st393{fill:#FE9545;} - .st394{fill:#FE8B00;} - .st395{fill:#DC5900;} - .st396{fill:#DE6D45;} - .st397{fill:#292925;} - .st398{fill:#63A1BF;} - .st399{fill:#61A1BF;} - .st400{fill:#8DC53F;} - .st401{fill:#8EC642;} - .st402{fill:#61853A;} - .st403{fill:#424243;} - .st404{fill:#8EC641;} - .st405{fill:#8DC640;} - .st406{fill:#414142;} - .st407{fill:#94C94C;} - .st408{fill:#4C4C4D;} - .st409{fill:#62863C;} - .st410{fill:#8DC540;} - .st411{fill:#577138;} - .st412{fill:#A2B24F;} - .st413{fill:#DCDF72;} - .st414{fill:#5E3108;} - .st415{fill:#074354;} - .st416{fill:#04C594;} - .st417{fill:#95AEB6;} - .st418{fill:#4B4B4B;} - .st419{fill:#5C5B5B;} - .st420{fill:#ABABAB;} - .st421{fill:#474646;} - .st422{fill:#454444;} - .st423{fill:#8C8C8C;} - .st424{fill:#292828;} - .st425{fill:#818181;} - .st426{fill:#C1C1C1;} - .st427{fill:#AAAAAA;} - .st428{fill:#A1A0A0;} - .st429{fill:#7A7879;} - .st430{fill:#C9C9C9;} - .st431{fill:#787878;} - .st432{fill:#474747;} - .st433{fill:#939393;} - .st434{fill:#9D9D9D;} - .st435{fill:#323131;} - .st436{fill:#646464;} - .st437{fill:#5F5F5F;} - .st438{fill:#454545;} - .st439{fill:#565555;} - .st440{fill:#504F4F;} - .st441{fill:#464646;} - .st442{fill:#807F7F;} - .st443{fill:#515050;} - .st444{fill:#444242;} - .st445{fill:#A8A8A8;} - .st446{fill:#B6B6B6;} - .st447{fill:#545454;} - .st448{fill:#6E6E6E;} - .st449{fill:#9C9C9C;} - .st450{fill:#A9A9A9;} - .st451{fill:#949494;} - .st452{fill:#353434;} - .st453{fill:#727272;} - .st454{fill:#585858;} - .st455{fill:#585757;} - .st456{fill:#7E7D7D;} - .st457{fill:#4C4B4B;} - .st458{fill:#3A3A3A;} - .st459{fill:#989898;} - .st460{fill:#484848;} - .st461{fill:#817F80;} - .st462{fill:#7A7A7A;} - .st463{fill:#5B5A5B;} - .st464{fill:#ADADAD;} - .st465{fill:#737373;} - .st466{fill:#2E2D2D;} - .st467{fill:#757575;} - .st468{fill:#5A5959;} - .st469{fill:#717171;} - .st470{fill:#595859;} - .st471{fill:#989797;} - .st472{fill:#393939;} - .st473{fill:#818080;} - .st474{fill:#929292;} - .st475{fill:#3F3F3F;} - .st476{fill:#BEBEBE;} - .st477{fill:#494949;} - .st478{fill:#494848;} - .st479{fill:#696868;} - .st480{fill:#828181;} - .st481{fill:#C8C8C8;} - .st482{fill:#616060;} - .st483{fill:#615F60;} - .st484{fill:#686767;} - .st485{fill:#7F7E7E;} - .st486{fill:#B3B3B3;} - .st487{fill:#A09F9F;} - .st488{fill:#4D4C4C;} - .st489{fill:#E2E2E2;} - .st490{fill:#D8D8D8;} - .st491{fill:#3E3E3E;} - .st492{fill:#A4A4A4;} - .st493{fill:#8B898A;} - .st494{fill:#4C4C4C;} - .st495{fill:#A3A3A3;} - .st496{fill:#333232;} - .st497{fill:#6C6B6B;} - .st498{fill:#7B7A7A;} - .st499{fill:#C0C0C0;} - .st500{fill:#313131;} - .st501{fill:#7C7B7B;} - .st502{fill:#393838;} - .st503{fill:#414141;} - .st504{fill:#676666;} - .st505{fill:#6F6E6E;} - .st506{fill:#414040;} - .st507{fill:#7F7F7F;} - .st508{fill:#4D4D4D;} - .st509{fill:#6A6969;} - .st510{fill:#6B6A6A;} - .st511{fill:#7E7E7E;} - .st512{fill:#787777;} - .st513{fill:#777777;} - .st514{fill:#D5D5D5;} - .st515{fill:#A1A1A1;} - .st516{fill:#848384;} - .st517{fill:#595959;} - .st518{fill:#575757;} - .st519{fill:#ACACAC;} - .st520{fill:#8A8889;} - .st521{fill:#CFCFCF;} - .st522{fill:#CACACA;} - .st523{fill:#8D8D8D;} - .st524{fill:none;stroke:#A3A3A3;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;} - .st525{fill:#4D4C4D;} - .st526{fill:#9F9F9F;} - .st527{fill:#8B8A8A;} - .st528{fill:#BBBBBB;} - .st529{fill:#5B5A5A;} - .st530{fill:#C2C2C2;} - .st531{fill:#A6A6A6;} - .st532{fill:#B4B4B4;} - .st533{fill:#C6C6C6;} - .st534{fill:#A3A2A2;} - .st535{fill:#B7B7B7;} - .st536{fill:#828081;} - .st537{fill:#AFAFAF;} - .st538{fill:#D1D1D1;} - .st539{fill:#D3D3D3;} - .st540{fill:#CECECE;} - .st541{fill:#BABABA;} - .st542{fill:#A4A3A3;} - .st543{fill:#E0E0E0;} - .st544{fill:#D7D7D7;} - .st545{fill:#B1B1B1;} - .st546{fill:#A7A7A7;} - .st547{fill:#D2D2D2;} - .st548{fill:#151F34;} - .st549{filter:url(#Adobe_OpacityMaskFilter);} - .st550{fill:#FFFFFF;} - .st551{mask:url(#b_1_);fill:#151F34;} - .st552{fill:#348540;} - .st553{fill:#7DBC42;} -</style> -<g - id="g859" - transform="matrix(1.7707274,0,0,1.7707274,0.85183359,-43.009452)"><path - class="st548" - d="m 4.7276613,37.955902 c -0.680236,0.165912 -1.3770631,0.232276 -2.0738902,0.232276 -0.7134182,0 -1.4102454,-0.08296 -2.07389025,-0.232276 0.54750705,-0.879329 1.26092525,-1.659112 2.07389025,-2.306166 0.812965,0.647054 1.5263832,1.426837 2.0738902,2.306166 z m 6.2548527,-5.076883 c -0.862738,-0.232276 -1.7420675,-0.348414 -2.6213969,-0.331822 -2.0241169,0 -4.0150516,0.59728 -5.707346,1.725476 -1.69229445,-1.128196 -3.666638,-1.742068 -5.707346,-1.725476 -0.9125117,0 -1.7918411,0.116137 -2.6213972,0.331822 -0.3484136,0.08296 -0.6968272,0.199093 -1.0286496,0.331822 -0.016591,0.01659 -0.033182,0.03318 -0.016591,0.04977 0,0 0,0 0,0 0.1493201,0.315231 0.3152313,0.630462 0.4811425,0.929103 0.016591,0.01659 0.033182,0.01659 0.049773,0.01659 1.0120584,-0.365005 2.0738902,-0.547507 3.135722,-0.547507 1.7420678,0 3.3679978,0.481142 4.761652,1.327289 -0.87932942,0.746601 -1.64252103,1.642522 -2.2232103,2.637989 -0.31523132,0.514325 -0.5640982,1.061832 -0.7797827,1.62593 -0.4313692,1.144787 -0.6470538,2.37253 -0.6470538,3.583682 0,2.920038 1.22774303,5.558026 3.1854954,7.432823 0.1493201,0.14932 0.3152313,0.29864 0.4811426,0.431369 0.1327289,0.116138 0.2654579,0.215685 0.3981869,0.315231 0.1659112,0.132729 0.3484136,0.265458 0.5309159,0.381596 0.016591,0.01659 0.033182,0.01659 0.049773,0 C 2.8860461,51.278568 3.0519573,51.145839 3.2344597,51.01311 3.3671886,50.91356 3.4999176,50.814017 3.6326466,50.697879 3.7985578,50.56515 3.964469,50.41583 4.1137891,50.26651 c 1.9577524,-1.874797 3.1689043,-4.512785 3.1689043,-7.432823 0,-1.460019 -0.3152313,-2.903446 -0.9125117,-4.230736 C 6.3038179,38.470227 6.2374534,38.320907 6.171089,38.188178 6.0715422,37.989085 5.9554044,37.789991 5.8392665,37.607489 5.2419861,36.612021 4.4953856,35.716101 3.6160562,34.9695 c 1.4434276,-0.862738 3.0859487,-1.327289 4.761652,-1.327289 1.0618318,0 2.1402548,0.182502 3.1357218,0.547507 0.01659,0 0.03318,0 0.04977,-0.01659 0.182502,-0.29864 0.331822,-0.613871 0.481142,-0.912511 0.01659,-0.01659 0,-0.04977 -0.01659,-0.04977 0,0 0,0 0,0 -0.348414,-0.132729 -0.696827,-0.248866 -1.045241,-0.331822 z" - id="path19" - inkscape:connector-curvature="0" - style="fill:#151f34;stroke-width:0.16591121" /><path - class="st552" - d="m 6.1379067,42.850283 c 0,2.438895 -0.9456939,4.662106 -2.5052594,6.304627 -0.2820491,-0.895921 -0.4147781,-1.825024 -0.4147781,-2.754127 0,-2.438895 0.945694,-4.662105 2.5052595,-6.304626 0.2654579,0.862738 0.414778,1.791841 0.414778,2.754126" - id="path21" - inkscape:connector-curvature="0" - style="fill:#348540;stroke-width:0.16591121" /><path - class="st553" - d="m 2.1062641,46.384192 c 0,0.962285 -0.1493201,1.891388 -0.4147781,2.754127 -1.60933881,-1.708886 -2.5052594,-3.965279 -2.5052594,-6.304627 0,-0.962285 0.1493201,-1.891388 0.43136917,-2.754126 1.59274773,1.708885 2.48866833,3.965278 2.48866833,6.304626" - id="path23" - inkscape:connector-curvature="0" - style="fill:#7dbc42;stroke-width:0.16591121" /></g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Layer_1" x="0" y="0" viewBox="-12.06 13.62 35.251 35.399" xml:space="preserve" width="35.251" height="35.399"><defs id="defs30"><mask id="b_1_" height="71.5" width="56.2" y="41.4" x="555.7" maskUnits="userSpaceOnUse"><g id="g12" filter="url(#Adobe_OpacityMaskFilter)"><path d="M306.3 12.4H.8v120.9h611.1V12.4z" id="a_1_" fill="#fff"/></g></mask><defs id="defs9"><filter height="71.5" width="56.2" y="41.4" x="555.7" filterUnits="userSpaceOnUse" id="Adobe_OpacityMaskFilter"><feColorMatrix id="feColorMatrix6" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" type="matrix"/></filter></defs></defs><style type="text/css" id="style2"></style><g id="g859" transform="matrix(1.77073 0 0 1.77073 .852 -43.01)" stroke-width=".166"><path d="M4.728 37.956a8.738 8.738 0 01-2.074.232c-.714 0-1.41-.083-2.074-.232a9.157 9.157 0 012.074-2.306 9.157 9.157 0 012.074 2.306zm6.255-5.077a9.394 9.394 0 00-2.622-.332c-2.024 0-4.015.597-5.707 1.726a10.127 10.127 0 00-5.708-1.726c-.912 0-1.791.116-2.621.332-.348.083-.697.2-1.029.332-.016.016-.033.033-.016.05.15.315.315.63.48.929.018.016.034.016.05.016a9.244 9.244 0 013.136-.547c1.742 0 3.368.48 4.762 1.327a10.278 10.278 0 00-2.223 2.638 10.214 10.214 0 00-1.427 5.21 10.27 10.27 0 003.186 7.433c.149.149.315.298.48.43.133.117.266.217.399.316.166.133.348.266.53.382.017.016.034.016.05 0 .183-.116.349-.25.531-.382.133-.1.266-.199.399-.315.166-.133.331-.282.48-.431a10.255 10.255 0 003.17-7.433c0-1.46-.316-2.904-.913-4.231-.066-.133-.133-.282-.199-.415a6.59 6.59 0 00-.332-.58 10.62 10.62 0 00-2.223-2.639 9.284 9.284 0 014.762-1.327c1.062 0 2.14.183 3.135.548.017 0 .034 0 .05-.017.183-.299.332-.614.481-.912.017-.017 0-.05-.016-.05a8.458 8.458 0 00-1.045-.332z" id="path19" fill="#151f34"/><path d="M6.138 42.85a9.124 9.124 0 01-2.505 6.305 9.163 9.163 0 01-.415-2.754c0-2.44.946-4.662 2.505-6.305.266.863.415 1.792.415 2.754" id="path21" fill="#348540"/><path d="M2.106 46.384c0 .962-.15 1.892-.415 2.754a9.2 9.2 0 01-2.505-6.304c0-.963.15-1.892.432-2.754a9.261 9.261 0 012.488 6.304" id="path23" fill="#7dbc42"/></g></svg> \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/consul.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/consul.svg index 28bbadd24c8a6..5ef8feaded689 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/consul.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/consul.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 79.97 113.78"><defs><style>.cls-1{fill:#961d59;}.cls-1,.cls-2{fill-rule:evenodd;}.cls-2,.cls-3{fill:#d62783;}</style></defs><title>Asset 1 \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/coredns.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/coredns.svg index 863a81e0f40e7..e38616a15a11c 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/coredns.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/coredns.svg @@ -1 +1 @@ -CoreDNS_Colour_Icon + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/couchdb.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/couchdb.svg index 2512c2eb2a011..3c3ecb66d8c87 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/couchdb.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/couchdb.svg @@ -1,86 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/envoyproxy.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/envoyproxy.svg index 45c995b19603b..a22132d415c40 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/envoyproxy.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/envoyproxy.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ibmmq.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ibmmq.svg index e474d93359beb..396d5a67a20eb 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ibmmq.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ibmmq.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/iis.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/iis.svg new file mode 100644 index 0000000000000..99964448d33c5 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/iis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/mssql.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/mssql.svg new file mode 100644 index 0000000000000..738507c5809c0 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/mssql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/munin.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/munin.svg new file mode 100644 index 0000000000000..b35a39498c9ec --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/munin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/nats.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/nats.svg index f7593c51a4c42..5a1d6e9a52f17 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/nats.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/nats.svg @@ -1,102 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/openmetrics.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/openmetrics.svg index feccb88a3f34b..1a00be6ab30a2 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/openmetrics.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/openmetrics.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/statsd.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/statsd.svg index f4458439fceb4..a745cd71efafe 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/statsd.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/statsd.svg @@ -1,41 +1 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/suricata.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/suricata.svg new file mode 100644 index 0000000000000..06e627a7e4ba7 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/suricata.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/system.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/system.svg new file mode 100644 index 0000000000000..0aba96275e24e --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/traefik.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/traefik.svg index 8ee3448f5626e..10b38261eca5e 100644 --- a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/traefik.svg +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/traefik.svg @@ -1,342 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ubiquiti.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ubiquiti.svg new file mode 100644 index 0000000000000..99a911e32863e --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/ubiquiti.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/uwsgi.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/uwsgi.svg new file mode 100644 index 0000000000000..43818ab211ee3 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/uwsgi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/vsphere.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/vsphere.svg new file mode 100644 index 0000000000000..2a04026e46432 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/vsphere.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zeek.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zeek.svg new file mode 100644 index 0000000000000..0e346f98c7238 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zeek.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zookeeper.svg b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zookeeper.svg new file mode 100644 index 0000000000000..80db65f670d1d --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/tutorial_resources/logos/zookeeper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts b/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts index f3a37e2b7348f..7261b2ba03372 100644 --- a/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts +++ b/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts @@ -21,7 +21,6 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { npStart } from 'ui/new_platform'; import { SavedObjectLoader } from '../../../../../plugins/saved_objects/public'; -import { start as visualizations } from '../../../visualizations/public/np_ready/public/legacy'; import { createSavedSearchesLoader } from '../../../../../plugins/discover/public'; /** @@ -63,7 +62,7 @@ const services = { savedObjectManagementRegistry.register({ id: 'savedVisualizations', - service: visualizations.savedVisualizationsLoader, + service: npStart.plugins.visualizations.savedVisualizationsLoader, title: 'visualizations', }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/__jest__/table.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/__jest__/table.test.js index fba249670ce60..9b3e2314c9f84 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/__jest__/table.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/__jest__/table.test.js @@ -21,7 +21,7 @@ import React from 'react'; import { shallowWithI18nProvider, mountWithI18nProvider } from 'test_utils/enzyme_helpers'; import { findTestSubject } from '@elastic/eui/lib/test'; import { keyCodes } from '@elastic/eui/lib/services'; -import { mockManagementPlugin } from '../../../../../../../../../../management/public/np_ready/mocks'; +import { npSetup as mockNpSetup } from '../../../../../../../../../../../ui/public/new_platform/__mocks__'; jest.mock('ui/kfetch', () => ({ kfetch: jest.fn() })); @@ -29,9 +29,8 @@ jest.mock('ui/chrome', () => ({ addBasePath: () => '', })); -jest.mock('../../../../../../../../../../management/public/legacy', () => ({ - setup: mockManagementPlugin.createSetupContract(), - start: mockManagementPlugin.createStartContract(), +jest.mock('ui/new_platform', () => ({ + npSetup: mockNpSetup, })); import { Table } from '../table'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/table.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/table.js index 5342693113bca..132fa1e691c1c 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/table.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/components/objects_table/components/table/table.js @@ -18,7 +18,7 @@ */ import chrome from 'ui/chrome'; -import { setup as managementSetup } from '../../../../../../../../../management/public/legacy'; +import { npSetup } from 'ui/new_platform'; import React, { PureComponent, Fragment } from 'react'; import PropTypes from 'prop-types'; @@ -79,7 +79,7 @@ export class Table extends PureComponent { constructor(props) { super(props); - this.extraActions = managementSetup.savedObjects.registry.get(); + this.extraActions = npSetup.plugins.savedObjectsManagement.actionRegistry.getAll(); } onChange = ({ query, error }) => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/import_legacy_file.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/import_legacy_file.test.js deleted file mode 100644 index 57b8557fb9afe..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/import_legacy_file.test.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { importLegacyFile } from '../import_legacy_file'; - -describe('importFile', () => { - it('should import a file', async () => { - class FileReader { - readAsText(text) { - this.onload({ - target: { - result: JSON.stringify({ text }), - }, - }); - } - } - - const file = 'foo'; - - const imported = await importLegacyFile(file, FileReader); - expect(imported).toEqual({ text: file }); - }); - - it('should throw errors', async () => { - class FileReader { - readAsText() { - this.onload({ - target: { - result: 'not_parseable', - }, - }); - } - } - - const file = 'foo'; - - try { - await importLegacyFile(file, FileReader); - } catch (e) { - // There isn't a great way to handle throwing exceptions - // with async/await but this seems to work :shrug: - expect(() => { - throw e; - }).toThrow(); - } - }); -}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/extract_export_details.test.ts b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/extract_export_details.test.ts similarity index 98% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/extract_export_details.test.ts rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/extract_export_details.test.ts index 4ecc3583e76ce..76f5c6e87ec90 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/extract_export_details.test.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/extract_export_details.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { extractExportDetails, SavedObjectsExportResultDetails } from '../extract_export_details'; +import { extractExportDetails, SavedObjectsExportResultDetails } from './extract_export_details'; describe('extractExportDetails', () => { const objLine = (id: string, type: string) => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.ts similarity index 86% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.ts index 788a4635d8dac..d3e527b9f96b7 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_by_type_and_search.ts @@ -19,7 +19,11 @@ import { kfetch } from 'ui/kfetch'; -export async function fetchExportByTypeAndSearch(types, search, includeReferencesDeep = false) { +export async function fetchExportByTypeAndSearch( + types: string[], + search: string | undefined, + includeReferencesDeep: boolean = false +): Promise { return await kfetch({ method: 'POST', pathname: '/api/saved_objects/_export', diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.ts similarity index 89% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.ts index 2521113f53752..744f8ef38af47 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/fetch_export_objects.ts @@ -19,7 +19,10 @@ import { kfetch } from 'ui/kfetch'; -export async function fetchExportObjects(objects, includeReferencesDeep = false) { +export async function fetchExportObjects( + objects: any[], + includeReferencesDeep: boolean = false +): Promise { return await kfetch({ method: 'POST', pathname: '/api/saved_objects/_export', diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.ts similarity index 85% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.ts index caf2b5f503440..24e08f0524f62 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/find_objects.ts @@ -18,13 +18,14 @@ */ import { kfetch } from 'ui/kfetch'; +import { SavedObjectsFindOptions } from 'src/core/public'; import { keysToCamelCaseShallow } from './case_conversion'; -export async function findObjects(findOptions) { +export async function findObjects(findOptions: SavedObjectsFindOptions) { const response = await kfetch({ method: 'GET', pathname: '/api/kibana/management/saved_objects/_find', - query: findOptions, + query: findOptions as Record, }); return keysToCamelCaseShallow(response); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.ts similarity index 92% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.ts index 5aa9601f04baa..0abfeee72915c 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_default_title.ts @@ -17,6 +17,6 @@ * under the License. */ -export function getDefaultTitle(object) { +export function getDefaultTitle(object: { id: string; type: string }) { return `${object.type} [id=${object.id}]`; } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/get_relationships.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.test.ts similarity index 71% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/get_relationships.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.test.ts index 880d577a9373e..b45b51b4de293 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/get_relationships.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.test.ts @@ -17,24 +17,24 @@ * under the License. */ -import { getRelationships } from '../get_relationships'; +import { getRelationships } from './get_relationships'; describe('getRelationships', () => { it('should make an http request', async () => { - const $http = jest.fn(); + const $http = jest.fn() as any; const basePath = 'test'; - await getRelationships('dashboard', 1, ['search', 'index-pattern'], $http, basePath); + await getRelationships('dashboard', '1', ['search', 'index-pattern'], $http, basePath); expect($http.mock.calls.length).toBe(1); }); it('should handle successful responses', async () => { - const $http = jest.fn().mockImplementation(() => ({ data: [1, 2] })); + const $http = jest.fn().mockImplementation(() => ({ data: [1, 2] })) as any; const basePath = 'test'; const response = await getRelationships( 'dashboard', - 1, + '1', ['search', 'index-pattern'], $http, basePath @@ -44,23 +44,17 @@ describe('getRelationships', () => { it('should handle errors', async () => { const $http = jest.fn().mockImplementation(() => { - throw { - data: { - error: 'Test error', - statusCode: 500, - }, + const err = new Error(); + (err as any).data = { + error: 'Test error', + statusCode: 500, }; - }); + throw err; + }) as any; const basePath = 'test'; - try { - await getRelationships('dashboard', 1, ['search', 'index-pattern'], $http, basePath); - } catch (e) { - // There isn't a great way to handle throwing exceptions - // with async/await but this seems to work :shrug: - expect(() => { - throw e; - }).toThrow(); - } + await expect( + getRelationships('dashboard', '1', ['search', 'index-pattern'], $http, basePath) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Test error"`); }); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.ts similarity index 69% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.ts index d5060eb2dd735..07bdf2db68fa2 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_relationships.ts @@ -17,9 +17,17 @@ * under the License. */ +import { IHttpService } from 'angular'; import { get } from 'lodash'; +import { SavedObjectRelation } from '../types'; -export async function getRelationships(type, id, savedObjectTypes, $http, basePath) { +export async function getRelationships( + type: string, + id: string, + savedObjectTypes: string[], + $http: IHttpService, + basePath: string +): Promise { const url = `${basePath}/api/kibana/management/saved_objects/relationships/${encodeURIComponent( type )}/${encodeURIComponent(id)}`; @@ -27,19 +35,19 @@ export async function getRelationships(type, id, savedObjectTypes, $http, basePa method: 'GET', url, params: { - savedObjectTypes: savedObjectTypes, + savedObjectTypes, }, }; try { - const response = await $http(options); - return response ? response.data : undefined; + const response = await $http(options); + return response?.data; } catch (resp) { - const respBody = get(resp, 'data', {}); + const respBody = get(resp, 'data', {}) as any; const err = new Error(respBody.message || respBody.error || `${resp.status} Response`); - err.statusCode = respBody.statusCode || resp.status; - err.body = respBody; + (err as any).statusCode = respBody.statusCode || resp.status; + (err as any).body = respBody; throw err; } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.ts similarity index 74% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.ts index 9fc531d53d378..d4dda1190bc43 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_counts.ts @@ -17,10 +17,18 @@ * under the License. */ +import { IHttpService } from 'angular'; import chrome from 'ui/chrome'; const apiBase = chrome.addBasePath('/api/kibana/management/saved_objects/scroll'); -export async function getSavedObjectCounts($http, typesToInclude, searchString) { - const results = await $http.post(`${apiBase}/counts`, { typesToInclude, searchString }); +export async function getSavedObjectCounts( + $http: IHttpService, + typesToInclude: string[], + searchString: string +): Promise> { + const results = await $http.post>(`${apiBase}/counts`, { + typesToInclude, + searchString, + }); return results.data; } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.ts similarity index 94% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.ts index b28d254f61d0d..9b34d8d0af321 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/get_saved_object_label.ts @@ -17,7 +17,7 @@ * under the License. */ -export function getSavedObjectLabel(type) { +export function getSavedObjectLabel(type: string) { switch (type) { case 'index-pattern': case 'index-patterns': diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.ts similarity index 93% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.ts index a76078d7e06e7..9bd5fbeed3a4c 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_file.ts @@ -19,7 +19,7 @@ import { kfetch } from 'ui/kfetch'; -export async function importFile(file, overwriteAll = false) { +export async function importFile(file: Blob, overwriteAll: boolean = false) { const formData = new FormData(); formData.append('file', file); return await kfetch({ diff --git a/src/legacy/core_plugins/visualizations/index.ts b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.test.ts similarity index 57% rename from src/legacy/core_plugins/visualizations/index.ts rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.test.ts index a2779cfe4346d..b2132979d3d19 100644 --- a/src/legacy/core_plugins/visualizations/index.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.test.ts @@ -17,18 +17,21 @@ * under the License. */ -import { resolve } from 'path'; -import { LegacyPluginInitializer } from '../../../../src/legacy/types'; +import { importLegacyFile } from './import_legacy_file'; -export const visualizations: LegacyPluginInitializer = kibana => - new kibana.Plugin({ - id: 'visualizations', - publicDir: resolve(__dirname, 'public'), - require: [], - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - }, +describe('importFile', () => { + it('should import a file with valid json format', async () => { + const file = new File([`{"text": "foo"}`], 'file.json'); + + const imported = await importLegacyFile(file); + expect(imported).toEqual({ text: 'foo' }); }); -// eslint-disable-next-line import/no-default-export -export default visualizations; + it('should throw errors when file content is not parseable', async () => { + const file = new File([`not_parseable`], 'file.json'); + + await expect(importLegacyFile(file)).rejects.toThrowErrorMatchingInlineSnapshot( + `"Unexpected token o in JSON at position 1"` + ); + }); +}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.ts similarity index 88% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.ts index 12aaf46b29445..0d86866fa3c1b 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/import_legacy_file.ts @@ -17,10 +17,11 @@ * under the License. */ -export async function importLegacyFile(file, FileReader = window.FileReader) { +export async function importLegacyFile(file: File) { return new Promise((resolve, reject) => { const fr = new FileReader(); - fr.onload = ({ target: { result } }) => { + fr.onload = event => { + const result = event.target!.result as string; try { resolve(JSON.parse(result)); } catch (e) { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/in_app_url.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/in_app_url.test.ts similarity index 79% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/in_app_url.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/in_app_url.test.ts index af2e7dcf704df..c0d6716391a1f 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/in_app_url.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/in_app_url.test.ts @@ -17,100 +17,110 @@ * under the License. */ -import { canViewInApp } from '../in_app_url'; +import { Capabilities } from '../../../../../../../../core/public'; +import { canViewInApp } from './in_app_url'; + +const createCapabilities = (sections: Record): Capabilities => { + return { + navLinks: {}, + management: {}, + catalogue: {}, + ...sections, + }; +}; describe('canViewInApp', () => { it('should handle saved searches', () => { - let uiCapabilities = { + let uiCapabilities = createCapabilities({ discover: { show: true, }, - }; + }); expect(canViewInApp(uiCapabilities, 'search')).toEqual(true); expect(canViewInApp(uiCapabilities, 'searches')).toEqual(true); - uiCapabilities = { + uiCapabilities = createCapabilities({ discover: { show: false, }, - }; + }); expect(canViewInApp(uiCapabilities, 'search')).toEqual(false); expect(canViewInApp(uiCapabilities, 'searches')).toEqual(false); }); it('should handle visualizations', () => { - let uiCapabilities = { + let uiCapabilities = createCapabilities({ visualize: { show: true, }, - }; + }); expect(canViewInApp(uiCapabilities, 'visualization')).toEqual(true); expect(canViewInApp(uiCapabilities, 'visualizations')).toEqual(true); - uiCapabilities = { + uiCapabilities = createCapabilities({ visualize: { show: false, }, - }; + }); expect(canViewInApp(uiCapabilities, 'visualization')).toEqual(false); expect(canViewInApp(uiCapabilities, 'visualizations')).toEqual(false); }); it('should handle index patterns', () => { - let uiCapabilities = { + let uiCapabilities = createCapabilities({ management: { kibana: { index_patterns: true, }, }, - }; + }); expect(canViewInApp(uiCapabilities, 'index-pattern')).toEqual(true); expect(canViewInApp(uiCapabilities, 'index-patterns')).toEqual(true); expect(canViewInApp(uiCapabilities, 'indexPatterns')).toEqual(true); - uiCapabilities = { + uiCapabilities = createCapabilities({ management: { kibana: { index_patterns: false, }, }, - }; + }); expect(canViewInApp(uiCapabilities, 'index-pattern')).toEqual(false); expect(canViewInApp(uiCapabilities, 'index-patterns')).toEqual(false); expect(canViewInApp(uiCapabilities, 'indexPatterns')).toEqual(false); }); it('should handle dashboards', () => { - let uiCapabilities = { + let uiCapabilities = createCapabilities({ dashboard: { show: true, }, - }; + }); expect(canViewInApp(uiCapabilities, 'dashboard')).toEqual(true); expect(canViewInApp(uiCapabilities, 'dashboards')).toEqual(true); - uiCapabilities = { + uiCapabilities = createCapabilities({ dashboard: { show: false, }, - }; + }); expect(canViewInApp(uiCapabilities, 'dashboard')).toEqual(false); expect(canViewInApp(uiCapabilities, 'dashboards')).toEqual(false); }); it('should have a default case', () => { - let uiCapabilities = { + let uiCapabilities = createCapabilities({ foo: { show: true, }, - }; + }); expect(canViewInApp(uiCapabilities, 'foo')).toEqual(true); - uiCapabilities = { + uiCapabilities = createCapabilities({ foo: { show: false, }, - }; + }); expect(canViewInApp(uiCapabilities, 'foo')).toEqual(false); }); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.js deleted file mode 100644 index b6c8d25568446..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export * from './fetch_export_by_type_and_search'; -export * from './fetch_export_objects'; -export * from './in_app_url'; -export * from './get_relationships'; -export * from './get_saved_object_counts'; -export * from './get_saved_object_label'; -export * from './import_file'; -export * from './import_legacy_file'; -export * from './parse_query'; -export * from './resolve_import_errors'; -export * from './resolve_saved_objects'; -export * from './log_legacy_import'; -export * from './process_import_response'; -export * from './get_default_title'; -export * from './find_objects'; -export * from './extract_export_details'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.ts b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.ts new file mode 100644 index 0000000000000..ecdfa6549a54e --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/index.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { fetchExportByTypeAndSearch } from './fetch_export_by_type_and_search'; +export { fetchExportObjects } from './fetch_export_objects'; +export { canViewInApp } from './in_app_url'; +export { getRelationships } from './get_relationships'; +export { getSavedObjectCounts } from './get_saved_object_counts'; +export { getSavedObjectLabel } from './get_saved_object_label'; +export { importFile } from './import_file'; +export { importLegacyFile } from './import_legacy_file'; +export { parseQuery } from './parse_query'; +export { resolveImportErrors } from './resolve_import_errors'; +export { + resolveIndexPatternConflicts, + resolveSavedObjects, + resolveSavedSearches, + saveObject, + saveObjects, +} from './resolve_saved_objects'; +export { logLegacyImport } from './log_legacy_import'; +export { + processImportResponse, + ProcessedImportResponse, + FailedImport, +} from './process_import_response'; +export { getDefaultTitle } from './get_default_title'; +export { findObjects } from './find_objects'; +export { extractExportDetails, SavedObjectsExportResultDetails } from './extract_export_details'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/log_legacy_import.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/log_legacy_import.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/log_legacy_import.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/log_legacy_import.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/parse_query.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.test.ts similarity index 96% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/parse_query.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.test.ts index 1b6c8e0d49dd2..77b34eccd9c6f 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/parse_query.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { parseQuery } from '../parse_query'; +import { parseQuery } from './parse_query'; describe('getQueryText', () => { it('should know how to get the text out of the AST', () => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.ts similarity index 89% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.ts index 8e7419bb924de..9b33deedafd95 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/parse_query.ts @@ -17,15 +17,15 @@ * under the License. */ -export function parseQuery(query) { - let queryText = undefined; - let visibleTypes = undefined; +export function parseQuery(query: any) { + let queryText; + let visibleTypes; if (query) { if (query.ast.getTermClauses().length) { queryText = query.ast .getTermClauses() - .map(clause => clause.value) + .map((clause: any) => clause.value) .join(' '); } if (query.ast.getFieldClauses('type')) { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/process_import_response.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.test.ts similarity index 66% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/process_import_response.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.test.ts index dc4d81dae8081..c1a153b800550 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/process_import_response.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.test.ts @@ -17,7 +17,12 @@ * under the License. */ -import { processImportResponse } from '../process_import_response'; +import { + SavedObjectsImportConflictError, + SavedObjectsImportUnknownError, + SavedObjectsImportMissingReferencesError, +} from 'src/core/public'; +import { processImportResponse } from './process_import_response'; describe('processImportResponse()', () => { test('works when no errors exist in the response', () => { @@ -36,32 +41,28 @@ describe('processImportResponse()', () => { successCount: 0, errors: [ { - obj: { - type: 'a', - id: '1', - }, + type: 'a', + id: '1', error: { type: 'conflict', - }, + } as SavedObjectsImportConflictError, }, ], }; const result = processImportResponse(response); expect(result.failedImports).toMatchInlineSnapshot(` -Array [ - Object { - "error": Object { - "type": "conflict", - }, - "obj": Object { - "obj": Object { - "id": "1", - "type": "a", - }, - }, - }, -] -`); + Array [ + Object { + "error": Object { + "type": "conflict", + }, + "obj": Object { + "id": "1", + "type": "a", + }, + }, + ] + `); }); test('unknown errors get added to failedImports', () => { @@ -70,32 +71,28 @@ Array [ successCount: 0, errors: [ { - obj: { - type: 'a', - id: '1', - }, + type: 'a', + id: '1', error: { type: 'unknown', - }, + } as SavedObjectsImportUnknownError, }, ], }; const result = processImportResponse(response); expect(result.failedImports).toMatchInlineSnapshot(` -Array [ - Object { - "error": Object { - "type": "unknown", - }, - "obj": Object { - "obj": Object { - "id": "1", - "type": "a", - }, - }, - }, -] -`); + Array [ + Object { + "error": Object { + "type": "unknown", + }, + "obj": Object { + "id": "1", + "type": "a", + }, + }, + ] + `); }); test('missing references get added to failedImports', () => { @@ -104,10 +101,8 @@ Array [ successCount: 0, errors: [ { - obj: { - type: 'a', - id: '1', - }, + type: 'a', + id: '1', error: { type: 'missing_references', references: [ @@ -116,31 +111,29 @@ Array [ id: '2', }, ], - }, + } as SavedObjectsImportMissingReferencesError, }, ], }; const result = processImportResponse(response); expect(result.failedImports).toMatchInlineSnapshot(` -Array [ - Object { - "error": Object { - "references": Array [ + Array [ Object { - "id": "2", - "type": "index-pattern", + "error": Object { + "references": Array [ + Object { + "id": "2", + "type": "index-pattern", + }, + ], + "type": "missing_references", + }, + "obj": Object { + "id": "1", + "type": "a", + }, }, - ], - "type": "missing_references", - }, - "obj": Object { - "obj": Object { - "id": "1", - "type": "a", - }, - }, - }, -] -`); + ] + `); }); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.ts b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.ts index 2444d18133af4..cfb2eb29e7885 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/process_import_response.ts @@ -26,15 +26,17 @@ import { SavedObjectsImportError, } from 'src/core/public'; +export interface FailedImport { + obj: Pick; + error: + | SavedObjectsImportConflictError + | SavedObjectsImportUnsupportedTypeError + | SavedObjectsImportMissingReferencesError + | SavedObjectsImportUnknownError; +} + export interface ProcessedImportResponse { - failedImports: Array<{ - obj: Pick; - error: - | SavedObjectsImportConflictError - | SavedObjectsImportUnsupportedTypeError - | SavedObjectsImportMissingReferencesError - | SavedObjectsImportUnknownError; - }>; + failedImports: FailedImport[]; unmatchedReferences: Array<{ existingIndexPatternId: string; list: Array>; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_import_errors.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.test.ts similarity index 90% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_import_errors.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.test.ts index ecdf3d5abced6..b94b0a9d1291f 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_import_errors.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.test.ts @@ -17,12 +17,16 @@ * under the License. */ -import { resolveImportErrors } from '../resolve_import_errors'; - jest.mock('ui/kfetch', () => ({ kfetch: jest.fn() })); -function getFormData(form) { - const formData = {}; +import { SavedObjectsImportUnknownError } from 'src/core/public'; +import { kfetch } from 'ui/kfetch'; +import { resolveImportErrors } from './resolve_import_errors'; + +const kfetchMock = kfetch as jest.Mock; + +function getFormData(form: Map) { + const formData: Record = {}; for (const [key, val] of form.entries()) { if (key === 'retries') { formData[key] = JSON.parse(val); @@ -69,7 +73,7 @@ Object { }, error: { type: 'unknown', - }, + } as SavedObjectsImportUnknownError, }, ], }, @@ -94,8 +98,7 @@ Object { }); test('resolves conflicts', async () => { - const { kfetch } = require('ui/kfetch'); - kfetch.mockResolvedValueOnce({ + kfetchMock.mockResolvedValueOnce({ success: true, successCount: 1, }); @@ -136,7 +139,7 @@ Object { "status": "success", } `); - const formData = getFormData(kfetch.mock.calls[0][0].body); + const formData = getFormData(kfetchMock.mock.calls[0][0].body); expect(formData).toMatchInlineSnapshot(` Object { "file": "undefined", @@ -153,8 +156,7 @@ Object { }); test('resolves missing references', async () => { - const { kfetch } = require('ui/kfetch'); - kfetch.mockResolvedValueOnce({ + kfetchMock.mockResolvedValueOnce({ success: true, successCount: 2, }); @@ -201,7 +203,7 @@ Object { "status": "success", } `); - const formData = getFormData(kfetch.mock.calls[0][0].body); + const formData = getFormData(kfetchMock.mock.calls[0][0].body); expect(formData).toMatchInlineSnapshot(` Object { "file": "undefined", @@ -274,8 +276,7 @@ Object { }); test('handles missing references then conflicts on the same errored objects', async () => { - const { kfetch } = require('ui/kfetch'); - kfetch.mockResolvedValueOnce({ + kfetchMock.mockResolvedValueOnce({ success: false, successCount: 0, errors: [ @@ -288,7 +289,7 @@ Object { }, ], }); - kfetch.mockResolvedValueOnce({ + kfetchMock.mockResolvedValueOnce({ success: true, successCount: 1, }); @@ -333,7 +334,7 @@ Object { "status": "success", } `); - const formData1 = getFormData(kfetch.mock.calls[0][0].body); + const formData1 = getFormData(kfetchMock.mock.calls[0][0].body); expect(formData1).toMatchInlineSnapshot(` Object { "file": "undefined", @@ -353,7 +354,7 @@ Object { ], } `); - const formData2 = getFormData(kfetch.mock.calls[1][0].body); + const formData2 = getFormData(kfetchMock.mock.calls[1][0].body); expect(formData2).toMatchInlineSnapshot(` Object { "file": "undefined", diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.ts similarity index 84% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.ts index f59e776b18046..dcc282402147d 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_import_errors.ts @@ -18,8 +18,16 @@ */ import { kfetch } from 'ui/kfetch'; +import { FailedImport } from './process_import_response'; -async function callResolveImportErrorsApi(file, retries) { +interface RetryObject { + id: string; + type: string; + overwrite?: boolean; + replaceReferences?: any[]; +} + +async function callResolveImportErrorsApi(file: File, retries: any) { const formData = new FormData(); formData.append('file', file); formData.append('retries', JSON.stringify(retries)); @@ -39,7 +47,12 @@ function mapImportFailureToRetryObject({ overwriteDecisionCache, replaceReferencesCache, state, -}) { +}: { + failure: FailedImport; + overwriteDecisionCache: Map; + replaceReferencesCache: Map; + state: any; +}): RetryObject | undefined { const { isOverwriteAllChecked, unmatchedReferences } = state; const isOverwriteGranted = isOverwriteAllChecked || @@ -86,27 +99,32 @@ function mapImportFailureToRetryObject({ }; } -export async function resolveImportErrors({ getConflictResolutions, state }) { +export async function resolveImportErrors({ + getConflictResolutions, + state, +}: { + getConflictResolutions: (objects: any[]) => Promise>; + state: { importCount: number; failedImports?: FailedImport[] } & Record; +}) { const overwriteDecisionCache = new Map(); const replaceReferencesCache = new Map(); let { importCount: successImportCount, failedImports: importFailures = [] } = state; const { file, isOverwriteAllChecked } = state; - const doesntHaveOverwriteDecision = ({ obj }) => { + const doesntHaveOverwriteDecision = ({ obj }: FailedImport) => { return !overwriteDecisionCache.has(`${obj.type}:${obj.id}`); }; - const getOverwriteDecision = ({ obj }) => { + const getOverwriteDecision = ({ obj }: FailedImport) => { return overwriteDecisionCache.get(`${obj.type}:${obj.id}`); }; - const callMapImportFailure = failure => { - return mapImportFailureToRetryObject({ + const callMapImportFailure = (failure: FailedImport) => + mapImportFailureToRetryObject({ failure, overwriteDecisionCache, replaceReferencesCache, state, }); - }; - const isNotSkipped = failure => { + const isNotSkipped = (failure: FailedImport) => { return ( (failure.error.type !== 'conflict' && failure.error.type !== 'missing_references') || getOverwriteDecision(failure) @@ -131,7 +149,7 @@ export async function resolveImportErrors({ getConflictResolutions, state }) { } // Build retries array - const retries = importFailures.map(callMapImportFailure).filter(obj => !!obj); + const retries = importFailures.map(callMapImportFailure).filter(obj => !!obj) as RetryObject[]; for (const { error, obj } of importFailures) { if (error.type !== 'missing_references') { continue; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_saved_objects.test.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.test.ts similarity index 85% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_saved_objects.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.test.ts index 96c178b35a7b3..8243aa69ac082 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/__jest__/resolve_saved_objects.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.test.ts @@ -22,21 +22,30 @@ import { resolveIndexPatternConflicts, saveObjects, saveObject, -} from '../resolve_saved_objects'; - -jest.mock('../../../../../../../../../plugins/kibana_utils/public', () => ({ - SavedObjectNotFound: class SavedObjectNotFound extends Error { - constructor(options) { - super(); - for (const option in options) { - if (options.hasOwnProperty(option)) { - this[option] = options[option]; - } +} from './resolve_saved_objects'; +import { + SavedObject, + SavedObjectLoader, +} from '../../../../../../../../plugins/saved_objects/public'; +import { IndexPatternsContract } from '../../../../../../../../plugins/data/public'; + +class SavedObjectNotFound extends Error { + constructor(options: Record) { + super(); + for (const option in options) { + if (options.hasOwnProperty(option)) { + (this as any)[option] = options[option]; } } - }, -})); -import { SavedObjectNotFound } from '../../../../../../../../../plugins/kibana_utils/public'; + } +} + +const openModalMock = jest.fn(); + +const createObj = (props: Partial): SavedObject => + ({ + ...props, + } as SavedObject); describe('resolveSavedObjects', () => { describe('resolveSavedObjects', () => { @@ -61,7 +70,7 @@ describe('resolveSavedObjects', () => { }, ]; - const indexPatterns = { + const indexPatterns = ({ get: async () => { return { create: () => '2', @@ -73,7 +82,7 @@ describe('resolveSavedObjects', () => { cache: { clear: () => {}, }, - }; + } as unknown) as IndexPatternsContract; const services = [ { @@ -115,11 +124,17 @@ describe('resolveSavedObjects', () => { }; }, }, - ]; + ] as SavedObjectLoader[]; const overwriteAll = false; - const result = await resolveSavedObjects(savedObjects, overwriteAll, services, indexPatterns); + const result = await resolveSavedObjects( + savedObjects, + overwriteAll, + services, + indexPatterns, + openModalMock + ); expect(result.conflictedIndexPatterns.length).toBe(3); expect(result.conflictedSavedObjectsLinkedToSavedSearches.length).toBe(0); @@ -147,7 +162,7 @@ describe('resolveSavedObjects', () => { }, ]; - const indexPatterns = { + const indexPatterns = ({ get: async () => { return { create: () => '2', @@ -159,7 +174,7 @@ describe('resolveSavedObjects', () => { cache: { clear: () => {}, }, - }; + } as unknown) as IndexPatternsContract; const services = [ { @@ -202,11 +217,17 @@ describe('resolveSavedObjects', () => { }; }, }, - ]; + ] as SavedObjectLoader[]; const overwriteAll = false; - const result = await resolveSavedObjects(savedObjects, overwriteAll, services, indexPatterns); + const result = await resolveSavedObjects( + savedObjects, + overwriteAll, + services, + indexPatterns, + openModalMock + ); expect(result.conflictedIndexPatterns.length).toBe(1); expect(result.conflictedSavedObjectsLinkedToSavedSearches.length).toBe(1); @@ -223,7 +244,7 @@ describe('resolveSavedObjects', () => { { obj: { searchSource: { - getOwnField: field => { + getOwnField: (field: string) => { return field === 'index' ? '1' : undefined; }, }, @@ -234,7 +255,7 @@ describe('resolveSavedObjects', () => { { obj: { searchSource: { - getOwnField: field => { + getOwnField: (field: string) => { return field === 'index' ? '3' : undefined; }, }, @@ -277,7 +298,7 @@ describe('resolveSavedObjects', () => { { obj: { searchSource: { - getOwnField: field => { + getOwnField: (field: string) => { return field === 'index' ? '1' : [{ meta: { index: 'filterIndex' } }]; }, setField: jest.fn(), @@ -289,7 +310,7 @@ describe('resolveSavedObjects', () => { { obj: { searchSource: { - getOwnField: field => { + getOwnField: (field: string) => { return field === 'index' ? '3' : undefined; }, }, @@ -330,12 +351,12 @@ describe('resolveSavedObjects', () => { const save = jest.fn(); const objs = [ - { + createObj({ save, - }, - { + }), + createObj({ save, - }, + }), ]; const overwriteAll = false; @@ -349,9 +370,9 @@ describe('resolveSavedObjects', () => { describe('saveObject', () => { it('should save the object', async () => { const save = jest.fn(); - const obj = { + const obj = createObj({ save, - }; + }); const overwriteAll = false; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.ts similarity index 78% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.js rename to src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.ts index e13e8c1efe8f7..902de654f5f85 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/resolve_saved_objects.ts @@ -18,9 +18,17 @@ */ import { i18n } from '@kbn/i18n'; +import { OverlayStart } from 'src/core/public'; +import { + SavedObject, + SavedObjectLoader, +} from '../../../../../../../../plugins/saved_objects/public'; +import { IndexPatternsContract, IIndexPattern } from '../../../../../../../../plugins/data/public'; -async function getSavedObject(doc, services) { - const service = services.find(service => service.type === doc._type); +type SavedObjectsRawDoc = Record; + +async function getSavedObject(doc: SavedObjectsRawDoc, services: SavedObjectLoader[]) { + const service = services.find(s => s.type === doc._type); if (!service) { return; } @@ -31,7 +39,12 @@ async function getSavedObject(doc, services) { return obj; } -function addJsonFieldToIndexPattern(target, sourceString, fieldName, indexName) { +function addJsonFieldToIndexPattern( + target: Record, + sourceString: string, + fieldName: string, + indexName: string +) { if (sourceString) { try { target[fieldName] = JSON.parse(sourceString); @@ -50,7 +63,12 @@ function addJsonFieldToIndexPattern(target, sourceString, fieldName, indexName) } } } -async function importIndexPattern(doc, indexPatterns, overwriteAll, confirmModalPromise) { +async function importIndexPattern( + doc: SavedObjectsRawDoc, + indexPatterns: IndexPatternsContract, + overwriteAll: boolean, + openConfirm: OverlayStart['openConfirm'] +) { // TODO: consolidate this is the code in create_index_pattern_wizard.js const emptyPattern = await indexPatterns.make(); const { @@ -66,7 +84,7 @@ async function importIndexPattern(doc, indexPatterns, overwriteAll, confirmModal id: doc._id, title, timeFieldName, - }; + } as IIndexPattern; if (type) { importedIndexPattern.type = type; } @@ -79,9 +97,9 @@ async function importIndexPattern(doc, indexPatterns, overwriteAll, confirmModal let newId = await emptyPattern.create(overwriteAll); if (!newId) { // We can override and we want to prompt for confirmation - const isConfirmed = await confirmModalPromise( + const isConfirmed = await openConfirm( i18n.translate('kbn.management.indexPattern.confirmOverwriteLabel', { - values: { title: this.title }, + values: { title }, defaultMessage: "Are you sure you want to overwrite '{title}'?", }), { @@ -96,7 +114,7 @@ async function importIndexPattern(doc, indexPatterns, overwriteAll, confirmModal ); if (isConfirmed) { - newId = await emptyPattern.create(true); + newId = (await emptyPattern.create(true)) as string; } else { return; } @@ -105,7 +123,7 @@ async function importIndexPattern(doc, indexPatterns, overwriteAll, confirmModal return newId; } -async function importDocument(obj, doc, overwriteAll) { +async function importDocument(obj: SavedObject, doc: SavedObjectsRawDoc, overwriteAll: boolean) { await obj.applyESResp({ references: doc._references || [], ...doc, @@ -113,12 +131,12 @@ async function importDocument(obj, doc, overwriteAll) { return await obj.save({ confirmOverwrite: !overwriteAll }); } -function groupByType(docs) { +function groupByType(docs: SavedObjectsRawDoc[]): Record { const defaultDocTypes = { searches: [], indexPatterns: [], other: [], - }; + } as Record; return docs.reduce((types, doc) => { switch (doc._type) { @@ -135,14 +153,14 @@ function groupByType(docs) { }, defaultDocTypes); } -async function awaitEachItemInParallel(list, op) { +async function awaitEachItemInParallel(list: T[], op: (item: T) => R) { return await Promise.all(list.map(item => op(item))); } export async function resolveIndexPatternConflicts( - resolutions, - conflictedIndexPatterns, - overwriteAll + resolutions: Array<{ oldId: string; newId: string }>, + conflictedIndexPatterns: any[], + overwriteAll: boolean ) { let importCount = 0; @@ -160,15 +178,13 @@ export async function resolveIndexPatternConflicts( } // Resolve filter index reference: - const filter = (obj.searchSource.getOwnField('filter') || []).map(filter => { - if (!(filter.meta && filter.meta.index)) { - return filter; + const filter = (obj.searchSource.getOwnField('filter') || []).map((f: any) => { + if (!(f.meta && f.meta.index)) { + return f; } - resolution = resolutions.find(({ oldId }) => oldId === filter.meta.index); - return resolution - ? { ...filter, ...{ meta: { ...filter.meta, index: resolution.newId } } } - : filter; + resolution = resolutions.find(({ oldId }) => oldId === f.meta.index); + return resolution ? { ...f, ...{ meta: { ...f.meta, index: resolution.newId } } } : f; }); if (filter.length > 0) { @@ -186,7 +202,7 @@ export async function resolveIndexPatternConflicts( return importCount; } -export async function saveObjects(objs, overwriteAll) { +export async function saveObjects(objs: SavedObject[], overwriteAll: boolean) { let importCount = 0; await awaitEachItemInParallel(objs, async obj => { if (await saveObject(obj, overwriteAll)) { @@ -196,11 +212,16 @@ export async function saveObjects(objs, overwriteAll) { return importCount; } -export async function saveObject(obj, overwriteAll) { +export async function saveObject(obj: SavedObject, overwriteAll: boolean) { return await obj.save({ confirmOverwrite: !overwriteAll }); } -export async function resolveSavedSearches(savedSearches, services, indexPatterns, overwriteAll) { +export async function resolveSavedSearches( + savedSearches: any[], + services: SavedObjectLoader[], + indexPatterns: IndexPatternsContract, + overwriteAll: boolean +) { let importCount = 0; await awaitEachItemInParallel(savedSearches, async searchDoc => { const obj = await getSavedObject(searchDoc, services); @@ -216,18 +237,18 @@ export async function resolveSavedSearches(savedSearches, services, indexPattern } export async function resolveSavedObjects( - savedObjects, - overwriteAll, - services, - indexPatterns, - confirmModalPromise + savedObjects: SavedObjectsRawDoc[], + overwriteAll: boolean, + services: SavedObjectLoader[], + indexPatterns: IndexPatternsContract, + confirmModalPromise: OverlayStart['openConfirm'] ) { const docTypes = groupByType(savedObjects); // Keep track of how many we actually import because the user // can cancel an override let importedObjectCount = 0; - const failedImports = []; + const failedImports: any[] = []; // Start with the index patterns since everything is dependent on them await awaitEachItemInParallel(docTypes.indexPatterns, async indexPatternDoc => { try { @@ -247,18 +268,18 @@ export async function resolveSavedObjects( // We want to do the same for saved searches, but we want to keep them separate because they need // to be applied _first_ because other saved objects can be dependent on those saved searches existing - const conflictedSearchDocs = []; + const conflictedSearchDocs: any[] = []; // Keep a record of the index patterns assigned to our imported saved objects that do not // exist. We will provide a way for the user to manually select a new index pattern for those // saved objects. - const conflictedIndexPatterns = []; + const conflictedIndexPatterns: any[] = []; // Keep a record of any objects which fail to import for unknown reasons. // It's possible to have saved objects that link to saved searches which then link to index patterns // and those could error out, but the error comes as an index pattern not found error. We can't resolve // those the same as way as normal index pattern not found errors, but when those are fixed, it's very // likely that these saved objects will work once resaved so keep them around to resave them. - const conflictedSavedObjectsLinkedToSavedSearches = []; + const conflictedSavedObjectsLinkedToSavedSearches: any[] = []; await awaitEachItemInParallel(docTypes.searches, async searchDoc => { const obj = await getSavedObject(searchDoc, services); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/types.ts b/src/legacy/core_plugins/kibana/public/management/sections/objects/types.ts index 32436e96d4829..6a89142bc9798 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/types.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/types.ts @@ -17,7 +17,25 @@ * under the License. */ -import { SavedObjectReference } from 'src/core/public'; +import { SavedObject, SavedObjectReference } from 'src/core/public'; + +export interface SavedObjectMetadata { + icon?: string; + title?: string; + editUrl?: string; + inAppUrl?: { path: string; uiCapabilitiesPath: string }; +} + +export type SavedObjectWithMetadata = SavedObject & { + meta: SavedObjectMetadata; +}; + +export interface SavedObjectRelation { + id: string; + type: string; + relationship: 'child' | 'parent'; + meta: SavedObjectMetadata; +} export interface ObjectField { type: FieldType; diff --git a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts index 7e96d7bde6e13..f29f07ba4b20b 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts @@ -32,7 +32,7 @@ import { Storage } from '../../../../../plugins/kibana_utils/public'; import { EmbeddableStart } from '../../../../../plugins/embeddable/public'; import { SharePluginStart } from '../../../../../plugins/share/public'; import { DataPublicPluginStart, IndexPatternsContract } from '../../../../../plugins/data/public'; -import { VisualizationsStart } from '../../../visualizations/public'; +import { VisualizationsStart } from '../../../../../plugins/visualizations/public'; import { SavedVisualizations } from './np_ready/types'; import { UsageCollectionSetup } from '../../../../../plugins/usage_collection/public'; import { KibanaLegacyStart } from '../../../../../plugins/kibana_legacy/public'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/legacy.ts b/src/legacy/core_plugins/kibana/public/visualize/legacy.ts index fbbc7ab944daf..4ef2c93689714 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/legacy.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/legacy.ts @@ -19,14 +19,10 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; -import { start as visualizations } from '../../../visualizations/public/np_ready/public/legacy'; import { plugin } from './index'; const instance = plugin({ env: npSetup.plugins.kibanaLegacy.env, } as PluginInitializerContext); instance.setup(npSetup.core, npSetup.plugins); -instance.start(npStart.core, { - ...npStart.plugins, - visualizations, -}); +instance.start(npStart.core, npStart.plugins); diff --git a/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts b/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts index a2e2ba3543104..a6774e2dd47e8 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts @@ -28,7 +28,10 @@ export { absoluteToParsedUrl } from 'ui/url/absolute_to_parsed_url'; export { KibanaParsedUrl } from 'ui/url/kibana_parsed_url'; export { wrapInI18nContext } from 'ui/i18n'; export { DashboardConstants } from '../dashboard/np_ready/dashboard_constants'; -export { VisSavedObject, VISUALIZE_EMBEDDABLE_TYPE } from '../../../visualizations/public/'; +export { + VisSavedObject, + VISUALIZE_EMBEDDABLE_TYPE, +} from '../../../../../plugins/visualizations/public/'; export { configureAppAngularModule, migrateLegacyQuery, diff --git a/src/legacy/core_plugins/kibana/public/visualize/np_ready/legacy_app.js b/src/legacy/core_plugins/kibana/public/visualize/np_ready/legacy_app.js index b0b1ae31a02a5..d1bf4411cac2a 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/np_ready/legacy_app.js +++ b/src/legacy/core_plugins/kibana/public/visualize/np_ready/legacy_app.js @@ -204,6 +204,9 @@ export function initVisualizeApp(app, deps) { '/management/kibana/objects/savedVisualizations/' + $route.current.params.id, }, toastNotifications, + onBeforeRedirect() { + deps.setActiveUrl(VisualizeConstants.LANDING_PAGE_PATH); + }, }) ); }, diff --git a/src/legacy/core_plugins/kibana/public/visualize/np_ready/types.d.ts b/src/legacy/core_plugins/kibana/public/visualize/np_ready/types.d.ts index 246a031f05769..e376b4f2bbacf 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/np_ready/types.d.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/np_ready/types.d.ts @@ -27,9 +27,8 @@ import { import { EmbeddableStart } from 'src/plugins/embeddable/public'; import { PersistedState } from 'src/plugins/visualizations/public'; import { LegacyCoreStart } from 'kibana/public'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; import { VisSavedObject } from '../legacy_imports'; -import { SavedVisState } from '../../../../visualizations/public/np_ready/public/types'; +import { SavedVisState } from '../../../../../../plugins/visualizations/public'; import { SavedSearch } from '../../../../../../plugins/discover/public'; export type PureVisState = SavedVisState; diff --git a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts index 9d88152c59aa7..59b814c98dd08 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts @@ -43,7 +43,7 @@ import { KibanaLegacySetup, AngularRenderedAppUpdater, } from '../../../../../plugins/kibana_legacy/public'; -import { VisualizationsStart } from '../../../visualizations/public'; +import { VisualizationsStart } from '../../../../../plugins/visualizations/public'; import { VisualizeConstants } from './np_ready/visualize_constants'; import { setServices, VisualizeKibanaServices } from './kibana_services'; import { diff --git a/src/legacy/core_plugins/kibana/server/routes/api/management/index.js b/src/legacy/core_plugins/kibana/server/routes/api/management/index.js deleted file mode 100644 index b98ce360f57d3..0000000000000 --- a/src/legacy/core_plugins/kibana/server/routes/api/management/index.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { registerFind } from './saved_objects/find'; -import { registerRelationships } from './saved_objects/relationships'; -import { registerScrollForExportRoute, registerScrollForCountRoute } from './saved_objects/scroll'; - -export function managementApi(server) { - registerRelationships(server); - registerFind(server); - registerScrollForExportRoute(server); - registerScrollForCountRoute(server); -} diff --git a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/find.js b/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/find.js deleted file mode 100644 index 920b5c43678d1..0000000000000 --- a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/find.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * This file wraps the saved object `_find` API and is designed specifically for the saved object - * management UI. The main difference is this will inject a root `meta` attribute on each saved object - * that the UI depends on. The meta fields come from functions within uiExports which can't be - * injected into the front end when defined within uiExports. There are alternatives to this but have - * decided to go with this approach at the time of development. - */ - -import Joi from 'joi'; -import { injectMetaAttributes } from '../../../../lib/management/saved_objects/inject_meta_attributes'; - -export function registerFind(server) { - server.route({ - path: '/api/kibana/management/saved_objects/_find', - method: 'GET', - config: { - validate: { - query: Joi.object() - .keys({ - perPage: Joi.number() - .min(0) - .default(20), - page: Joi.number() - .min(0) - .default(1), - type: Joi.array() - .items(Joi.string()) - .single() - .required(), - search: Joi.string() - .allow('') - .optional(), - defaultSearchOperator: Joi.string() - .valid('OR', 'AND') - .default('OR'), - sortField: Joi.string(), - hasReference: Joi.object() - .keys({ - type: Joi.string().required(), - id: Joi.string().required(), - }) - .optional(), - fields: Joi.array() - .items(Joi.string()) - .single(), - }) - .default(), - }, - }, - async handler(request) { - const searchFields = new Set(); - const searchTypes = request.query.type; - const savedObjectsClient = request.getSavedObjectsClient(); - const savedObjectsManagement = server.getSavedObjectsManagement(); - const importAndExportableTypes = searchTypes.filter(type => - savedObjectsManagement.isImportAndExportable(type) - ); - - // Accumulate "defaultSearchField" attributes from savedObjectsManagement. Unfortunately - // search fields apply to all types of saved objects, the sum of these fields will - // be searched on for each object. - for (const type of importAndExportableTypes) { - const searchField = savedObjectsManagement.getDefaultSearchField(type); - if (searchField) { - searchFields.add(searchField); - } - } - - const findResponse = await savedObjectsClient.find({ - ...request.query, - fields: undefined, - searchFields: [...searchFields], - }); - return { - ...findResponse, - saved_objects: findResponse.saved_objects - .map(obj => injectMetaAttributes(obj, savedObjectsManagement)) - .map(obj => { - const result = { ...obj, attributes: {} }; - for (const field of request.query.fields || []) { - result.attributes[field] = obj.attributes[field]; - } - return result; - }), - }; - }, - }); -} diff --git a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/relationships.js b/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/relationships.js deleted file mode 100644 index eb6a7fc7b5195..0000000000000 --- a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/relationships.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import Joi from 'joi'; -import { findRelationships } from '../../../../lib/management/saved_objects/relationships'; - -export function registerRelationships(server) { - server.route({ - path: '/api/kibana/management/saved_objects/relationships/{type}/{id}', - method: ['GET'], - config: { - validate: { - params: Joi.object().keys({ - type: Joi.string(), - id: Joi.string(), - }), - query: Joi.object().keys({ - size: Joi.number().default(10000), - savedObjectTypes: Joi.array() - .single() - .items(Joi.string()) - .required(), - }), - }, - }, - - handler: async req => { - const type = req.params.type; - const id = req.params.id; - const size = req.query.size; - const savedObjectTypes = req.query.savedObjectTypes; - const savedObjectsClient = req.getSavedObjectsClient(); - const savedObjectsManagement = req.server.getSavedObjectsManagement(); - - return await findRelationships(type, id, { - size, - savedObjectsClient, - savedObjectsManagement, - savedObjectTypes, - }); - }, - }); -} diff --git a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.js b/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.js deleted file mode 100644 index b3edd42149d45..0000000000000 --- a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import Joi from 'joi'; - -async function findAll(savedObjectsClient, findOptions, page = 1, allObjects = []) { - const objects = await savedObjectsClient.find({ - ...findOptions, - page, - }); - - allObjects.push(...objects.saved_objects); - if (allObjects.length < objects.total) { - return findAll(savedObjectsClient, findOptions, page + 1, allObjects); - } - - return allObjects; -} - -export function registerScrollForExportRoute(server) { - server.route({ - path: '/api/kibana/management/saved_objects/scroll/export', - method: ['POST'], - config: { - validate: { - payload: Joi.object() - .keys({ - typesToInclude: Joi.array() - .items(Joi.string()) - .required(), - }) - .required(), - }, - }, - - handler: async req => { - const savedObjectsClient = req.getSavedObjectsClient(); - const objects = await findAll(savedObjectsClient, { - perPage: 1000, - type: req.payload.typesToInclude, - }); - - return objects.map(hit => { - return { - _id: hit.id, - _source: hit.attributes, - _meta: { - savedObjectVersion: 2, - }, - _migrationVersion: hit.migrationVersion, - _references: hit.references || [], - }; - }); - }, - }); -} - -export function registerScrollForCountRoute(server) { - server.route({ - path: '/api/kibana/management/saved_objects/scroll/counts', - method: ['POST'], - config: { - validate: { - payload: Joi.object() - .keys({ - typesToInclude: Joi.array() - .items(Joi.string()) - .required(), - searchString: Joi.string(), - }) - .required(), - }, - }, - - handler: async req => { - const savedObjectsClient = req.getSavedObjectsClient(); - const findOptions = { - type: req.payload.typesToInclude, - perPage: 1000, - }; - - if (req.payload.searchString) { - findOptions.search = `${req.payload.searchString}*`; - findOptions.searchFields = ['title']; - } - - const objects = await findAll(savedObjectsClient, findOptions); - const counts = objects.reduce((accum, result) => { - const type = result.type; - accum[type] = accum[type] || 0; - accum[type]++; - return accum; - }, {}); - - for (const type of req.payload.typesToInclude) { - if (!counts[type]) { - counts[type] = 0; - } - } - - return counts; - }, - }); -} diff --git a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.test.js b/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.test.js deleted file mode 100644 index 0d14da39d73b3..0000000000000 --- a/src/legacy/core_plugins/kibana/server/routes/api/management/saved_objects/scroll.test.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import Hapi from 'hapi'; -import { registerScrollForExportRoute } from './scroll'; - -const createMockServer = () => { - const mockServer = new Hapi.Server({ - debug: false, - port: 8080, - routes: { - validate: { - failAction: (r, h, err) => { - throw err; - }, - }, - }, - }); - return mockServer; -}; - -describe(`POST /api/kibana/management/saved_objects/scroll/export`, () => { - test('requires "typesToInclude"', async () => { - const mockServer = createMockServer(); - registerScrollForExportRoute(mockServer); - - const headers = {}; - const payload = {}; - - const request = { - method: 'POST', - url: `/api/kibana/management/saved_objects/scroll/export`, - headers, - payload, - }; - - const { result, statusCode } = await mockServer.inject(request); - expect(statusCode).toEqual(400); - expect(result).toMatchObject({ - message: `child "typesToInclude" fails because ["typesToInclude" is required]`, - }); - }); - - test(`uses "typesToInclude" when searching for objects to export`, async () => { - const mockServer = createMockServer(); - const mockClient = { - find: jest.fn(() => { - return { - saved_objects: [], - }; - }), - }; - - mockServer.decorate('request', 'getSavedObjectsClient', () => mockClient); - - registerScrollForExportRoute(mockServer); - - const headers = {}; - const payload = { - typesToInclude: ['foo', 'bar'], - }; - - const request = { - method: 'POST', - url: `/api/kibana/management/saved_objects/scroll/export`, - headers, - payload, - }; - - const { result, statusCode } = await mockServer.inject(request); - expect(statusCode).toEqual(200); - expect(result).toEqual([]); - - expect(mockClient.find).toHaveBeenCalledWith({ - page: 1, - perPage: 1000, - type: ['foo', 'bar'], - }); - }); -}); diff --git a/src/legacy/core_plugins/management/public/index.ts b/src/legacy/core_plugins/management/public/index.ts index 3d64b6d2aa2bb..bc3737524e125 100644 --- a/src/legacy/core_plugins/management/public/index.ts +++ b/src/legacy/core_plugins/management/public/index.ts @@ -30,8 +30,6 @@ export { plugin, IndexPatternCreationConfig, IndexPatternListConfig, - SavedObjectsManagementAction, - SavedObjectsManagementRecord, } from './np_ready'; export { diff --git a/src/legacy/core_plugins/management/public/legacy.ts b/src/legacy/core_plugins/management/public/legacy.ts index 4481bad79c47d..96d2c74398a0e 100644 --- a/src/legacy/core_plugins/management/public/legacy.ts +++ b/src/legacy/core_plugins/management/public/legacy.ts @@ -29,7 +29,7 @@ * simply delete this shim file. * * We are also calling `setup/start` here and exporting our public contract so that - * other legacy plugins are able to import from '../core_plugins/visualizations/legacy' + * other legacy plugins are able to import from '../core_plugins/management/legacy' * and receive the response value of the `setup/start` contract, mimicking the * data that will eventually be injected by the new platform. */ diff --git a/src/legacy/core_plugins/management/public/np_ready/index.ts b/src/legacy/core_plugins/management/public/np_ready/index.ts index ec93516df8349..bae0f1d3e23cd 100644 --- a/src/legacy/core_plugins/management/public/np_ready/index.ts +++ b/src/legacy/core_plugins/management/public/np_ready/index.ts @@ -40,8 +40,3 @@ export { IndexPatternCreationConfig, IndexPatternListConfig, } from './services/index_pattern_management'; - -export { - SavedObjectsManagementAction, - SavedObjectsManagementRecord, -} from './services/saved_objects_management'; diff --git a/src/legacy/core_plugins/management/public/np_ready/mocks.ts b/src/legacy/core_plugins/management/public/np_ready/mocks.ts index 5ed7c045d1f64..ae0be98de63f3 100644 --- a/src/legacy/core_plugins/management/public/np_ready/mocks.ts +++ b/src/legacy/core_plugins/management/public/np_ready/mocks.ts @@ -40,13 +40,6 @@ const createSetupContract = (): ManagementSetup => ({ areScriptedFieldsEnabled: jest.fn(), } as any, }, - savedObjects: { - registry: { - register: jest.fn(), - has: jest.fn(), - get: jest.fn(() => []), - }, - }, }); const createStartContract = (): ManagementStart => ({}); diff --git a/src/legacy/core_plugins/management/public/np_ready/plugin.ts b/src/legacy/core_plugins/management/public/np_ready/plugin.ts index 7dd2b23d40610..2a8ef10c817cc 100644 --- a/src/legacy/core_plugins/management/public/np_ready/plugin.ts +++ b/src/legacy/core_plugins/management/public/np_ready/plugin.ts @@ -19,10 +19,6 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'src/core/public'; import { HomePublicPluginSetup } from 'src/plugins/home/public'; import { IndexPatternManagementService, IndexPatternManagementSetup } from './services'; -import { - SavedObjectsManagementService, - SavedObjectsManagementServiceSetup, -} from './services/saved_objects_management'; export interface ManagementPluginSetupDependencies { home: HomePublicPluginSetup; @@ -33,7 +29,6 @@ interface ManagementPluginStartDependencies {} export interface ManagementSetup { indexPattern: IndexPatternManagementSetup; - savedObjects: SavedObjectsManagementServiceSetup; } // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -48,14 +43,12 @@ export class ManagementPlugin ManagementPluginStartDependencies > { private readonly indexPattern = new IndexPatternManagementService(); - private readonly savedObjects = new SavedObjectsManagementService(); constructor(initializerContext: PluginInitializerContext) {} public setup(core: CoreSetup, { home }: ManagementPluginSetupDependencies) { return { indexPattern: this.indexPattern.setup({ httpClient: core.http, home }), - savedObjects: this.savedObjects.setup({ home }), }; } diff --git a/src/legacy/core_plugins/management/public/np_ready/services/index.ts b/src/legacy/core_plugins/management/public/np_ready/services/index.ts index 4d55fce3d8a7d..9df010223542b 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/index.ts +++ b/src/legacy/core_plugins/management/public/np_ready/services/index.ts @@ -18,4 +18,3 @@ */ export * from './index_pattern_management'; -export * from './saved_objects_management'; diff --git a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.test.ts b/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.test.ts deleted file mode 100644 index 902b7f01c19f4..0000000000000 --- a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { SavedObjectsManagementActionRegistry } from './saved_objects_management_action_registry'; -import { SavedObjectsManagementAction } from './saved_objects_management_action'; - -describe('SavedObjectsManagementActionRegistry', () => { - it('allows actions to be registered and retrieved', () => { - const action = { id: 'foo' } as SavedObjectsManagementAction; - SavedObjectsManagementActionRegistry.register(action); - expect(SavedObjectsManagementActionRegistry.get()).toContain(action); - }); - - it('requires an "id" property', () => { - expect(() => - SavedObjectsManagementActionRegistry.register({} as SavedObjectsManagementAction) - ).toThrowErrorMatchingInlineSnapshot(`"Saved Objects Management Actions must have an id"`); - }); - - it('does not allow actions with duplicate ids to be registered', () => { - const action = { id: 'my-action' } as SavedObjectsManagementAction; - SavedObjectsManagementActionRegistry.register(action); - expect(() => - SavedObjectsManagementActionRegistry.register(action) - ).toThrowErrorMatchingInlineSnapshot( - `"Saved Objects Management Action with id 'my-action' already exists"` - ); - }); - - it('#has returns true when an action with a matching ID exists', () => { - const action = { id: 'existing-action' } as SavedObjectsManagementAction; - SavedObjectsManagementActionRegistry.register(action); - expect(SavedObjectsManagementActionRegistry.has('existing-action')).toEqual(true); - }); - - it(`#has returns false when an action with doesn't exist`, () => { - expect(SavedObjectsManagementActionRegistry.has('missing-action')).toEqual(false); - }); -}); diff --git a/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js b/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js index 23ca99791e92e..3880f42d52561 100644 --- a/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js +++ b/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js @@ -37,11 +37,13 @@ import afterdatachangePng from './afterdatachange.png'; import afterdatachangeandresizePng from './afterdatachangeandresize.png'; import aftercolorchangePng from './aftercolorchange.png'; import changestartupPng from './changestartup.png'; -import { setup as visualizationsSetup } from '../../../visualizations/public/np_ready/public/legacy'; import { createRegionMapVisualization } from '../region_map_visualization'; import { createRegionMapTypeDefinition } from '../region_map_type'; -import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ExprVis } from '../../../../../plugins/visualizations/public/expressions/vis'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { BaseVisType } from '../../../../../plugins/visualizations/public/vis_types/base_vis_type'; const THRESHOLD = 0.45; const PIXEL_DIFF = 96; @@ -50,6 +52,7 @@ describe('RegionMapsVisualizationTests', function() { let domNode; let RegionMapsVisualization; let vis; + let regionMapVisType; let dependencies; let imageComparator; @@ -84,8 +87,6 @@ describe('RegionMapsVisualizationTests', function() { ], }; - let visRegComplete = false; - beforeEach(ngMock.module('kibana')); let getManifestStub; @@ -105,11 +106,7 @@ describe('RegionMapsVisualizationTests', function() { uiSettings, }; - if (!visRegComplete) { - visRegComplete = true; - visualizationsSetup.createBaseVisualization(createRegionMapTypeDefinition(dependencies)); - } - + regionMapVisType = new BaseVisType(createRegionMapTypeDefinition(dependencies)); RegionMapsVisualization = createRegionMapVisualization(dependencies); ChoroplethLayer.prototype._makeJsonAjaxCall = async function() { @@ -154,7 +151,7 @@ describe('RegionMapsVisualizationTests', function() { imageComparator = new ImageComparator(); vis = new ExprVis({ - type: 'region_map', + type: regionMapVisType, }); vis.params.bucket = { diff --git a/src/legacy/core_plugins/region_map/public/legacy.ts b/src/legacy/core_plugins/region_map/public/legacy.ts index 495e558e29dd7..08615946affa2 100644 --- a/src/legacy/core_plugins/region_map/public/legacy.ts +++ b/src/legacy/core_plugins/region_map/public/legacy.ts @@ -20,7 +20,6 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { RegionMapPluginSetupDependencies, RegionMapsConfig } from './plugin'; import { LegacyDependenciesPlugin } from './shim'; import { plugin } from '.'; @@ -31,7 +30,7 @@ const regionmapsConfig = npSetup.core.injectedMetadata.getInjectedVar( const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, // Temporary solution // It will be removed when all dependent services are migrated to the new platform. diff --git a/src/legacy/core_plugins/region_map/public/plugin.ts b/src/legacy/core_plugins/region_map/public/plugin.ts index 98fb5604c3d65..cae569f8fd26d 100644 --- a/src/legacy/core_plugins/region_map/public/plugin.ts +++ b/src/legacy/core_plugins/region_map/public/plugin.ts @@ -24,7 +24,7 @@ import { IUiSettingsClient, } from '../../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { LegacyDependenciesPlugin, LegacyDependenciesPluginSetup } from './shim'; diff --git a/src/legacy/core_plugins/tile_map/public/__tests__/coordinate_maps_visualization.js b/src/legacy/core_plugins/tile_map/public/__tests__/coordinate_maps_visualization.js index 3b8a7dfbed313..2c142b19d9096 100644 --- a/src/legacy/core_plugins/tile_map/public/__tests__/coordinate_maps_visualization.js +++ b/src/legacy/core_plugins/tile_map/public/__tests__/coordinate_maps_visualization.js @@ -31,11 +31,13 @@ import EMS_TILES from '../../../../ui/public/vis/__tests__/map/ems_mocks/sample_ import EMS_STYLE_ROAD_MAP_BRIGHT from '../../../../ui/public/vis/__tests__/map/ems_mocks/sample_style_bright'; import EMS_STYLE_ROAD_MAP_DESATURATED from '../../../../ui/public/vis/__tests__/map/ems_mocks/sample_style_desaturated'; import EMS_STYLE_DARK_MAP from '../../../../ui/public/vis/__tests__/map/ems_mocks/sample_style_dark'; -import { setup as visualizationsSetup } from '../../../visualizations/public/np_ready/public/legacy'; import { createTileMapVisualization } from '../tile_map_visualization'; import { createTileMapTypeDefinition } from '../tile_map_type'; -import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ExprVis } from '../../../../../plugins/visualizations/public/expressions/vis'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { BaseVisType } from '../../../../../plugins/visualizations/public/vis_types/base_vis_type'; function mockRawData() { const stack = [dummyESResponse]; @@ -59,13 +61,13 @@ mockRawData(); const THRESHOLD = 0.45; const PIXEL_DIFF = 64; -let visRegComplete = false; describe('CoordinateMapsVisualizationTest', function() { let domNode; let CoordinateMapsVisualization; let vis; let dependencies; + let visType; let imageComparator; @@ -82,10 +84,7 @@ describe('CoordinateMapsVisualizationTest', function() { $injector, }; - if (!visRegComplete) { - visRegComplete = true; - visualizationsSetup.createBaseVisualization(createTileMapTypeDefinition(dependencies)); - } + visType = new BaseVisType(createTileMapTypeDefinition(dependencies)); CoordinateMapsVisualization = createTileMapVisualization(dependencies); @@ -120,7 +119,7 @@ describe('CoordinateMapsVisualizationTest', function() { imageComparator = new ImageComparator(); vis = new ExprVis({ - type: 'tile_map', + type: visType, }); vis.params = { mapType: 'Scaled Circle Markers', diff --git a/src/legacy/core_plugins/tile_map/public/components/wms_options.tsx b/src/legacy/core_plugins/tile_map/public/components/wms_options.tsx index 204ad5efa9b40..27127b781cd4d 100644 --- a/src/legacy/core_plugins/tile_map/public/components/wms_options.tsx +++ b/src/legacy/core_plugins/tile_map/public/components/wms_options.tsx @@ -23,7 +23,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { TmsLayer } from 'ui/vis/map/service_settings'; -import { Vis } from '../../../visualizations/public'; +import { Vis } from '../../../../../plugins/visualizations/public'; import { RegionMapVisParams } from '../../../region_map/public/types'; import { SelectOption, SwitchOption } from '../../../vis_type_vislib/public'; import { WmsInternalOptions } from './wms_internal_options'; diff --git a/src/legacy/core_plugins/tile_map/public/legacy.ts b/src/legacy/core_plugins/tile_map/public/legacy.ts index 74be8482bfd30..7b1f916076f61 100644 --- a/src/legacy/core_plugins/tile_map/public/legacy.ts +++ b/src/legacy/core_plugins/tile_map/public/legacy.ts @@ -20,14 +20,13 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { TileMapPluginSetupDependencies } from './plugin'; import { LegacyDependenciesPlugin } from './shim'; import { plugin } from '.'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, // Temporary solution // It will be removed when all dependent services are migrated to the new platform. diff --git a/src/legacy/core_plugins/tile_map/public/plugin.ts b/src/legacy/core_plugins/tile_map/public/plugin.ts index a12c2753cc525..f2addbe3ab872 100644 --- a/src/legacy/core_plugins/tile_map/public/plugin.ts +++ b/src/legacy/core_plugins/tile_map/public/plugin.ts @@ -24,7 +24,7 @@ import { IUiSettingsClient, } from '../../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { LegacyDependenciesPlugin, LegacyDependenciesPluginSetup } from './shim'; diff --git a/src/legacy/core_plugins/timelion/public/app.js b/src/legacy/core_plugins/timelion/public/app.js index a50f8a2cd3e8d..c15318d29e761 100644 --- a/src/legacy/core_plugins/timelion/public/app.js +++ b/src/legacy/core_plugins/timelion/public/app.js @@ -41,7 +41,6 @@ import './directives/saved_object_save_as_checkbox'; import './services/saved_sheet_register'; import rootTemplate from 'plugins/timelion/index.html'; -import { start as visualizations } from '../../visualizations/public/np_ready/public/legacy'; import { loadKbnTopNavDirectives } from '../../../../plugins/kibana_legacy/public'; loadKbnTopNavDirectives(npStart.plugins.navigation.ui); @@ -125,7 +124,7 @@ app.controller('timelion', function( timefilter.enableAutoRefreshSelector(); timefilter.enableTimeRangeSelector(); - const savedVisualizations = visualizations.savedVisualizationsLoader; + const savedVisualizations = npStart.plugins.visualizations.savedVisualizationsLoader; const timezone = getTimezone(config); const defaultExpression = '.es(*)'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts index 3aae10879138a..0c130a96230b4 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts @@ -17,7 +17,7 @@ * under the License. */ -import { VisParams } from 'src/legacy/core_plugins/visualizations/public'; +import { VisParams } from 'src/plugins/visualizations/public'; import { IAggType, IAggConfig, IAggGroupNames } from 'src/plugins/data/public'; import { Schema } from '../schemas'; import { EditorVisState } from './sidebar/state/reducers'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx index 98540d3414f2d..329704ca106db 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { VisParams } from 'src/legacy/core_plugins/visualizations/public'; +import { VisParams } from 'src/plugins/visualizations/public'; import { IAggConfig } from 'src/plugins/data/public'; import { DefaultEditorAggCommonProps } from '../agg_common_props'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx index 59642ae4c25f7..fc1cbb51b70a7 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx @@ -80,6 +80,8 @@ function FieldParamEditor({ } const isValid = !!value && !errors.length && !isDirty; + // we show an error message right away if there is no compatible fields + const showErrorMessage = (showValidation || !indexedFields.length) && !isValid; useValidation(setValidity, isValid); @@ -103,7 +105,7 @@ function FieldParamEditor({ return ( ); - const errors = []; - - if (!isValid && value) { - errors.push( - i18n.translate('visDefaultEditor.controls.timeInterval.invalidFormatErrorMessage', { - defaultMessage: 'Invalid interval format.', - }) - ); - } - - const onCustomInterval = (customValue: string) => { - const normalizedCustomValue = customValue.trim(); - setValue(normalizedCustomValue); - - if (normalizedCustomValue && search.aggs.isValidInterval(normalizedCustomValue, timeBase)) { - agg.write(); - } - }; + const onCustomInterval = (customValue: string) => setValue(customValue.trim()); const onChange = (opts: EuiComboBoxOptionOption[]) => { const selectedOpt: ComboBoxOption = get(opts, '0'); setValue(selectedOpt ? selectedOpt.key : ''); - - if (selectedOpt) { - agg.write(); - } }; useEffect(() => { @@ -121,10 +166,10 @@ function TimeIntervalParamEditor({ return ( { aggs: IAggConfigs; diff --git a/src/legacy/core_plugins/vis_type_markdown/public/legacy.ts b/src/legacy/core_plugins/vis_type_markdown/public/legacy.ts index d4a5290df865c..1cfc583f6e005 100644 --- a/src/legacy/core_plugins/vis_type_markdown/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_markdown/public/legacy.ts @@ -19,14 +19,12 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { MarkdownPluginSetupDependencies } from './plugin'; import { plugin } from '.'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_markdown/public/plugin.ts b/src/legacy/core_plugins/vis_type_markdown/public/plugin.ts index 71d6c1c69ef2d..0445d270c9330 100644 --- a/src/legacy/core_plugins/vis_type_markdown/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_markdown/public/plugin.ts @@ -19,7 +19,7 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { markdownVisDefinition } from './markdown_vis'; import { createMarkdownVisFn } from './markdown_fn'; diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx index 00e8df2f0f936..2bd423656b0f0 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx +++ b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx @@ -21,7 +21,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MetricVisComponent, MetricVisComponentProps } from './metric_vis_component'; -import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; +import { ExprVis } from '../../../../../plugins/visualizations/public'; jest.mock('../services', () => ({ getFormatService: () => ({ diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx index 3fca1df92eacb..de2cc66a99c79 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx +++ b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx @@ -27,8 +27,7 @@ import { KibanaDatatable } from '../../../../../plugins/expressions/public'; import { getHeatmapColors } from '../../../../../plugins/charts/public'; import { VisParams, MetricVisMetric } from '../types'; import { getFormatService } from '../services'; -import { SchemaConfig } from '../../../visualizations/public'; -import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; +import { SchemaConfig, ExprVis } from '../../../../../plugins/visualizations/public'; export interface MetricVisComponentProps { visParams: VisParams; diff --git a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts b/src/legacy/core_plugins/vis_type_metric/public/legacy.ts index 5fc2e48609d4b..ba883601e5d65 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/legacy.ts @@ -19,14 +19,12 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { MetricVisPluginSetupDependencies } from './plugin'; import { plugin } from '.'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, charts: npSetup.plugins.charts, }; diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts b/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts index 2a5478f23e850..459da47556307 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts @@ -17,112 +17,19 @@ * under the License. */ -import $ from 'jquery'; - -// TODO This is an integration test and thus requires a running platform. When moving to the new platform, -// this test has to be migrated to a real unit test. -// @ts-ignore -import getStubIndexPattern from 'fixtures/stubbed_logstash_index_pattern'; - -import { Vis } from '../../visualizations/public'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../visualizations/public/np_ready/public/legacy'; import { createMetricVisTypeDefinition } from './metric_vis_type'; +import { MetricVisComponent } from './components/metric_vis_component'; jest.mock('ui/new_platform'); -jest.mock('./services', () => ({ - getFormatService: () => ({ - deserialize: () => { - return { - convert: (x: unknown) => `ip[${x}]`, - }; - }, - }), -})); - jest.mock('../../vis_default_editor/public', () => ({ Schemas: class {}, })); describe('metric_vis - createMetricVisTypeDefinition', () => { - let vis: Vis; - - beforeAll(() => { - visualizationsSetup.createReactVisualization(createMetricVisTypeDefinition()); - }); - - const setup = () => { - const stubIndexPattern = getStubIndexPattern(); - - stubIndexPattern.stubSetFieldFormat('ip', 'url', { - urlTemplate: 'http://ip.info?address={{value}}', - labelTemplate: 'ip[{{value}}]', - }); - - const searchSource = { - getField: (name: string) => { - if (name === 'index') { - return stubIndexPattern; - } - }, - }; - - // TODO: remove when Vis is converted to typescript. Only importing Vis as type - // @ts-ignore - vis = visualizationsStart.createVis('metric', { - type: 'metric', - data: { - searchSource, - aggs: [{ id: '1', type: 'top_hits', schema: 'metric', params: { field: 'ip' } }], - }, - }); - - vis.params.dimensions = { - metrics: [ - { - accessor: 0, - format: { - id: 'url', - params: { - urlTemplate: 'http://ip.info?address={{value}}', - labelTemplate: 'ip[{{value}}]', - }, - }, - }, - ], - }; - - const el = document.createElement('div'); - const metricVisType = visualizationsStart.get('metric'); - const Controller = metricVisType.visualization; - const controller = new Controller(el, vis); - const render = (esResponse: any) => { - controller.render(esResponse, vis.params); - }; - - return { el, render }; - }; - - it('renders html value from field formatter', () => { - const { el, render } = setup(); - - const ip = '235.195.237.208'; - render({ - columns: [{ id: 'col-0', name: 'ip' }], - rows: [{ 'col-0': ip }], - }); - - const links = $(el) - .find('a[href]') - .filter(function() { - // @ts-ignore - return this.href.includes('ip.info'); - }); + it('has metric vis component set', () => { + const def = createMetricVisTypeDefinition(); - expect(links.length).toBe(1); - expect(links.text()).toBe(`ip[${ip}]`); + expect(def.visConfig.component).toBe(MetricVisComponent); }); }); diff --git a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts b/src/legacy/core_plugins/vis_type_metric/public/plugin.ts index 1c3e1568f4de2..cb65d5cafbdd2 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/plugin.ts @@ -19,7 +19,7 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { createMetricVisFn } from './metric_vis_fn'; import { createMetricVisTypeDefinition } from './metric_vis_type'; diff --git a/src/legacy/core_plugins/vis_type_metric/public/types.ts b/src/legacy/core_plugins/vis_type_metric/public/types.ts index 298eebf23027d..cae18dd8a2ab1 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/types.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/types.ts @@ -18,7 +18,7 @@ */ import { Range } from '../../../../plugins/expressions/public'; -import { SchemaConfig } from '../../visualizations/public'; +import { SchemaConfig } from '../../../../plugins/visualizations/public'; import { ColorModes, Labels, Style } from '../../vis_type_vislib/public'; import { ColorSchemas } from '../../../../plugins/charts/public'; diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js index 211b79e915038..a23407a599ae2 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js @@ -21,105 +21,17 @@ import $ from 'jquery'; import moment from 'moment'; import ngMock from 'ng_mock'; import expect from '@kbn/expect'; -import { - metricOnly, - threeTermBuckets, - oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative, -} from 'fixtures/fake_hierarchical_data'; import sinon from 'sinon'; import { npStart } from '../../legacy_imports'; -import { search } from '../../../../../../plugins/data/public'; -import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; import { round } from 'lodash'; -import { tableVisTypeDefinition } from '../../table_vis_type'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../../../visualizations/public/np_ready/public/legacy'; import { getAngularModule } from '../../get_inner_angular'; import { initTableVisLegacyModule } from '../../table_vis_legacy_module'; -import { tableVisResponseHandler } from '../../table_vis_response_handler'; - -const { tabifyAggResponse } = search; +import { tabifiedData } from './tabified_data'; describe('Table Vis - AggTable Directive', function() { let $rootScope; let $compile; - let indexPattern; let settings; - const tabifiedData = {}; - - const init = () => { - const searchSource = { - getField: name => { - if (name === 'index') { - return indexPattern; - } - }, - }; - const vis1 = visualizationsStart.createVis('table', { - type: 'table', - data: { searchSource, aggs: [] }, - }); - tabifiedData.metricOnly = tabifyAggResponse(vis1.data.aggs, metricOnly); - - const vis2 = visualizationsStart.createVis('table', { - type: 'table', - params: { - showMetricsAtAllLevels: true, - }, - data: { - aggs: [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'bucket', params: { field: 'extension' } }, - { type: 'terms', schema: 'bucket', params: { field: 'geo.src' } }, - { type: 'terms', schema: 'bucket', params: { field: 'machine.os' } }, - ], - searchSource, - }, - }); - vis2.data.aggs.aggs.forEach(function(agg, i) { - agg.id = 'agg_' + (i + 1); - }); - tabifiedData.threeTermBuckets = tabifyAggResponse(vis2.data.aggs, threeTermBuckets, { - metricsAtAllLevels: true, - }); - - const vis3 = visualizationsStart.createVis('table', { - type: 'table', - data: { - aggs: [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'min', schema: 'metric', params: { field: '@timestamp' } }, - { type: 'terms', schema: 'bucket', params: { field: 'extension' } }, - { - type: 'date_histogram', - schema: 'bucket', - params: { field: '@timestamp', interval: 'd' }, - }, - { - type: 'derivative', - schema: 'metric', - params: { metricAgg: 'custom', customMetric: { id: '5-orderAgg', type: 'count' } }, - }, - { - type: 'top_hits', - schema: 'metric', - params: { field: 'bytes', aggregate: { val: 'min' }, size: 1 }, - }, - ], - searchSource, - }, - }); - vis3.data.aggs.aggs.forEach(function(agg, i) { - agg.id = 'agg_' + (i + 1); - }); - - tabifiedData.oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative = tabifyAggResponse( - vis3.data.aggs, - oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative - ); - }; const initLocalAngular = () => { const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); @@ -128,20 +40,13 @@ describe('Table Vis - AggTable Directive', function() { beforeEach(initLocalAngular); - ngMock.inject(function() { - visualizationsSetup.createBaseVisualization(tableVisTypeDefinition); - }); - beforeEach(ngMock.module('kibana/table_vis')); beforeEach( - ngMock.inject(function($injector, Private, config) { - indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); + ngMock.inject(function($injector, config) { settings = config; $rootScope = $injector.get('$rootScope'); $compile = $injector.get('$compile'); - - init(); }) ); @@ -158,7 +63,7 @@ describe('Table Vis - AggTable Directive', function() { metrics: [{ accessor: 0, format: { id: 'number' }, params: {} }], buckets: [], }; - $scope.table = tableVisResponseHandler(tabifiedData.metricOnly, $scope.dimensions).tables[0]; + $scope.table = tabifiedData.metricOnly.tables[0]; const $el = $compile('')( $scope @@ -194,10 +99,7 @@ describe('Table Vis - AggTable Directive', function() { { accessor: 5, params: {} }, ], }; - $scope.table = tableVisResponseHandler( - tabifiedData.threeTermBuckets, - $scope.dimensions - ).tables[0]; + $scope.table = tabifiedData.threeTermBuckets.tables[0]; const $el = $(''); $compile($el)($scope); $scope.$digest(); @@ -261,11 +163,8 @@ describe('Table Vis - AggTable Directive', function() { { accessor: 5, format: { id: 'number' } }, ], }; - const response = tableVisResponseHandler( - tabifiedData.oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative, - $scope.dimensions - ); - $scope.table = response.tables[0]; + $scope.table = + tabifiedData.oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative.tables[0]; $scope.showTotal = true; $scope.totalFunc = totalFunc; const $el = $(`')( $scope @@ -419,10 +315,7 @@ describe('Table Vis - AggTable Directive', function() { { accessor: 5, params: {} }, ], }; - $scope.table = tableVisResponseHandler( - tabifiedData.threeTermBuckets, - $scope.dimensions - ).tables[0]; + $scope.table = tabifiedData.threeTermBuckets.tables[0]; const $el = $compile('')( $scope @@ -481,11 +374,8 @@ describe('Table Vis - AggTable Directive', function() { { accessor: 5, format: { id: 'number' } }, ], }; - const response = tableVisResponseHandler( - tabifiedData.oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative, - $scope.dimensions - ); - $scope.table = response.tables[0]; + $scope.table = + tabifiedData.oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative.tables[0]; $scope.percentageCol = 'Average bytes'; const $el = $(` { - const searchSource = { - getField: name => { - if (name === 'index') { - return indexPattern; - } - }, - }; - const vis1 = visualizationsStart.createVis('table', { - type: 'table', - data: { searchSource, aggs: [] }, - }); - tabifiedData.metricOnly = tabifyAggResponse(vis1.data.aggs, metricOnly); - - const vis2 = visualizationsStart.createVis('pie', { - type: 'pie', - data: { - aggs: [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'split', params: { field: 'extension' } }, - { type: 'terms', schema: 'segment', params: { field: 'geo.src' } }, - { type: 'terms', schema: 'segment', params: { field: 'machine.os' } }, - ], - searchSource, - }, - }); - vis2.data.aggs.aggs.forEach(function(agg, i) { - agg.id = 'agg_' + (i + 1); - }); - tabifiedData.threeTermBuckets = tabifyAggResponse(vis2.data.aggs, threeTermBuckets); - }; const initLocalAngular = () => { const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); @@ -78,23 +38,9 @@ describe('Table Vis - AggTableGroup Directive', function() { beforeEach(ngMock.module('kibana/table_vis')); beforeEach( - ngMock.inject(function($injector, Private) { - // this is provided in table_vis_controller.js - // tech debt that will be resolved through further deangularization and moving tests to jest - /* - legacyDependencies = { - // eslint-disable-next-line new-cap - createAngularVisualization: VisFactoryProvider(Private).createAngularVisualization, - }; - - visualizationsSetup.types.registerVisualization(() => createTableVisTypeDefinition(legacyDependencies)); - */ - - indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); + ngMock.inject(function($injector) { $rootScope = $injector.get('$rootScope'); $compile = $injector.get('$compile'); - - init(); }) ); @@ -111,7 +57,7 @@ describe('Table Vis - AggTableGroup Directive', function() { metrics: [{ accessor: 0, format: { id: 'number' }, params: {} }], buckets: [], }; - $scope.group = tableVisResponseHandler(tabifiedData.metricOnly, $scope.dimensions); + $scope.group = tabifiedData.metricOnly; $scope.sort = { columnIndex: null, direction: null, @@ -156,10 +102,7 @@ describe('Table Vis - AggTableGroup Directive', function() { { accessor: 5, params: {} }, ], }; - const group = ($scope.group = tableVisResponseHandler( - tabifiedData.threeTermBuckets, - $scope.dimensions - )); + const group = ($scope.group = tabifiedData.threeTermBucketsWithSplit); const $el = $( '' ); diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/tabified_data.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/tabified_data.js new file mode 100644 index 0000000000000..857b0ea8662cd --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/tabified_data.js @@ -0,0 +1,795 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const tabifiedData = { + metricOnly: { + tables: [ + { + columns: [ + { + id: 'col-0-1', + name: 'Count', + }, + ], + rows: [ + { + 'col-0-1': 1000, + }, + ], + }, + ], + }, + threeTermBuckets: { + tables: [ + { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + ], + }, + threeTermBucketsWithSplit: { + tables: [ + { + title: 'png: extension: Descending', + name: 'extension: Descending', + key: 'png', + column: 0, + row: 0, + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + tables: [ + { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + ], + }, + { + title: 'css: extension: Descending', + name: 'extension: Descending', + key: 'css', + column: 0, + row: 4, + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + tables: [ + { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + ], + }, + { + title: 'html: extension: Descending', + name: 'extension: Descending', + key: 'html', + column: 0, + row: 8, + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'IT', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'MX', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'linux', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-1-agg_3': 'US', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + tables: [ + { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-2-agg_4', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'CN', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'win', + 'col-3-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-1-agg_3': 'FR', + 'col-2-agg_4': 'mac', + 'col-3-agg_1': 3029, + }, + ], + }, + ], + }, + ], + direction: 'row', + }, + oneTermOneHistogramBucketWithTwoMetricsOneTopHitOneDerivative: { + tables: [ + { + columns: [ + { + id: 'col-0-agg_3', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_4', + name: '@timestamp per day', + }, + { + id: 'col-2-agg_1', + name: 'Average bytes', + }, + { + id: 'col-3-agg_2', + name: 'Min @timestamp', + }, + { + id: 'col-4-agg_5', + name: 'Derivative of Count', + }, + { + id: 'col-5-agg_6', + name: 'Last bytes', + }, + ], + rows: [ + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1411862400000, + 'col-2-agg_1': 9283, + 'col-3-agg_2': 1411862400000, + 'col-5-agg_6': 23, + }, + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1411948800000, + 'col-2-agg_1': 28349, + 'col-3-agg_2': 1411948800000, + 'col-4-agg_5': 203, + 'col-5-agg_6': 39, + }, + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1412035200000, + 'col-2-agg_1': 84330, + 'col-3-agg_2': 1412035200000, + 'col-4-agg_5': 200, + 'col-5-agg_6': 329, + }, + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1412121600000, + 'col-2-agg_1': 34992, + 'col-3-agg_2': 1412121600000, + 'col-4-agg_5': 103, + 'col-5-agg_6': 22, + }, + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1412208000000, + 'col-2-agg_1': 145432, + 'col-3-agg_2': 1412208000000, + 'col-4-agg_5': 153, + 'col-5-agg_6': 93, + }, + { + 'col-0-agg_3': 'png', + 'col-1-agg_4': 1412294400000, + 'col-2-agg_1': 220943, + 'col-3-agg_2': 1412294400000, + 'col-4-agg_5': 239, + 'col-5-agg_6': 72, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1411862400000, + 'col-2-agg_1': 9283, + 'col-3-agg_2': 1411862400000, + 'col-5-agg_6': 75, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1411948800000, + 'col-2-agg_1': 28349, + 'col-3-agg_2': 1411948800000, + 'col-4-agg_5': 10, + 'col-5-agg_6': 11, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1412035200000, + 'col-2-agg_1': 84330, + 'col-3-agg_2': 1412035200000, + 'col-4-agg_5': 24, + 'col-5-agg_6': 238, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1412121600000, + 'col-2-agg_1': 34992, + 'col-3-agg_2': 1412121600000, + 'col-4-agg_5': 49, + 'col-5-agg_6': 343, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1412208000000, + 'col-2-agg_1': 145432, + 'col-3-agg_2': 1412208000000, + 'col-4-agg_5': 100, + 'col-5-agg_6': 837, + }, + { + 'col-0-agg_3': 'css', + 'col-1-agg_4': 1412294400000, + 'col-2-agg_1': 220943, + 'col-3-agg_2': 1412294400000, + 'col-4-agg_5': 23, + 'col-5-agg_6': 302, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1411862400000, + 'col-2-agg_1': 9283, + 'col-3-agg_2': 1411862400000, + 'col-5-agg_6': 30, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1411948800000, + 'col-2-agg_1': 28349, + 'col-3-agg_2': 1411948800000, + 'col-4-agg_5': 1, + 'col-5-agg_6': 43, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1412035200000, + 'col-2-agg_1': 84330, + 'col-3-agg_2': 1412035200000, + 'col-4-agg_5': 5, + 'col-5-agg_6': 88, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1412121600000, + 'col-2-agg_1': 34992, + 'col-3-agg_2': 1412121600000, + 'col-4-agg_5': 10, + 'col-5-agg_6': 91, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1412208000000, + 'col-2-agg_1': 145432, + 'col-3-agg_2': 1412208000000, + 'col-4-agg_5': 43, + 'col-5-agg_6': 534, + }, + { + 'col-0-agg_3': 'html', + 'col-1-agg_4': 1412294400000, + 'col-2-agg_1': 220943, + 'col-3-agg_2': 1412294400000, + 'col-4-agg_5': 1, + 'col-5-agg_6': 553, + }, + ], + }, + ], + }, +}; diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy.ts b/src/legacy/core_plugins/vis_type_table/public/legacy.ts index 30403139d212d..3d5f8c1b3efe9 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_table/public/legacy.ts @@ -22,11 +22,10 @@ import { npSetup, npStart } from './legacy_imports'; import { plugin } from '.'; import { TablePluginSetupDependencies } from './plugin'; -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_table/public/plugin.ts b/src/legacy/core_plugins/vis_type_table/public/plugin.ts index 42bd36c83e28c..ea12a5320a14d 100644 --- a/src/legacy/core_plugins/vis_type_table/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_table/public/plugin.ts @@ -17,7 +17,7 @@ * under the License. */ import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts index ad56607e9296c..8d6f88bf8dd4a 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts @@ -27,7 +27,7 @@ import StubIndexPattern from 'test_utils/stub_index_pattern'; import { getAngularModule } from './get_inner_angular'; import { initTableVisLegacyModule } from './table_vis_legacy_module'; import { tableVisTypeDefinition } from './table_vis_type'; -import { Vis } from '../../visualizations/public'; +import { Vis } from '../../../../plugins/visualizations/public'; // eslint-disable-next-line import { stubFields } from '../../../../plugins/data/public/stubs'; // eslint-disable-next-line diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts index e70b09904253f..d26e860e51272 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts @@ -20,7 +20,7 @@ import { i18n } from '@kbn/i18n'; import { AggGroupNames } from '../../../../plugins/data/public'; import { Schemas } from '../../vis_default_editor/public'; -import { Vis } from '../../visualizations/public'; +import { Vis } from '../../../../plugins/visualizations/public'; import { tableVisResponseHandler } from './table_vis_response_handler'; // @ts-ignore import tableVisTemplate from './table_vis.html'; diff --git a/src/legacy/core_plugins/vis_type_table/public/types.ts b/src/legacy/core_plugins/vis_type_table/public/types.ts index 39023d1305cb6..c6de14b9f050c 100644 --- a/src/legacy/core_plugins/vis_type_table/public/types.ts +++ b/src/legacy/core_plugins/vis_type_table/public/types.ts @@ -17,7 +17,7 @@ * under the License. */ -import { SchemaConfig } from '../../visualizations/public'; +import { SchemaConfig } from '../../../../plugins/visualizations/public'; export enum AggTypes { SUM = 'sum', diff --git a/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts b/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts index 2feaad9f4e6b6..5bb730d2f9b10 100644 --- a/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts +++ b/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts @@ -20,11 +20,10 @@ import angular, { IModule, auto, IRootScopeService, IScope, ICompileService } from 'angular'; import $ from 'jquery'; -import { VisParams } from '../../visualizations/public'; +import { VisParams, ExprVis } from '../../../../plugins/visualizations/public'; import { npStart } from './legacy_imports'; import { getAngularModule } from './get_inner_angular'; import { initTableVisLegacyModule } from './table_vis_legacy_module'; -import { ExprVis } from '../../visualizations/public/np_ready/public/expressions/vis'; const innerAngularName = 'kibana/table_vis'; diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/components/__tests__/tag_cloud_visualization.js b/src/legacy/core_plugins/vis_type_tagcloud/public/components/__tests__/tag_cloud_visualization.js index 6f54744a2f508..9e611861417cd 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/components/__tests__/tag_cloud_visualization.js +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/components/__tests__/tag_cloud_visualization.js @@ -19,20 +19,23 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; -import { start as visualizationsStart } from '../../../../../core_plugins/visualizations/public/np_ready/public/legacy'; import { ImageComparator } from 'test_utils/image_comparator'; import { createTagCloudVisualization } from '../tag_cloud_visualization'; import basicdrawPng from './basicdraw.png'; import afterresizePng from './afterresize.png'; import afterparamChange from './afterparamchange.png'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ExprVis } from '../../../../../../plugins/visualizations/public/expressions/vis'; // Replace with mock when converting to jest tests // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { seedColors } from '../../../../../../plugins/charts/public/services/colors/seed_colors'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { BaseVisType } from '../../../../../../plugins/visualizations/public/vis_types/base_vis_type'; +import { createTagCloudVisTypeDefinition } from '../../tag_cloud_type'; const THRESHOLD = 0.65; const PIXEL_DIFF = 64; - describe('TagCloudVisualizationTest', function() { let domNode; let vis; @@ -67,10 +70,11 @@ describe('TagCloudVisualizationTest', function() { describe('TagCloudVisualization - basics', function() { beforeEach(async function() { + const visType = new BaseVisType(createTagCloudVisTypeDefinition({ colors: seedColors })); setupDOM('512px', '512px'); imageComparator = new ImageComparator(); - vis = visualizationsStart.createVis('tagcloud', { - type: 'tagcloud', + vis = new ExprVis({ + type: visType, params: { bucket: { accessor: 0, format: {} }, metric: { accessor: 0, format: {} }, diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts index 96073caf20515..f70789edc66ba 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts @@ -19,14 +19,12 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { TagCloudPluginSetupDependencies } from './plugin'; import { plugin } from '.'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, charts: npSetup.plugins.charts, }; diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts index c9dd4943519be..1061271aa315b 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts @@ -19,7 +19,7 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { ChartsPluginSetup } from '../../../../plugins/charts/public'; import { createTagCloudFn } from './tag_cloud_fn'; diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts index 30fd185be877d..fef46282eb8dd 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts @@ -23,3 +23,5 @@ import { DataPublicPluginStart } from '../../../../plugins/data/public'; export const [getFormatService, setFormatService] = createGetterSetter< DataPublicPluginStart['fieldFormats'] >('data.fieldFormats'); + +export { npStart } from 'ui/new_platform'; diff --git a/src/legacy/core_plugins/vis_type_timelion/index.ts b/src/legacy/core_plugins/vis_type_timelion/index.ts index 6c1e3f452959e..7bca5154c84fd 100644 --- a/src/legacy/core_plugins/vis_type_timelion/index.ts +++ b/src/legacy/core_plugins/vis_type_timelion/index.ts @@ -25,7 +25,7 @@ import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy const timelionVisPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => new Plugin({ id: 'timelion_vis', - require: ['kibana', 'elasticsearch', 'visualizations'], + require: ['kibana', 'elasticsearch'], publicDir: resolve(__dirname, 'public'), uiExports: { styleSheetPaths: resolve(__dirname, 'public/index.scss'), diff --git a/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_vis.tsx b/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_vis.tsx index f55d1602ea342..0fad0a164bf0b 100644 --- a/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_vis.tsx +++ b/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_vis.tsx @@ -23,7 +23,7 @@ import { IUiSettingsClient } from 'kibana/public'; import { ChartComponent } from './chart'; import { VisParams } from '../timelion_vis_fn'; import { TimelionSuccessResponse } from '../helpers/timelion_request_handler'; -import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; +import { ExprVis } from '../../../../../plugins/visualizations/public'; export interface TimelionVisComponentProp { config: IUiSettingsClient; diff --git a/src/legacy/core_plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts b/src/legacy/core_plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts index 47bfed6340e93..61e31420f73ba 100644 --- a/src/legacy/core_plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts +++ b/src/legacy/core_plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { KIBANA_CONTEXT_NAME } from 'src/plugins/expressions/public'; -import { VisParams } from 'src/legacy/core_plugins/visualizations/public'; +import { VisParams } from '../../../../../plugins/visualizations/public'; import { TimeRange, Filter, esQuery, Query } from '../../../../../plugins/data/public'; import { TimelionVisDependencies } from '../plugin'; import { getTimezone } from './get_timezone'; diff --git a/src/legacy/core_plugins/vis_type_timelion/public/legacy.ts b/src/legacy/core_plugins/vis_type_timelion/public/legacy.ts index 9935f3d92f6bd..f8de9f94dcedf 100644 --- a/src/legacy/core_plugins/vis_type_timelion/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_timelion/public/legacy.ts @@ -20,15 +20,13 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from './legacy_imports'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { TimelionVisSetupDependencies } from './plugin'; import { plugin } from '.'; const setupPlugins: Readonly = { expressions: npSetup.plugins.expressions, data: npSetup.plugins.data, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_timelion/public/plugin.ts b/src/legacy/core_plugins/vis_type_timelion/public/plugin.ts index 8d067369fef70..b5aa64db19aa4 100644 --- a/src/legacy/core_plugins/vis_type_timelion/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_timelion/public/plugin.ts @@ -29,7 +29,7 @@ import { Plugin as ExpressionsPlugin } from 'src/plugins/expressions/public'; import { DataPublicPluginSetup, TimefilterContract } from 'src/plugins/data/public'; import { PluginsStart } from './legacy_imports'; -import { VisualizationsSetup } from '../../visualizations/public/np_ready/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { getTimelionVisualizationConfig } from './timelion_vis_fn'; import { getTimelionVisDefinition } from './timelion_vis_type'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/legacy.ts b/src/legacy/core_plugins/vis_type_timeseries/public/legacy.ts index fb22bbd4146e2..42f116701be51 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_timeseries/public/legacy.ts @@ -19,14 +19,12 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { MetricsPluginSetupDependencies } from './plugin'; import { plugin } from '.'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts b/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts index 441b1f05ea78c..0310ecf6cfd87 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts @@ -18,7 +18,7 @@ */ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'kibana/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { createMetricsFn } from './metrics_fn'; import { metricsVisDefinition } from './metrics_type'; diff --git a/src/legacy/core_plugins/vis_type_vega/public/__tests__/vega_visualization.js b/src/legacy/core_plugins/vis_type_vega/public/__tests__/vega_visualization.js index 0db3e6cefa724..c7fbc0815b07c 100644 --- a/src/legacy/core_plugins/vis_type_vega/public/__tests__/vega_visualization.js +++ b/src/legacy/core_plugins/vis_type_vega/public/__tests__/vega_visualization.js @@ -39,15 +39,15 @@ import vegaMapImage256 from './vega_map_image_256.png'; import { VegaParser } from '../data_model/vega_parser'; import { SearchCache } from '../data_model/search_cache'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../../visualizations/public/np_ready/public/legacy'; import { createVegaTypeDefinition } from '../vega_type'; // TODO This is an integration test and thus requires a running platform. When moving to the new platform, // this test has to be migrated to the newly created integration test environment. // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { npStart } from 'ui/new_platform'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { BaseVisType } from '../../../../../plugins/visualizations/public/vis_types/base_vis_type'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ExprVis } from '../../../../../plugins/visualizations/public/expressions/vis'; import { setInjectedVars } from '../services'; const THRESHOLD = 0.1; @@ -59,7 +59,7 @@ describe('VegaVisualizations', () => { let vis; let imageComparator; let vegaVisualizationDependencies; - let visRegComplete = false; + let vegaVisType; setInjectedVars({ emsTileLayerId: {}, @@ -89,13 +89,7 @@ describe('VegaVisualizations', () => { }, }; - if (!visRegComplete) { - visRegComplete = true; - visualizationsSetup.createBaseVisualization( - createVegaTypeDefinition(vegaVisualizationDependencies) - ); - } - + vegaVisType = new BaseVisType(createVegaTypeDefinition(vegaVisualizationDependencies)); VegaVisualization = createVegaVisualization(vegaVisualizationDependencies); }) ); @@ -105,7 +99,9 @@ describe('VegaVisualizations', () => { setupDOM('512px', '512px'); imageComparator = new ImageComparator(); - vis = visualizationsStart.createVis('vega', { type: 'vega' }); + vis = new ExprVis({ + type: vegaVisType, + }); }); afterEach(function() { diff --git a/src/legacy/core_plugins/vis_type_vega/public/data_model/vega_parser.js b/src/legacy/core_plugins/vis_type_vega/public/data_model/vega_parser.js index 7c2638d1f5165..735ce60f76d47 100644 --- a/src/legacy/core_plugins/vis_type_vega/public/data_model/vega_parser.js +++ b/src/legacy/core_plugins/vis_type_vega/public/data_model/vega_parser.js @@ -116,7 +116,8 @@ export class VegaParser { */ _compileVegaLite() { this.vlspec = this.spec; - const logger = vega.logger(vega.Warn); + // eslint-disable-next-line import/namespace + const logger = vega.logger(vega.Warn); // note: eslint has a false positive here logger.warn = this._onWarning.bind(this); this.spec = vegaLite.compile(this.vlspec, logger).spec; diff --git a/src/legacy/core_plugins/vis_type_vega/public/legacy.ts b/src/legacy/core_plugins/vis_type_vega/public/legacy.ts index 38ce706ed13ef..b2c73894d978d 100644 --- a/src/legacy/core_plugins/vis_type_vega/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_vega/public/legacy.ts @@ -19,15 +19,13 @@ import { PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; - -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; import { VegaPluginSetupDependencies, VegaPluginStartDependencies } from './plugin'; import { LegacyDependenciesPlugin } from './shim'; import { plugin } from '.'; const setupPlugins: Readonly = { ...npSetup.plugins, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, // Temporary solution // It will be removed when all dependent services are migrated to the new platform. diff --git a/src/legacy/core_plugins/vis_type_vega/public/plugin.ts b/src/legacy/core_plugins/vis_type_vega/public/plugin.ts index 3b01d9ceca5a6..38b92a40cd99a 100644 --- a/src/legacy/core_plugins/vis_type_vega/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vega/public/plugin.ts @@ -20,7 +20,7 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../.. import { LegacyDependenciesPlugin, LegacyDependenciesPluginSetup } from './shim'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; import { Plugin as DataPublicPlugin } from '../../../../plugins/data/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { setNotifications, setData, diff --git a/src/legacy/core_plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/legacy/core_plugins/vis_type_vega/public/vega_view/vega_base_view.js index 76a2e672e0bd0..c90f059ff7c94 100644 --- a/src/legacy/core_plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/legacy/core_plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -132,7 +132,8 @@ export class VegaBaseView { createViewConfig() { const config = { - logLevel: vega.Warn, + // eslint-disable-next-line import/namespace + logLevel: vega.Warn, // note: eslint has a false positive here renderer: this._parser.renderer, }; diff --git a/src/legacy/core_plugins/vis_type_vislib/index.ts b/src/legacy/core_plugins/vis_type_vislib/index.ts index 1f75aea31ba0b..da9476285a9b2 100644 --- a/src/legacy/core_plugins/vis_type_vislib/index.ts +++ b/src/legacy/core_plugins/vis_type_vislib/index.ts @@ -25,7 +25,7 @@ import { LegacyPluginApi, LegacyPluginInitializer } from '../../types'; const visTypeVislibPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => new Plugin({ id: 'vis_type_vislib', - require: ['kibana', 'elasticsearch', 'visualizations', 'interpreter'], + require: ['kibana', 'elasticsearch', 'interpreter'], publicDir: resolve(__dirname, 'public'), styleSheetPaths: resolve(__dirname, 'public/index.scss'), uiExports: { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/chart_options.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/chart_options.tsx index bc12e04e29468..ec7a325ba43d1 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/chart_options.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/chart_options.tsx @@ -22,7 +22,7 @@ import React, { useMemo, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { SeriesParam, ValueAxis } from '../../../types'; import { ChartTypes } from '../../../utils/collections'; import { SelectOption } from '../../common'; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/line_options.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/line_options.tsx index a53d21b121f7d..01a69a6fac70b 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/line_options.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/line_options.tsx @@ -22,7 +22,7 @@ import React, { useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { SeriesParam } from '../../../types'; import { NumberInputOption, SelectOption, SwitchOption } from '../../common'; import { SetChart } from './chart_options'; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/mocks.ts b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/mocks.ts index 58c75629f1fa1..0d9fa8c25a4f7 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/mocks.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/mocks.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { Axis, ValueAxis, SeriesParam, Style } from '../../../types'; import { ChartTypes, diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/series_panel.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/series_panel.tsx index 44e7a4cfb0088..22a726b53363b 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/series_panel.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/series_panel.tsx @@ -23,7 +23,7 @@ import { EuiPanel, EuiTitle, EuiSpacer, EuiAccordion } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { ValueAxis, SeriesParam } from '../../../types'; import { ChartOptions } from './chart_options'; import { SetParamByIndex, ChangeValueAxis } from './'; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axes_panel.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axes_panel.tsx index 30d80ed595fe7..912c3b904b110 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axes_panel.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axes_panel.tsx @@ -31,7 +31,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { SeriesParam, ValueAxis } from '../../../types'; import { ValueAxisOptions } from './value_axis_options'; import { SetParamByIndex } from './'; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axis_options.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axis_options.tsx index 0e78bf2f31ef6..8f0327e78c7ab 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axis_options.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/value_axis_options.tsx @@ -21,7 +21,7 @@ import React, { useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSpacer, EuiAccordion, EuiHorizontalRule } from '@elastic/eui'; -import { Vis } from 'src/legacy/core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../plugins/visualizations/public'; import { ValueAxis } from '../../../types'; import { Positions } from '../../../utils/collections'; import { SelectOption, SwitchOption, TextInputOption } from '../../common'; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts index ef7277222e5fd..aa11e0ef41fba 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts @@ -25,11 +25,10 @@ import { VisTypeVislibPluginSetupDependencies, VisTypeVislibPluginStartDependencies, } from './plugin'; -import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; const setupPlugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, charts: npSetup.plugins.charts, }; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts index 9f7b8cbeea11e..da16a38deba9f 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts @@ -19,6 +19,7 @@ import { search } from '../../../../plugins/data/public'; export const { tabifyAggResponse, tabifyGetColumns } = search; + // @ts-ignore export { buildHierarchicalData } from 'ui/agg_response/hierarchical/build_hierarchical_data'; // @ts-ignore diff --git a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts index 8b4510050802e..2731fb6f5fbe6 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts @@ -25,7 +25,7 @@ import { } from 'kibana/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../visualizations/public'; +import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { createVisTypeVislibVisFn } from './vis_type_vislib_vis_fn'; import { createPieVisFn } from './pie_fn'; import { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vis_controller.tsx b/src/legacy/core_plugins/vis_type_vislib/public/vis_controller.tsx index 010b61a0900b0..ec091e5d29cfd 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vis_controller.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/vis_controller.tsx @@ -26,8 +26,7 @@ import { Positions } from './utils/collections'; import { VisTypeVislibDependencies } from './plugin'; import { mountReactNode } from '../../../../core/public/utils'; import { VisLegend, CUSTOM_LEGEND_VIS_TYPES } from './vislib/components/legend'; -import { VisParams } from '../../visualizations/public'; -import { ExprVis } from '../../visualizations/public/np_ready/public/expressions/vis'; +import { VisParams, ExprVis } from '../../../../plugins/visualizations/public'; const legendClassName = { top: 'visLib--legend-top', diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart.js index 21f4e60e4bc6e..caafb2c636271 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart.js @@ -22,91 +22,8 @@ import _ from 'lodash'; import $ from 'jquery'; import expect from '@kbn/expect'; -import { threeTermBuckets } from 'fixtures/fake_hierarchical_data'; -import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; - -import { start as visualizationsStart } from '../../../../../visualizations/public/np_ready/public/legacy'; import { getVis, getMockUiState } from '../lib/fixtures/_vis_fixture'; -import { tabifyAggResponse } from '../../../legacy_imports'; -import { vislibSlicesResponseHandler } from '../../response_handler'; - -const rowAgg = [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'split', params: { field: 'extension', rows: true } }, - { type: 'terms', schema: 'segment', params: { field: 'machine.os' } }, - { type: 'terms', schema: 'segment', params: { field: 'geo.src' } }, -]; - -const rowAggDimensions = { - splitRow: [ - { - accessor: 0, - }, - ], - buckets: [ - { - accessor: 2, - }, - { - accessor: 4, - }, - ], - metric: { - accessor: 5, - }, -}; - -const colAgg = [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'split', params: { field: 'extension', row: false } }, - { type: 'terms', schema: 'segment', params: { field: 'machine.os' } }, - { type: 'terms', schema: 'segment', params: { field: 'geo.src' } }, -]; - -const colAggDimensions = { - splitColumn: [ - { - accessor: 0, - }, - ], - buckets: [ - { - accessor: 2, - }, - { - accessor: 4, - }, - ], - metric: { - accessor: 5, - }, -}; - -const sliceAgg = [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'segment', params: { field: 'machine.os' } }, - { type: 'terms', schema: 'segment', params: { field: 'geo.src' } }, -]; - -const sliceAggDimensions = { - buckets: [ - { - accessor: 0, - }, - { - accessor: 2, - }, - ], - metric: { - accessor: 3, - }, -}; - -const aggArray = [ - [rowAgg, rowAggDimensions], - [colAgg, colAggDimensions], - [sliceAgg, sliceAggDimensions], -]; +import { pieChartMockData } from './pie_chart_mock_data'; const names = ['rows', 'columns', 'slices']; @@ -121,47 +38,14 @@ describe('No global chart settings', function() { }; let chart1; let mockUiState; - let indexPattern; - let responseHandler; - let data1; - let stubVis1; beforeEach(() => { chart1 = getVis(visLibParams1); mockUiState = getMockUiState(); - indexPattern = new FixturesStubbedLogstashIndexPatternProvider(); - responseHandler = vislibSlicesResponseHandler; - - let id1 = 1; - stubVis1 = visualizationsStart.createVis('pie', { - type: 'pie', - data: { - aggs: rowAgg, - searchSource: { - getField: name => { - if (name === 'index') { - return indexPattern; - } - }, - }, - }, - }); - - stubVis1.isHierarchical = () => true; - - // We need to set the aggs to a known value. - _.each(stubVis1.data.aggs.aggs, function(agg) { - agg.id = 'agg_' + id1++; - }); }); beforeEach(async () => { - const table1 = tabifyAggResponse(stubVis1.data.aggs, threeTermBuckets, { - metricsAtAllLevels: true, - }); - data1 = await responseHandler(table1, rowAggDimensions); - - chart1.render(data1, mockUiState); + chart1.render(pieChartMockData.rowData, mockUiState); }); afterEach(function() { @@ -209,55 +93,21 @@ describe('No global chart settings', function() { }); describe('Vislib PieChart Class Test Suite', function() { - aggArray.forEach(function(aggItem, i) { - const [dataAgg, dataDimensions] = aggItem; + ['rowData', 'columnData', 'sliceData'].forEach(function(aggItem, i) { describe('Vislib PieChart Class Test Suite for ' + names[i] + ' data', function() { + const mockPieData = pieChartMockData[aggItem]; + const visLibParams = { type: 'pie', addLegend: true, addTooltip: true, }; let vis; - let mockUiState; - let indexPattern; - let data; - let stubVis; - let responseHandler; - - beforeEach(() => { - vis = getVis(visLibParams); - mockUiState = getMockUiState(); - indexPattern = new FixturesStubbedLogstashIndexPatternProvider(); - responseHandler = vislibSlicesResponseHandler; - - let id = 1; - stubVis = visualizationsStart.createVis('pie', { - type: 'pie', - data: { - aggs: dataAgg, - searchSource: { - getField: name => { - if (name === 'index') { - return indexPattern; - } - }, - }, - }, - }); - - // We need to set the aggs to a known value. - _.each(stubVis.data.aggs.aggs, function(agg) { - agg.id = 'agg_' + id++; - }); - }); beforeEach(async () => { - const table = tabifyAggResponse(stubVis.data.aggs, threeTermBuckets, { - metricsAtAllLevels: true, - }); - data = await responseHandler(table, dataDimensions); - - vis.render(data, mockUiState); + vis = getVis(visLibParams); + const mockUiState = getMockUiState(); + vis.render(mockPieData, mockUiState); }); afterEach(function() { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart_mock_data.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart_mock_data.js new file mode 100644 index 0000000000000..188cd51759e51 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/visualizations/pie_chart_mock_data.js @@ -0,0 +1,3742 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const pieChartMockData = { + rowData: { + rows: [ + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['IT', 'win', 'mac', 'US', 'linux'], + slices: { + children: [ + { + name: 'IT', + size: 9299, + children: [ + { + name: 'win', + size: 0, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 9299, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'IT', + }, + }, + { + name: 'US', + size: 8293, + children: [ + { + name: 'linux', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'linux', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'US', + }, + }, + ], + }, + label: 'png: extension: Descending', + }, + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['MX', 'win', 'mac', 'US', 'linux'], + slices: { + children: [ + { + name: 'MX', + size: 9299, + children: [ + { + name: 'win', + size: 4992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 5892, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'MX', + }, + }, + { + name: 'US', + size: 8293, + children: [ + { + name: 'linux', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'linux', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'US', + }, + }, + ], + }, + label: 'css: extension: Descending', + }, + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['CN', 'win', 'mac', 'FR'], + slices: { + children: [ + { + name: 'CN', + size: 9299, + children: [ + { + name: 'win', + size: 4992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 5892, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'CN', + }, + }, + { + name: 'FR', + size: 8293, + children: [ + { + name: 'win', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'FR', + }, + }, + ], + }, + label: 'html: extension: Descending', + }, + ], + hits: 12, + }, + columnData: { + columns: [ + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['IT', 'win', 'mac', 'US', 'linux'], + slices: { + children: [ + { + name: 'IT', + size: 9299, + children: [ + { + name: 'win', + size: 0, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 9299, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'IT', + }, + }, + { + name: 'US', + size: 8293, + children: [ + { + name: 'linux', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'linux', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 0, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'US', + }, + }, + ], + }, + label: 'png: extension: Descending', + }, + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['MX', 'win', 'mac', 'US', 'linux'], + slices: { + children: [ + { + name: 'MX', + size: 9299, + children: [ + { + name: 'win', + size: 4992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 5892, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'MX', + }, + }, + { + name: 'US', + size: 8293, + children: [ + { + name: 'linux', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'linux', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'linux', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'US', + }, + }, + ], + }, + label: 'css: extension: Descending', + }, + { + hits: 4, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + names: ['CN', 'win', 'mac', 'FR'], + slices: { + children: [ + { + name: 'CN', + size: 9299, + children: [ + { + name: 'win', + size: 4992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 5892, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 1, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 0, + column: 2, + value: 'CN', + }, + }, + { + name: 'FR', + size: 8293, + children: [ + { + name: 'win', + size: 3992, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 4, + value: 'win', + }, + }, + { + name: 'mac', + size: 3029, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 3, + column: 4, + value: 'mac', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'extension: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'machine.os: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + { + id: 'col-4-agg_4', + name: 'geo.src: Descending', + }, + { + id: 'col-5-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 4992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + 'col-5-agg_1': 5892, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'win', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3992, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-4-agg_4': 'mac', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + 'col-5-agg_1': 3029, + }, + ], + }, + row: 2, + column: 2, + value: 'FR', + }, + }, + ], + }, + label: 'html: extension: Descending', + }, + ], + hits: 12, + }, + sliceData: { + hits: 6, + raw: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + names: ['png', 'IT', 'US', 'css', 'MX', 'html', 'CN', 'FR'], + slices: { + children: [ + { + name: 'png', + size: 412032, + children: [ + { + name: 'IT', + size: 9299, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 0, + column: 2, + value: 'IT', + }, + }, + { + name: 'US', + size: 8293, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 1, + column: 2, + value: 'US', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 0, + column: 0, + value: 'png', + }, + }, + { + name: 'css', + size: 412032, + children: [ + { + name: 'MX', + size: 9299, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 2, + column: 2, + value: 'MX', + }, + }, + { + name: 'US', + size: 8293, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 3, + column: 2, + value: 'US', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 2, + column: 0, + value: 'css', + }, + }, + { + name: 'html', + size: 412032, + children: [ + { + name: 'CN', + size: 9299, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 4, + column: 2, + value: 'CN', + }, + }, + { + name: 'FR', + size: 8293, + children: [], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 5, + column: 2, + value: 'FR', + }, + }, + ], + rawData: { + table: { + columns: [ + { + id: 'col-0-agg_2', + name: 'machine.os: Descending', + }, + { + id: 'col-1-agg_1', + name: 'Average bytes', + }, + { + id: 'col-2-agg_3', + name: 'geo.src: Descending', + }, + { + id: 'col-3-agg_1', + name: 'Average bytes', + }, + ], + rows: [ + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'IT', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'png', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'MX', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'css', + 'col-2-agg_3': 'US', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'CN', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 9299, + }, + { + 'col-0-agg_2': 'html', + 'col-2-agg_3': 'FR', + 'col-1-agg_1': 412032, + 'col-3-agg_1': 8293, + }, + ], + }, + row: 4, + column: 0, + value: 'html', + }, + }, + ], + }, + }, +}; diff --git a/src/legacy/core_plugins/vis_type_xy/public/legacy.ts b/src/legacy/core_plugins/vis_type_xy/public/legacy.ts index e1cee9c30804a..740ceeaac6a7d 100644 --- a/src/legacy/core_plugins/vis_type_xy/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_xy/public/legacy.ts @@ -22,20 +22,16 @@ import { PluginInitializerContext } from 'kibana/public'; import { plugin } from '.'; import { VisTypeXyPluginSetupDependencies, VisTypeXyPluginStartDependencies } from './plugin'; -import { - setup as visualizationsSetup, - start as visualizationsStart, -} from '../../visualizations/public/np_ready/public/legacy'; const setupPlugins: Readonly = { expressions: npSetup.plugins.expressions, - visualizations: visualizationsSetup, + visualizations: npSetup.plugins.visualizations, charts: npSetup.plugins.charts, }; const startPlugins: Readonly = { expressions: npStart.plugins.expressions, - visualizations: visualizationsStart, + visualizations: npStart.plugins.visualizations, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_xy/public/plugin.ts b/src/legacy/core_plugins/vis_type_xy/public/plugin.ts index 0884cdf6a5e18..ab01b6b3153fb 100644 --- a/src/legacy/core_plugins/vis_type_xy/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_xy/public/plugin.ts @@ -26,7 +26,10 @@ import { } from 'kibana/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup, VisualizationsStart } from '../../visualizations/public'; +import { + VisualizationsSetup, + VisualizationsStart, +} from '../../../../plugins/visualizations/public'; import { ChartsPluginSetup } from '../../../../plugins/charts/public'; export interface VisTypeXyDependencies { diff --git a/src/legacy/core_plugins/visualizations/package.json b/src/legacy/core_plugins/visualizations/package.json deleted file mode 100644 index 5b436f0c2fef2..0000000000000 --- a/src/legacy/core_plugins/visualizations/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "visualizations", - "version": "kibana" -} diff --git a/src/legacy/core_plugins/visualizations/public/index.scss b/src/legacy/core_plugins/visualizations/public/index.scss deleted file mode 100644 index 238f58fbfa295..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import 'src/legacy/ui/public/styles/styling_constants'; -@import './np_ready/public/index'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/kibana.json b/src/legacy/core_plugins/visualizations/public/np_ready/kibana.json deleted file mode 100644 index f8637a71b2d35..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/kibana.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": "visualizations", - "version": "kibana", - "server": false, - "ui": true, - "requiredPlugins": ["data", "expressions", "uiActions", "embeddable", "usageCollection"] -} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts deleted file mode 100644 index 078cc4a3f4035..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Visualizations Plugin - public - * - * This is the entry point for the entire client-side public contract of the plugin. - * If something is not explicitly exported here, you can safely assume it is private - * to the plugin and not considered stable. - * - * All stateful contracts will be injected by the platform at runtime, and are defined - * in the setup/start interfaces in `plugin.ts`. The remaining items exported here are - * either types, or static code. - */ - -import { PublicContract } from '@kbn/utility-types'; -import { PluginInitializerContext } from '../../../../../../core/public'; -import { VisualizationsPlugin, VisualizationsSetup, VisualizationsStart } from './plugin'; - -/** @public */ -export { VisualizationsSetup, VisualizationsStart }; - -/** @public types */ -export { VisTypeAlias, VisType } from './vis_types'; -export { VisSavedObject } from './types'; -export { Vis, VisParams, SerializedVis, SerializedVisData, VisData } from './vis'; -import { VisualizeEmbeddableFactory, VisualizeEmbeddable } from './embeddable'; -export type VisualizeEmbeddableFactoryContract = PublicContract; -export type VisualizeEmbeddableContract = PublicContract; -export { TypesService } from './vis_types/types_service'; -export { VISUALIZE_EMBEDDABLE_TYPE, VisualizeInput } from './embeddable'; -export { SchemaConfig } from './legacy/build_pipeline'; - -export function plugin(initializerContext: PluginInitializerContext) { - return new VisualizationsPlugin(initializerContext); -} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/_vis.js b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/_vis.js deleted file mode 100644 index deb345a77cdb6..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/_vis.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import _ from 'lodash'; -import ngMock from 'ng_mock'; -import expect from '@kbn/expect'; -import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; -import { start as visualizations } from '../../legacy'; - -describe('Vis Class', function() { - let indexPattern; - let visTypes; - - let vis; - const stateFixture = { - type: 'pie', - aggs: [ - { type: 'avg', schema: 'metric', params: { field: 'bytes' } }, - { type: 'terms', schema: 'segment', params: { field: 'machine.os' } }, - { type: 'terms', schema: 'segment', params: { field: 'geo.src' } }, - ], - params: { isDonut: true }, - listeners: { click: _.noop }, - }; - - beforeEach(ngMock.module('kibana')); - beforeEach( - ngMock.inject(function(Private) { - indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); - visTypes = visualizations; - }) - ); - - beforeEach(function() { - vis = visualizations.createVis(indexPattern, stateFixture); - }); - - const verifyVis = function(vis) { - expect(vis).to.have.property('aggs'); - expect(vis.aggs.aggs).to.have.length(3); - - expect(vis).to.have.property('type'); - expect(vis.type).to.eql(visTypes.get('pie')); - - expect(vis).to.have.property('params'); - expect(vis.params).to.have.property('isDonut', true); - expect(vis).to.have.property('indexPattern', indexPattern); - }; - - describe('initialization', function() { - it('should set the state', function() { - verifyVis(vis); - }); - }); - - describe('getState()', function() { - it('should get a state that represents the... er... state', function() { - const state = vis.getEnabledState(); - expect(state).to.have.property('type', 'pie'); - - expect(state).to.have.property('params'); - expect(state.params).to.have.property('isDonut', true); - - expect(state).to.have.property('aggs'); - expect(state.aggs).to.have.length(3); - }); - }); - - describe('setState()', function() { - it('should set the state to defaults', function() { - const vis = visualizations.createVis(indexPattern); - expect(vis).to.have.property('type'); - expect(vis.type).to.eql(visTypes.get('histogram')); - expect(vis).to.have.property('aggs'); - expect(vis.aggs.aggs).to.have.length(1); - expect(vis).to.have.property('params'); - expect(vis.params).to.have.property('addLegend', true); - expect(vis.params).to.have.property('addTooltip', true); - }); - }); - - describe('isHierarchical()', function() { - it('should return true for hierarchical vis (like pie)', function() { - expect(vis.isHierarchical()).to.be(true); - }); - it('should return false for non-hierarchical vis (like histogram)', function() { - const vis = visualizations.createVis(indexPattern); - expect(vis.isHierarchical()).to.be(false); - }); - }); -}); diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/base_vis_type.js b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/base_vis_type.js deleted file mode 100644 index 9c1dfd9780255..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/base_vis_type.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import { BaseVisType } from '../../../vis_types/base_vis_type'; - -describe('Base Vis Type', function() { - beforeEach(ngMock.module('kibana')); - - describe('initialization', () => { - it('should throw if mandatory properties are missing', () => { - expect(() => { - new BaseVisType({}); - }).to.throwError('vis_type must define its name'); - - expect(() => { - new BaseVisType({ name: 'test' }); - }).to.throwError('vis_type must define its title'); - - expect(() => { - new BaseVisType({ name: 'test', title: 'test' }); - }).to.throwError('vis_type must define its description'); - - expect(() => { - new BaseVisType({ name: 'test', title: 'test', description: 'test' }); - }).to.throwError('vis_type must define its icon or image'); - - expect(() => { - new BaseVisType({ name: 'test', title: 'test', description: 'test', icon: 'test' }); - }).to.throwError('vis_type must define visualization controller'); - - expect(() => { - new BaseVisType({ - name: 'test', - title: 'test', - description: 'test', - icon: 'test', - visualization: {}, - }); - }).to.not.throwError(); - }); - }); -}); diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts deleted file mode 100644 index 17f777e4e80e1..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { PluginInitializerContext } from '../../../../../../core/public'; -import { VisualizationsSetup, VisualizationsStart } from './'; -import { VisualizationsPlugin } from './plugin'; -import { coreMock } from '../../../../../../core/public/mocks'; -import { embeddablePluginMock } from '../../../../../../plugins/embeddable/public/mocks'; -import { expressionsPluginMock } from '../../../../../../plugins/expressions/public/mocks'; -import { dataPluginMock } from '../../../../../../plugins/data/public/mocks'; -import { usageCollectionPluginMock } from '../../../../../../plugins/usage_collection/public/mocks'; -import { uiActionsPluginMock } from '../../../../../../plugins/ui_actions/public/mocks'; - -const createSetupContract = (): VisualizationsSetup => ({ - createBaseVisualization: jest.fn(), - createReactVisualization: jest.fn(), - registerAlias: jest.fn(), - hideTypes: jest.fn(), -}); - -const createStartContract = (): VisualizationsStart => ({ - get: jest.fn(), - all: jest.fn(), - getAliases: jest.fn(), - savedVisualizationsLoader: {} as any, - showNewVisModal: jest.fn(), - createVis: jest.fn(), - convertFromSerializedVis: jest.fn(), - convertToSerializedVis: jest.fn(), -}); - -const createInstance = async () => { - const plugin = new VisualizationsPlugin({} as PluginInitializerContext); - - const setup = plugin.setup(coreMock.createSetup(), { - data: dataPluginMock.createSetupContract(), - expressions: expressionsPluginMock.createSetupContract(), - embeddable: embeddablePluginMock.createSetupContract(), - usageCollection: usageCollectionPluginMock.createSetupContract(), - }); - const doStart = () => - plugin.start(coreMock.createStart(), { - data: dataPluginMock.createStartContract(), - expressions: expressionsPluginMock.createStartContract(), - uiActions: uiActionsPluginMock.createStartContract(), - }); - - return { - plugin, - setup, - doStart, - }; -}; - -export const visualizationsPluginMock = { - createSetupContract, - createStartContract, - createInstance, -}; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts deleted file mode 100644 index 3ade6cee0d4d2..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { - PluginInitializerContext, - CoreSetup, - CoreStart, - Plugin, -} from '../../../../../../core/public'; -import { TypesService, TypesSetup, TypesStart } from './vis_types'; -import { - setUISettings, - setTypes, - setI18n, - setCapabilities, - setHttp, - setIndexPatterns, - setSavedObjects, - setUsageCollector, - setFilterManager, - setExpressions, - setUiActions, - setSavedVisualizationsLoader, - setTimeFilter, - setAggs, - setChrome, - setOverlays, -} from './services'; -import { VISUALIZE_EMBEDDABLE_TYPE, VisualizeEmbeddableFactory } from './embeddable'; -import { ExpressionsSetup, ExpressionsStart } from '../../../../../../plugins/expressions/public'; -import { EmbeddableSetup } from '../../../../../../plugins/embeddable/public'; -import { visualization as visualizationFunction } from './expressions/visualization_function'; -import { visualization as visualizationRenderer } from './expressions/visualization_renderer'; -import { - DataPublicPluginSetup, - DataPublicPluginStart, -} from '../../../../../../plugins/data/public'; -import { UsageCollectionSetup } from '../../../../../../plugins/usage_collection/public'; -import { createSavedVisLoader, SavedVisualizationsLoader } from './saved_visualizations'; -import { SerializedVis, Vis } from './vis'; -import { showNewVisModal } from './wizard'; -import { UiActionsStart } from '../../../../../../plugins/ui_actions/public'; -import { - convertFromSerializedVis, - convertToSerializedVis, -} from './saved_visualizations/_saved_vis'; - -/** - * Interface for this plugin's returned setup/start contracts. - * - * @public - */ - -export type VisualizationsSetup = TypesSetup; - -export interface VisualizationsStart extends TypesStart { - savedVisualizationsLoader: SavedVisualizationsLoader; - createVis: (visType: string, visState?: SerializedVis) => Vis; - convertToSerializedVis: typeof convertToSerializedVis; - convertFromSerializedVis: typeof convertFromSerializedVis; - showNewVisModal: typeof showNewVisModal; -} - -export interface VisualizationsSetupDeps { - expressions: ExpressionsSetup; - embeddable: EmbeddableSetup; - usageCollection: UsageCollectionSetup; - data: DataPublicPluginSetup; -} - -export interface VisualizationsStartDeps { - data: DataPublicPluginStart; - expressions: ExpressionsStart; - uiActions: UiActionsStart; -} - -/** - * Visualizations Plugin - public - * - * This plugin's stateful contracts are returned from the `setup` and `start` methods - * below. The interfaces for these contracts are provided above. - * - * @internal - */ -export class VisualizationsPlugin - implements - Plugin< - VisualizationsSetup, - VisualizationsStart, - VisualizationsSetupDeps, - VisualizationsStartDeps - > { - private readonly types: TypesService = new TypesService(); - - constructor(initializerContext: PluginInitializerContext) {} - - public setup( - core: CoreSetup, - { expressions, embeddable, usageCollection, data }: VisualizationsSetupDeps - ): VisualizationsSetup { - setUISettings(core.uiSettings); - setUsageCollector(usageCollection); - - expressions.registerFunction(visualizationFunction); - expressions.registerRenderer(visualizationRenderer); - - const embeddableFactory = new VisualizeEmbeddableFactory(); - embeddable.registerEmbeddableFactory(VISUALIZE_EMBEDDABLE_TYPE, embeddableFactory); - - return { - ...this.types.setup(), - }; - } - - public start( - core: CoreStart, - { data, expressions, uiActions }: VisualizationsStartDeps - ): VisualizationsStart { - const types = this.types.start(); - setI18n(core.i18n); - setTypes(types); - setCapabilities(core.application.capabilities); - setHttp(core.http); - setSavedObjects(core.savedObjects); - setIndexPatterns(data.indexPatterns); - setFilterManager(data.query.filterManager); - setExpressions(expressions); - setUiActions(uiActions); - setTimeFilter(data.query.timefilter.timefilter); - setAggs(data.search.aggs); - setOverlays(core.overlays); - setChrome(core.chrome); - const savedVisualizationsLoader = createSavedVisLoader({ - savedObjectsClient: core.savedObjects.client, - indexPatterns: data.indexPatterns, - chrome: core.chrome, - overlays: core.overlays, - visualizationTypes: types, - }); - setSavedVisualizationsLoader(savedVisualizationsLoader); - - return { - ...types, - showNewVisModal, - /** - * creates new instance of Vis - * @param {IIndexPattern} indexPattern - index pattern to use - * @param {VisState} visState - visualization configuration - */ - createVis: (visType: string, visState?: SerializedVis) => new Vis(visType, visState), - convertToSerializedVis, - convertFromSerializedVis, - savedVisualizationsLoader, - }; - } - - public stop() { - this.types.stop(); - } -} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/types.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/types.ts deleted file mode 100644 index 8f93a179af3bc..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/types.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { SavedObject } from '../../../../../../plugins/saved_objects/public'; -import { ISearchSource, AggConfigOptions } from '../../../../../../plugins/data/public'; -import { SerializedVis, Vis, VisParams } from './vis'; - -export { Vis, SerializedVis, VisParams }; - -export interface VisualizationController { - render(visData: any, visParams: any): Promise; - destroy(): void; - isLoaded?(): Promise | void; -} - -export interface SavedVisState { - type: string; - params: VisParams; - aggs: AggConfigOptions[]; -} - -export interface ISavedVis { - id: string; - title: string; - description?: string; - visState: SavedVisState; - searchSource?: ISearchSource; - uiStateJSON?: string; - savedSearchRefName?: string; - savedSearchId?: string; -} - -// @ts-ignore-next-line -export interface VisSavedObject extends SavedObject, ISavedVis {} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/base_vis_type.js b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/base_vis_type.js deleted file mode 100644 index 50ff74cfe9dd3..0000000000000 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/base_vis_type.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import _ from 'lodash'; - -export class BaseVisType { - constructor(opts = {}) { - if (!opts.name) { - throw 'vis_type must define its name'; - } - if (!opts.title) { - throw 'vis_type must define its title'; - } - if (!opts.description) { - throw 'vis_type must define its description'; - } - if (!opts.icon && !opts.image) { - throw 'vis_type must define its icon or image'; - } - if (!opts.visualization) { - throw 'vis_type must define visualization controller'; - } - - const _defaults = { - // name, title, description, icon, image - visualization: null, // must be a class with render/resize/destroy methods - visConfig: { - defaults: {}, // default configuration - }, - requestHandler: 'courier', // select one from registry or pass a function - responseHandler: 'none', - editor: null, // no default is provided - editorConfig: { - collections: {}, // collections used for configuration (list of positions, ...) - }, - options: { - // controls the visualize editor - showTimePicker: true, - showQueryBar: true, - showFilterBar: true, - showIndexSelection: true, - hierarchicalData: false, // we should get rid of this i guess ? - }, - stage: 'production', - feedbackMessage: '', - hidden: false, - }; - - _.defaultsDeep(this, opts, _defaults); - - this.requiresSearch = this.requestHandler !== 'none'; - } - - shouldMarkAsExperimentalInUI() { - return this.stage === 'experimental'; - } - - get schemas() { - if (this.editorConfig && this.editorConfig.schemas) { - return this.editorConfig.schemas; - } - return []; - } -} diff --git a/src/legacy/server/config/schema.js b/src/legacy/server/config/schema.js index 769d9ba311281..4b7618712cdd8 100644 --- a/src/legacy/server/config/schema.js +++ b/src/legacy/server/config/schema.js @@ -263,7 +263,7 @@ export default () => .allow(''), emsFileApiUrl: Joi.string().default('https://vector.maps.elastic.co'), emsTileApiUrl: Joi.string().default('https://tiles.maps.elastic.co'), - emsLandingPageUrl: Joi.string().default('https://maps.elastic.co/v7.6'), + emsLandingPageUrl: Joi.string().default('https://maps.elastic.co/v7.7'), emsFontLibraryUrl: Joi.string().default( 'https://tiles.maps.elastic.co/fonts/{fontstack}/{range}.pbf' ), diff --git a/src/legacy/server/http/index.js b/src/legacy/server/http/index.js index d616afb533d0a..3649987d89b9a 100644 --- a/src/legacy/server/http/index.js +++ b/src/legacy/server/http/index.js @@ -18,7 +18,6 @@ */ import { format } from 'url'; -import { resolve } from 'path'; import _ from 'lodash'; import Boom from 'boom'; @@ -32,22 +31,6 @@ export default async function(kbnServer, server, config) { await registerHapiPlugins(server); - // provide a simple way to expose static directories - server.decorate('server', 'exposeStaticDir', function(routePath, dirPath) { - this.route({ - path: routePath, - method: 'GET', - handler: { - directory: { - path: dirPath, - listing: false, - lookupCompressed: true, - }, - }, - config: { auth: false }, - }); - }); - // helper for creating view managers for servers server.decorate('server', 'setupViews', function(path, engines) { this.views({ @@ -77,7 +60,4 @@ export default async function(kbnServer, server, config) { .permanent(true); }, }); - - // Expose static assets - server.exposeStaticDir('/ui/{path*}', resolve(__dirname, '../../ui/public/assets')); } diff --git a/src/legacy/server/kbn_server.d.ts b/src/legacy/server/kbn_server.d.ts index d222dbb550f11..d43ddf581da90 100644 --- a/src/legacy/server/kbn_server.d.ts +++ b/src/legacy/server/kbn_server.d.ts @@ -39,9 +39,6 @@ import { LegacyServiceDiscoverPlugins, } from '../../core/server'; -// Disable lint errors for imports from src/core/server/saved_objects until SavedObjects migration is complete -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SavedObjectsManagement } from '../../core/server/saved_objects/management'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { LegacyConfig, ILegacyService, ILegacyInternals } from '../../core/server/legacy'; import { ApmOssPlugin } from '../core_plugins/apm_oss'; @@ -78,7 +75,6 @@ declare module 'hapi' { addScopedTutorialContextFactory: ( scopedTutorialContextFactory: (...args: any[]) => any ) => void; - getSavedObjectsManagement(): SavedObjectsManagement; getInjectedUiAppVars: (pluginName: string) => { [key: string]: any }; getUiNavLinks(): Array<{ _id: string }>; addMemoizedFactoryToRequest: ( diff --git a/src/legacy/server/plugins/lib/plugin.js b/src/legacy/server/plugins/lib/plugin.js index e73f1bf2c4d38..2b392d13d595a 100644 --- a/src/legacy/server/plugins/lib/plugin.js +++ b/src/legacy/server/plugins/lib/plugin.js @@ -73,7 +73,10 @@ export class Plugin { }); if (this.publicDir) { - server.exposeStaticDir(`/plugins/${id}/{path*}`, this.publicDir); + server.newPlatform.__internals.http.registerStaticDir( + `/plugins/${id}/{path*}`, + this.publicDir + ); } // Many of the plugins are simply adding static assets to the server and we don't need diff --git a/src/legacy/server/sass/build.js b/src/legacy/server/sass/build.js index 3d892ce321c2e..1ec656786ccc5 100644 --- a/src/legacy/server/sass/build.js +++ b/src/legacy/server/sass/build.js @@ -34,7 +34,7 @@ const access = promisify(fs.access); const copyFile = promisify(fs.copyFile); const mkdirAsync = promisify(fs.mkdir); -const UI_ASSETS_DIR = resolve(__dirname, '../../ui/public/assets'); +const UI_ASSETS_DIR = resolve(__dirname, '../../../core/server/core_app/assets'); const DARK_THEME_IMPORTER = url => { if (url.includes('eui_colors_light')) { return { file: url.replace('eui_colors_light', 'eui_colors_dark') }; diff --git a/src/legacy/server/saved_objects/saved_objects_mixin.js b/src/legacy/server/saved_objects/saved_objects_mixin.js index cc63099c8a211..bcf766231dc9c 100644 --- a/src/legacy/server/saved_objects/saved_objects_mixin.js +++ b/src/legacy/server/saved_objects/saved_objects_mixin.js @@ -29,7 +29,6 @@ import { } from '../../../core/server/saved_objects'; import { getRootPropertiesObjects } from '../../../core/server/saved_objects/mappings'; import { convertTypesToLegacySchema } from '../../../core/server/saved_objects/utils'; -import { SavedObjectsManagement } from '../../../core/server/saved_objects/management'; export function savedObjectsMixin(kbnServer, server) { const migrator = kbnServer.newPlatform.__internals.kibanaMigrator; @@ -40,11 +39,6 @@ export function savedObjectsMixin(kbnServer, server) { const visibleTypes = allTypes.filter(type => !schema.isHiddenType(type)); server.decorate('server', 'kibanaMigrator', migrator); - server.decorate( - 'server', - 'getSavedObjectsManagement', - () => new SavedObjectsManagement(typeRegistry) - ); const warn = message => server.log(['warning', 'saved-objects'], message); // we use kibana.index which is technically defined in the kibana plugin, so if @@ -84,8 +78,13 @@ export function savedObjectsMixin(kbnServer, server) { const provider = kbnServer.newPlatform.__internals.savedObjectsClientProvider; + const importAndExportableTypes = typeRegistry + .getImportableAndExportableTypes() + .map(type => type.name); + const service = { types: visibleTypes, + importAndExportableTypes, SavedObjectsClient, SavedObjectsRepository, getSavedObjectsRepository: createRepository, diff --git a/src/legacy/server/saved_objects/saved_objects_mixin.test.js b/src/legacy/server/saved_objects/saved_objects_mixin.test.js index 3745f0b92123c..3fa9f9a936988 100644 --- a/src/legacy/server/saved_objects/saved_objects_mixin.test.js +++ b/src/legacy/server/saved_objects/saved_objects_mixin.test.js @@ -183,7 +183,7 @@ describe('Saved Objects Mixin', () => { 'kibanaMigrator', expect.any(Object) ); - expect(mockServer.decorate).toHaveBeenCalledTimes(2); + expect(mockServer.decorate).toHaveBeenCalledTimes(1); expect(mockServer.route).not.toHaveBeenCalled(); }); }); diff --git a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts index 6f6b4be86f58d..f9f4494929014 100644 --- a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts +++ b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts @@ -30,6 +30,8 @@ import { usageCollectionPluginMock } from '../../../../../plugins/usage_collecti import { kibanaLegacyPluginMock } from '../../../../../plugins/kibana_legacy/public/mocks'; import { chartPluginMock } from '../../../../../plugins/charts/public/mocks'; import { advancedSettingsMock } from '../../../../../plugins/advanced_settings/public/mocks'; +import { savedObjectsManagementPluginMock } from '../../../../../plugins/saved_objects_management/public/mocks'; +import { visualizationsPluginMock } from '../../../../../plugins/visualizations/public/mocks'; /* eslint-enable @kbn/eslint/no-restricted-paths */ export const pluginsMock = { @@ -43,7 +45,9 @@ export const pluginsMock = { uiActions: uiActionsPluginMock.createSetupContract(), usageCollection: usageCollectionPluginMock.createSetupContract(), advancedSettings: advancedSettingsMock.createSetupContract(), + visualizations: visualizationsPluginMock.createSetupContract(), kibanaLegacy: kibanaLegacyPluginMock.createSetupContract(), + savedObjectsManagement: savedObjectsManagementPluginMock.createSetupContract(), }), createStart: () => ({ data: dataPluginMock.createStartContract(), @@ -55,7 +59,9 @@ export const pluginsMock = { uiActions: uiActionsPluginMock.createStartContract(), management: managementPluginMock.createStartContract(), advancedSettings: advancedSettingsMock.createStartContract(), + visualizations: visualizationsPluginMock.createStartContract(), kibanaLegacy: kibanaLegacyPluginMock.createStartContract(), + savedObjectsManagement: savedObjectsManagementPluginMock.createStartContract(), }), }; diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index 67877c5382633..25647e4a08897 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -20,20 +20,7 @@ import sinon from 'sinon'; import { getFieldFormatsRegistry } from '../../../../test_utils/public/stub_field_formats'; import { METRIC_TYPE } from '@kbn/analytics'; -import { - setFieldFormats, - setIndexPatterns, - setInjectedMetadata, - setHttp, - setNotifications, - setOverlays, - setQueryService, - setSearchService, - setUiSettings, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../plugins/data/public/services'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { setAggs } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/services'; +import { setSetupServices, setStartServices } from './set_services'; import { AggTypesRegistry, getAggTypes, @@ -57,6 +44,10 @@ const mockComponent = () => { return null; }; +let refreshInterval = undefined; +let isTimeRangeSelectorEnabled = true; +let isAutoRefreshSelectorEnabled = true; + export const mockUiSettings = { get: item => { return mockUiSettings[item]; @@ -64,6 +55,7 @@ export const mockUiSettings = { getUpdate$: () => ({ subscribe: sinon.fake(), }), + isDefault: sinon.fake(), 'query:allowLeadingWildcards': true, 'query:queryString:options': {}, 'courier:ignoreFilterIfFieldNotInIndex': true, @@ -71,20 +63,110 @@ export const mockUiSettings = { 'format:defaultTypeMap': {}, }; -const mockCore = { +const mockCoreSetup = { chrome: {}, + http: { + basePath: { + get: sinon.fake.returns(''), + }, + }, + injectedMetadata: {}, uiSettings: mockUiSettings, +}; + +const mockCoreStart = { + application: { + capabilities: {}, + }, + chrome: { + overlays: { + openModal: sinon.fake(), + }, + }, http: { basePath: { get: sinon.fake.returns(''), }, }, + i18n: {}, + overlays: {}, + savedObjects: { + client: {}, + }, + uiSettings: mockUiSettings, +}; + +const querySetup = { + state$: mockObservable(), + filterManager: { + getFetches$: sinon.fake(), + getFilters: sinon.fake(), + getAppFilters: sinon.fake(), + getGlobalFilters: sinon.fake(), + removeFilter: sinon.fake(), + addFilters: sinon.fake(), + setFilters: sinon.fake(), + removeAll: sinon.fake(), + getUpdates$: mockObservable, + }, + timefilter: { + timefilter: { + getFetch$: mockObservable, + getAutoRefreshFetch$: mockObservable, + getEnabledUpdated$: mockObservable, + getTimeUpdate$: mockObservable, + getRefreshIntervalUpdate$: mockObservable, + isTimeRangeSelectorEnabled: () => { + return isTimeRangeSelectorEnabled; + }, + isAutoRefreshSelectorEnabled: () => { + return isAutoRefreshSelectorEnabled; + }, + disableAutoRefreshSelector: () => { + isAutoRefreshSelectorEnabled = false; + }, + enableAutoRefreshSelector: () => { + isAutoRefreshSelectorEnabled = true; + }, + getRefreshInterval: () => { + return refreshInterval; + }, + setRefreshInterval: interval => { + refreshInterval = interval; + }, + enableTimeRangeSelector: () => { + isTimeRangeSelectorEnabled = true; + }, + disableTimeRangeSelector: () => { + isTimeRangeSelectorEnabled = false; + }, + getTime: sinon.fake(), + setTime: sinon.fake(), + getActiveBounds: sinon.fake(), + getBounds: sinon.fake(), + calculateBounds: sinon.fake(), + createFilter: sinon.fake(), + }, + history: sinon.fake(), + }, + savedQueries: { + saveQuery: sinon.fake(), + getAllSavedQueries: sinon.fake(), + findSavedQueries: sinon.fake(), + getSavedQuery: sinon.fake(), + deleteSavedQuery: sinon.fake(), + getSavedQueryCount: sinon.fake(), + }, }; const mockAggTypesRegistry = () => { const registry = new AggTypesRegistry(); const registrySetup = registry.setup(); - const aggTypes = getAggTypes({ uiSettings: mockCore.uiSettings }); + const aggTypes = getAggTypes({ + uiSettings: mockCoreSetup.uiSettings, + notifications: mockCoreStart.notifications, + query: querySetup, + }); aggTypes.buckets.forEach(type => registrySetup.registerBucket(type)); aggTypes.metrics.forEach(type => registrySetup.registerMetric(type)); @@ -93,12 +175,8 @@ const mockAggTypesRegistry = () => { const aggTypesRegistry = mockAggTypesRegistry(); -let refreshInterval = undefined; -let isTimeRangeSelectorEnabled = true; -let isAutoRefreshSelectorEnabled = true; - export const npSetup = { - core: mockCore, + core: mockCoreSetup, plugins: { advancedSettings: { component: { @@ -135,72 +213,7 @@ export const npSetup = { addProvider: sinon.fake(), getProvider: sinon.fake(), }, - query: { - state$: mockObservable(), - filterManager: { - getFetches$: sinon.fake(), - getFilters: sinon.fake(), - getAppFilters: sinon.fake(), - getGlobalFilters: sinon.fake(), - removeFilter: sinon.fake(), - addFilters: sinon.fake(), - setFilters: sinon.fake(), - removeAll: sinon.fake(), - getUpdates$: mockObservable, - }, - timefilter: { - timefilter: { - getTime: sinon.fake(), - getRefreshInterval: sinon.fake(), - getTimeUpdate$: mockObservable, - getRefreshIntervalUpdate$: mockObservable, - getFetch$: mockObservable, - getAutoRefreshFetch$: mockObservable, - getEnabledUpdated$: mockObservable, - getTimeUpdate$: mockObservable, - getRefreshIntervalUpdate$: mockObservable, - isTimeRangeSelectorEnabled: () => { - return isTimeRangeSelectorEnabled; - }, - isAutoRefreshSelectorEnabled: () => { - return isAutoRefreshSelectorEnabled; - }, - disableAutoRefreshSelector: () => { - isAutoRefreshSelectorEnabled = false; - }, - enableAutoRefreshSelector: () => { - isAutoRefreshSelectorEnabled = true; - }, - getRefreshInterval: () => { - return refreshInterval; - }, - setRefreshInterval: interval => { - refreshInterval = interval; - }, - enableTimeRangeSelector: () => { - isTimeRangeSelectorEnabled = true; - }, - disableTimeRangeSelector: () => { - isTimeRangeSelectorEnabled = false; - }, - getTime: sinon.fake(), - setTime: sinon.fake(), - getActiveBounds: sinon.fake(), - getBounds: sinon.fake(), - calculateBounds: sinon.fake(), - createFilter: sinon.fake(), - }, - history: sinon.fake(), - }, - savedQueries: { - saveQuery: sinon.fake(), - getAllSavedQueries: sinon.fake(), - findSavedQueries: sinon.fake(), - getSavedQuery: sinon.fake(), - deleteSavedQuery: sinon.fake(), - getSavedQueryCount: sinon.fake(), - }, - }, + query: querySetup, search: { aggs: { calculateAutoTimeExpression: sinon.fake(), @@ -213,7 +226,7 @@ export const npSetup = { }, }, }, - fieldFormats: getFieldFormatsRegistry(mockCore), + fieldFormats: getFieldFormatsRegistry(mockCoreSetup), }, share: { register: () => {}, @@ -280,17 +293,17 @@ export const npSetup = { visTypeVega: { config: sinon.fake(), }, + visualizations: { + createBaseVisualization: sinon.fake(), + createReactVisualization: sinon.fake(), + registerAlias: sinon.fake(), + hideTypes: sinon.fake(), + }, }, }; export const npStart = { - core: { - chrome: { - overlays: { - openModal: sinon.fake(), - }, - }, - }, + core: mockCoreStart, plugins: { management: { legacy: { @@ -410,7 +423,6 @@ export const npStart = { search: { aggs: { calculateAutoTimeExpression: sinon.fake(), - createAggConfigs: sinon.fake(), createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: aggTypesRegistry.start(), @@ -435,7 +447,7 @@ export const npStart = { }, }, }, - fieldFormats: getFieldFormatsRegistry(mockCore), + fieldFormats: getFieldFormatsRegistry(mockCoreStart), }, share: { toggleShareContextMenu: () => {}, @@ -457,6 +469,16 @@ export const npStart = { getTriggerActions: sinon.fake(), getTriggerCompatibleActions: sinon.fake(), }, + visualizations: { + get: sinon.fake(), + all: sinon.fake(), + getAliases: sinon.fake(), + savedVisualizationsLoader: {}, + showNewVisModal: sinon.fake(), + createVis: sinon.fake(), + convertFromSerializedVis: sinon.fake(), + convertToSerializedVis: sinon.fake(), + }, navigation: { ui: { TopNavMenu: mockComponent, @@ -483,23 +505,15 @@ export function __setup__(coreSetup) { // bootstrap an LP plugin outside of tests) npSetup.core.application.register = () => {}; - // Services that need to be set in the legacy platform since the legacy data plugin - // which previously provided them has been removed. - setInjectedMetadata(npSetup.core.injectedMetadata); + // Services that need to be set in the legacy platform since the legacy data + // & vis plugins which previously provided them have been removed. + setSetupServices(npSetup); } export function __start__(coreStart) { npStart.core = coreStart; - // Services that need to be set in the legacy platform since the legacy data plugin - // which previously provided them has been removed. - setHttp(npStart.core.http); - setNotifications(npStart.core.notifications); - setOverlays(npStart.core.overlays); - setUiSettings(npStart.core.uiSettings); - setFieldFormats(npStart.plugins.data.fieldFormats); - setIndexPatterns(npStart.plugins.data.indexPatterns); - setQueryService(npStart.plugins.data.query); - setSearchService(npStart.plugins.data.search); - setAggs(npStart.plugins.data.search.aggs); + // Services that need to be set in the legacy platform since the legacy data + // & vis plugins which previously provided them have been removed. + setStartServices(npStart); } diff --git a/src/legacy/ui/public/new_platform/new_platform.test.ts b/src/legacy/ui/public/new_platform/new_platform.test.ts index dd41093f3a1f0..1629aac588a61 100644 --- a/src/legacy/ui/public/new_platform/new_platform.test.ts +++ b/src/legacy/ui/public/new_platform/new_platform.test.ts @@ -20,19 +20,8 @@ jest.mock('history'); import { setRootControllerMock, historyMock } from './new_platform.test.mocks'; -import { - legacyAppRegister, - __reset__, - __setup__, - __start__, - PluginsSetup, - PluginsStart, -} from './new_platform'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import * as dataServices from '../../../../plugins/data/public/services'; -import { LegacyCoreSetup, LegacyCoreStart } from '../../../../core/public'; +import { legacyAppRegister, __reset__, __setup__, __start__ } from './new_platform'; import { coreMock } from '../../../../core/public/mocks'; -import { npSetup, npStart } from './__mocks__'; describe('ui/new_platform', () => { describe('legacyAppRegister', () => { @@ -119,25 +108,4 @@ describe('ui/new_platform', () => { expect(unmountMock).toHaveBeenCalled(); }); }); - - describe('service getters', () => { - const services: Record = dataServices; - const getters = Object.keys(services).filter(k => k.substring(0, 3) === 'get'); - - getters.forEach(g => { - it(`sets a value for ${g}`, () => { - __reset__(); - __setup__( - (coreMock.createSetup() as unknown) as LegacyCoreSetup, - (npSetup.plugins as unknown) as PluginsSetup - ); - __start__( - (coreMock.createStart() as unknown) as LegacyCoreStart, - (npStart.plugins as unknown) as PluginsStart - ); - - expect(services[g]()).toBeDefined(); - }); - }); - }); }); diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index b315abec1a64b..b4b5099081759 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -23,6 +23,7 @@ import { UiActionsStart, UiActionsSetup } from 'src/plugins/ui_actions/public'; import { EmbeddableStart, EmbeddableSetup } from 'src/plugins/embeddable/public'; import { createBrowserHistory } from 'history'; import { DashboardStart } from '../../../../plugins/dashboard/public'; +import { setSetupServices, setStartServices } from './set_services'; import { LegacyCoreSetup, LegacyCoreStart, @@ -31,18 +32,6 @@ import { ScopedHistory, } from '../../../../core/public'; import { Plugin as DataPlugin } from '../../../../plugins/data/public'; -import { - setFieldFormats, - setIndexPatterns, - setInjectedMetadata, - setHttp, - setNotifications, - setOverlays, - setQueryService, - setSearchService, - setUiSettings, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../plugins/data/public/services'; import { Plugin as ExpressionsPlugin } from '../../../../plugins/expressions/public'; import { Setup as InspectorSetup, @@ -67,6 +56,14 @@ import { } from '../../../../plugins/navigation/public'; import { VisTypeVegaSetup } from '../../../../plugins/vis_type_vega/public'; import { DiscoverSetup, DiscoverStart } from '../../../../plugins/discover/public'; +import { + SavedObjectsManagementPluginSetup, + SavedObjectsManagementPluginStart, +} from '../../../../plugins/saved_objects_management/public'; +import { + VisualizationsSetup, + VisualizationsStart, +} from '../../../../plugins/visualizations/public'; export interface PluginsSetup { bfetch: BfetchPublicSetup; @@ -86,7 +83,9 @@ export interface PluginsSetup { management: ManagementSetup; visTypeVega: VisTypeVegaSetup; discover: DiscoverSetup; + visualizations: VisualizationsSetup; telemetry?: TelemetryPluginSetup; + savedObjectsManagement: SavedObjectsManagementPluginSetup; } export interface PluginsStart { @@ -104,8 +103,10 @@ export interface PluginsStart { management: ManagementStart; advancedSettings: AdvancedSettingsStart; discover: DiscoverStart; + visualizations: VisualizationsStart; telemetry?: TelemetryPluginStart; dashboard: DashboardStart; + savedObjectsManagement: SavedObjectsManagementPluginStart; } export const npSetup = { @@ -137,25 +138,18 @@ export function __setup__(coreSetup: LegacyCoreSetup, plugins: PluginsSetup) { // Setup compatibility layer for AppService in legacy platform npSetup.core.application.register = legacyAppRegister; - // Services that need to be set in the legacy platform since the legacy data plugin - // which previously provided them has been removed. - setInjectedMetadata(npSetup.core.injectedMetadata); + // Services that need to be set in the legacy platform since the legacy data + // & vis plugins which previously provided them have been removed. + setSetupServices(npSetup); } export function __start__(coreStart: LegacyCoreStart, plugins: PluginsStart) { npStart.core = coreStart; npStart.plugins = plugins; - // Services that need to be set in the legacy platform since the legacy data plugin - // which previously provided them has been removed. - setHttp(npStart.core.http); - setNotifications(npStart.core.notifications); - setOverlays(npStart.core.overlays); - setUiSettings(npStart.core.uiSettings); - setFieldFormats(npStart.plugins.data.fieldFormats); - setIndexPatterns(npStart.plugins.data.indexPatterns); - setQueryService(npStart.plugins.data.query); - setSearchService(npStart.plugins.data.search); + // Services that need to be set in the legacy platform since the legacy data + // & vis plugins which previously provided them have been removed. + setStartServices(npStart); } /** Flag used to ensure `legacyAppRegister` is only called once. */ diff --git a/src/legacy/ui/public/new_platform/set_services.test.ts b/src/legacy/ui/public/new_platform/set_services.test.ts new file mode 100644 index 0000000000000..25a4524925169 --- /dev/null +++ b/src/legacy/ui/public/new_platform/set_services.test.ts @@ -0,0 +1,53 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { __reset__, __setup__, __start__, PluginsSetup, PluginsStart } from './new_platform'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import * as dataServices from '../../../../plugins/data/public/services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import * as visualizationsServices from '../../../../plugins/visualizations/public/services'; +import { LegacyCoreSetup, LegacyCoreStart } from '../../../../core/public'; +import { coreMock } from '../../../../core/public/mocks'; +import { npSetup, npStart } from './__mocks__'; + +describe('ui/new_platform', () => { + describe('set service getters', () => { + const testServiceGetters = (name: string, services: Record) => { + const getters = Object.keys(services).filter(k => k.substring(0, 3) === 'get'); + getters.forEach(g => { + it(`ui/new_platform sets a value for ${name} getter ${g}`, () => { + __reset__(); + __setup__( + (coreMock.createSetup() as unknown) as LegacyCoreSetup, + (npSetup.plugins as unknown) as PluginsSetup + ); + __start__( + (coreMock.createStart() as unknown) as LegacyCoreStart, + (npStart.plugins as unknown) as PluginsStart + ); + + expect(services[g]()).toBeDefined(); + }); + }); + }; + + testServiceGetters('data', dataServices); + testServiceGetters('visualizations', visualizationsServices); + }); +}); diff --git a/src/legacy/ui/public/new_platform/set_services.ts b/src/legacy/ui/public/new_platform/set_services.ts new file mode 100644 index 0000000000000..8cf015d5dff5c --- /dev/null +++ b/src/legacy/ui/public/new_platform/set_services.ts @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { pick } from 'lodash'; + +import { PluginsSetup, PluginsStart } from './new_platform'; +import { LegacyCoreSetup, LegacyCoreStart } from '../../../../core/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import * as dataServices from '../../../../plugins/data/public/services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import * as visualizationsServices from '../../../../plugins/visualizations/public/services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { createSavedVisLoader } from '../../../../plugins/visualizations/public/saved_visualizations/saved_visualizations'; + +interface NpSetup { + core: LegacyCoreSetup; + plugins: PluginsSetup; +} + +interface NpStart { + core: LegacyCoreStart; + plugins: PluginsStart; +} + +export function setSetupServices(npSetup: NpSetup) { + // Services that need to be set in the legacy platform since the legacy data plugin + // which previously provided them has been removed. + dataServices.setInjectedMetadata(npSetup.core.injectedMetadata); + visualizationsServices.setUISettings(npSetup.core.uiSettings); + visualizationsServices.setUsageCollector(npSetup.plugins.usageCollection); +} + +export function setStartServices(npStart: NpStart) { + // Services that need to be set in the legacy platform since the legacy data plugin + // which previously provided them has been removed. + dataServices.setHttp(npStart.core.http); + dataServices.setNotifications(npStart.core.notifications); + dataServices.setOverlays(npStart.core.overlays); + dataServices.setUiSettings(npStart.core.uiSettings); + dataServices.setFieldFormats(npStart.plugins.data.fieldFormats); + dataServices.setIndexPatterns(npStart.plugins.data.indexPatterns); + dataServices.setQueryService(npStart.plugins.data.query); + dataServices.setSearchService(npStart.plugins.data.search); + visualizationsServices.setI18n(npStart.core.i18n); + visualizationsServices.setTypes( + pick(npStart.plugins.visualizations, ['get', 'all', 'getAliases']) + ); + visualizationsServices.setCapabilities(npStart.core.application.capabilities); + visualizationsServices.setHttp(npStart.core.http); + visualizationsServices.setSavedObjects(npStart.core.savedObjects); + visualizationsServices.setIndexPatterns(npStart.plugins.data.indexPatterns); + visualizationsServices.setFilterManager(npStart.plugins.data.query.filterManager); + visualizationsServices.setExpressions(npStart.plugins.expressions); + visualizationsServices.setUiActions(npStart.plugins.uiActions); + visualizationsServices.setTimeFilter(npStart.plugins.data.query.timefilter.timefilter); + visualizationsServices.setAggs(npStart.plugins.data.search.aggs); + visualizationsServices.setOverlays(npStart.core.overlays); + visualizationsServices.setChrome(npStart.core.chrome); + const savedVisualizationsLoader = createSavedVisLoader({ + savedObjectsClient: npStart.core.savedObjects.client, + indexPatterns: npStart.plugins.data.indexPatterns, + chrome: npStart.core.chrome, + overlays: npStart.core.overlays, + visualizationTypes: visualizationsServices.getTypes(), + }); + visualizationsServices.setSavedVisualizationsLoader(savedVisualizationsLoader); +} diff --git a/src/legacy/ui/public/visualize/_index.scss b/src/legacy/ui/public/visualize/_index.scss index c528c1e37b412..d9761f741353b 100644 --- a/src/legacy/ui/public/visualize/_index.scss +++ b/src/legacy/ui/public/visualize/_index.scss @@ -1 +1 @@ -@import '../../../core_plugins/visualizations/public/np_ready/public/components/index'; +@import '../../../../plugins/visualizations/public/components/index'; diff --git a/src/legacy/ui/public/visualize/loader/pipeline_helpers/index.ts b/src/legacy/ui/public/visualize/loader/pipeline_helpers/index.ts index f19940726ef2d..fe7f239fbea3b 100644 --- a/src/legacy/ui/public/visualize/loader/pipeline_helpers/index.ts +++ b/src/legacy/ui/public/visualize/loader/pipeline_helpers/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export { buildPipeline } from '../../../../../core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline'; +export { buildPipeline } from '../../../../../../plugins/visualizations/public/legacy/build_pipeline'; diff --git a/src/legacy/ui/ui_render/ui_render_mixin.js b/src/legacy/ui/ui_render/ui_render_mixin.js index 0a1b95c23450b..99560b0bf653f 100644 --- a/src/legacy/ui/ui_render/ui_render_mixin.js +++ b/src/legacy/ui/ui_render/ui_render_mixin.js @@ -23,8 +23,6 @@ import { resolve } from 'path'; import { i18n } from '@kbn/i18n'; import * as UiSharedDeps from '@kbn/ui-shared-deps'; import { AppBootstrap } from './bootstrap'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { fromRoot } from '../../../core/server/utils'; import { getApmConfig } from '../apm'; import { DllCompiler } from '../../../optimize/dynamic_dll_plugin'; @@ -43,11 +41,6 @@ export function uiRenderMixin(kbnServer, server, config) { // render all views from ./views server.setupViews(resolve(__dirname, 'views')); - server.exposeStaticDir( - '/node_modules/@kbn/ui-framework/dist/{path*}', - fromRoot('node_modules/@kbn/ui-framework/dist') - ); - const translationsCache = { translations: null, hash: null }; server.route({ path: '/translations/{locale}.json', diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index fc5dde94fa851..26587470adfd9 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -121,7 +121,10 @@ export class DataPublicPlugin implements Plugin Record<"buckets" | "metrics", string>; + aggGroupNamesMap: () => Record<"metrics" | "buckets", string>; aggTypeFilters: import("./search/aggs/filter/agg_type_filters").AggTypeFilters; CidrMask: typeof CidrMask; convertDateRangeToString: typeof convertDateRangeToString; diff --git a/src/plugins/data/public/search/aggs/agg_types.ts b/src/plugins/data/public/search/aggs/agg_types.ts index 73c6a5046fd23..556f6b0c93c41 100644 --- a/src/plugins/data/public/search/aggs/agg_types.ts +++ b/src/plugins/data/public/search/aggs/agg_types.ts @@ -17,7 +17,8 @@ * under the License. */ -import { IUiSettingsClient } from 'src/core/public'; +import { IUiSettingsClient, NotificationsSetup } from 'src/core/public'; +import { QuerySetup } from '../../query/query_service'; import { countMetricAgg } from './metrics/count'; import { avgMetricAgg } from './metrics/avg'; @@ -36,10 +37,10 @@ import { derivativeMetricAgg } from './metrics/derivative'; import { cumulativeSumMetricAgg } from './metrics/cumulative_sum'; import { movingAvgMetricAgg } from './metrics/moving_avg'; import { serialDiffMetricAgg } from './metrics/serial_diff'; -import { dateHistogramBucketAgg } from './buckets/date_histogram'; -import { histogramBucketAgg } from './buckets/histogram'; +import { getDateHistogramBucketAgg } from './buckets/date_histogram'; +import { getHistogramBucketAgg } from './buckets/histogram'; import { rangeBucketAgg } from './buckets/range'; -import { dateRangeBucketAgg } from './buckets/date_range'; +import { getDateRangeBucketAgg } from './buckets/date_range'; import { ipRangeBucketAgg } from './buckets/ip_range'; import { termsBucketAgg } from './buckets/terms'; import { filterBucketAgg } from './buckets/filter'; @@ -52,44 +53,47 @@ import { bucketAvgMetricAgg } from './metrics/bucket_avg'; import { bucketMinMetricAgg } from './metrics/bucket_min'; import { bucketMaxMetricAgg } from './metrics/bucket_max'; -export function getAggTypes(deps: { uiSettings: IUiSettingsClient }) { - const { uiSettings } = deps; - return { - metrics: [ - countMetricAgg, - avgMetricAgg, - sumMetricAgg, - medianMetricAgg, - minMetricAgg, - maxMetricAgg, - stdDeviationMetricAgg, - cardinalityMetricAgg, - percentilesMetricAgg, - percentileRanksMetricAgg, - topHitMetricAgg, - derivativeMetricAgg, - cumulativeSumMetricAgg, - movingAvgMetricAgg, - serialDiffMetricAgg, - bucketAvgMetricAgg, - bucketSumMetricAgg, - bucketMinMetricAgg, - bucketMaxMetricAgg, - geoBoundsMetricAgg, - geoCentroidMetricAgg, - ], - buckets: [ - dateHistogramBucketAgg, - histogramBucketAgg, - rangeBucketAgg, - dateRangeBucketAgg, - ipRangeBucketAgg, - termsBucketAgg, - filterBucketAgg, - getFiltersBucketAgg({ uiSettings }), - significantTermsBucketAgg, - geoHashBucketAgg, - geoTileBucketAgg, - ], - }; +export interface AggTypesDependencies { + notifications: NotificationsSetup; + uiSettings: IUiSettingsClient; + query: QuerySetup; } + +export const getAggTypes = ({ notifications, uiSettings, query }: AggTypesDependencies) => ({ + metrics: [ + countMetricAgg, + avgMetricAgg, + sumMetricAgg, + medianMetricAgg, + minMetricAgg, + maxMetricAgg, + stdDeviationMetricAgg, + cardinalityMetricAgg, + percentilesMetricAgg, + percentileRanksMetricAgg, + topHitMetricAgg, + derivativeMetricAgg, + cumulativeSumMetricAgg, + movingAvgMetricAgg, + serialDiffMetricAgg, + bucketAvgMetricAgg, + bucketSumMetricAgg, + bucketMinMetricAgg, + bucketMaxMetricAgg, + geoBoundsMetricAgg, + geoCentroidMetricAgg, + ], + buckets: [ + getDateHistogramBucketAgg({ uiSettings, query }), + getHistogramBucketAgg({ uiSettings, notifications }), + rangeBucketAgg, + getDateRangeBucketAgg({ uiSettings }), + ipRangeBucketAgg, + termsBucketAgg, + filterBucketAgg, + getFiltersBucketAgg({ uiSettings }), + significantTermsBucketAgg, + geoHashBucketAgg, + geoTileBucketAgg, + ], +}); diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts index 12817a9ba1159..def354c4557cb 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts @@ -22,23 +22,35 @@ import { createFilterDateHistogram } from './date_histogram'; import { intervalOptions } from '../_interval_options'; import { AggConfigs } from '../../agg_configs'; import { mockDataServices, mockAggTypesRegistry } from '../../test_helpers'; -import { dateHistogramBucketAgg, IBucketDateHistogramAggConfig } from '../date_histogram'; +import { + getDateHistogramBucketAgg, + DateHistogramBucketAggDependencies, + IBucketDateHistogramAggConfig, +} from '../date_histogram'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { RangeFilter } from '../../../../../common'; +import { coreMock } from '../../../../../../../core/public/mocks'; +import { queryServiceMock } from '../../../../query/mocks'; describe('AggConfig Filters', () => { describe('date_histogram', () => { - beforeEach(() => { - mockDataServices(); - }); - - const typesRegistry = mockAggTypesRegistry([dateHistogramBucketAgg]); - + let aggTypesDependencies: DateHistogramBucketAggDependencies; let agg: IBucketDateHistogramAggConfig; let filter: RangeFilter; let bucketStart: any; let field: any; + beforeEach(() => { + const { uiSettings } = coreMock.createSetup(); + + aggTypesDependencies = { + uiSettings, + query: queryServiceMock.createSetupContract(), + }; + + mockDataServices(); + }); + const init = (interval: string = 'auto', duration: any = moment.duration(15, 'minutes')) => { field = { name: 'date', @@ -61,7 +73,7 @@ describe('AggConfig Filters', () => { params: { field: field.name, interval, customInterval: '5d' }, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([getDateHistogramBucketAgg(aggTypesDependencies)]) } ); const bucketKey = 1422579600000; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts index d18a30fb6c6f8..6a03176959a83 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts @@ -18,7 +18,7 @@ */ import moment from 'moment'; -import { dateRangeBucketAgg } from '../date_range'; +import { getDateRangeBucketAgg, DateRangeBucketAggDependencies } from '../date_range'; import { createFilterDateRange } from './date_range'; import { FieldFormatsGetConfigFn } from '../../../../../common'; import { DateFormat } from '../../../../field_formats'; @@ -26,10 +26,20 @@ import { AggConfigs } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; +import { coreMock } from '../../../../../../../core/public/mocks'; describe('AggConfig Filters', () => { describe('Date range', () => { - const typesRegistry = mockAggTypesRegistry([dateRangeBucketAgg]); + let aggTypesDependencies: DateRangeBucketAggDependencies; + + beforeEach(() => { + const { uiSettings } = coreMock.createSetup(); + + aggTypesDependencies = { + uiSettings, + }; + }); + const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { const field = { @@ -57,7 +67,7 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]) } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts index 33ab1ce8186a1..32ada8d57c768 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts @@ -17,25 +17,24 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { coreMock } from '../../../../../../../../src/core/public/mocks'; -import { getFiltersBucketAgg } from '../filters'; +import { getFiltersBucketAgg, FiltersBucketAggDependencies } from '../filters'; import { createFilterFilters } from './filters'; import { AggConfigs } from '../../agg_configs'; -import { mockDataServices, mockAggTypesRegistry } from '../../test_helpers'; +import { mockAggTypesRegistry } from '../../test_helpers'; import { IBucketAggConfig } from '../_bucket_agg_type'; +import { coreMock } from '../../../../../../../core/public/mocks'; describe('AggConfig Filters', () => { describe('filters', () => { + let aggTypesDependencies: FiltersBucketAggDependencies; + beforeEach(() => { - mockDataServices(); - }); + const { uiSettings } = coreMock.createSetup(); - const typesRegistry = mockAggTypesRegistry([ - getFiltersBucketAgg({ - uiSettings: coreMock.createSetup().uiSettings, - }), - ]); + aggTypesDependencies = { + uiSettings, + }; + }); const getAggConfigs = () => { const field = { @@ -65,7 +64,7 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([getFiltersBucketAgg(aggTypesDependencies)]) } ); }; it('should return a filters filter', () => { diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index d600b16f56764..7701f1bbcb4d0 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -17,9 +17,10 @@ * under the License. */ -import _ from 'lodash'; +import { get, noop, find, every } from 'lodash'; import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; +import { IUiSettingsClient } from 'src/core/public'; import { TimeBuckets } from './lib/time_buckets'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; @@ -32,7 +33,8 @@ import { isMetricAggType } from '../metrics/metric_agg_type'; import { FIELD_FORMAT_IDS, KBN_FIELD_TYPES } from '../../../../common'; import { TimefilterContract } from '../../../query'; -import { getFieldFormats, getQueryService, getUiSettings } from '../../../../public/services'; +import { getFieldFormats } from '../../../../public/services'; +import { QuerySetup } from '../../../query/query_service'; const detectedTimezone = moment.tz.guess(); const tzOffset = moment().format('Z'); @@ -56,6 +58,11 @@ interface ITimeBuckets { getInterval: Function; } +export interface DateHistogramBucketAggDependencies { + uiSettings: IUiSettingsClient; + query: QuerySetup; +} + export interface IBucketDateHistogramAggConfig extends IBucketAggConfig { buckets: ITimeBuckets; } @@ -64,212 +71,214 @@ export function isDateHistogramBucketAggConfig(agg: any): agg is IBucketDateHist return Boolean(agg.buckets); } -export const dateHistogramBucketAgg = new BucketAggType({ - name: BUCKET_TYPES.DATE_HISTOGRAM, - title: i18n.translate('data.search.aggs.buckets.dateHistogramTitle', { - defaultMessage: 'Date Histogram', - }), - ordered: { - date: true, - }, - makeLabel(agg) { - let output: Record = {}; +export const getDateHistogramBucketAgg = ({ + uiSettings, + query, +}: DateHistogramBucketAggDependencies) => + new BucketAggType({ + name: BUCKET_TYPES.DATE_HISTOGRAM, + title: i18n.translate('data.search.aggs.buckets.dateHistogramTitle', { + defaultMessage: 'Date Histogram', + }), + ordered: { + date: true, + }, + makeLabel(agg) { + let output: Record = {}; - if (this.params) { - output = writeParams(this.params, agg); - } + if (this.params) { + output = writeParams(this.params, agg); + } - const field = agg.getFieldDisplayName(); - return i18n.translate('data.search.aggs.buckets.dateHistogramLabel', { - defaultMessage: '{fieldName} per {intervalDescription}', - values: { - fieldName: field, - intervalDescription: output.metricScaleText || output.bucketInterval.description, - }, - }); - }, - createFilter: createFilterDateHistogram, - decorateAggConfig() { - const uiSettings = getUiSettings(); - let buckets: any; + const field = agg.getFieldDisplayName(); + return i18n.translate('data.search.aggs.buckets.dateHistogramLabel', { + defaultMessage: '{fieldName} per {intervalDescription}', + values: { + fieldName: field, + intervalDescription: output.metricScaleText || output.bucketInterval.description, + }, + }); + }, + createFilter: createFilterDateHistogram, + decorateAggConfig() { + let buckets: any; - return { - buckets: { - configurable: true, - get() { - if (buckets) return buckets; + return { + buckets: { + configurable: true, + get() { + if (buckets) return buckets; - const { timefilter } = getQueryService().timefilter; - buckets = new TimeBuckets({ uiSettings }); - updateTimeBuckets(this, timefilter, buckets); + const { timefilter } = query.timefilter; + buckets = new TimeBuckets({ uiSettings }); + updateTimeBuckets(this, timefilter, buckets); - return buckets; - }, - } as any, - }; - }, - getFormat(agg) { - const DateFieldFormat = getFieldFormats().getType(FIELD_FORMAT_IDS.DATE); + return buckets; + }, + } as any, + }; + }, + getFormat(agg) { + const DateFieldFormat = getFieldFormats().getType(FIELD_FORMAT_IDS.DATE); - if (!DateFieldFormat) { - throw new Error('Unable to retrieve Date Field Format'); - } + if (!DateFieldFormat) { + throw new Error('Unable to retrieve Date Field Format'); + } - return new DateFieldFormat( + return new DateFieldFormat( + { + pattern: agg.buckets.getScaledDateFormat(), + }, + (key: string) => uiSettings.get(key) + ); + }, + params: [ { - pattern: agg.buckets.getScaledDateFormat(), + name: 'field', + type: 'field', + filterFieldTypes: KBN_FIELD_TYPES.DATE, + default(agg: IBucketDateHistogramAggConfig) { + return agg.getIndexPattern().timeFieldName; + }, + onChange(agg: IBucketDateHistogramAggConfig) { + if (get(agg, 'params.interval') === 'auto' && !agg.fieldIsTimeField()) { + delete agg.params.interval; + } + }, }, - (key: string) => getUiSettings().get(key) - ); - }, - params: [ - { - name: 'field', - type: 'field', - filterFieldTypes: KBN_FIELD_TYPES.DATE, - default(agg: IBucketDateHistogramAggConfig) { - return agg.getIndexPattern().timeFieldName; + { + name: 'timeRange', + default: null, + write: noop, }, - onChange(agg: IBucketDateHistogramAggConfig) { - if (_.get(agg, 'params.interval') === 'auto' && !agg.fieldIsTimeField()) { - delete agg.params.interval; - } + { + name: 'useNormalizedEsInterval', + default: true, + write: noop, }, - }, - { - name: 'timeRange', - default: null, - write: _.noop, - }, - { - name: 'useNormalizedEsInterval', - default: true, - write: _.noop, - }, - { - name: 'scaleMetricValues', - default: false, - write: _.noop, - advanced: true, - }, - { - name: 'interval', - deserialize(state: any, agg) { - // For upgrading from 7.0.x to 7.1.x - intervals are now stored as key of options or custom value - if (state === 'custom') { - return _.get(agg, 'params.customInterval'); - } + { + name: 'scaleMetricValues', + default: false, + write: noop, + advanced: true, + }, + { + name: 'interval', + deserialize(state: any, agg) { + // For upgrading from 7.0.x to 7.1.x - intervals are now stored as key of options or custom value + if (state === 'custom') { + return get(agg, 'params.customInterval'); + } - const interval = _.find(intervalOptions, { val: state }); + const interval = find(intervalOptions, { val: state }); - // For upgrading from 4.0.x to 4.1.x - intervals are now stored as 'y' instead of 'year', - // but this maps the old values to the new values - if (!interval && state === 'year') { - return 'y'; - } - return state; - }, - default: 'auto', - options: intervalOptions, - write(agg, output, aggs) { - const { timefilter } = getQueryService().timefilter; - updateTimeBuckets(agg, timefilter); + // For upgrading from 4.0.x to 4.1.x - intervals are now stored as 'y' instead of 'year', + // but this maps the old values to the new values + if (!interval && state === 'year') { + return 'y'; + } + return state; + }, + default: 'auto', + options: intervalOptions, + write(agg, output, aggs) { + const { timefilter } = query.timefilter; + updateTimeBuckets(agg, timefilter); - const { useNormalizedEsInterval, scaleMetricValues } = agg.params; - const interval = agg.buckets.getInterval(useNormalizedEsInterval); - output.bucketInterval = interval; - if (interval.expression === '0ms') { - // We are hitting this code a couple of times while configuring in editor - // with an interval of 0ms because the overall time range has not yet been - // set. Since 0ms is not a valid ES interval, we cannot pass it through dateHistogramInterval - // below, since it would throw an exception. So in the cases we still have an interval of 0ms - // here we simply skip the rest of the method and never write an interval into the DSL, since - // this DSL will anyway not be used before we're passing this code with an actual interval. - return; - } - output.params = { - ...output.params, - ...dateHistogramInterval(interval.expression), - }; + const { useNormalizedEsInterval, scaleMetricValues } = agg.params; + const interval = agg.buckets.getInterval(useNormalizedEsInterval); + output.bucketInterval = interval; + if (interval.expression === '0ms') { + // We are hitting this code a couple of times while configuring in editor + // with an interval of 0ms because the overall time range has not yet been + // set. Since 0ms is not a valid ES interval, we cannot pass it through dateHistogramInterval + // below, since it would throw an exception. So in the cases we still have an interval of 0ms + // here we simply skip the rest of the method and never write an interval into the DSL, since + // this DSL will anyway not be used before we're passing this code with an actual interval. + return; + } + output.params = { + ...output.params, + ...dateHistogramInterval(interval.expression), + }; - const scaleMetrics = scaleMetricValues && interval.scaled && interval.scale < 1; - if (scaleMetrics && aggs) { - const metrics = aggs.aggs.filter(a => isMetricAggType(a.type)); - const all = _.every(metrics, (a: IBucketAggConfig) => { - const { type } = a; + const scaleMetrics = scaleMetricValues && interval.scaled && interval.scale < 1; + if (scaleMetrics && aggs) { + const metrics = aggs.aggs.filter(a => isMetricAggType(a.type)); + const all = every(metrics, (a: IBucketAggConfig) => { + const { type } = a; - if (isMetricAggType(type)) { - return type.isScalable(); + if (isMetricAggType(type)) { + return type.isScalable(); + } + }); + if (all) { + output.metricScale = interval.scale; + output.metricScaleText = interval.preScaled.description; } - }); - if (all) { - output.metricScale = interval.scale; - output.metricScaleText = interval.preScaled.description; } - } + }, }, - }, - { - name: 'time_zone', - default: undefined, - // We don't ever want this parameter to be serialized out (when saving or to URLs) - // since we do all the logic handling it "on the fly" in the `write` method, to prevent - // time_zones being persisted into saved_objects - serialize: _.noop, - write(agg, output) { - // If a time_zone has been set explicitly always prefer this. - let tz = agg.params.time_zone; - if (!tz && agg.params.field) { - // If a field has been configured check the index pattern's typeMeta if a date_histogram on that - // field requires a specific time_zone - tz = _.get(agg.getIndexPattern(), [ - 'typeMeta', - 'aggs', - 'date_histogram', - agg.params.field.name, - 'time_zone', - ]); - } - if (!tz) { - const config = getUiSettings(); - // If the index pattern typeMeta data, didn't had a time zone assigned for the selected field use the configured tz - const isDefaultTimezone = config.isDefault('dateFormat:tz'); - tz = isDefaultTimezone ? detectedTimezone || tzOffset : config.get('dateFormat:tz'); - } - output.params.time_zone = tz; + { + name: 'time_zone', + default: undefined, + // We don't ever want this parameter to be serialized out (when saving or to URLs) + // since we do all the logic handling it "on the fly" in the `write` method, to prevent + // time_zones being persisted into saved_objects + serialize: noop, + write(agg, output) { + // If a time_zone has been set explicitly always prefer this. + let tz = agg.params.time_zone; + if (!tz && agg.params.field) { + // If a field has been configured check the index pattern's typeMeta if a date_histogram on that + // field requires a specific time_zone + tz = get(agg.getIndexPattern(), [ + 'typeMeta', + 'aggs', + 'date_histogram', + agg.params.field.name, + 'time_zone', + ]); + } + if (!tz) { + // If the index pattern typeMeta data, didn't had a time zone assigned for the selected field use the configured tz + const isDefaultTimezone = uiSettings.isDefault('dateFormat:tz'); + tz = isDefaultTimezone ? detectedTimezone || tzOffset : uiSettings.get('dateFormat:tz'); + } + output.params.time_zone = tz; + }, }, - }, - { - name: 'drop_partials', - default: false, - write: _.noop, - shouldShow: agg => { - const field = agg.params.field; - return field && field.name && field.name === agg.getIndexPattern().timeFieldName; + { + name: 'drop_partials', + default: false, + write: noop, + shouldShow: agg => { + const field = agg.params.field; + return field && field.name && field.name === agg.getIndexPattern().timeFieldName; + }, }, - }, - { - name: 'format', - }, - { - name: 'min_doc_count', - default: 1, - }, - { - name: 'extended_bounds', - default: {}, - write(agg, output) { - const val = agg.params.extended_bounds; + { + name: 'format', + }, + { + name: 'min_doc_count', + default: 1, + }, + { + name: 'extended_bounds', + default: {}, + write(agg, output) { + const val = agg.params.extended_bounds; - if (val.min != null || val.max != null) { - output.params.extended_bounds = { - min: moment(val.min).valueOf(), - max: moment(val.max).valueOf(), - }; + if (val.min != null || val.max != null) { + output.params.extended_bounds = { + min: moment(val.min).valueOf(), + max: moment(val.max).valueOf(), + }; - return; - } + return; + } + }, }, - }, - ], -}); + ], + }); diff --git a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts b/src/plugins/data/public/search/aggs/buckets/date_range.test.ts index 03a453836e113..4ea550492fa09 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_range.test.ts @@ -17,20 +17,22 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { setUiSettings } from '../../../../public/services'; -import { dateRangeBucketAgg } from './date_range'; +import { getDateRangeBucketAgg, DateRangeBucketAggDependencies } from './date_range'; import { AggConfigs } from '../agg_configs'; -import { mockDataServices, mockAggTypesRegistry } from '../test_helpers'; +import { mockAggTypesRegistry } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; describe('date_range params', () => { + let aggTypesDependencies: DateRangeBucketAggDependencies; + beforeEach(() => { - mockDataServices(); - }); + const { uiSettings } = coreMock.createSetup(); - const typesRegistry = mockAggTypesRegistry([dateRangeBucketAgg]); + aggTypesDependencies = { + uiSettings, + }; + }); const getAggConfigs = (params: Record = {}, hasIncludeTypeMeta: boolean = true) => { const field = { @@ -67,12 +69,12 @@ describe('date_range params', () => { params, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]) } ); }; describe('getKey', () => { - it('should return object', () => { + test('should return object', () => { const aggConfigs = getAggConfigs(); const dateRange = aggConfigs.aggs[0]; const bucket = { from: 'from-date', to: 'to-date', key: 'from-dateto-date' }; @@ -82,7 +84,7 @@ describe('date_range params', () => { }); describe('time_zone', () => { - it('should use the specified time_zone', () => { + test('should use the specified time_zone', () => { const aggConfigs = getAggConfigs({ time_zone: 'Europe/Minsk', field: 'bytes', @@ -93,7 +95,7 @@ describe('date_range params', () => { expect(params.time_zone).toBe('Europe/Minsk'); }); - it('should use the fixed time_zone from the index pattern typeMeta', () => { + test('should use the fixed time_zone from the index pattern typeMeta', () => { const aggConfigs = getAggConfigs({ field: 'bytes', }); @@ -103,12 +105,14 @@ describe('date_range params', () => { expect(params.time_zone).toBe('defaultTimeZone'); }); - it('should use the Kibana time_zone if no parameter specified', () => { - const core = coreMock.createStart(); - setUiSettings({ - ...core.uiSettings, - get: () => 'kibanaTimeZone' as any, - }); + test('should use the Kibana time_zone if no parameter specified', () => { + aggTypesDependencies = { + ...aggTypesDependencies, + uiSettings: { + ...aggTypesDependencies.uiSettings, + get: () => 'kibanaTimeZone' as any, + }, + }; const aggConfigs = getAggConfigs( { @@ -119,8 +123,6 @@ describe('date_range params', () => { const dateRange = aggConfigs.aggs[0]; const params = dateRange.toDsl()[BUCKET_TYPES.DATE_RANGE]; - setUiSettings(core.uiSettings); // clean up - expect(params.time_zone).toBe('kibanaTimeZone'); }); }); diff --git a/src/plugins/data/public/search/aggs/buckets/date_range.ts b/src/plugins/data/public/search/aggs/buckets/date_range.ts index 59e78af2d7b95..8133a47ec7248 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_range.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_range.ts @@ -20,86 +20,92 @@ import { get } from 'lodash'; import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; +import { IUiSettingsClient } from 'src/core/public'; + import { BUCKET_TYPES } from './bucket_agg_types'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { createFilterDateRange } from './create_filter/date_range'; import { convertDateRangeToString, DateRangeKey } from './lib/date_range'; import { KBN_FIELD_TYPES, FieldFormat, TEXT_CONTEXT_TYPE } from '../../../../common'; -import { getFieldFormats, getUiSettings } from '../../../../public/services'; +import { getFieldFormats } from '../../../../public/services'; const dateRangeTitle = i18n.translate('data.search.aggs.buckets.dateRangeTitle', { defaultMessage: 'Date Range', }); -export const dateRangeBucketAgg = new BucketAggType({ - name: BUCKET_TYPES.DATE_RANGE, - title: dateRangeTitle, - createFilter: createFilterDateRange, - getKey({ from, to }): DateRangeKey { - return { from, to }; - }, - getFormat(agg) { - const fieldFormatsService = getFieldFormats(); +export interface DateRangeBucketAggDependencies { + uiSettings: IUiSettingsClient; +} - const formatter = agg.fieldOwnFormatter( - TEXT_CONTEXT_TYPE, - fieldFormatsService.getDefaultInstance(KBN_FIELD_TYPES.DATE) - ); - const DateRangeFormat = FieldFormat.from(function(range: DateRangeKey) { - return convertDateRangeToString(range, formatter); - }); - return new DateRangeFormat(); - }, - makeLabel(aggConfig) { - return aggConfig.getFieldDisplayName() + ' date ranges'; - }, - params: [ - { - name: 'field', - type: 'field', - filterFieldTypes: KBN_FIELD_TYPES.DATE, - default(agg: IBucketAggConfig) { - return agg.getIndexPattern().timeFieldName; - }, +export const getDateRangeBucketAgg = ({ uiSettings }: DateRangeBucketAggDependencies) => + new BucketAggType({ + name: BUCKET_TYPES.DATE_RANGE, + title: dateRangeTitle, + createFilter: createFilterDateRange, + getKey({ from, to }): DateRangeKey { + return { from, to }; }, - { - name: 'ranges', - default: [ - { - from: 'now-1w/w', - to: 'now', - }, - ], + getFormat(agg) { + const fieldFormatsService = getFieldFormats(); + + const formatter = agg.fieldOwnFormatter( + TEXT_CONTEXT_TYPE, + fieldFormatsService.getDefaultInstance(KBN_FIELD_TYPES.DATE) + ); + const DateRangeFormat = FieldFormat.from(function(range: DateRangeKey) { + return convertDateRangeToString(range, formatter); + }); + return new DateRangeFormat(); + }, + makeLabel(aggConfig) { + return aggConfig.getFieldDisplayName() + ' date ranges'; }, - { - name: 'time_zone', - default: undefined, - // Implimentation method is the same as that of date_histogram - serialize: () => undefined, - write: (agg, output) => { - const field = agg.getParam('field'); - let tz = agg.getParam('time_zone'); + params: [ + { + name: 'field', + type: 'field', + filterFieldTypes: KBN_FIELD_TYPES.DATE, + default(agg: IBucketAggConfig) { + return agg.getIndexPattern().timeFieldName; + }, + }, + { + name: 'ranges', + default: [ + { + from: 'now-1w/w', + to: 'now', + }, + ], + }, + { + name: 'time_zone', + default: undefined, + // Implimentation method is the same as that of date_histogram + serialize: () => undefined, + write: (agg, output) => { + const field = agg.getParam('field'); + let tz = agg.getParam('time_zone'); - if (!tz && field) { - tz = get(agg.getIndexPattern(), [ - 'typeMeta', - 'aggs', - 'date_range', - field.name, - 'time_zone', - ]); - } - if (!tz) { - const config = getUiSettings(); - const detectedTimezone = moment.tz.guess(); - const tzOffset = moment().format('Z'); - const isDefaultTimezone = config.isDefault('dateFormat:tz'); + if (!tz && field) { + tz = get(agg.getIndexPattern(), [ + 'typeMeta', + 'aggs', + 'date_range', + field.name, + 'time_zone', + ]); + } + if (!tz) { + const detectedTimezone = moment.tz.guess(); + const tzOffset = moment().format('Z'); + const isDefaultTimezone = uiSettings.isDefault('dateFormat:tz'); - tz = isDefaultTimezone ? detectedTimezone || tzOffset : config.get('dateFormat:tz'); - } - output.params.time_zone = tz; + tz = isDefaultTimezone ? detectedTimezone || tzOffset : uiSettings.get('dateFormat:tz'); + } + output.params.time_zone = tz; + }, }, - }, - ], -}); + ], + }); diff --git a/src/plugins/data/public/search/aggs/buckets/filters.ts b/src/plugins/data/public/search/aggs/buckets/filters.ts index 0ad28b8be2132..8b9aca87f8735 100644 --- a/src/plugins/data/public/search/aggs/buckets/filters.ts +++ b/src/plugins/data/public/search/aggs/buckets/filters.ts @@ -17,9 +17,8 @@ * under the License. */ -import _ from 'lodash'; import { i18n } from '@kbn/i18n'; - +import { size, transform, cloneDeep } from 'lodash'; import { IUiSettingsClient } from 'src/core/public'; import { createFilterFilters } from './create_filter/filters'; @@ -27,7 +26,6 @@ import { toAngularJSON } from '../utils'; import { BucketAggType } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { Storage } from '../../../../../../plugins/kibana_utils/public'; - import { getEsQueryConfig, buildEsQuery, Query } from '../../../../common'; import { getQueryLog } from '../../../query'; @@ -43,9 +41,12 @@ interface FilterValue { id: string; } -export function getFiltersBucketAgg(deps: { uiSettings: IUiSettingsClient }) { - const { uiSettings } = deps; - return new BucketAggType({ +export interface FiltersBucketAggDependencies { + uiSettings: IUiSettingsClient; +} + +export const getFiltersBucketAgg = ({ uiSettings }: FiltersBucketAggDependencies) => + new BucketAggType({ name: BUCKET_TYPES.FILTERS, title: filtersTitle, createFilter: createFilterFilters, @@ -58,7 +59,7 @@ export function getFiltersBucketAgg(deps: { uiSettings: IUiSettingsClient }) { ], write(aggConfig, output) { const inFilters: FilterValue[] = aggConfig.params.filters; - if (!_.size(inFilters)) return; + if (!size(inFilters)) return; inFilters.forEach(filter => { const persistedLog = getQueryLog( @@ -70,10 +71,10 @@ export function getFiltersBucketAgg(deps: { uiSettings: IUiSettingsClient }) { persistedLog.add(filter.input.query); }); - const outFilters = _.transform( + const outFilters = transform( inFilters, function(filters, filter) { - const input = _.cloneDeep(filter.input); + const input = cloneDeep(filter.input); if (!input) { console.log('malformed filter agg params, missing "input" query'); // eslint-disable-line no-console @@ -100,7 +101,7 @@ export function getFiltersBucketAgg(deps: { uiSettings: IUiSettingsClient }) { {} ); - if (!_.size(outFilters)) return; + if (!size(outFilters)) return; const params = output.params || (output.params = {}); params.filters = outFilters; @@ -108,4 +109,3 @@ export function getFiltersBucketAgg(deps: { uiSettings: IUiSettingsClient }) { }, ], }); -} diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts b/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts index 09dd03c759155..408cdf22bcbc2 100644 --- a/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts @@ -24,8 +24,6 @@ import { BUCKET_TYPES } from './bucket_agg_types'; import { IBucketAggConfig } from './_bucket_agg_type'; describe('Geohash Agg', () => { - // const typesRegistry = mockAggTypesRegistry([geoHashBucketAgg]); - const typesRegistry = mockAggTypesRegistry(); const getAggConfigs = (params?: Record) => { const indexPattern = { id: '1234', @@ -63,7 +61,7 @@ describe('Geohash Agg', () => { }, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry() } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts b/src/plugins/data/public/search/aggs/buckets/histogram.test.ts index 07cf022dca83c..c61b4ff37935a 100644 --- a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/histogram.test.ts @@ -17,21 +17,29 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { setUiSettings } from '../../../../public/services'; import { AggConfigs } from '../agg_configs'; -import { mockDataServices, mockAggTypesRegistry } from '../test_helpers'; +import { mockAggTypesRegistry } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { IBucketHistogramAggConfig, histogramBucketAgg, AutoBounds } from './histogram'; +import { + IBucketHistogramAggConfig, + getHistogramBucketAgg, + AutoBounds, + HistogramBucketAggDependencies, +} from './histogram'; import { BucketAggType } from './_bucket_agg_type'; describe('Histogram Agg', () => { + let aggTypesDependencies: HistogramBucketAggDependencies; + beforeEach(() => { - mockDataServices(); - }); + const { uiSettings, notifications } = coreMock.createSetup(); - const typesRegistry = mockAggTypesRegistry([histogramBucketAgg]); + aggTypesDependencies = { + uiSettings, + notifications, + }; + }); const getAggConfigs = (params: Record) => { const indexPattern = { @@ -58,7 +66,7 @@ describe('Histogram Agg', () => { params, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([getHistogramBucketAgg(aggTypesDependencies)]) } ); }; @@ -76,7 +84,7 @@ describe('Histogram Agg', () => { let histogramType: BucketAggType; beforeEach(() => { - histogramType = histogramBucketAgg; + histogramType = getHistogramBucketAgg(aggTypesDependencies); }); it('is ordered', () => { @@ -150,6 +158,14 @@ describe('Histogram Agg', () => { params?: Record, autoBounds?: AutoBounds ) => { + aggTypesDependencies = { + ...aggTypesDependencies, + uiSettings: { + ...aggTypesDependencies.uiSettings, + get: () => maxBars as any, + }, + }; + const aggConfigs = getAggConfigs({ ...params, field: { @@ -162,15 +178,7 @@ describe('Histogram Agg', () => { aggConfig.setAutoBounds(autoBounds); } - const core = coreMock.createStart(); - setUiSettings({ - ...core.uiSettings, - get: () => maxBars as any, - }); - - const interval = aggConfig.write(aggConfigs).params; - setUiSettings(core.uiSettings); // clean up - return interval; + return aggConfig.write(aggConfigs).params; }; it('will respect the histogram:maxBars setting', () => { diff --git a/src/plugins/data/public/search/aggs/buckets/histogram.ts b/src/plugins/data/public/search/aggs/buckets/histogram.ts index 7ccd5ae4bf98c..bbffc0912bf0d 100644 --- a/src/plugins/data/public/search/aggs/buckets/histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/histogram.ts @@ -17,182 +17,190 @@ * under the License. */ -import _ from 'lodash'; +import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { IUiSettingsClient, NotificationsSetup } from 'src/core/public'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { createFilterHistogram } from './create_filter/histogram'; import { BUCKET_TYPES } from './bucket_agg_types'; import { KBN_FIELD_TYPES } from '../../../../common'; -import { getNotifications, getUiSettings } from '../../../../public/services'; export interface AutoBounds { min: number; max: number; } +export interface HistogramBucketAggDependencies { + uiSettings: IUiSettingsClient; + notifications: NotificationsSetup; +} + export interface IBucketHistogramAggConfig extends IBucketAggConfig { setAutoBounds: (bounds: AutoBounds) => void; getAutoBounds: () => AutoBounds; } -export const histogramBucketAgg = new BucketAggType({ - name: BUCKET_TYPES.HISTOGRAM, - title: i18n.translate('data.search.aggs.buckets.histogramTitle', { - defaultMessage: 'Histogram', - }), - ordered: {}, - makeLabel(aggConfig) { - return aggConfig.getFieldDisplayName(); - }, - createFilter: createFilterHistogram, - decorateAggConfig() { - let autoBounds: AutoBounds; - - return { - setAutoBounds: { - configurable: true, - value(newValue: AutoBounds) { - autoBounds = newValue; +export const getHistogramBucketAgg = ({ + uiSettings, + notifications, +}: HistogramBucketAggDependencies) => + new BucketAggType({ + name: BUCKET_TYPES.HISTOGRAM, + title: i18n.translate('data.search.aggs.buckets.histogramTitle', { + defaultMessage: 'Histogram', + }), + ordered: {}, + makeLabel(aggConfig) { + return aggConfig.getFieldDisplayName(); + }, + createFilter: createFilterHistogram, + decorateAggConfig() { + let autoBounds: AutoBounds; + + return { + setAutoBounds: { + configurable: true, + value(newValue: AutoBounds) { + autoBounds = newValue; + }, }, - }, - getAutoBounds: { - configurable: true, - value() { - return autoBounds; + getAutoBounds: { + configurable: true, + value() { + return autoBounds; + }, }, - }, - }; - }, - params: [ - { - name: 'field', - type: 'field', - filterFieldTypes: KBN_FIELD_TYPES.NUMBER, + }; }, - { - /* - * This parameter can be set if you want the auto scaled interval to always - * be a multiple of a specific base. - */ - name: 'intervalBase', - default: null, - write: () => {}, - }, - { - name: 'interval', - modifyAggConfigOnSearchRequestStart( - aggConfig: IBucketHistogramAggConfig, - searchSource: any, - options: any - ) { - const field = aggConfig.getField(); - const aggBody = field.scripted - ? { script: { source: field.script, lang: field.lang } } - : { field: field.name }; - - const childSearchSource = searchSource - .createChild() - .setField('size', 0) - .setField('aggs', { - maxAgg: { - max: aggBody, - }, - minAgg: { - min: aggBody, - }, - }); - - return childSearchSource - .fetch(options) - .then((resp: any) => { - aggConfig.setAutoBounds({ - min: _.get(resp, 'aggregations.minAgg.value'), - max: _.get(resp, 'aggregations.maxAgg.value'), - }); - }) - .catch((e: Error) => { - if (e.name === 'AbortError') return; - getNotifications().toasts.addWarning( - i18n.translate('data.search.aggs.histogram.missingMaxMinValuesWarning', { - defaultMessage: - 'Unable to retrieve max and min values to auto-scale histogram buckets. This may lead to poor visualization performance.', - }) - ); - }); + params: [ + { + name: 'field', + type: 'field', + filterFieldTypes: KBN_FIELD_TYPES.NUMBER, }, - write(aggConfig, output) { - let interval = parseFloat(aggConfig.params.interval); - if (interval <= 0) { - interval = 1; - } - const autoBounds = aggConfig.getAutoBounds(); - - // ensure interval does not create too many buckets and crash browser - if (autoBounds) { - const range = autoBounds.max - autoBounds.min; - const bars = range / interval; - - const config = getUiSettings(); - if (bars > config.get('histogram:maxBars')) { - const minInterval = range / config.get('histogram:maxBars'); - - // Round interval by order of magnitude to provide clean intervals - // Always round interval up so there will always be less buckets than histogram:maxBars - const orderOfMagnitude = Math.pow(10, Math.floor(Math.log10(minInterval))); - let roundInterval = orderOfMagnitude; - - while (roundInterval < minInterval) { - roundInterval += orderOfMagnitude; + { + /* + * This parameter can be set if you want the auto scaled interval to always + * be a multiple of a specific base. + */ + name: 'intervalBase', + default: null, + write: () => {}, + }, + { + name: 'interval', + modifyAggConfigOnSearchRequestStart( + aggConfig: IBucketHistogramAggConfig, + searchSource: any, + options: any + ) { + const field = aggConfig.getField(); + const aggBody = field.scripted + ? { script: { source: field.script, lang: field.lang } } + : { field: field.name }; + + const childSearchSource = searchSource + .createChild() + .setField('size', 0) + .setField('aggs', { + maxAgg: { + max: aggBody, + }, + minAgg: { + min: aggBody, + }, + }); + + return childSearchSource + .fetch(options) + .then((resp: any) => { + aggConfig.setAutoBounds({ + min: get(resp, 'aggregations.minAgg.value'), + max: get(resp, 'aggregations.maxAgg.value'), + }); + }) + .catch((e: Error) => { + if (e.name === 'AbortError') return; + notifications.toasts.addWarning( + i18n.translate('data.search.aggs.histogram.missingMaxMinValuesWarning', { + defaultMessage: + 'Unable to retrieve max and min values to auto-scale histogram buckets. This may lead to poor visualization performance.', + }) + ); + }); + }, + write(aggConfig, output) { + let interval = parseFloat(aggConfig.params.interval); + if (interval <= 0) { + interval = 1; + } + const autoBounds = aggConfig.getAutoBounds(); + + // ensure interval does not create too many buckets and crash browser + if (autoBounds) { + const range = autoBounds.max - autoBounds.min; + const bars = range / interval; + + if (bars > uiSettings.get('histogram:maxBars')) { + const minInterval = range / uiSettings.get('histogram:maxBars'); + + // Round interval by order of magnitude to provide clean intervals + // Always round interval up so there will always be less buckets than histogram:maxBars + const orderOfMagnitude = Math.pow(10, Math.floor(Math.log10(minInterval))); + let roundInterval = orderOfMagnitude; + + while (roundInterval < minInterval) { + roundInterval += orderOfMagnitude; + } + interval = roundInterval; } - interval = roundInterval; } - } - const base = aggConfig.params.intervalBase; - - if (base) { - if (interval < base) { - // In case the specified interval is below the base, just increase it to it's base - interval = base; - } else if (interval % base !== 0) { - // In case the interval is not a multiple of the base round it to the next base - interval = Math.round(interval / base) * base; + const base = aggConfig.params.intervalBase; + + if (base) { + if (interval < base) { + // In case the specified interval is below the base, just increase it to it's base + interval = base; + } else if (interval % base !== 0) { + // In case the interval is not a multiple of the base round it to the next base + interval = Math.round(interval / base) * base; + } } - } - output.params.interval = interval; + output.params.interval = interval; + }, }, - }, - { - name: 'min_doc_count', - default: false, - write(aggConfig, output) { - if (aggConfig.params.min_doc_count) { - output.params.min_doc_count = 0; - } else { - output.params.min_doc_count = 1; - } + { + name: 'min_doc_count', + default: false, + write(aggConfig, output) { + if (aggConfig.params.min_doc_count) { + output.params.min_doc_count = 0; + } else { + output.params.min_doc_count = 1; + } + }, }, - }, - { - name: 'has_extended_bounds', - default: false, - write: () => {}, - }, - { - name: 'extended_bounds', - default: { - min: '', - max: '', + { + name: 'has_extended_bounds', + default: false, + write: () => {}, }, - write(aggConfig, output) { - const { min, max } = aggConfig.params.extended_bounds; + { + name: 'extended_bounds', + default: { + min: '', + max: '', + }, + write(aggConfig, output) { + const { min, max } = aggConfig.params.extended_bounds; - if (aggConfig.params.has_extended_bounds && (min || min === 0) && (max || max === 0)) { - output.params.extended_bounds = { min, max }; - } + if (aggConfig.params.has_extended_bounds && (min || min === 0) && (max || max === 0)) { + output.params.extended_bounds = { min, max }; + } + }, + shouldShow: (aggConfig: IBucketAggConfig) => aggConfig.params.has_extended_bounds, }, - shouldShow: (aggConfig: IBucketAggConfig) => aggConfig.params.has_extended_bounds, - }, - ], -}); + ], + }); diff --git a/src/plugins/data/public/search/aggs/buckets/range.test.ts b/src/plugins/data/public/search/aggs/buckets/range.test.ts index d9e1af149524c..bf3711543ae88 100644 --- a/src/plugins/data/public/search/aggs/buckets/range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/range.test.ts @@ -48,8 +48,6 @@ describe('Range Agg', () => { mockDataServices(); }); - const typesRegistry = mockAggTypesRegistry([rangeBucketAgg]); - const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { const field = { @@ -86,7 +84,7 @@ describe('Range Agg', () => { }, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([rangeBucketAgg]) } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts b/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts index cee3ed506c29c..1c221126c35e0 100644 --- a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts @@ -26,7 +26,6 @@ import { IBucketAggConfig } from './_bucket_agg_type'; describe('Significant Terms Agg', () => { describe('order agg editor UI', () => { describe('convert include/exclude from old format', () => { - const typesRegistry = mockAggTypesRegistry([significantTermsBucketAgg]); const getAggConfigs = (params: Record = {}) => { const indexPattern = { id: '1234', @@ -52,12 +51,12 @@ describe('Significant Terms Agg', () => { params, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry([significantTermsBucketAgg]) } ); }; const testSerializeAndWrite = (aggs: IAggConfigs) => { - const agg = aggs.aggs[0]; + const [agg] = aggs.aggs; const { [BUCKET_TYPES.SIGNIFICANT_TERMS]: params } = agg.toDsl(); expect(params.field).toBe('field'); diff --git a/src/plugins/data/public/search/aggs/buckets/terms.test.ts b/src/plugins/data/public/search/aggs/buckets/terms.test.ts index 9a4f28afd3edf..280d78f6620bd 100644 --- a/src/plugins/data/public/search/aggs/buckets/terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/terms.test.ts @@ -23,7 +23,6 @@ import { BUCKET_TYPES } from './bucket_agg_types'; describe('Terms Agg', () => { describe('order agg editor UI', () => { - const typesRegistry = mockAggTypesRegistry(); const getAggConfigs = (params: Record = {}) => { const indexPattern = { id: '1234', @@ -48,7 +47,7 @@ describe('Terms Agg', () => { type: BUCKET_TYPES.TERMS, }, ], - { typesRegistry } + { typesRegistry: mockAggTypesRegistry() } ); }; diff --git a/src/plugins/data/public/search/aggs/index.test.ts b/src/plugins/data/public/search/aggs/index.test.ts index b5dedc9d45e84..8c0e47763c295 100644 --- a/src/plugins/data/public/search/aggs/index.test.ts +++ b/src/plugins/data/public/search/aggs/index.test.ts @@ -22,24 +22,29 @@ import { getAggTypes } from './index'; import { isBucketAggType } from './buckets/_bucket_agg_type'; import { isMetricAggType } from './metrics/metric_agg_type'; +import { QueryStart } from '../../query'; -const aggTypes = getAggTypes({ uiSettings: coreMock.createStart().uiSettings }); +describe('AggTypesComponent', () => { + const core = coreMock.createSetup(); + const aggTypes = getAggTypes({ + uiSettings: core.uiSettings, + notifications: core.notifications, + query: {} as QueryStart, + }); -const bucketAggs = aggTypes.buckets; -const metricAggs = aggTypes.metrics; + const { buckets, metrics } = aggTypes; -describe('AggTypesComponent', () => { describe('bucket aggs', () => { - it('all extend BucketAggType', () => { - bucketAggs.forEach(bucketAgg => { + test('all extend BucketAggType', () => { + buckets.forEach(bucketAgg => { expect(isBucketAggType(bucketAgg)).toBeTruthy(); }); }); }); describe('metric aggs', () => { - it('all extend MetricAggType', () => { - metricAggs.forEach(metricAgg => { + test('all extend MetricAggType', () => { + metrics.forEach(metricAgg => { expect(isMetricAggType(metricAgg)).toBeTruthy(); }); }); diff --git a/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts b/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts index 1ebd0ea29c9ff..57d27b7da6313 100644 --- a/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts +++ b/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts @@ -23,6 +23,7 @@ import { AggTypesRegistry, AggTypesRegistryStart } from '../agg_types_registry'; import { getAggTypes } from '../agg_types'; import { BucketAggType } from '../buckets/_bucket_agg_type'; import { MetricAggType } from '../metrics/metric_agg_type'; +import { queryServiceMock } from '../../../query/mocks'; /** * Testing utility which creates a new instance of AggTypesRegistry, @@ -51,7 +52,13 @@ export function mockAggTypesRegistry | MetricAggTyp } }); } else { - const aggTypes = getAggTypes({ uiSettings: coreMock.createSetup().uiSettings }); + const core = coreMock.createSetup(); + const aggTypes = getAggTypes({ + uiSettings: core.uiSettings, + notifications: core.notifications, + query: queryServiceMock.createSetupContract(), + }); + aggTypes.buckets.forEach(type => registrySetup.registerBucket(type)); aggTypes.metrics.forEach(type => registrySetup.registerMetric(type)); } diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index 4bf027b07b833..19308dd387d3a 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -34,7 +34,7 @@ describe('Search service', () => { describe('setup()', () => { it('exposes proper contract', async () => { const setup = searchService.setup(mockCoreSetup, { - version: '8', + packageInfo: { version: '8' }, } as any); expect(setup).toHaveProperty('registerSearchStrategyProvider'); }); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 311a8a2fc6f60..dc1c99f76d59a 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -25,6 +25,7 @@ import { TStrategyTypes } from './strategy_types'; import { getEsClient, LegacyApiCaller } from './es_client'; import { ES_SEARCH_STRATEGY, DEFAULT_SEARCH_STRATEGY } from '../../common/search'; import { esSearchStrategyProvider } from './es_search/es_search_strategy'; +import { QuerySetup } from '../query/query_service'; import { SearchInterceptor } from './search_interceptor'; import { getAggTypes, @@ -40,6 +41,11 @@ import { siblingPipelineAggHelper, } from './aggs'; +interface SearchServiceSetupDependencies { + packageInfo: PackageInfo; + query: QuerySetup; +} + /** * The search plugin exposes two registration methods for other plugins: * - registerSearchStrategyProvider for plugins to add their own custom @@ -73,13 +79,21 @@ export class SearchService implements Plugin { return strategyProvider; }; - public setup(core: CoreSetup, packageInfo: PackageInfo): ISearchSetup { + public setup( + core: CoreSetup, + { packageInfo, query }: SearchServiceSetupDependencies + ): ISearchSetup { this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo); this.registerSearchStrategyProvider(SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider); this.registerSearchStrategyProvider(ES_SEARCH_STRATEGY, esSearchStrategyProvider); const aggTypesSetup = this.aggTypesRegistry.setup(); - const aggTypes = getAggTypes({ uiSettings: core.uiSettings }); + const aggTypes = getAggTypes({ + query, + uiSettings: core.uiSettings, + notifications: core.notifications, + }); + aggTypes.buckets.forEach(b => aggTypesSetup.registerBucket(b)); aggTypes.metrics.forEach(m => aggTypesSetup.registerMetric(m)); diff --git a/src/plugins/data/public/services.ts b/src/plugins/data/public/services.ts index 2af87d84b780e..199ba17b3b81b 100644 --- a/src/plugins/data/public/services.ts +++ b/src/plugins/data/public/services.ts @@ -17,8 +17,7 @@ * under the License. */ -import { NotificationsStart } from 'src/core/public'; -import { CoreSetup, CoreStart } from 'kibana/public'; +import { NotificationsStart, CoreSetup, CoreStart } from 'src/core/public'; import { FieldFormatsStart } from './field_formats'; import { createGetterSetter } from '../../kibana_utils/public'; import { IndexPatternsContract } from './index_patterns'; diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index 5038b4226fad8..47bef4255347c 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -173,6 +173,7 @@ export { ISearchContext, TSearchStrategyProvider, getDefaultSearchParams, + getTotalLoaded, } from './search'; // Search namespace diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index b4ee02eefaf84..47cad7aa6b4d7 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -21,7 +21,7 @@ import { APICaller } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { ES_SEARCH_STRATEGY } from '../../../common/search'; import { ISearchStrategy, TSearchStrategyProvider } from '../i_search_strategy'; -import { getDefaultSearchParams, ISearchContext } from '..'; +import { getDefaultSearchParams, getTotalLoaded, ISearchContext } from '..'; export const esSearchStrategyProvider: TSearchStrategyProvider = ( context: ISearchContext, @@ -46,9 +46,7 @@ export const esSearchStrategyProvider: TSearchStrategyProvider { + it('returns the total/loaded, not including skipped', () => { + const result = getTotalLoaded({ + successful: 10, + failed: 5, + skipped: 5, + total: 100, + }); + + expect(result).toEqual({ + total: 100, + loaded: 15, + }); + }); +}); diff --git a/src/plugins/data/server/search/es_search/get_total_loaded.ts b/src/plugins/data/server/search/es_search/get_total_loaded.ts new file mode 100644 index 0000000000000..b5af600e84eff --- /dev/null +++ b/src/plugins/data/server/search/es_search/get_total_loaded.ts @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ShardsResponse } from 'elasticsearch'; + +/** + * Get the `total`/`loaded` for this response (see `IKibanaSearchResponse`). Note that `skipped` is + * not included as it is already included in `successful`. + * @internal + */ +export function getTotalLoaded({ total, failed, successful }: ShardsResponse) { + const loaded = failed + successful; + return { total, loaded }; +} diff --git a/src/plugins/data/server/search/es_search/index.ts b/src/plugins/data/server/search/es_search/index.ts index 5a8b3bc94c679..20006b70730d8 100644 --- a/src/plugins/data/server/search/es_search/index.ts +++ b/src/plugins/data/server/search/es_search/index.ts @@ -20,3 +20,4 @@ export { ES_SEARCH_STRATEGY, IEsSearchRequest, IEsSearchResponse } from '../../../common/search'; export { esSearchStrategyProvider } from './es_search_strategy'; export { getDefaultSearchParams } from './get_default_search_params'; +export { getTotalLoaded } from './get_total_loaded'; diff --git a/src/plugins/data/server/search/index.ts b/src/plugins/data/server/search/index.ts index 15738a3befb27..e08eba1cad831 100644 --- a/src/plugins/data/server/search/index.ts +++ b/src/plugins/data/server/search/index.ts @@ -33,4 +33,4 @@ export { TStrategyTypes } from './strategy_types'; export { TSearchStrategyProvider } from './i_search_strategy'; -export { getDefaultSearchParams } from './es_search'; +export { getDefaultSearchParams, getTotalLoaded } from './es_search'; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 1abc74fe07ccc..c41023eab6d20 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -125,6 +125,7 @@ import { SearchResponse } from 'elasticsearch'; import { SearchShardsParams } from 'elasticsearch'; import { SearchTemplateParams } from 'elasticsearch'; import { ShallowPromise } from '@kbn/utility-types'; +import { ShardsResponse } from 'elasticsearch'; import { SnapshotCreateParams } from 'elasticsearch'; import { SnapshotCreateRepositoryParams } from 'elasticsearch'; import { SnapshotDeleteParams } from 'elasticsearch'; @@ -330,6 +331,12 @@ export function getDefaultSearchParams(config: SharedGlobalConfig): { restTotalHitsAsInt: boolean; }; +// @internal +export function getTotalLoaded({ total, failed, successful }: ShardsResponse): { + total: number; + loaded: number; +}; + // Warning: (ae-missing-release-tag) "IFieldFormatsRegistry" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -730,12 +737,12 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/server/index.ts:102:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:130:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:130:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:181:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:182:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:183:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:184:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:182:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:183:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:184:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:186:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:189:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/server/plugin.ts:64:14 - (ae-forgotten-export) The symbol "ISearchSetup" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/expressions/public/render_error_handler.ts b/src/plugins/expressions/public/render_error_handler.ts index 432ef3ed96536..27c3f9c5d8e65 100644 --- a/src/plugins/expressions/public/render_error_handler.ts +++ b/src/plugins/expressions/public/render_error_handler.ts @@ -27,6 +27,11 @@ export const renderErrorHandler: RenderErrorHandlerFnType = ( error: RenderError, handlers: IInterpreterRenderHandlers ) => { + if (error.name === 'AbortError') { + handlers.done(); + return; + } + getNotifications().toasts.addError(error, { title: i18n.translate('expressions.defaultErrorRenderer.errorTitle', { defaultMessage: 'Error in visualisation', diff --git a/src/plugins/home/server/tutorials/cisco_logs/index.ts b/src/plugins/home/server/tutorials/cisco_logs/index.ts index 303dbd9a9d856..a694802663171 100644 --- a/src/plugins/home/server/tutorials/cisco_logs/index.ts +++ b/src/plugins/home/server/tutorials/cisco_logs/index.ts @@ -50,7 +50,7 @@ supports the "asa" fileset for Cisco ASA firewall logs received over syslog or r learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-cisco.html', }, }), - // euiIconType: 'logoCisco', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/cisco.svg', artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts index ac2db66dff6b6..53803a9358a14 100644 --- a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts +++ b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts @@ -50,7 +50,7 @@ It supports both standalone deployment and Envoy proxy deployment in Kubernetes. learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-envoyproxy.html', }, }), - // euiIconType: 'logoCisco', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/envoyproxy.svg', artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/iis_logs/index.ts b/src/plugins/home/server/tutorials/iis_logs/index.ts index ff9996c1b0187..82ce098018e0b 100644 --- a/src/plugins/home/server/tutorials/iis_logs/index.ts +++ b/src/plugins/home/server/tutorials/iis_logs/index.ts @@ -49,7 +49,7 @@ export function iisLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-iis.html', }, }), - // euiIconType: 'logoIIS', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/iis.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/iptables_logs/index.ts b/src/plugins/home/server/tutorials/iptables_logs/index.ts index e3f2124347b6b..b29ab20cb6653 100644 --- a/src/plugins/home/server/tutorials/iptables_logs/index.ts +++ b/src/plugins/home/server/tutorials/iptables_logs/index.ts @@ -52,7 +52,7 @@ number and the action performed on the traffic (allow/deny).. \ learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-iptables.html', }, }), - // euiIconType: 'logoUbiquiti', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/ubiquiti.svg', artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/mssql_metrics/index.ts b/src/plugins/home/server/tutorials/mssql_metrics/index.ts index cea46c3220d5a..a1c994d670a3d 100644 --- a/src/plugins/home/server/tutorials/mssql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mssql_metrics/index.ts @@ -48,7 +48,7 @@ export function mssqlMetricsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-mssql.html', }, }), - // euiIconType: 'logoMSSQL', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/mssql.svg', isBeta: false, artifacts: { dashboards: [ diff --git a/src/plugins/home/server/tutorials/munin_metrics/index.ts b/src/plugins/home/server/tutorials/munin_metrics/index.ts index e438d3015c77c..90e4ac6026dad 100644 --- a/src/plugins/home/server/tutorials/munin_metrics/index.ts +++ b/src/plugins/home/server/tutorials/munin_metrics/index.ts @@ -36,6 +36,7 @@ export function muninMetricsSpecProvider(context: TutorialContext): TutorialSche name: i18n.translate('home.tutorials.muninMetrics.nameTitle', { defaultMessage: 'Munin metrics', }), + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/munin.svg', isBeta: true, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.muninMetrics.shortDescription', { diff --git a/src/plugins/home/server/tutorials/suricata_logs/index.ts b/src/plugins/home/server/tutorials/suricata_logs/index.ts index ac19cf0987b84..a3812fda147f5 100644 --- a/src/plugins/home/server/tutorials/suricata_logs/index.ts +++ b/src/plugins/home/server/tutorials/suricata_logs/index.ts @@ -50,7 +50,7 @@ export function suricataLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-suricata.html', }, }), - // euiIconType: 'logoSuricata', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/suricata.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/system_logs/index.ts b/src/plugins/home/server/tutorials/system_logs/index.ts index fc2fa4f49fd5f..ab8184c1b3249 100644 --- a/src/plugins/home/server/tutorials/system_logs/index.ts +++ b/src/plugins/home/server/tutorials/system_logs/index.ts @@ -50,6 +50,7 @@ Unix/Linux based distributions. This module is not available on Windows. \ learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-system.html', }, }), + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/system.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/system_metrics/index.ts b/src/plugins/home/server/tutorials/system_metrics/index.ts index b0355e1118a96..456804c51f838 100644 --- a/src/plugins/home/server/tutorials/system_metrics/index.ts +++ b/src/plugins/home/server/tutorials/system_metrics/index.ts @@ -49,6 +49,7 @@ It collects system wide statistics and statistics per process and filesystem. \ learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-system.html', }, }), + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/system.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/traefik_logs/index.ts b/src/plugins/home/server/tutorials/traefik_logs/index.ts index 423023a3902e5..56f1d56ea0123 100644 --- a/src/plugins/home/server/tutorials/traefik_logs/index.ts +++ b/src/plugins/home/server/tutorials/traefik_logs/index.ts @@ -49,7 +49,7 @@ export function traefikLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-traefik.html', }, }), - // euiIconType: 'logoTraefik', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/traefik.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts index fc36cfe869867..a1dfbc64ec244 100644 --- a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts +++ b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts @@ -48,7 +48,7 @@ export function uwsgiMetricsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-uwsgi.html', }, }), - // euiIconType: 'logouWSGI', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/uwsgi.svg', isBeta: false, artifacts: { dashboards: [ diff --git a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts index 3ea57cdbc0e44..908b6440f88c6 100644 --- a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts +++ b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts @@ -48,7 +48,7 @@ export function vSphereMetricsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-vsphere.html', }, }), - // euiIconType: 'logoVSphere', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/vsphere.svg', isBeta: true, artifacts: { application: { diff --git a/src/plugins/home/server/tutorials/zeek_logs/index.ts b/src/plugins/home/server/tutorials/zeek_logs/index.ts index c015545046c99..251825147ded1 100644 --- a/src/plugins/home/server/tutorials/zeek_logs/index.ts +++ b/src/plugins/home/server/tutorials/zeek_logs/index.ts @@ -50,7 +50,7 @@ export function zeekLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-zeek.html', }, }), - // TODO: euiIconType: 'logoZeek', + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/zeek.svg', artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts index dcecbb6d4a812..581b4a14a2f38 100644 --- a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts +++ b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts @@ -36,6 +36,7 @@ export function zookeeperMetricsSpecProvider(context: TutorialContext): Tutorial name: i18n.translate('home.tutorials.zookeeperMetrics.nameTitle', { defaultMessage: 'Zookeeper metrics', }), + euiIconType: '/plugins/kibana/home/tutorial_resources/logos/zookeeper.svg', isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.zookeeperMetrics.shortDescription', { diff --git a/src/plugins/kibana_utils/public/history/redirect_when_missing.tsx b/src/plugins/kibana_utils/public/history/redirect_when_missing.tsx index cbdeef6fbe96c..8a4cc88999bfe 100644 --- a/src/plugins/kibana_utils/public/history/redirect_when_missing.tsx +++ b/src/plugins/kibana_utils/public/history/redirect_when_missing.tsx @@ -37,6 +37,7 @@ export function redirectWhenMissing({ history, mapping, toastNotifications, + onBeforeRedirect, }: { history: History; /** @@ -48,6 +49,10 @@ export function redirectWhenMissing({ * Toast notifications service to show toasts in error cases. */ toastNotifications: ToastsSetup; + /** + * Optional callback invoked directly before a redirect is triggered + */ + onBeforeRedirect?: (error: SavedObjectNotFound) => void; }) { let localMappingObject: Mapping; @@ -75,6 +80,9 @@ export function redirectWhenMissing({ text: toMountPoint({error.message}), }); + if (onBeforeRedirect) { + onBeforeRedirect(error); + } history.replace(url); }; } diff --git a/src/plugins/saved_objects/kibana.json b/src/plugins/saved_objects/kibana.json index 4081c9a4b21b9..0792955b7c5f1 100644 --- a/src/plugins/saved_objects/kibana.json +++ b/src/plugins/saved_objects/kibana.json @@ -3,5 +3,5 @@ "version": "kibana", "server": false, "ui": true, - "requiredPlugins": [] + "requiredPlugins": ["data"] } diff --git a/src/plugins/saved_objects/public/plugin.ts b/src/plugins/saved_objects/public/plugin.ts index 5092f7a0b7b33..0f5773c00283e 100644 --- a/src/plugins/saved_objects/public/plugin.ts +++ b/src/plugins/saved_objects/public/plugin.ts @@ -17,11 +17,31 @@ * under the License. */ -import { Plugin } from 'src/core/public'; +import { CoreStart, Plugin } from 'src/core/public'; import './index.scss'; +import { createSavedObjectClass } from './saved_object'; +import { DataPublicPluginStart } from '../../data/public'; -export class SavedObjectsPublicPlugin implements Plugin { +export interface SavedObjectsStart { + SavedObjectClass: any; +} + +export interface SavedObjectsStartDeps { + data: DataPublicPluginStart; +} + +export class SavedObjectsPublicPlugin + implements Plugin { public setup() {} - public start() {} + public start(core: CoreStart, { data }: SavedObjectsStartDeps) { + return { + SavedObjectClass: createSavedObjectClass({ + indexPatterns: data.indexPatterns, + savedObjectsClient: core.savedObjects.client, + chrome: core.chrome, + overlays: core.overlays, + }), + }; + } } diff --git a/src/plugins/saved_objects/public/saved_object/saved_object_loader.ts b/src/plugins/saved_objects/public/saved_object/saved_object_loader.ts index 178edadaff6c4..e83f5c0b6bafb 100644 --- a/src/plugins/saved_objects/public/saved_object/saved_object_loader.ts +++ b/src/plugins/saved_objects/public/saved_object/saved_object_loader.ts @@ -56,7 +56,7 @@ export class SavedObjectLoader { * @param id * @returns {Promise} */ - async get(id: string) { + async get(id?: string) { // @ts-ignore const obj = new this.Class(id); return obj.init(); diff --git a/src/plugins/saved_objects_management/kibana.json b/src/plugins/saved_objects_management/kibana.json new file mode 100644 index 0000000000000..e1f14b0e3c59d --- /dev/null +++ b/src/plugins/saved_objects_management/kibana.json @@ -0,0 +1,7 @@ +{ + "id": "savedObjectsManagement", + "version": "kibana", + "server": true, + "ui": true, + "requiredPlugins": ["home"] +} diff --git a/src/plugins/saved_objects_management/public/index.ts b/src/plugins/saved_objects_management/public/index.ts new file mode 100644 index 0000000000000..7fb2f137d7d84 --- /dev/null +++ b/src/plugins/saved_objects_management/public/index.ts @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginInitializerContext } from 'kibana/public'; +import { SavedObjectsManagementPlugin } from './plugin'; + +export { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './plugin'; +export { + ISavedObjectsManagementActionRegistry, + SavedObjectsManagementAction, + SavedObjectsManagementRecord, +} from './services'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new SavedObjectsManagementPlugin(); +} diff --git a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.ts b/src/plugins/saved_objects_management/public/mocks.ts similarity index 54% rename from src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.ts rename to src/plugins/saved_objects_management/public/mocks.ts index f4085a674f496..8cf23afe87907 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action_registry.ts +++ b/src/plugins/saved_objects_management/public/mocks.ts @@ -16,22 +16,24 @@ * specific language governing permissions and limitations * under the License. */ -import { SavedObjectsManagementAction } from './saved_objects_management_action'; -const actions: Map = new Map(); +import { actionRegistryMock } from './services/action_registry.mock'; +import { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './plugin'; -export const SavedObjectsManagementActionRegistry = { - register: (action: SavedObjectsManagementAction) => { - if (!action.id) { - throw new TypeError('Saved Objects Management Actions must have an id'); - } - if (actions.has(action.id)) { - throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); - } - actions.set(action.id, action); - }, +const createSetupContractMock = (): jest.Mocked => { + const mock = { + actionRegistry: actionRegistryMock.create(), + }; + return mock; +}; - has: (actionId: string) => actions.has(actionId), +const createStartContractMock = (): jest.Mocked => { + const mock = {}; + return mock; +}; - get: () => Array.from(actions.values()), +export const savedObjectsManagementPluginMock = { + createActionRegistry: actionRegistryMock.create, + createSetupContract: createSetupContractMock, + createStartContract: createStartContractMock, }; diff --git a/src/plugins/saved_objects_management/public/plugin.test.ts b/src/plugins/saved_objects_management/public/plugin.test.ts new file mode 100644 index 0000000000000..1cafbb235ad5b --- /dev/null +++ b/src/plugins/saved_objects_management/public/plugin.test.ts @@ -0,0 +1,47 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { coreMock } from '../../../core/public/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { homePluginMock } from '../../home/public/mocks'; +import { SavedObjectsManagementPlugin } from './plugin'; + +describe('SavedObjectsManagementPlugin', () => { + let plugin: SavedObjectsManagementPlugin; + + beforeEach(() => { + plugin = new SavedObjectsManagementPlugin(); + }); + + describe('#setup', () => { + it('registers the saved_objects feature to the home plugin', async () => { + const coreSetup = coreMock.createSetup(); + const homeSetup = homePluginMock.createSetupContract(); + + await plugin.setup(coreSetup, { home: homeSetup }); + + expect(homeSetup.featureCatalogue.register).toHaveBeenCalledTimes(1); + expect(homeSetup.featureCatalogue.register).toHaveBeenCalledWith( + expect.objectContaining({ + id: 'saved_objects', + }) + ); + }); + }); +}); diff --git a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_service.ts b/src/plugins/saved_objects_management/public/plugin.ts similarity index 52% rename from src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_service.ts rename to src/plugins/saved_objects_management/public/plugin.ts index be102b2a4dce7..3f2e9c166058e 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_service.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -18,24 +18,44 @@ */ import { i18n } from '@kbn/i18n'; +import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; +import { HomePublicPluginSetup, FeatureCatalogueCategory } from '../../home/public'; import { - FeatureCatalogueCategory, - HomePublicPluginSetup, -} from '../../../../../../../plugins/home/public'; -import { SavedObjectsManagementActionRegistry } from './saved_objects_management_action_registry'; + SavedObjectsManagementActionRegistry, + ISavedObjectsManagementActionRegistry, +} from './services'; -interface SetupDependencies { +export interface SavedObjectsManagementPluginSetup { + actionRegistry: ISavedObjectsManagementActionRegistry; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SavedObjectsManagementPluginStart {} + +export interface SetupDependencies { home: HomePublicPluginSetup; } -export class SavedObjectsManagementService { - public setup({ home }: SetupDependencies) { +export class SavedObjectsManagementPlugin + implements + Plugin< + SavedObjectsManagementPluginSetup, + SavedObjectsManagementPluginStart, + SetupDependencies, + {} + > { + private actionRegistry = new SavedObjectsManagementActionRegistry(); + + public setup( + core: CoreSetup<{}>, + { home }: SetupDependencies + ): SavedObjectsManagementPluginSetup { home.featureCatalogue.register({ id: 'saved_objects', - title: i18n.translate('management.objects.savedObjectsTitle', { + title: i18n.translate('savedObjectsManagement.objects.savedObjectsTitle', { defaultMessage: 'Saved Objects', }), - description: i18n.translate('management.objects.savedObjectsDescription', { + description: i18n.translate('savedObjectsManagement.objects.savedObjectsDescription', { defaultMessage: 'Import, export, and manage your saved searches, visualizations, and dashboards.', }), @@ -46,12 +66,11 @@ export class SavedObjectsManagementService { }); return { - registry: SavedObjectsManagementActionRegistry, + actionRegistry: this.actionRegistry, }; } - public stop() {} + public start(core: CoreStart) { + return {}; + } } - -/** @internal */ -export type SavedObjectsManagementServiceSetup = ReturnType; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy.ts b/src/plugins/saved_objects_management/public/services/action_registry.mock.ts similarity index 66% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy.ts rename to src/plugins/saved_objects_management/public/services/action_registry.mock.ts index 216e523b07141..a9093ad42d0ac 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy.ts +++ b/src/plugins/saved_objects_management/public/services/action_registry.mock.ts @@ -17,12 +17,21 @@ * under the License. */ -// eslint-disable-next-line -import { npSetup, npStart } from 'ui/new_platform'; -import { PluginInitializerContext } from '../../../../../../core/public'; -import { plugin } from '.'; +import { ISavedObjectsManagementActionRegistry } from './action_registry'; -const pluginInstance = plugin({} as PluginInitializerContext); +const createRegistryMock = (): jest.Mocked => { + const mock = { + register: jest.fn(), + has: jest.fn(), + getAll: jest.fn(), + }; -export const setup = pluginInstance.setup(npSetup.core, npSetup.plugins); -export const start = pluginInstance.start(npStart.core, npStart.plugins); + mock.has.mockReturnValue(true); + mock.getAll.mockReturnValue([]); + + return mock; +}; + +export const actionRegistryMock = { + create: createRegistryMock, +}; diff --git a/src/plugins/saved_objects_management/public/services/action_registry.test.ts b/src/plugins/saved_objects_management/public/services/action_registry.test.ts new file mode 100644 index 0000000000000..eb3bda00f4196 --- /dev/null +++ b/src/plugins/saved_objects_management/public/services/action_registry.test.ts @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsManagementActionRegistry } from './action_registry'; +import { SavedObjectsManagementAction } from './action_types'; + +class DummyAction extends SavedObjectsManagementAction { + constructor(public id: string) { + super(); + } + + public euiAction = { + name: 'name', + description: 'description', + icon: 'icon', + type: 'type', + }; + + public render = () => ''; +} + +describe('SavedObjectsManagementActionRegistry', () => { + let registry: SavedObjectsManagementActionRegistry; + + const createAction = (id: string): SavedObjectsManagementAction => { + return new DummyAction(id); + }; + + beforeEach(() => { + registry = new SavedObjectsManagementActionRegistry(); + }); + + describe('#register', () => { + it('allows actions to be registered and retrieved', () => { + const action = createAction('foo'); + registry.register(action); + expect(registry.getAll()).toContain(action); + }); + + it('does not allow actions with duplicate ids to be registered', () => { + const action = createAction('my-action'); + registry.register(action); + expect(() => registry.register(action)).toThrowErrorMatchingInlineSnapshot( + `"Saved Objects Management Action with id 'my-action' already exists"` + ); + }); + }); + + describe('#has', () => { + it('returns true when an action with a matching ID exists', () => { + const action = createAction('existing-action'); + registry.register(action); + expect(registry.has('existing-action')).toEqual(true); + }); + + it(`returns false when an action doesn't exist`, () => { + expect(registry.has('missing-action')).toEqual(false); + }); + }); +}); diff --git a/src/plugins/saved_objects_management/public/services/action_registry.ts b/src/plugins/saved_objects_management/public/services/action_registry.ts new file mode 100644 index 0000000000000..8bf77231dd73f --- /dev/null +++ b/src/plugins/saved_objects_management/public/services/action_registry.ts @@ -0,0 +1,52 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsManagementAction } from './action_types'; + +export type ISavedObjectsManagementActionRegistry = PublicMethodsOf< + SavedObjectsManagementActionRegistry +>; + +export class SavedObjectsManagementActionRegistry { + private readonly actions = new Map(); + + /** + * register given action in the registry. + */ + register(action: SavedObjectsManagementAction) { + if (this.actions.has(action.id)) { + throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); + } + this.actions.set(action.id, action); + } + + /** + * return true if the registry contains given action, false otherwise. + */ + has(actionId: string) { + return this.actions.has(actionId); + } + + /** + * return all {@link SavedObjectsManagementAction | actions} currently registered. + */ + getAll() { + return [...this.actions.values()]; + } +} diff --git a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action.ts b/src/plugins/saved_objects_management/public/services/action_types.ts similarity index 92% rename from src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action.ts rename to src/plugins/saved_objects_management/public/services/action_types.ts index d83afb195a492..92b0ea638b9bb 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/saved_objects_management_action.ts +++ b/src/plugins/saved_objects_management/public/services/action_types.ts @@ -18,12 +18,8 @@ */ import { ReactNode } from 'react'; +import { SavedObjectReference } from 'src/core/public'; -export interface SavedObjectsManagementRecordReference { - type: string; - id: string; - name: string; -} export interface SavedObjectsManagementRecord { type: string; id: string; @@ -31,7 +27,7 @@ export interface SavedObjectsManagementRecord { icon: string; title: string; }; - references: SavedObjectsManagementRecordReference[]; + references: SavedObjectReference[]; } export abstract class SavedObjectsManagementAction { diff --git a/src/legacy/core_plugins/visualizations/public/index.ts b/src/plugins/saved_objects_management/public/services/index.ts similarity index 79% rename from src/legacy/core_plugins/visualizations/public/index.ts rename to src/plugins/saved_objects_management/public/services/index.ts index f5590c745b3f9..d6353576b8e11 100644 --- a/src/legacy/core_plugins/visualizations/public/index.ts +++ b/src/plugins/saved_objects_management/public/services/index.ts @@ -17,10 +17,8 @@ * under the License. */ -/** - * Static np-ready code, re-exported here so consumers can import from - * `src/legacy/core_plugins/visualizations/public` - * - * @public - */ -export * from './np_ready/public'; +export { + SavedObjectsManagementActionRegistry, + ISavedObjectsManagementActionRegistry, +} from './action_registry'; +export { SavedObjectsManagementAction, SavedObjectsManagementRecord } from './action_types'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/is_same_query.js b/src/plugins/saved_objects_management/server/index.ts similarity index 68% rename from src/legacy/core_plugins/kibana/public/management/sections/objects/lib/is_same_query.js rename to src/plugins/saved_objects_management/server/index.ts index ce5de5ce45003..820118ebf3ec4 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/lib/is_same_query.js +++ b/src/plugins/saved_objects_management/server/index.ts @@ -17,16 +17,15 @@ * under the License. */ -import { parseQuery } from '.'; +import { PluginInitializerContext } from 'src/core/server'; +import { SavedObjectsManagementPlugin } from './plugin'; -export const isSameQuery = (query1, query2) => { - const parsedQuery1 = parseQuery(query1); - const parsedQuery2 = parseQuery(query2); +export const plugin = (context: PluginInitializerContext) => + new SavedObjectsManagementPlugin(context); - if (parsedQuery1.queryText === parsedQuery2.queryText) { - if (parsedQuery1.visibleTypes === parsedQuery2.visibleTypes) { - return true; - } - } - return false; -}; +export { + SavedObjectsManagementPluginSetup, + SavedObjectsManagementPluginStart, + SavedObjectMetadata, + SavedObjectWithMetadata, +} from './types'; diff --git a/src/plugins/saved_objects_management/server/lib/find_all.test.ts b/src/plugins/saved_objects_management/server/lib/find_all.test.ts new file mode 100644 index 0000000000000..98e669c093178 --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/find_all.test.ts @@ -0,0 +1,95 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { times } from 'lodash'; +import { SavedObjectsFindOptions, SavedObject } from 'src/core/server'; +import { savedObjectsClientMock } from '../../../../core/server/mocks'; +import { findAll } from './find_all'; + +describe('findAll', () => { + let savedObjectsClient: ReturnType; + + const createObj = (id: number): SavedObject => ({ + type: 'type', + id: `id-${id}`, + attributes: {}, + references: [], + }); + + beforeEach(() => { + savedObjectsClient = savedObjectsClientMock.create(); + }); + + it('calls the saved object client with the correct parameters', async () => { + const query: SavedObjectsFindOptions = { + type: ['some-type', 'another-type'], + }; + + savedObjectsClient.find.mockResolvedValue({ + saved_objects: [createObj(1), createObj(2)], + total: 1, + per_page: 20, + page: 1, + }); + + const results = await findAll(savedObjectsClient, query); + + expect(savedObjectsClient.find).toHaveBeenCalledTimes(1); + expect(savedObjectsClient.find).toHaveBeenCalledWith({ + ...query, + page: 1, + }); + + expect(results).toEqual([createObj(1), createObj(2)]); + }); + + it('recursively call find until all objects are fetched', async () => { + const query: SavedObjectsFindOptions = { + type: ['some-type', 'another-type'], + }; + const objPerPage = 2; + + savedObjectsClient.find.mockImplementation(({ page }) => { + const firstInPage = (page! - 1) * objPerPage + 1; + return Promise.resolve({ + saved_objects: [createObj(firstInPage), createObj(firstInPage + 1)], + total: objPerPage * 3, + per_page: objPerPage, + page: page!, + }); + }); + + const results = await findAll(savedObjectsClient, query); + expect(savedObjectsClient.find).toHaveBeenCalledTimes(3); + expect(savedObjectsClient.find).toHaveBeenCalledWith({ + ...query, + page: 1, + }); + expect(savedObjectsClient.find).toHaveBeenCalledWith({ + ...query, + page: 2, + }); + expect(savedObjectsClient.find).toHaveBeenCalledWith({ + ...query, + page: 3, + }); + + expect(results).toEqual(times(6, num => createObj(num + 1))); + }); +}); diff --git a/src/plugins/saved_objects_management/server/lib/find_all.ts b/src/plugins/saved_objects_management/server/lib/find_all.ts new file mode 100644 index 0000000000000..6bc3e46d026bf --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/find_all.ts @@ -0,0 +1,46 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsClientContract, SavedObject, SavedObjectsFindOptions } from 'src/core/server'; + +export const findAll = async ( + client: SavedObjectsClientContract, + findOptions: SavedObjectsFindOptions +): Promise => { + return recursiveFind(client, findOptions, 1, []); +}; + +const recursiveFind = async ( + client: SavedObjectsClientContract, + findOptions: SavedObjectsFindOptions, + page: number, + allObjects: SavedObject[] +): Promise => { + const objects = await client.find({ + ...findOptions, + page, + }); + + allObjects.push(...objects.saved_objects); + if (allObjects.length < objects.total) { + return recursiveFind(client, findOptions, page + 1, allObjects); + } + + return allObjects; +}; diff --git a/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts b/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts new file mode 100644 index 0000000000000..18846eeebdfb7 --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts @@ -0,0 +1,213 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { findRelationships } from './find_relationships'; +import { managementMock } from '../services/management.mock'; +import { savedObjectsClientMock } from '../../../../core/server/mocks'; + +describe('findRelationships', () => { + let savedObjectsClient: ReturnType; + let managementService: ReturnType; + + beforeEach(() => { + savedObjectsClient = savedObjectsClientMock.create(); + managementService = managementMock.create(); + }); + + it('returns the child and parent references of the object', async () => { + const type = 'dashboard'; + const id = 'some-id'; + const references = [ + { + type: 'some-type', + id: 'ref-1', + name: 'ref 1', + }, + { + type: 'another-type', + id: 'ref-2', + name: 'ref 2', + }, + ]; + const referenceTypes = ['some-type', 'another-type']; + + savedObjectsClient.get.mockResolvedValue({ + id, + type, + attributes: {}, + references, + }); + + savedObjectsClient.bulkGet.mockResolvedValue({ + saved_objects: [ + { + type: 'some-type', + id: 'ref-1', + attributes: {}, + references: [], + }, + { + type: 'another-type', + id: 'ref-2', + attributes: {}, + references: [], + }, + ], + }); + + savedObjectsClient.find.mockResolvedValue({ + saved_objects: [ + { + type: 'parent-type', + id: 'parent-id', + attributes: {}, + references: [], + }, + ], + total: 1, + per_page: 20, + page: 1, + }); + + const relationships = await findRelationships({ + type, + id, + size: 20, + client: savedObjectsClient, + referenceTypes, + savedObjectsManagement: managementService, + }); + + expect(savedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(savedObjectsClient.get).toHaveBeenCalledWith(type, id); + + expect(savedObjectsClient.bulkGet).toHaveBeenCalledTimes(1); + expect(savedObjectsClient.bulkGet).toHaveBeenCalledWith( + references.map(ref => ({ + id: ref.id, + type: ref.type, + })) + ); + + expect(savedObjectsClient.find).toHaveBeenCalledTimes(1); + expect(savedObjectsClient.find).toHaveBeenCalledWith({ + hasReference: { type, id }, + perPage: 20, + type: referenceTypes, + }); + + expect(relationships).toEqual([ + { + id: 'ref-1', + relationship: 'child', + type: 'some-type', + meta: expect.any(Object), + }, + { + id: 'ref-2', + relationship: 'child', + type: 'another-type', + meta: expect.any(Object), + }, + { + id: 'parent-id', + relationship: 'parent', + type: 'parent-type', + meta: expect.any(Object), + }, + ]); + }); + + it('uses the management service to consolidate the relationship objects', async () => { + const type = 'dashboard'; + const id = 'some-id'; + const references = [ + { + type: 'some-type', + id: 'ref-1', + name: 'ref 1', + }, + ]; + const referenceTypes = ['some-type', 'another-type']; + + managementService.getIcon.mockReturnValue('icon'); + managementService.getTitle.mockReturnValue('title'); + managementService.getEditUrl.mockReturnValue('editUrl'); + managementService.getInAppUrl.mockReturnValue({ + path: 'path', + uiCapabilitiesPath: 'uiCapabilitiesPath', + }); + + savedObjectsClient.get.mockResolvedValue({ + id, + type, + attributes: {}, + references, + }); + + savedObjectsClient.bulkGet.mockResolvedValue({ + saved_objects: [ + { + type: 'some-type', + id: 'ref-1', + attributes: {}, + references: [], + }, + ], + }); + + savedObjectsClient.find.mockResolvedValue({ + saved_objects: [], + total: 0, + per_page: 20, + page: 1, + }); + + const relationships = await findRelationships({ + type, + id, + size: 20, + client: savedObjectsClient, + referenceTypes, + savedObjectsManagement: managementService, + }); + + expect(managementService.getIcon).toHaveBeenCalledTimes(1); + expect(managementService.getTitle).toHaveBeenCalledTimes(1); + expect(managementService.getEditUrl).toHaveBeenCalledTimes(1); + expect(managementService.getInAppUrl).toHaveBeenCalledTimes(1); + + expect(relationships).toEqual([ + { + id: 'ref-1', + relationship: 'child', + type: 'some-type', + meta: { + title: 'title', + icon: 'icon', + editUrl: 'editUrl', + inAppUrl: { + path: 'path', + uiCapabilitiesPath: 'uiCapabilitiesPath', + }, + }, + }, + ]); + }); +}); diff --git a/src/plugins/saved_objects_management/server/lib/find_relationships.ts b/src/plugins/saved_objects_management/server/lib/find_relationships.ts new file mode 100644 index 0000000000000..cca8831afd16c --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/find_relationships.ts @@ -0,0 +1,88 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsClientContract } from 'src/core/server'; +import { injectMetaAttributes } from './inject_meta_attributes'; +import { ISavedObjectsManagement } from '../services'; +import { SavedObjectRelation, SavedObjectWithMetadata } from '../types'; + +export async function findRelationships({ + type, + id, + size, + client, + referenceTypes, + savedObjectsManagement, +}: { + type: string; + id: string; + size: number; + client: SavedObjectsClientContract; + referenceTypes: string[]; + savedObjectsManagement: ISavedObjectsManagement; +}): Promise { + const { references = [] } = await client.get(type, id); + + // Use a map to avoid duplicates, it does happen but have a different "name" in the reference + const referencedToBulkGetOpts = new Map( + references.map(ref => [`${ref.type}:${ref.id}`, { id: ref.id, type: ref.type }]) + ); + + const [childReferencesResponse, parentReferencesResponse] = await Promise.all([ + referencedToBulkGetOpts.size > 0 + ? client.bulkGet([...referencedToBulkGetOpts.values()]) + : Promise.resolve({ saved_objects: [] }), + client.find({ + hasReference: { type, id }, + perPage: size, + type: referenceTypes, + }), + ]); + + return childReferencesResponse.saved_objects + .map(obj => injectMetaAttributes(obj, savedObjectsManagement)) + .map(extractCommonProperties) + .map( + obj => + ({ + ...obj, + relationship: 'child', + } as SavedObjectRelation) + ) + .concat( + parentReferencesResponse.saved_objects + .map(obj => injectMetaAttributes(obj, savedObjectsManagement)) + .map(extractCommonProperties) + .map( + obj => + ({ + ...obj, + relationship: 'parent', + } as SavedObjectRelation) + ) + ); +} + +function extractCommonProperties(savedObject: SavedObjectWithMetadata) { + return { + id: savedObject.id, + type: savedObject.type, + meta: savedObject.meta, + }; +} diff --git a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/index.ts b/src/plugins/saved_objects_management/server/lib/index.ts similarity index 83% rename from src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/index.ts rename to src/plugins/saved_objects_management/server/lib/index.ts index bad3b3ac36ef7..dea6813d690ec 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/saved_objects_management/index.ts +++ b/src/plugins/saved_objects_management/server/lib/index.ts @@ -17,6 +17,6 @@ * under the License. */ -export * from './saved_objects_management_action_registry'; -export * from './saved_objects_management_action'; -export * from './saved_objects_management_service'; +export { injectMetaAttributes } from './inject_meta_attributes'; +export { findAll } from './find_all'; +export { findRelationships } from './find_relationships'; diff --git a/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.test.ts b/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.test.ts new file mode 100644 index 0000000000000..0c0f9d8feb506 --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.test.ts @@ -0,0 +1,82 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObject } from 'src/core/server'; +import { injectMetaAttributes } from './inject_meta_attributes'; +import { managementMock } from '../services/management.mock'; + +describe('injectMetaAttributes', () => { + let managementService: ReturnType; + + beforeEach(() => { + managementService = managementMock.create(); + + managementService.getIcon.mockReturnValue('icon'); + managementService.getTitle.mockReturnValue('title'); + managementService.getEditUrl.mockReturnValue('editUrl'); + managementService.getInAppUrl.mockReturnValue({ + path: 'path', + uiCapabilitiesPath: 'uiCapabilitiesPath', + }); + }); + + it('inject the metadata to the obj', () => { + const obj: SavedObject = { + id: 'id', + type: 'config', + attributes: { some: 'value' }, + references: [], + }; + + const objWithMeta = injectMetaAttributes(obj, managementService); + expect(objWithMeta).toStrictEqual({ + id: 'id', + type: 'config', + attributes: { some: 'value' }, + references: [], + meta: { + icon: 'icon', + title: 'title', + editUrl: 'editUrl', + inAppUrl: { + path: 'path', + uiCapabilitiesPath: 'uiCapabilitiesPath', + }, + }, + }); + }); + + it('does not alter the original object', () => { + const obj: SavedObject = { + id: 'id', + type: 'config', + attributes: { some: 'value' }, + references: [], + }; + + injectMetaAttributes(obj, managementService); + + expect(obj).toStrictEqual({ + id: 'id', + type: 'config', + attributes: { some: 'value' }, + references: [], + }); + }); +}); diff --git a/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.ts b/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.ts new file mode 100644 index 0000000000000..615caffd3b60b --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/inject_meta_attributes.ts @@ -0,0 +1,40 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObject } from 'src/core/server'; +import { ISavedObjectsManagement } from '../services'; +import { SavedObjectWithMetadata } from '../types'; + +export function injectMetaAttributes( + savedObject: SavedObject | SavedObjectWithMetadata, + savedObjectsManagement: ISavedObjectsManagement +): SavedObjectWithMetadata { + const result = { + ...savedObject, + meta: (savedObject as SavedObjectWithMetadata).meta || {}, + }; + + // Add extra meta information + result.meta.icon = savedObjectsManagement.getIcon(savedObject.type); + result.meta.title = savedObjectsManagement.getTitle(savedObject); + result.meta.editUrl = savedObjectsManagement.getEditUrl(savedObject); + result.meta.inAppUrl = savedObjectsManagement.getInAppUrl(savedObject); + + return result; +} diff --git a/test/api_integration/apis/management/index.js b/src/plugins/saved_objects_management/server/plugin.test.mocks.ts similarity index 84% rename from test/api_integration/apis/management/index.js rename to src/plugins/saved_objects_management/server/plugin.test.mocks.ts index a442e3e4fee74..95dba4563a528 100644 --- a/test/api_integration/apis/management/index.js +++ b/src/plugins/saved_objects_management/server/plugin.test.mocks.ts @@ -17,8 +17,8 @@ * under the License. */ -export default function({ loadTestFile }) { - describe('management apis', () => { - loadTestFile(require.resolve('./saved_objects')); - }); -} +export const registerRoutesMock = jest.fn(); + +jest.doMock('./routes', () => ({ + registerRoutes: registerRoutesMock, +})); diff --git a/src/plugins/saved_objects_management/server/plugin.test.ts b/src/plugins/saved_objects_management/server/plugin.test.ts new file mode 100644 index 0000000000000..6c2c12c10efca --- /dev/null +++ b/src/plugins/saved_objects_management/server/plugin.test.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { registerRoutesMock } from './plugin.test.mocks'; +import { SavedObjectsManagementPlugin } from './plugin'; +import { coreMock } from '../../../core/server/mocks'; + +describe('SavedObjectsManagementPlugin', () => { + let plugin: SavedObjectsManagementPlugin; + + beforeEach(() => { + plugin = new SavedObjectsManagementPlugin(coreMock.createPluginInitializerContext()); + }); + + describe('#setup', () => { + it('registers the routes', async () => { + const coreSetup = coreMock.createSetup(); + + await plugin.setup(coreSetup); + + expect(registerRoutesMock).toHaveBeenCalledTimes(1); + expect(registerRoutesMock).toHaveBeenCalledWith( + expect.objectContaining({ + http: coreSetup.http, + }) + ); + }); + }); +}); diff --git a/src/plugins/saved_objects_management/server/plugin.ts b/src/plugins/saved_objects_management/server/plugin.ts new file mode 100644 index 0000000000000..b72644b500967 --- /dev/null +++ b/src/plugins/saved_objects_management/server/plugin.ts @@ -0,0 +1,53 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Subject } from 'rxjs'; +import { first } from 'rxjs/operators'; +import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from 'src/core/server'; +import { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './types'; +import { SavedObjectsManagement } from './services'; +import { registerRoutes } from './routes'; + +export class SavedObjectsManagementPlugin + implements Plugin { + private readonly logger: Logger; + private managementService$ = new Subject(); + + constructor(private readonly context: PluginInitializerContext) { + this.logger = this.context.logger.get(); + } + + public async setup({ http }: CoreSetup) { + this.logger.debug('Setting up SavedObjectsManagement plugin'); + registerRoutes({ + http, + managementServicePromise: this.managementService$.pipe(first()).toPromise(), + }); + + return {}; + } + + public async start(core: CoreStart) { + this.logger.debug('Starting up SavedObjectsManagement plugin'); + const managementService = new SavedObjectsManagement(core.savedObjects.getTypeRegistry()); + this.managementService$.next(managementService); + + return {}; + } +} diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts new file mode 100644 index 0000000000000..a74c92ba6161f --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -0,0 +1,97 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema } from '@kbn/config-schema'; +import { IRouter } from 'src/core/server'; +import { injectMetaAttributes } from '../lib'; +import { ISavedObjectsManagement } from '../services'; + +export const registerFindRoute = ( + router: IRouter, + managementServicePromise: Promise +) => { + router.get( + { + path: '/api/kibana/management/saved_objects/_find', + validate: { + query: schema.object({ + perPage: schema.number({ min: 0, defaultValue: 20 }), + page: schema.number({ min: 0, defaultValue: 1 }), + type: schema.oneOf([schema.string(), schema.arrayOf(schema.string())]), + search: schema.maybe(schema.string()), + defaultSearchOperator: schema.oneOf([schema.literal('OR'), schema.literal('AND')], { + defaultValue: 'OR', + }), + sortField: schema.maybe(schema.string()), + hasReference: schema.maybe( + schema.object({ + type: schema.string(), + id: schema.string(), + }) + ), + fields: schema.oneOf([schema.string(), schema.arrayOf(schema.string())], { + defaultValue: [], + }), + }), + }, + }, + router.handleLegacyErrors(async (context, req, res) => { + const managementService = await managementServicePromise; + const { client } = context.core.savedObjects; + const searchTypes = Array.isArray(req.query.type) ? req.query.type : [req.query.type]; + const includedFields = Array.isArray(req.query.fields) + ? req.query.fields + : [req.query.fields]; + const importAndExportableTypes = searchTypes.filter(type => + managementService.isImportAndExportable(type) + ); + + const searchFields = new Set(); + importAndExportableTypes.forEach(type => { + const searchField = managementService.getDefaultSearchField(type); + if (searchField) { + searchFields.add(searchField); + } + }); + + const findResponse = await client.find({ + ...req.query, + fields: undefined, + searchFields: [...searchFields], + }); + + const enhancedSavedObjects = findResponse.saved_objects + .map(so => injectMetaAttributes(so, managementService)) + .map(obj => { + const result = { ...obj, attributes: {} as Record }; + for (const field of includedFields) { + result.attributes[field] = obj.attributes[field]; + } + return result; + }); + + return res.ok({ + body: { + ...findResponse, + saved_objects: enhancedSavedObjects, + }, + }); + }) + ); +}; diff --git a/src/plugins/saved_objects_management/server/routes/index.test.ts b/src/plugins/saved_objects_management/server/routes/index.test.ts new file mode 100644 index 0000000000000..f183972953dce --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/index.test.ts @@ -0,0 +1,65 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { registerRoutes } from './index'; +import { ISavedObjectsManagement } from '../services'; +import { coreMock, httpServiceMock } from '../../../../core/server/mocks'; + +describe('registerRoutes', () => { + it('registers the management routes', () => { + const router = httpServiceMock.createRouter(); + const httpSetup = coreMock.createSetup().http; + httpSetup.createRouter.mockReturnValue(router); + const managementPromise = Promise.resolve({} as ISavedObjectsManagement); + + registerRoutes({ + http: httpSetup, + managementServicePromise: managementPromise, + }); + + expect(httpSetup.createRouter).toHaveBeenCalledTimes(1); + expect(router.get).toHaveBeenCalledTimes(2); + expect(router.post).toHaveBeenCalledTimes(2); + + expect(router.get).toHaveBeenCalledWith( + expect.objectContaining({ + path: '/api/kibana/management/saved_objects/_find', + }), + expect.any(Function) + ); + expect(router.get).toHaveBeenCalledWith( + expect.objectContaining({ + path: '/api/kibana/management/saved_objects/relationships/{type}/{id}', + }), + expect.any(Function) + ); + expect(router.post).toHaveBeenCalledWith( + expect.objectContaining({ + path: '/api/kibana/management/saved_objects/scroll/counts', + }), + expect.any(Function) + ); + expect(router.post).toHaveBeenCalledWith( + expect.objectContaining({ + path: '/api/kibana/management/saved_objects/scroll/export', + }), + expect.any(Function) + ); + }); +}); diff --git a/src/plugins/saved_objects_management/server/routes/index.ts b/src/plugins/saved_objects_management/server/routes/index.ts new file mode 100644 index 0000000000000..2c6adb71ed3ce --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/index.ts @@ -0,0 +1,38 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HttpServiceSetup } from 'src/core/server'; +import { ISavedObjectsManagement } from '../services'; +import { registerFindRoute } from './find'; +import { registerScrollForCountRoute } from './scroll_count'; +import { registerScrollForExportRoute } from './scroll_export'; +import { registerRelationshipsRoute } from './relationships'; + +interface RegisterRouteOptions { + http: HttpServiceSetup; + managementServicePromise: Promise; +} + +export function registerRoutes({ http, managementServicePromise }: RegisterRouteOptions) { + const router = http.createRouter(); + registerFindRoute(router, managementServicePromise); + registerScrollForCountRoute(router); + registerScrollForExportRoute(router); + registerRelationshipsRoute(router, managementServicePromise); +} diff --git a/src/plugins/saved_objects_management/server/routes/relationships.ts b/src/plugins/saved_objects_management/server/routes/relationships.ts new file mode 100644 index 0000000000000..c9001deb91237 --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/relationships.ts @@ -0,0 +1,66 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema } from '@kbn/config-schema'; +import { IRouter } from 'src/core/server'; +import { findRelationships } from '../lib'; +import { ISavedObjectsManagement } from '../services'; + +export const registerRelationshipsRoute = ( + router: IRouter, + managementServicePromise: Promise +) => { + router.get( + { + path: '/api/kibana/management/saved_objects/relationships/{type}/{id}', + validate: { + params: schema.object({ + type: schema.string(), + id: schema.string(), + }), + query: schema.object({ + size: schema.number({ defaultValue: 10000 }), + savedObjectTypes: schema.oneOf([schema.string(), schema.arrayOf(schema.string())]), + }), + }, + }, + router.handleLegacyErrors(async (context, req, res) => { + const managementService = await managementServicePromise; + const { client } = context.core.savedObjects; + const { type, id } = req.params; + const { size } = req.query; + const savedObjectTypes = Array.isArray(req.query.savedObjectTypes) + ? req.query.savedObjectTypes + : [req.query.savedObjectTypes]; + + const relations = await findRelationships({ + type, + id, + client, + size, + referenceTypes: savedObjectTypes, + savedObjectsManagement: managementService, + }); + + return res.ok({ + body: relations, + }); + }) + ); +}; diff --git a/src/plugins/saved_objects_management/server/routes/scroll_count.ts b/src/plugins/saved_objects_management/server/routes/scroll_count.ts new file mode 100644 index 0000000000000..58ba90d847791 --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/scroll_count.ts @@ -0,0 +1,67 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema } from '@kbn/config-schema'; +import { IRouter, SavedObjectsFindOptions } from 'src/core/server'; +import { findAll } from '../lib'; + +export const registerScrollForCountRoute = (router: IRouter) => { + router.post( + { + path: '/api/kibana/management/saved_objects/scroll/counts', + validate: { + body: schema.object({ + typesToInclude: schema.arrayOf(schema.string()), + searchString: schema.maybe(schema.string()), + }), + }, + }, + router.handleLegacyErrors(async (context, req, res) => { + const { client } = context.core.savedObjects; + + const findOptions: SavedObjectsFindOptions = { + type: req.body.typesToInclude, + perPage: 1000, + }; + if (req.body.searchString) { + findOptions.search = `${req.body.searchString}*`; + findOptions.searchFields = ['title']; + } + + const objects = await findAll(client, findOptions); + + const counts = objects.reduce((accum, result) => { + const type = result.type; + accum[type] = accum[type] || 0; + accum[type]++; + return accum; + }, {} as Record); + + for (const type of req.body.typesToInclude) { + if (!counts[type]) { + counts[type] = 0; + } + } + + return res.ok({ + body: counts, + }); + }) + ); +}; diff --git a/src/plugins/saved_objects_management/server/routes/scroll_export.ts b/src/plugins/saved_objects_management/server/routes/scroll_export.ts new file mode 100644 index 0000000000000..cda2770234911 --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/scroll_export.ts @@ -0,0 +1,56 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema } from '@kbn/config-schema'; +import { IRouter } from 'src/core/server'; +import { findAll } from '../lib'; + +export const registerScrollForExportRoute = (router: IRouter) => { + router.post( + { + path: '/api/kibana/management/saved_objects/scroll/export', + validate: { + body: schema.object({ + typesToInclude: schema.arrayOf(schema.string()), + }), + }, + }, + router.handleLegacyErrors(async (context, req, res) => { + const { client } = context.core.savedObjects; + const objects = await findAll(client, { + perPage: 1000, + type: req.body.typesToInclude, + }); + + return res.ok({ + body: objects.map(hit => { + return { + _id: hit.id, + _source: hit.attributes, + _meta: { + savedObjectVersion: 2, + }, + _migrationVersion: hit.migrationVersion, + _references: hit.references || [], + }; + }), + }); + }) + ); +}; diff --git a/src/core/server/saved_objects/management/index.ts b/src/plugins/saved_objects_management/server/services/index.ts similarity index 90% rename from src/core/server/saved_objects/management/index.ts rename to src/plugins/saved_objects_management/server/services/index.ts index a256a1333c5cc..fddd53c73634e 100644 --- a/src/core/server/saved_objects/management/index.ts +++ b/src/plugins/saved_objects_management/server/services/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export { SavedObjectsManagement } from './management'; +export { SavedObjectsManagement, ISavedObjectsManagement } from './management'; diff --git a/src/core/server/saved_objects/management/management.mock.ts b/src/plugins/saved_objects_management/server/services/management.mock.ts similarity index 96% rename from src/core/server/saved_objects/management/management.mock.ts rename to src/plugins/saved_objects_management/server/services/management.mock.ts index e7242c30d3961..2099cc0f77bcc 100644 --- a/src/core/server/saved_objects/management/management.mock.ts +++ b/src/plugins/saved_objects_management/server/services/management.mock.ts @@ -24,7 +24,6 @@ const createManagementMock = () => { const mocked: jest.Mocked = { isImportAndExportable: jest.fn().mockReturnValue(true), getDefaultSearchField: jest.fn(), - getImportableAndExportableTypes: jest.fn(), getIcon: jest.fn(), getTitle: jest.fn(), getEditUrl: jest.fn(), diff --git a/src/core/server/saved_objects/management/management.test.ts b/src/plugins/saved_objects_management/server/services/management.test.ts similarity index 97% rename from src/core/server/saved_objects/management/management.test.ts rename to src/plugins/saved_objects_management/server/services/management.test.ts index dc110dec020f0..6b95048749fae 100644 --- a/src/core/server/saved_objects/management/management.test.ts +++ b/src/plugins/saved_objects_management/server/services/management.test.ts @@ -18,8 +18,7 @@ */ import { SavedObjectsManagement } from './management'; -import { SavedObjectsType } from '../types'; -import { SavedObjectTypeRegistry } from '../saved_objects_type_registry'; +import { SavedObjectsType, SavedObjectTypeRegistry } from '../../../../core/server'; describe('SavedObjectsManagement', () => { let registry: SavedObjectTypeRegistry; diff --git a/src/core/server/saved_objects/management/management.ts b/src/plugins/saved_objects_management/server/services/management.ts similarity index 86% rename from src/core/server/saved_objects/management/management.ts rename to src/plugins/saved_objects_management/server/services/management.ts index db759c4aec752..7aee974182497 100644 --- a/src/core/server/saved_objects/management/management.ts +++ b/src/plugins/saved_objects_management/server/services/management.ts @@ -17,19 +17,13 @@ * under the License. */ -import { SavedObject } from '../types'; -import { ISavedObjectTypeRegistry } from '../saved_objects_type_registry'; +import { ISavedObjectTypeRegistry, SavedObject } from 'src/core/server'; + +export type ISavedObjectsManagement = PublicMethodsOf; export class SavedObjectsManagement { constructor(private readonly registry: ISavedObjectTypeRegistry) {} - public getImportableAndExportableTypes() { - return this.registry - .getAllTypes() - .map(type => type.name) - .filter(type => this.isImportAndExportable(type)); - } - public isImportAndExportable(type: string) { return this.registry.isImportableAndExportable(type); } diff --git a/src/plugins/saved_objects_management/server/types.ts b/src/plugins/saved_objects_management/server/types.ts new file mode 100644 index 0000000000000..5c4763d357e87 --- /dev/null +++ b/src/plugins/saved_objects_management/server/types.ts @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObject } from 'src/core/server'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SavedObjectsManagementPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SavedObjectsManagementPluginStart {} + +/** + * The metadata injected into a {@link SavedObject | saved object} when returning + * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. + */ +export interface SavedObjectMetadata { + icon?: string; + title?: string; + editUrl?: string; + inAppUrl?: { path: string; uiCapabilitiesPath: string }; +} + +/** + * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. + */ +export type SavedObjectWithMetadata = SavedObject & { + meta: SavedObjectMetadata; +}; + +/** + * Represents a relation between two {@link SavedObject | saved object} + */ +export interface SavedObjectRelation { + id: string; + type: string; + relationship: 'child' | 'parent'; + meta: SavedObjectMetadata; +} diff --git a/src/plugins/visualizations/kibana.json b/src/plugins/visualizations/kibana.json index 8e63ea7833327..cd22b1375ae1b 100644 --- a/src/plugins/visualizations/kibana.json +++ b/src/plugins/visualizations/kibana.json @@ -3,7 +3,5 @@ "version": "kibana", "server": true, "ui": true, - "requiredPlugins": [ - "expressions" - ] + "requiredPlugins": ["data", "expressions", "uiActions", "embeddable", "usageCollection"] } diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/__snapshots__/visualization_noresults.test.js.snap b/src/plugins/visualizations/public/components/__snapshots__/visualization_noresults.test.js.snap similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/__snapshots__/visualization_noresults.test.js.snap rename to src/plugins/visualizations/public/components/__snapshots__/visualization_noresults.test.js.snap diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/__snapshots__/visualization_requesterror.test.js.snap b/src/plugins/visualizations/public/components/__snapshots__/visualization_requesterror.test.js.snap similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/__snapshots__/visualization_requesterror.test.js.snap rename to src/plugins/visualizations/public/components/__snapshots__/visualization_requesterror.test.js.snap diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/_index.scss b/src/plugins/visualizations/public/components/_index.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/_index.scss rename to src/plugins/visualizations/public/components/_index.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/_visualization.scss b/src/plugins/visualizations/public/components/_visualization.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/_visualization.scss rename to src/plugins/visualizations/public/components/_visualization.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/index.ts b/src/plugins/visualizations/public/components/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/index.ts rename to src/plugins/visualizations/public/components/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization.test.js b/src/plugins/visualizations/public/components/visualization.test.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization.test.js rename to src/plugins/visualizations/public/components/visualization.test.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization.tsx b/src/plugins/visualizations/public/components/visualization.tsx similarity index 96% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization.tsx rename to src/plugins/visualizations/public/components/visualization.tsx index 5296de365daec..c17e088d7635b 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization.tsx +++ b/src/plugins/visualizations/public/components/visualization.tsx @@ -19,7 +19,7 @@ import { get } from 'lodash'; import React from 'react'; -import { PersistedState } from '../../../../../../../plugins/visualizations/public'; +import { PersistedState } from '../../../../plugins/visualizations/public'; import { memoizeLast } from '../legacy/memoize'; import { VisualizationChart } from './visualization_chart'; import { VisualizationNoResults } from './visualization_noresults'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_chart.test.js b/src/plugins/visualizations/public/components/visualization_chart.test.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_chart.test.js rename to src/plugins/visualizations/public/components/visualization_chart.test.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_chart.tsx b/src/plugins/visualizations/public/components/visualization_chart.tsx similarity index 96% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_chart.tsx rename to src/plugins/visualizations/public/components/visualization_chart.tsx index fcfbc8445952c..7d163d2067ee5 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_chart.tsx +++ b/src/plugins/visualizations/public/components/visualization_chart.tsx @@ -20,9 +20,9 @@ import React from 'react'; import * as Rx from 'rxjs'; import { debounceTime, filter, share, switchMap } from 'rxjs/operators'; -import { PersistedState } from '../../../../../../../plugins/visualizations/public'; +import { PersistedState } from '../../../../plugins/visualizations/public'; import { VisualizationController } from '../types'; -import { ResizeChecker } from '../../../../../../../plugins/kibana_utils/public'; +import { ResizeChecker } from '../../../../plugins/kibana_utils/public'; import { ExprVis } from '../expressions/vis'; interface VisualizationChartProps { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_noresults.test.js b/src/plugins/visualizations/public/components/visualization_noresults.test.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_noresults.test.js rename to src/plugins/visualizations/public/components/visualization_noresults.test.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_noresults.tsx b/src/plugins/visualizations/public/components/visualization_noresults.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_noresults.tsx rename to src/plugins/visualizations/public/components/visualization_noresults.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_requesterror.test.js b/src/plugins/visualizations/public/components/visualization_requesterror.test.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_requesterror.test.js rename to src/plugins/visualizations/public/components/visualization_requesterror.test.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_requesterror.tsx b/src/plugins/visualizations/public/components/visualization_requesterror.tsx similarity index 96% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_requesterror.tsx rename to src/plugins/visualizations/public/components/visualization_requesterror.tsx index 406f24741c911..3e677e609ad9a 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/components/visualization_requesterror.tsx +++ b/src/plugins/visualizations/public/components/visualization_requesterror.tsx @@ -19,7 +19,7 @@ import { EuiIcon, EuiSpacer, EuiText } from '@elastic/eui'; import React from 'react'; -import { SearchError } from '../../../../../../../plugins/data/public'; +import { SearchError } from '../../../../plugins/data/public'; interface VisualizationRequestErrorProps { onInit?: () => void; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_embeddables.scss b/src/plugins/visualizations/public/embeddable/_embeddables.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_embeddables.scss rename to src/plugins/visualizations/public/embeddable/_embeddables.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_index.scss b/src/plugins/visualizations/public/embeddable/_index.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_index.scss rename to src/plugins/visualizations/public/embeddable/_index.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_visualize_lab_disabled.scss b/src/plugins/visualizations/public/embeddable/_visualize_lab_disabled.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/_visualize_lab_disabled.scss rename to src/plugins/visualizations/public/embeddable/_visualize_lab_disabled.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/constants.ts b/src/plugins/visualizations/public/embeddable/constants.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/constants.ts rename to src/plugins/visualizations/public/embeddable/constants.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/disabled_lab_embeddable.tsx b/src/plugins/visualizations/public/embeddable/disabled_lab_embeddable.tsx similarity index 94% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/disabled_lab_embeddable.tsx rename to src/plugins/visualizations/public/embeddable/disabled_lab_embeddable.tsx index fbb2eba3afe79..af8121d8bf033 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/disabled_lab_embeddable.tsx +++ b/src/plugins/visualizations/public/embeddable/disabled_lab_embeddable.tsx @@ -19,7 +19,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { Embeddable, EmbeddableOutput } from '../../../../../../../plugins/embeddable/public'; +import { Embeddable, EmbeddableOutput } from '../../../../plugins/embeddable/public'; import { DisabledLabVisualization } from './disabled_lab_visualization'; import { VisualizeInput } from './visualize_embeddable'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/disabled_lab_visualization.tsx b/src/plugins/visualizations/public/embeddable/disabled_lab_visualization.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/disabled_lab_visualization.tsx rename to src/plugins/visualizations/public/embeddable/disabled_lab_visualization.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events.ts b/src/plugins/visualizations/public/embeddable/events.ts similarity index 90% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events.ts rename to src/plugins/visualizations/public/embeddable/events.ts index 53d04bf6eb04a..0957895a21403 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events.ts +++ b/src/plugins/visualizations/public/embeddable/events.ts @@ -17,10 +17,7 @@ * under the License. */ -import { - SELECT_RANGE_TRIGGER, - VALUE_CLICK_TRIGGER, -} from '../../../../../../../plugins/ui_actions/public'; +import { SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER } from '../../../../plugins/ui_actions/public'; export interface VisEventToTrigger { ['brush']: typeof SELECT_RANGE_TRIGGER; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/get_index_pattern.ts b/src/plugins/visualizations/public/embeddable/get_index_pattern.ts similarity index 97% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/get_index_pattern.ts rename to src/plugins/visualizations/public/embeddable/get_index_pattern.ts index 05ce68221eaf0..c12c95145fe44 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/get_index_pattern.ts +++ b/src/plugins/visualizations/public/embeddable/get_index_pattern.ts @@ -22,7 +22,7 @@ import { indexPatterns, IIndexPattern, IndexPatternAttributes, -} from '../../../../../../../plugins/data/public'; +} from '../../../../plugins/data/public'; import { getUISettings, getSavedObjects } from '../services'; export async function getIndexPattern( diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/index.ts b/src/plugins/visualizations/public/embeddable/index.ts similarity index 95% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/index.ts rename to src/plugins/visualizations/public/embeddable/index.ts index a1cd31eebef20..78f9827ffde3e 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/index.ts +++ b/src/plugins/visualizations/public/embeddable/index.ts @@ -20,3 +20,4 @@ export { DisabledLabEmbeddable } from './disabled_lab_embeddable'; export { VisualizeEmbeddable, VisualizeInput } from './visualize_embeddable'; export { VisualizeEmbeddableFactory } from './visualize_embeddable_factory'; export { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; +export { VIS_EVENT_TO_TRIGGER } from './events'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts similarity index 95% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/visualize_embeddable.ts rename to src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index 3739d1af6fc40..0c7e732f0b185 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -28,19 +28,16 @@ import { esFilters, Filter, TimefilterContract, -} from '../../../../../../../plugins/data/public'; +} from '../../../../plugins/data/public'; import { EmbeddableInput, EmbeddableOutput, Embeddable, Container, EmbeddableVisTriggerContext, -} from '../../../../../../../plugins/embeddable/public'; -import { dispatchRenderComplete } from '../../../../../../../plugins/kibana_utils/public'; -import { - IExpressionLoaderParams, - ExpressionsStart, -} from '../../../../../../../plugins/expressions/public'; +} from '../../../../plugins/embeddable/public'; +import { dispatchRenderComplete } from '../../../../plugins/kibana_utils/public'; +import { IExpressionLoaderParams, ExpressionsStart } from '../../../../plugins/expressions/public'; import { buildPipeline } from '../legacy/build_pipeline'; import { Vis } from '../vis'; import { getExpressions, getUiActions } from '../services'; @@ -86,6 +83,7 @@ export class VisualizeEmbeddable extends Embeddable; +export type VisualizeEmbeddableContract = PublicContract; +export { VisualizeInput } from './embeddable'; +export type ExprVis = ExprVisClass; +export { SchemaConfig } from './legacy/build_pipeline'; export { PersistedState } from './persisted_state'; +export { + VisualizationController, + SavedVisState, + ISavedVis, + VisSavedObject, + VisResponseValue, +} from './types'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__snapshots__/build_pipeline.test.ts.snap b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__snapshots__/build_pipeline.test.ts.snap rename to src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_update_objs/gauge_objs.js b/src/plugins/visualizations/public/legacy/__tests__/vis_update_objs/gauge_objs.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_update_objs/gauge_objs.js rename to src/plugins/visualizations/public/legacy/__tests__/vis_update_objs/gauge_objs.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts similarity index 98% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts rename to src/plugins/visualizations/public/legacy/build_pipeline.test.ts index d5c532b53a53e..5476ce6df0390 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts @@ -27,10 +27,8 @@ import { Schemas, } from './build_pipeline'; import { Vis } from '..'; -import { dataPluginMock } from '../../../../../../../plugins/data/public/mocks'; -import { IAggConfig } from '../../../../../../../plugins/data/public'; - -jest.mock('ui/new_platform'); +import { dataPluginMock } from '../../../../plugins/data/public/mocks'; +import { IAggConfig } from '../../../../plugins/data/public'; describe('visualize loader pipeline helpers: build pipeline', () => { describe('prepareJson', () => { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts similarity index 99% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts rename to src/plugins/visualizations/public/legacy/build_pipeline.ts index ea15cd9201fd7..18af94c919247 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -19,13 +19,13 @@ import { get } from 'lodash'; import moment from 'moment'; -import { SerializedFieldFormat } from '../../../../../../../plugins/expressions/public'; +import { SerializedFieldFormat } from '../../../../plugins/expressions/public'; import { IAggConfig, fieldFormats, search, TimefilterContract, -} from '../../../../../../../plugins/data/public'; +} from '../../../../plugins/data/public'; import { Vis, VisParams } from '../types'; const { isDateHistogramBucketAggConfig } = search.aggs; @@ -490,6 +490,7 @@ export const buildPipeline = async ( params: { timefilter: TimefilterContract; timeRange?: any; + abortSignal?: AbortSignal; } ) => { const { indexPattern, searchSource } = vis.data; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/memoize.test.ts b/src/plugins/visualizations/public/legacy/memoize.test.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/memoize.test.ts rename to src/plugins/visualizations/public/legacy/memoize.test.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/memoize.ts b/src/plugins/visualizations/public/legacy/memoize.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/memoize.ts rename to src/plugins/visualizations/public/legacy/memoize.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update.js b/src/plugins/visualizations/public/legacy/vis_update.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update.js rename to src/plugins/visualizations/public/legacy/vis_update.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update_state.js b/src/plugins/visualizations/public/legacy/vis_update_state.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update_state.js rename to src/plugins/visualizations/public/legacy/vis_update_state.js diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update_state.test.js b/src/plugins/visualizations/public/legacy/vis_update_state.test.js similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/vis_update_state.test.js rename to src/plugins/visualizations/public/legacy/vis_update_state.test.js diff --git a/src/plugins/visualizations/public/mocks.ts b/src/plugins/visualizations/public/mocks.ts index af7688d019f65..f4983a4313c4d 100644 --- a/src/plugins/visualizations/public/mocks.ts +++ b/src/plugins/visualizations/public/mocks.ts @@ -16,22 +16,60 @@ * specific language governing permissions and limitations * under the License. */ -import { VisualizationsSetup, VisualizationsStart } from '.'; -export type Setup = jest.Mocked; -export type Start = jest.Mocked; +import { PluginInitializerContext } from '../../../core/public'; +import { VisualizationsSetup, VisualizationsStart } from './'; +import { VisualizationsPlugin } from './plugin'; +import { coreMock } from '../../../core/public/mocks'; +import { embeddablePluginMock } from '../../../plugins/embeddable/public/mocks'; +import { expressionsPluginMock } from '../../../plugins/expressions/public/mocks'; +import { dataPluginMock } from '../../../plugins/data/public/mocks'; +import { usageCollectionPluginMock } from '../../../plugins/usage_collection/public/mocks'; +import { uiActionsPluginMock } from '../../../plugins/ui_actions/public/mocks'; -const createSetupContract = (): Setup => { - const setupContract: Setup = undefined; - return setupContract; -}; +const createSetupContract = (): VisualizationsSetup => ({ + createBaseVisualization: jest.fn(), + createReactVisualization: jest.fn(), + registerAlias: jest.fn(), + hideTypes: jest.fn(), +}); + +const createStartContract = (): VisualizationsStart => ({ + get: jest.fn(), + all: jest.fn(), + getAliases: jest.fn(), + savedVisualizationsLoader: {} as any, + showNewVisModal: jest.fn(), + createVis: jest.fn(), + convertFromSerializedVis: jest.fn(), + convertToSerializedVis: jest.fn(), +}); + +const createInstance = async () => { + const plugin = new VisualizationsPlugin({} as PluginInitializerContext); + + const setup = plugin.setup(coreMock.createSetup(), { + data: dataPluginMock.createSetupContract(), + expressions: expressionsPluginMock.createSetupContract(), + embeddable: embeddablePluginMock.createSetupContract(), + usageCollection: usageCollectionPluginMock.createSetupContract(), + }); + const doStart = () => + plugin.start(coreMock.createStart(), { + data: dataPluginMock.createStartContract(), + expressions: expressionsPluginMock.createStartContract(), + uiActions: uiActionsPluginMock.createStartContract(), + }); -const createStartContract = (): Start => { - const startContract: Start = undefined; - return startContract; + return { + plugin, + setup, + doStart, + }; }; -export const expressionsPluginMock = { +export const visualizationsPluginMock = { createSetupContract, createStartContract, + createInstance, }; diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index cceb63122820d..d3e7b759a4416 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -18,23 +18,81 @@ */ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../core/public'; -import { ExpressionsSetup, ExpressionsStart } from '../../expressions/public'; +import { TypesService, TypesSetup, TypesStart } from './vis_types'; +import { + setUISettings, + setTypes, + setI18n, + setCapabilities, + setHttp, + setIndexPatterns, + setSavedObjects, + setUsageCollector, + setFilterManager, + setExpressions, + setUiActions, + setSavedVisualizationsLoader, + setTimeFilter, + setAggs, + setChrome, + setOverlays, +} from './services'; +import { VISUALIZE_EMBEDDABLE_TYPE, VisualizeEmbeddableFactory } from './embeddable'; +import { ExpressionsSetup, ExpressionsStart } from '../../../plugins/expressions/public'; +import { EmbeddableSetup } from '../../../plugins/embeddable/public'; +import { visualization as visualizationFunction } from './expressions/visualization_function'; +import { visualization as visualizationRenderer } from './expressions/visualization_renderer'; import { range as rangeExpressionFunction } from './expression_functions/range'; import { visDimension as visDimensionExpressionFunction } from './expression_functions/vis_dimension'; +import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../plugins/data/public'; +import { UsageCollectionSetup } from '../../../plugins/usage_collection/public'; +import { createSavedVisLoader, SavedVisualizationsLoader } from './saved_visualizations'; +import { SerializedVis, Vis } from './vis'; +import { showNewVisModal } from './wizard'; +import { UiActionsStart } from '../../../plugins/ui_actions/public'; +import { + convertFromSerializedVis, + convertToSerializedVis, +} from './saved_visualizations/_saved_vis'; + +/** + * Interface for this plugin's returned setup/start contracts. + * + * @public + */ + +export type VisualizationsSetup = TypesSetup; + +export interface VisualizationsStart extends TypesStart { + savedVisualizationsLoader: SavedVisualizationsLoader; + createVis: (visType: string, visState?: SerializedVis) => Vis; + convertToSerializedVis: typeof convertToSerializedVis; + convertFromSerializedVis: typeof convertFromSerializedVis; + showNewVisModal: typeof showNewVisModal; +} export interface VisualizationsSetupDeps { expressions: ExpressionsSetup; + embeddable: EmbeddableSetup; + usageCollection: UsageCollectionSetup; + data: DataPublicPluginSetup; } export interface VisualizationsStartDeps { + data: DataPublicPluginStart; expressions: ExpressionsStart; + uiActions: UiActionsStart; } -export type VisualizationsSetup = void; - -export type VisualizationsStart = void; - -export class VisualizationsPublicPlugin +/** + * Visualizations Plugin - public + * + * This plugin's stateful contracts are returned from the `setup` and `start` methods + * below. The interfaces for these contracts are provided above. + * + * @internal + */ +export class VisualizationsPlugin implements Plugin< VisualizationsSetup, @@ -42,18 +100,73 @@ export class VisualizationsPublicPlugin VisualizationsSetupDeps, VisualizationsStartDeps > { + private readonly types: TypesService = new TypesService(); + constructor(initializerContext: PluginInitializerContext) {} - public setup(core: CoreSetup, { expressions }: VisualizationsSetupDeps): VisualizationsSetup { + public setup( + core: CoreSetup, + { expressions, embeddable, usageCollection, data }: VisualizationsSetupDeps + ): VisualizationsSetup { + setUISettings(core.uiSettings); + setUsageCollector(usageCollection); + + expressions.registerFunction(visualizationFunction); + expressions.registerRenderer(visualizationRenderer); expressions.registerFunction(rangeExpressionFunction); expressions.registerFunction(visDimensionExpressionFunction); - return undefined; + const embeddableFactory = new VisualizeEmbeddableFactory(); + embeddable.registerEmbeddableFactory(VISUALIZE_EMBEDDABLE_TYPE, embeddableFactory); + + return { + ...this.types.setup(), + }; } - public start(core: CoreStart, { expressions }: VisualizationsStartDeps): VisualizationsStart { - return undefined; + public start( + core: CoreStart, + { data, expressions, uiActions }: VisualizationsStartDeps + ): VisualizationsStart { + const types = this.types.start(); + setI18n(core.i18n); + setTypes(types); + setCapabilities(core.application.capabilities); + setHttp(core.http); + setSavedObjects(core.savedObjects); + setIndexPatterns(data.indexPatterns); + setFilterManager(data.query.filterManager); + setExpressions(expressions); + setUiActions(uiActions); + setTimeFilter(data.query.timefilter.timefilter); + setAggs(data.search.aggs); + setOverlays(core.overlays); + setChrome(core.chrome); + const savedVisualizationsLoader = createSavedVisLoader({ + savedObjectsClient: core.savedObjects.client, + indexPatterns: data.indexPatterns, + chrome: core.chrome, + overlays: core.overlays, + visualizationTypes: types, + }); + setSavedVisualizationsLoader(savedVisualizationsLoader); + + return { + ...types, + showNewVisModal, + /** + * creates new instance of Vis + * @param {IIndexPattern} indexPattern - index pattern to use + * @param {VisState} visState - visualization configuration + */ + createVis: (visType: string, visState?: SerializedVis) => new Vis(visType, visState), + convertToSerializedVis, + convertFromSerializedVis, + savedVisualizationsLoader, + }; } - public stop() {} + public stop() { + this.types.stop(); + } } diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/_saved_vis.ts b/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts similarity index 94% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/_saved_vis.ts rename to src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts index c9906428ccb31..bc96e08f4b9da 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/_saved_vis.ts +++ b/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts @@ -28,17 +28,13 @@ import { createSavedObjectClass, SavedObject, SavedObjectKibanaServices, -} from '../../../../../../../plugins/saved_objects/public'; +} from '../../../../plugins/saved_objects/public'; // @ts-ignore import { updateOldState } from '../legacy/vis_update_state'; import { extractReferences, injectReferences } from './saved_visualization_references'; -import { - IIndexPattern, - ISearchSource, - SearchSource, -} from '../../../../../../../plugins/data/public'; +import { IIndexPattern, ISearchSource, SearchSource } from '../../../../plugins/data/public'; import { ISavedVis, SerializedVis } from '../types'; -import { createSavedSearchesLoader } from '../../../../../../../plugins/discover/public'; +import { createSavedSearchesLoader } from '../../../../plugins/discover/public'; import { getChrome, getOverlays, getIndexPatterns, getSavedObjects } from '../services'; export const convertToSerializedVis = async (savedVis: ISavedVis): Promise => { @@ -159,5 +155,5 @@ export function createSavedVisClass(services: SavedObjectKibanaServices) { } } - return SavedVis; + return SavedVis as new (opts: Record | string) => SavedObject; } diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.test.ts b/src/plugins/visualizations/public/saved_visualizations/find_list_items.test.ts similarity index 97% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.test.ts rename to src/plugins/visualizations/public/saved_visualizations/find_list_items.test.ts index d1def09978dbb..4a50590e26251 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.test.ts +++ b/src/plugins/visualizations/public/saved_visualizations/find_list_items.test.ts @@ -18,8 +18,8 @@ */ import { findListItems } from './find_list_items'; -import { coreMock } from '../../../../../../../core/public/mocks'; -import { SavedObjectsClientContract } from '../../../../../../../core/public'; +import { coreMock } from '../../../../core/public/mocks'; +import { SavedObjectsClientContract } from '../../../../core/public'; import { VisTypeAlias } from '../vis_types'; describe('saved_visualizations', () => { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.ts b/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts similarity index 92% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.ts rename to src/plugins/visualizations/public/saved_visualizations/find_list_items.ts index 02db90a762e89..c0203a7441a61 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/find_list_items.ts +++ b/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts @@ -18,11 +18,8 @@ */ import _ from 'lodash'; -import { - SavedObjectAttributes, - SavedObjectsClientContract, -} from '../../../../../../../core/public'; -import { SavedObjectLoader } from '../../../../../../../plugins/saved_objects/public'; +import { SavedObjectAttributes, SavedObjectsClientContract } from '../../../../core/public'; +import { SavedObjectLoader } from '../../../../plugins/saved_objects/public'; import { VisTypeAlias } from '../vis_types'; import { VisualizationsAppExtension } from '../vis_types/vis_type_alias_registry'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/index.ts b/src/plugins/visualizations/public/saved_visualizations/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/index.ts rename to src/plugins/visualizations/public/saved_visualizations/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualization_references.test.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references.test.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualization_references.test.ts rename to src/plugins/visualizations/public/saved_visualizations/saved_visualization_references.test.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualization_references.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts similarity index 99% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualization_references.ts rename to src/plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts index b995d340d44d9..a14595524100b 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualization_references.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { SavedObjectAttributes, SavedObjectReference } from '../../../../../../../core/public'; +import { SavedObjectAttributes, SavedObjectReference } from '../../../../core/public'; import { VisSavedObject } from '../types'; export function extractReferences({ diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualizations.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts similarity index 92% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualizations.ts rename to src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts index fc0f77d54059c..e5d0c41712a91 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/saved_visualizations/saved_visualizations.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts @@ -19,7 +19,7 @@ import { SavedObjectLoader, SavedObjectKibanaServices, -} from '../../../../../../../plugins/saved_objects/public'; +} from '../../../../plugins/saved_objects/public'; import { findListItems } from './find_list_items'; import { createSavedVisClass } from './_saved_vis'; import { TypesStart } from '../vis_types'; @@ -76,5 +76,9 @@ export function createSavedVisLoader(services: SavedObjectKibanaServicesWithVisu } } const SavedVis = createSavedVisClass(services); - return new SavedObjectLoaderVisualize(SavedVis, savedObjectsClient, services.chrome); + return new SavedObjectLoaderVisualize( + SavedVis, + savedObjectsClient, + services.chrome + ) as SavedObjectLoader & { findListItems: (search: string, size: number) => any }; } diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/services.ts b/src/plugins/visualizations/public/services.ts similarity index 83% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/services.ts rename to src/plugins/visualizations/public/services.ts index 23cdeae7d15ff..c4668fa4b0c79 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/services.ts +++ b/src/plugins/visualizations/public/services.ts @@ -18,7 +18,6 @@ */ import { - ApplicationStart, Capabilities, ChromeStart, HttpStart, @@ -26,18 +25,18 @@ import { IUiSettingsClient, OverlayStart, SavedObjectsStart, -} from '../../../../../../core/public'; +} from '../../../core/public'; import { TypesStart } from './vis_types'; -import { createGetterSetter } from '../../../../../../plugins/kibana_utils/public'; +import { createGetterSetter } from '../../../plugins/kibana_utils/public'; import { DataPublicPluginStart, FilterManager, IndexPatternsContract, TimefilterContract, -} from '../../../../../../plugins/data/public'; -import { UsageCollectionSetup } from '../../../../../../plugins/usage_collection/public'; -import { ExpressionsStart } from '../../../../../../plugins/expressions/public'; -import { UiActionsStart } from '../../../../../../plugins/ui_actions/public'; +} from '../../../plugins/data/public'; +import { UsageCollectionSetup } from '../../../plugins/usage_collection/public'; +import { ExpressionsStart } from '../../../plugins/expressions/public'; +import { UiActionsStart } from '../../../plugins/ui_actions/public'; import { SavedVisualizationsLoader } from './saved_visualizations'; export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); @@ -83,5 +82,3 @@ export const [getAggs, setAggs] = createGetterSetter('Overlays'); export const [getChrome, setChrome] = createGetterSetter('Chrome'); - -export const [getApplication, setApplication] = createGetterSetter('Application'); diff --git a/src/plugins/visualizations/public/types.ts b/src/plugins/visualizations/public/types.ts index 6487266956119..54528a33414c3 100644 --- a/src/plugins/visualizations/public/types.ts +++ b/src/plugins/visualizations/public/types.ts @@ -17,6 +17,42 @@ * under the License. */ +import { SavedObject } from '../../../plugins/saved_objects/public'; +import { ISearchSource, AggConfigOptions } from '../../../plugins/data/public'; +import { SerializedVis, Vis, VisParams } from './vis'; + +export { Vis, SerializedVis, VisParams }; + +export interface VisualizationController { + render(visData: any, visParams: any): Promise; + destroy(): void; + isLoaded?(): Promise | void; +} + +export type VisualizationControllerConstructor = new ( + el: HTMLElement, + vis: Vis +) => VisualizationController; + +export interface SavedVisState { + type: string; + params: VisParams; + aggs: AggConfigOptions[]; +} + +export interface ISavedVis { + id?: string; + title: string; + description?: string; + visState: SavedVisState; + searchSource?: ISearchSource; + uiStateJSON?: string; + savedSearchRefName?: string; + savedSearchId?: string; +} + +export interface VisSavedObject extends SavedObject, ISavedVis {} + export interface VisResponseValue { visType: string; visData: object; diff --git a/src/plugins/visualizations/public/vis.test.ts b/src/plugins/visualizations/public/vis.test.ts new file mode 100644 index 0000000000000..fc9327903fc90 --- /dev/null +++ b/src/plugins/visualizations/public/vis.test.ts @@ -0,0 +1,124 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Vis } from './vis'; +// @ts-ignore +import fixturesStubbedLogstashIndexPatternProvider from '../../../fixtures/stubbed_logstash_index_pattern'; + +jest.mock('./services', () => { + class MockVisualizationController { + constructor() {} + + render(): Promise { + return new Promise(resolve => { + resolve(); + }); + } + + destroy() {} + } + + // eslint-disable-next-line + const { BaseVisType } = require('./vis_types/base_vis_type'); + + const visType = new BaseVisType({ + name: 'pie', + title: 'pie', + icon: 'pie-icon', + visualization: MockVisualizationController, + }); + + return { + getTypes: () => ({ get: () => visType }), + getAggs: () => ({ + createAggConfigs: (indexPattern: any, cfg: any) => ({ + aggs: cfg.map((aggConfig: any) => ({ ...aggConfig, toJSON: () => aggConfig })), + }), + }), + }; +}); + +describe('Vis Class', function() { + let vis: Vis; + const stateFixture = { + type: 'pie', + title: 'pie', + data: { + aggs: [ + { type: 'avg' as any, schema: 'metric', params: { field: 'bytes' } }, + { type: 'terms' as any, schema: 'segment', params: { field: 'machine.os' } }, + { type: 'terms' as any, schema: 'segment', params: { field: 'geo.src' } }, + ], + searchSource: { + getField: (name: string) => { + if (name === 'index') { + return fixturesStubbedLogstashIndexPatternProvider(); + } + }, + createCopy: jest.fn(), + }, + }, + params: { isDonut: true }, + }; + + beforeEach(function() { + vis = new Vis('test', stateFixture as any); + }); + + const verifyVis = function(visToVerify: Vis) { + expect(visToVerify).toHaveProperty('data'); + expect(visToVerify.data).toHaveProperty('aggs'); + expect(visToVerify.data.aggs!.aggs).toHaveLength(3); + + expect(visToVerify).toHaveProperty('type'); + + expect(visToVerify).toHaveProperty('params'); + expect(visToVerify.params).toHaveProperty('isDonut', true); + }; + + describe('initialization', function() { + it('should set the state', function() { + verifyVis(vis); + }); + }); + + describe('getState()', function() { + it('should get a state that represents the... er... state', function() { + const state = vis.serialize(); + expect(state).toHaveProperty('type', 'pie'); + + expect(state).toHaveProperty('params'); + expect(state.params).toHaveProperty('isDonut', true); + + expect(state.data).toHaveProperty('aggs'); + expect(state.data.aggs).toHaveLength(3); + }); + }); + + describe('isHierarchical()', function() { + it('should return false for non-hierarchical vis (like histogram)', function() { + expect(vis.isHierarchical()).toBe(false); + }); + + it('should return true for hierarchical vis (like pie)', function() { + vis.type.hierarchicalData = true; + expect(vis.isHierarchical()).toBe(true); + }); + }); +}); diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.ts b/src/plugins/visualizations/public/vis.ts similarity index 97% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/vis.ts rename to src/plugins/visualizations/public/vis.ts index 91b6a2368f5ef..3cab4faf2a27f 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.ts +++ b/src/plugins/visualizations/public/vis.ts @@ -28,7 +28,7 @@ */ import { isFunction, defaults, cloneDeep } from 'lodash'; -import { PersistedState } from '../../../../../../../src/plugins/visualizations/public'; +import { PersistedState } from './persisted_state'; // @ts-ignore import { updateVisualizationConfig } from './legacy/vis_update'; import { getTypes, getAggs } from './services'; @@ -38,7 +38,7 @@ import { IndexPattern, ISearchSource, AggConfigOptions, -} from '../../../../../../plugins/data/public'; +} from '../../../plugins/data/public'; export interface SerializedVisData { expression?: string; @@ -49,7 +49,7 @@ export interface SerializedVisData { } export interface SerializedVis { - id: string; + id?: string; title: string; description?: string; type: string; @@ -72,7 +72,7 @@ export interface VisParams { export class Vis { public readonly type: VisType; - public readonly id: string; + public readonly id?: string; public title: string = ''; public description: string = ''; public params: VisParams = {}; diff --git a/src/plugins/visualizations/public/vis_types/base_vis_type.test.ts b/src/plugins/visualizations/public/vis_types/base_vis_type.test.ts new file mode 100644 index 0000000000000..ac1242b2a1321 --- /dev/null +++ b/src/plugins/visualizations/public/vis_types/base_vis_type.test.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BaseVisType } from './base_vis_type'; + +describe('BaseVisType', () => { + describe('constructor', () => { + test('should throw if image and icon are missing', () => { + expect(() => { + new BaseVisType({ + name: 'test', + title: 'test', + description: 'test', + visualization: {} as any, + }); + }).toThrow(); + }); + }); +}); diff --git a/src/plugins/visualizations/public/vis_types/base_vis_type.ts b/src/plugins/visualizations/public/vis_types/base_vis_type.ts new file mode 100644 index 0000000000000..2464bb72d2695 --- /dev/null +++ b/src/plugins/visualizations/public/vis_types/base_vis_type.ts @@ -0,0 +1,110 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import _ from 'lodash'; +import { VisualizationControllerConstructor } from '../types'; + +export interface BaseVisTypeOptions { + name: string; + title: string; + description?: string; + icon?: string; + image?: string; + stage?: 'experimental' | 'beta' | 'production'; + feedbackMessage?: string; + options?: Record; + visualization: VisualizationControllerConstructor; + visConfig?: Record; + editor?: any; + editorConfig?: Record; + hidden?: boolean; + requestHandler?: string | unknown; + responseHandler?: string | unknown; + hierarchicalData?: boolean | unknown; + setup?: unknown; + useCustomNoDataScreen?: boolean; +} + +export class BaseVisType { + name: string; + title: string; + description: string; + icon?: string; + image?: string; + stage: 'experimental' | 'beta' | 'production'; + feedbackMessage: string; + options: Record; + visualization: VisualizationControllerConstructor; + visConfig: Record; + editor: any; + editorConfig: Record; + hidden: boolean; + requiresSearch: boolean; + requestHandler: string | unknown; + responseHandler: string | unknown; + hierarchicalData: boolean | unknown; + setup?: unknown; + useCustomNoDataScreen: boolean; + + constructor(opts: BaseVisTypeOptions) { + if (!opts.icon && !opts.image) { + throw new Error('vis_type must define its icon or image'); + } + + const defaultOptions = { + // controls the visualize editor + showTimePicker: true, + showQueryBar: true, + showFilterBar: true, + showIndexSelection: true, + hierarchicalData: false, // we should get rid of this i guess ? + }; + + this.name = opts.name; + this.description = opts.description || ''; + this.title = opts.title; + this.icon = opts.icon; + this.image = opts.image; + this.visualization = opts.visualization; + this.visConfig = _.defaultsDeep({}, opts.visConfig, { defaults: {} }); + this.editor = opts.editor; + this.editorConfig = _.defaultsDeep({}, opts.editorConfig, { collections: {} }); + this.options = _.defaultsDeep({}, opts.options, defaultOptions); + this.stage = opts.stage || 'production'; + this.feedbackMessage = opts.feedbackMessage || ''; + this.hidden = opts.hidden || false; + this.requestHandler = opts.requestHandler || 'courier'; + this.responseHandler = opts.responseHandler || 'none'; + this.setup = opts.setup; + this.requiresSearch = this.requestHandler !== 'none'; + this.hierarchicalData = opts.hierarchicalData || false; + this.useCustomNoDataScreen = opts.useCustomNoDataScreen || false; + } + + shouldMarkAsExperimentalInUI() { + return this.stage === 'experimental'; + } + + public get schemas() { + if (this.editorConfig && this.editorConfig.schemas) { + return this.editorConfig.schemas; + } + return []; + } +} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/index.ts b/src/plugins/visualizations/public/vis_types/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/index.ts rename to src/plugins/visualizations/public/vis_types/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/react_vis_type.js b/src/plugins/visualizations/public/vis_types/react_vis_controller.tsx similarity index 70% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/react_vis_type.js rename to src/plugins/visualizations/public/vis_types/react_vis_controller.tsx index e8ee7bc6e5445..643e6ffcb730b 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/react_vis_type.js +++ b/src/plugins/visualizations/public/vis_types/react_vis_controller.tsx @@ -19,21 +19,26 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { getUISettings, getI18n } from '../services'; -import { BaseVisType } from './base_vis_type'; +import { Vis, VisualizationController } from '../types'; +import { getI18n, getUISettings } from '../services'; -class ReactVisController { - constructor(element, vis) { +export class ReactVisController implements VisualizationController { + private el: HTMLElement; + private vis: Vis; + + constructor(element: HTMLElement, vis: Vis) { this.el = element; this.vis = vis; } - render(visData, visParams, updateStatus) { - this.visData = visData; - + public render(visData: any, visParams: any): Promise { const I18nContext = getI18n().Context; - return new Promise(resolve => { + return new Promise((resolve, reject) => { + if (!this.vis.type || !this.vis.type.visConfig || !this.vis.type.visConfig.component) { + reject('Missing component for ReactVisType'); + } + const Component = this.vis.type.visConfig.component; const config = getUISettings(); render( @@ -44,7 +49,6 @@ class ReactVisController { visData={visData} visParams={visParams} renderComplete={resolve} - updateStatus={updateStatus} /> , this.el @@ -52,20 +56,7 @@ class ReactVisController { }); } - destroy() { + public destroy() { unmountComponentAtNode(this.el); } } - -export class ReactVisType extends BaseVisType { - constructor(opts) { - super({ - ...opts, - visualization: ReactVisController, - }); - - if (!this.visConfig.component) { - throw new Error('Missing component for ReactVisType'); - } - } -} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/react_vis_type.js b/src/plugins/visualizations/public/vis_types/react_vis_type.test.ts similarity index 55% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/react_vis_type.js rename to src/plugins/visualizations/public/vis_types/react_vis_type.test.ts index 2474a58870424..134106bb3d42a 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/__tests__/vis_types/react_vis_type.js +++ b/src/plugins/visualizations/public/vis_types/react_vis_type.test.ts @@ -17,57 +17,30 @@ * under the License. */ -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import { ReactVisType } from '../../../vis_types/react_vis_type'; +import { cloneDeep } from 'lodash'; +import { ReactVisType } from './react_vis_type'; -describe('React Vis Type', function() { +describe('React Vis Type', () => { const visConfig = { name: 'test', title: 'test', description: 'test', icon: 'test', visConfig: { component: 'test' }, - type: { visConfig: { component: 'test' } }, }; - beforeEach(ngMock.module('kibana')); - describe('initialization', () => { it('should throw if component is not set', () => { expect(() => { - new ReactVisType({}); - }).to.throwError(); + const missingConfig = cloneDeep(visConfig); + delete missingConfig.visConfig.component; + new ReactVisType(missingConfig); + }).toThrow(); }); it('creates react controller', () => { const visType = new ReactVisType(visConfig); - expect(visType.visualization).to.not.be.an('undefined'); - }); - }); - - describe('controller render method', () => { - let vis; - beforeEach(() => { - const visType = new ReactVisType(visConfig); - const Vis = visType.visualization; - - vis = new Vis(window.document.body, {}); - }); - - it('rejects if data is not provided', () => { - vis - .render() - .then(() => { - expect('promise was not rejected').to.equal(false); - }) - .catch(() => {}); - }); - - it('renders the component', () => { - expect(() => { - vis.render({}); - }).to.not.throwError(); + expect(visType.visualization).not.toBeUndefined(); }); }); }); diff --git a/src/plugins/visualizations/public/vis_types/react_vis_type.ts b/src/plugins/visualizations/public/vis_types/react_vis_type.ts new file mode 100644 index 0000000000000..68979abe52a3c --- /dev/null +++ b/src/plugins/visualizations/public/vis_types/react_vis_type.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BaseVisType, BaseVisTypeOptions } from './base_vis_type'; +import { ReactVisController } from './react_vis_controller'; + +export class ReactVisType extends BaseVisType { + constructor(opts: Omit) { + super({ + ...opts, + visualization: ReactVisController, + }); + + if (!this.visConfig.component) { + throw new Error('Missing component for ReactVisType'); + } + } +} diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/types_service.ts b/src/plugins/visualizations/public/vis_types/types_service.ts similarity index 98% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/types_service.ts rename to src/plugins/visualizations/public/vis_types/types_service.ts index 6bcaa9a3e1dac..321f96180fd68 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/types_service.ts +++ b/src/plugins/visualizations/public/vis_types/types_service.ts @@ -30,8 +30,8 @@ export interface VisType { description?: string; visualization: any; isAccessible?: boolean; - requestHandler: string; - responseHandler: string; + requestHandler: string | unknown; + responseHandler: string | unknown; icon?: IconType; image?: string; stage: 'experimental' | 'beta' | 'production'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/vis_type_alias_registry.ts b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts similarity index 98% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/vis_type_alias_registry.ts rename to src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts index 12b02ee9e6b32..040fa22352a3a 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types/vis_type_alias_registry.ts +++ b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts @@ -17,7 +17,7 @@ * under the License. */ -interface VisualizationListItem { +export interface VisualizationListItem { editUrl: string; icon: string; id: string; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap rename to src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/_dialog.scss b/src/plugins/visualizations/public/wizard/_dialog.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/_dialog.scss rename to src/plugins/visualizations/public/wizard/_dialog.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/_index.scss b/src/plugins/visualizations/public/wizard/_index.scss similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/_index.scss rename to src/plugins/visualizations/public/wizard/_index.scss diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/index.ts b/src/plugins/visualizations/public/wizard/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/index.ts rename to src/plugins/visualizations/public/wizard/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.test.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx similarity index 99% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.test.tsx rename to src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx index 2712019e42609..5637aeafc6f14 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.test.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx @@ -21,7 +21,7 @@ import React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypesStart, VisType } from '../vis_types'; import { NewVisModal } from './new_vis_modal'; -import { SavedObjectsStart } from '../../../../../../../core/public'; +import { SavedObjectsStart } from '../../../../core/public'; describe('NewVisModal', () => { const { location } = window; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx similarity index 97% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.tsx rename to src/plugins/visualizations/public/wizard/new_vis_modal.tsx index 7c10001eddb50..448077819bb8d 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/new_vis_modal.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx @@ -23,11 +23,11 @@ import { EuiModal, EuiOverlayMask } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { METRIC_TYPE, UiStatsMetricType } from '@kbn/analytics'; -import { IUiSettingsClient, SavedObjectsStart } from '../../../../../../../core/public'; +import { IUiSettingsClient, SavedObjectsStart } from '../../../../core/public'; import { SearchSelection } from './search_selection'; import { TypeSelection } from './type_selection'; import { TypesStart, VisType, VisTypeAlias } from '../vis_types'; -import { UsageCollectionSetup } from '../../../../../../../plugins/usage_collection/public'; +import { UsageCollectionSetup } from '../../../../plugins/usage_collection/public'; interface TypeSelectionProps { isOpen: boolean; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/index.ts b/src/plugins/visualizations/public/wizard/search_selection/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/index.ts rename to src/plugins/visualizations/public/wizard/search_selection/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx b/src/plugins/visualizations/public/wizard/search_selection/search_selection.tsx similarity index 96% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx rename to src/plugins/visualizations/public/wizard/search_selection/search_selection.tsx index f8eb191dd5f92..c9fb592d1f936 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx +++ b/src/plugins/visualizations/public/wizard/search_selection/search_selection.tsx @@ -21,9 +21,9 @@ import { EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui' import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; -import { IUiSettingsClient, SavedObjectsStart } from '../../../../../../../../core/public'; +import { IUiSettingsClient, SavedObjectsStart } from '../../../../../core/public'; -import { SavedObjectFinderUi } from '../../../../../../../../plugins/saved_objects/public'; +import { SavedObjectFinderUi } from '../../../../../plugins/saved_objects/public'; import { VisType } from '../../vis_types'; interface SearchSelectionProps { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/show_new_vis.tsx b/src/plugins/visualizations/public/wizard/show_new_vis.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/show_new_vis.tsx rename to src/plugins/visualizations/public/wizard/show_new_vis.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/index.ts b/src/plugins/visualizations/public/wizard/type_selection/index.ts similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/index.ts rename to src/plugins/visualizations/public/wizard/type_selection/index.ts diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/new_vis_help.test.tsx b/src/plugins/visualizations/public/wizard/type_selection/new_vis_help.test.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/new_vis_help.test.tsx rename to src/plugins/visualizations/public/wizard/type_selection/new_vis_help.test.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/new_vis_help.tsx b/src/plugins/visualizations/public/wizard/type_selection/new_vis_help.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/new_vis_help.tsx rename to src/plugins/visualizations/public/wizard/type_selection/new_vis_help.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/type_selection.tsx b/src/plugins/visualizations/public/wizard/type_selection/type_selection.tsx similarity index 98% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/type_selection.tsx rename to src/plugins/visualizations/public/wizard/type_selection/type_selection.tsx index 81dcecfee2613..bb5037545cc82 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/type_selection.tsx +++ b/src/plugins/visualizations/public/wizard/type_selection/type_selection.tsx @@ -35,8 +35,8 @@ import { EuiTitle, } from '@elastic/eui'; -import { memoizeLast } from '../../../../../../visualizations/public/np_ready/public/legacy/memoize'; -import { VisTypeAlias } from '../../../../../../visualizations/public'; +import { memoizeLast } from '../../legacy/memoize'; +import { VisTypeAlias } from '../../vis_types/vis_type_alias_registry'; import { NewVisHelp } from './new_vis_help'; import { VisHelpText } from './vis_help_text'; import { VisTypeIcon } from './vis_type_icon'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/vis_help_text.tsx b/src/plugins/visualizations/public/wizard/type_selection/vis_help_text.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/vis_help_text.tsx rename to src/plugins/visualizations/public/wizard/type_selection/vis_help_text.tsx diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/vis_type_icon.tsx b/src/plugins/visualizations/public/wizard/type_selection/vis_type_icon.tsx similarity index 100% rename from src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/type_selection/vis_type_icon.tsx rename to src/plugins/visualizations/public/wizard/type_selection/vis_type_icon.tsx diff --git a/test/api_integration/apis/index.js b/test/api_integration/apis/index.js index 57e9120773f33..c5bfc847d0041 100644 --- a/test/api_integration/apis/index.js +++ b/test/api_integration/apis/index.js @@ -25,7 +25,7 @@ export default function({ loadTestFile }) { loadTestFile(require.resolve('./home')); loadTestFile(require.resolve('./index_patterns')); loadTestFile(require.resolve('./kql_telemetry')); - loadTestFile(require.resolve('./management')); + loadTestFile(require.resolve('./saved_objects_management')); loadTestFile(require.resolve('./saved_objects')); loadTestFile(require.resolve('./scripts')); loadTestFile(require.resolve('./shorten')); diff --git a/test/api_integration/apis/management/saved_objects/relationships.js b/test/api_integration/apis/management/saved_objects/relationships.js deleted file mode 100644 index d202094e6d6f8..0000000000000 --- a/test/api_integration/apis/management/saved_objects/relationships.js +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -const Joi = require('joi'); - -export default function({ getService }) { - const supertest = getService('supertest'); - const esArchiver = getService('esArchiver'); - - const GENERIC_RESPONSE_SCHEMA = Joi.array().items( - Joi.object().keys({ - id: Joi.string() - .uuid() - .required(), - type: Joi.string().required(), - relationship: Joi.string() - .valid('parent', 'child') - .required(), - meta: Joi.object() - .keys({ - title: Joi.string().required(), - icon: Joi.string().required(), - editUrl: Joi.string().required(), - inAppUrl: Joi.object() - .keys({ - path: Joi.string().required(), - uiCapabilitiesPath: Joi.string().required(), - }) - .required(), - }) - .required(), - }) - ); - - describe('relationships', () => { - before(() => esArchiver.load('management/saved_objects')); - after(() => esArchiver.unload('management/saved_objects')); - - const baseApiUrl = `/api/kibana/management/saved_objects/relationships`; - const coerceToArray = itemOrItems => [].concat(itemOrItems); - const getSavedObjectTypesQuery = types => - coerceToArray(types) - .map(type => `savedObjectTypes=${type}`) - .join('&'); - const defaultQuery = getSavedObjectTypesQuery([ - 'visualization', - 'index-pattern', - 'search', - 'dashboard', - ]); - - describe('searches', () => { - it('should validate search response schema', async () => { - await supertest - .get(`${baseApiUrl}/search/960372e0-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - const validationResult = Joi.validate(resp.body, GENERIC_RESPONSE_SCHEMA); - expect(validationResult.error).to.be(null); - }); - }); - - it('should work for searches', async () => { - await supertest - .get(`${baseApiUrl}/search/960372e0-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '8963ca30-3224-11e8-a572-ffca06da1357', - type: 'index-pattern', - relationship: 'child', - meta: { - title: 'saved_objects*', - icon: 'indexPatternApp', - editUrl: '/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: - '/app/kibana#/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'management.kibana.index_patterns', - }, - }, - }, - { - id: 'a42c0580-3224-11e8-a572-ffca06da1357', - type: 'visualization', - relationship: 'parent', - meta: { - title: 'VisualizationFromSavedSearch', - icon: 'visualizeApp', - editUrl: - '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - }, - ]); - }); - }); - - it('should filter based on savedObjectTypes', async () => { - await supertest - .get( - `${baseApiUrl}/search/960372e0-3224-11e8-a572-ffca06da1357?${getSavedObjectTypesQuery( - 'visualization' - )}` - ) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '8963ca30-3224-11e8-a572-ffca06da1357', - type: 'index-pattern', - meta: { - icon: 'indexPatternApp', - title: 'saved_objects*', - editUrl: '/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: - '/app/kibana#/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'management.kibana.index_patterns', - }, - }, - relationship: 'child', - }, - { - id: 'a42c0580-3224-11e8-a572-ffca06da1357', - type: 'visualization', - meta: { - icon: 'visualizeApp', - title: 'VisualizationFromSavedSearch', - editUrl: - '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - relationship: 'parent', - }, - ]); - }); - }); - - //TODO: https://github.com/elastic/kibana/issues/19713 causes this test to fail. - it.skip('should return 404 if search finds no results', async () => { - await supertest - .get(`${baseApiUrl}/search/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx${defaultQuery}`) - .expect(404); - }); - }); - - describe('dashboards', () => { - it('should validate dashboard response schema', async () => { - await supertest - .get(`${baseApiUrl}/dashboard/b70c7ae0-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - const validationResult = Joi.validate(resp.body, GENERIC_RESPONSE_SCHEMA); - expect(validationResult.error).to.be(null); - }); - }); - - it('should work for dashboards', async () => { - await supertest - .get(`${baseApiUrl}/dashboard/b70c7ae0-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: 'add810b0-3224-11e8-a572-ffca06da1357', - type: 'visualization', - relationship: 'child', - meta: { - icon: 'visualizeApp', - title: 'Visualization', - editUrl: - '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - }, - { - id: 'a42c0580-3224-11e8-a572-ffca06da1357', - type: 'visualization', - relationship: 'child', - meta: { - icon: 'visualizeApp', - title: 'VisualizationFromSavedSearch', - editUrl: - '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - }, - ]); - }); - }); - - it('should filter based on savedObjectTypes', async () => { - await supertest - .get( - `${baseApiUrl}/dashboard/b70c7ae0-3224-11e8-a572-ffca06da1357?${getSavedObjectTypesQuery( - 'search' - )}` - ) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: 'add810b0-3224-11e8-a572-ffca06da1357', - type: 'visualization', - meta: { - icon: 'visualizeApp', - title: 'Visualization', - editUrl: - '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - relationship: 'child', - }, - { - id: 'a42c0580-3224-11e8-a572-ffca06da1357', - type: 'visualization', - meta: { - icon: 'visualizeApp', - title: 'VisualizationFromSavedSearch', - editUrl: - '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - relationship: 'child', - }, - ]); - }); - }); - - //TODO: https://github.com/elastic/kibana/issues/19713 causes this test to fail. - it.skip('should return 404 if dashboard finds no results', async () => { - await supertest - .get(`${baseApiUrl}/dashboard/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx${defaultQuery}`) - .expect(404); - }); - }); - - describe('visualizations', () => { - it('should validate visualization response schema', async () => { - await supertest - .get(`${baseApiUrl}/visualization/a42c0580-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - const validationResult = Joi.validate(resp.body, GENERIC_RESPONSE_SCHEMA); - expect(validationResult.error).to.be(null); - }); - }); - - it('should work for visualizations', async () => { - await supertest - .get(`${baseApiUrl}/visualization/a42c0580-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '960372e0-3224-11e8-a572-ffca06da1357', - type: 'search', - relationship: 'child', - meta: { - icon: 'discoverApp', - title: 'OneRecord', - editUrl: - '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'discover.show', - }, - }, - }, - { - id: 'b70c7ae0-3224-11e8-a572-ffca06da1357', - type: 'dashboard', - relationship: 'parent', - meta: { - icon: 'dashboardApp', - title: 'Dashboard', - editUrl: - '/management/kibana/objects/savedDashboards/b70c7ae0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/dashboard/b70c7ae0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'dashboard.show', - }, - }, - }, - ]); - }); - }); - - it('should filter based on savedObjectTypes', async () => { - await supertest - .get( - `${baseApiUrl}/visualization/a42c0580-3224-11e8-a572-ffca06da1357?${getSavedObjectTypesQuery( - 'search' - )}` - ) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '960372e0-3224-11e8-a572-ffca06da1357', - type: 'search', - meta: { - icon: 'discoverApp', - title: 'OneRecord', - editUrl: - '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'discover.show', - }, - }, - relationship: 'child', - }, - ]); - }); - }); - - it('should return 404 if visualizations finds no results', async () => { - await supertest - .get(`${baseApiUrl}/visualization/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?${defaultQuery}`) - .expect(404); - }); - }); - - describe('index patterns', () => { - it('should validate visualization response schema', async () => { - await supertest - .get(`${baseApiUrl}/index-pattern/8963ca30-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - const validationResult = Joi.validate(resp.body, GENERIC_RESPONSE_SCHEMA); - expect(validationResult.error).to.be(null); - }); - }); - - it('should work for index patterns', async () => { - await supertest - .get(`${baseApiUrl}/index-pattern/8963ca30-3224-11e8-a572-ffca06da1357?${defaultQuery}`) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '960372e0-3224-11e8-a572-ffca06da1357', - type: 'search', - relationship: 'parent', - meta: { - icon: 'discoverApp', - title: 'OneRecord', - editUrl: - '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'discover.show', - }, - }, - }, - { - id: 'add810b0-3224-11e8-a572-ffca06da1357', - type: 'visualization', - relationship: 'parent', - meta: { - icon: 'visualizeApp', - title: 'Visualization', - editUrl: - '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'visualize.show', - }, - }, - }, - ]); - }); - }); - - it('should filter based on savedObjectTypes', async () => { - await supertest - .get( - `${baseApiUrl}/index-pattern/8963ca30-3224-11e8-a572-ffca06da1357?${getSavedObjectTypesQuery( - 'search' - )}` - ) - .expect(200) - .then(resp => { - expect(resp.body).to.eql([ - { - id: '960372e0-3224-11e8-a572-ffca06da1357', - type: 'search', - meta: { - icon: 'discoverApp', - title: 'OneRecord', - editUrl: - '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', - inAppUrl: { - path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', - uiCapabilitiesPath: 'discover.show', - }, - }, - relationship: 'parent', - }, - ]); - }); - }); - - it('should return 404 if index pattern finds no results', async () => { - await supertest - .get(`${baseApiUrl}/index-pattern/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?${defaultQuery}`) - .expect(404); - }); - }); - }); -} diff --git a/test/api_integration/apis/management/saved_objects/find.js b/test/api_integration/apis/saved_objects_management/find.ts similarity index 89% rename from test/api_integration/apis/management/saved_objects/find.js rename to test/api_integration/apis/saved_objects_management/find.ts index 89e158671c3ca..9b3eda4c0664b 100644 --- a/test/api_integration/apis/management/saved_objects/find.js +++ b/test/api_integration/apis/saved_objects_management/find.ts @@ -18,8 +18,10 @@ */ import expect from '@kbn/expect'; +import { Response } from 'supertest'; +import { FtrProviderContext } from '../../ftr_provider_context'; -export default function({ getService }) { +export default function({ getService }: FtrProviderContext) { const es = getService('legacyEs'); const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -33,7 +35,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=visualization&fields=title') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 1, per_page: 20, @@ -75,7 +77,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=wigwags') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 1, per_page: 20, @@ -92,7 +94,7 @@ export default function({ getService }) { '/api/kibana/management/saved_objects/_find?type=visualization&page=100&perPage=100' ) .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 100, per_page: 100, @@ -107,15 +109,11 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=url&searchFields=a') .expect(400) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ statusCode: 400, error: 'Bad Request', - message: '"searchFields" is not allowed', - validation: { - source: 'query', - keys: ['searchFields'], - }, + message: '[request query.searchFields]: definition for this key is missing', }); })); }); @@ -135,7 +133,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=visualization') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 1, per_page: 20, @@ -149,7 +147,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=wigwags') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 1, per_page: 20, @@ -164,15 +162,12 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find') .expect(400) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ error: 'Bad Request', - message: 'child "type" fails because ["type" is required]', + message: + '[request query.type]: expected at least one defined value but got [undefined]', statusCode: 400, - validation: { - keys: ['type'], - source: 'query', - }, }); })); }); @@ -184,7 +179,7 @@ export default function({ getService }) { '/api/kibana/management/saved_objects/_find?type=visualization&page=100&perPage=100' ) .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ page: 100, per_page: 100, @@ -199,29 +194,25 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=url&searchFields=a') .expect(400) - .then(resp => { + .then((resp: Response) => { expect(resp.body).to.eql({ statusCode: 400, error: 'Bad Request', - message: '"searchFields" is not allowed', - validation: { - source: 'query', - keys: ['searchFields'], - }, + message: '[request query.searchFields]: definition for this key is missing', }); })); }); }); describe('meta attributes injected properly', () => { - before(() => esArchiver.load('management/saved_objects')); - after(() => esArchiver.unload('management/saved_objects')); + before(() => esArchiver.load('management/saved_objects/search')); + after(() => esArchiver.unload('management/saved_objects/search')); it('should inject meta attributes for searches', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=search') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); expect(resp.body.saved_objects[0].meta).to.eql({ icon: 'discoverApp', @@ -239,7 +230,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=dashboard') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); expect(resp.body.saved_objects[0].meta).to.eql({ icon: 'dashboardApp', @@ -257,7 +248,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=visualization') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(2); expect(resp.body.saved_objects[0].meta).to.eql({ icon: 'visualizeApp', @@ -285,7 +276,7 @@ export default function({ getService }) { await supertest .get('/api/kibana/management/saved_objects/_find?type=index-pattern') .expect(200) - .then(resp => { + .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); expect(resp.body.saved_objects[0].meta).to.eql({ icon: 'indexPatternApp', diff --git a/test/api_integration/apis/saved_objects_management/index.ts b/test/api_integration/apis/saved_objects_management/index.ts new file mode 100644 index 0000000000000..5895940c4bbef --- /dev/null +++ b/test/api_integration/apis/saved_objects_management/index.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ loadTestFile }: FtrProviderContext) { + describe('saved objects management apis', () => { + loadTestFile(require.resolve('./find')); + loadTestFile(require.resolve('./relationships')); + loadTestFile(require.resolve('./scroll_count')); + }); +} diff --git a/test/api_integration/apis/saved_objects_management/relationships.ts b/test/api_integration/apis/saved_objects_management/relationships.ts new file mode 100644 index 0000000000000..78a437ab56cf7 --- /dev/null +++ b/test/api_integration/apis/saved_objects_management/relationships.ts @@ -0,0 +1,423 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import expect from '@kbn/expect'; +import { schema } from '@kbn/config-schema'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + const responseSchema = schema.arrayOf( + schema.object({ + id: schema.string(), + type: schema.string(), + relationship: schema.oneOf([schema.literal('parent'), schema.literal('child')]), + meta: schema.object({ + title: schema.string(), + icon: schema.string(), + editUrl: schema.string(), + inAppUrl: schema.object({ + path: schema.string(), + uiCapabilitiesPath: schema.string(), + }), + }), + }) + ); + + describe('relationships', () => { + before(async () => { + await esArchiver.load('management/saved_objects/relationships'); + }); + after(async () => { + await esArchiver.unload('management/saved_objects/relationships'); + }); + + const baseApiUrl = `/api/kibana/management/saved_objects/relationships`; + const defaultTypes = ['visualization', 'index-pattern', 'search', 'dashboard']; + + const relationshipsUrl = (type: string, id: string, types: string[] = defaultTypes) => { + const typesQuery = types.map(t => `savedObjectTypes=${t}`).join('&'); + return `${baseApiUrl}/${type}/${id}?${typesQuery}`; + }; + + describe('searches', () => { + it('should validate search response schema', async () => { + const resp = await supertest + .get(relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(() => { + responseSchema.validate(resp.body); + }).not.to.throwError(); + }); + + it('should work for searches', async () => { + const resp = await supertest + .get(relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '8963ca30-3224-11e8-a572-ffca06da1357', + type: 'index-pattern', + relationship: 'child', + meta: { + title: 'saved_objects*', + icon: 'indexPatternApp', + editUrl: '/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: + '/app/kibana#/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'management.kibana.index_patterns', + }, + }, + }, + { + id: 'a42c0580-3224-11e8-a572-ffca06da1357', + type: 'visualization', + relationship: 'parent', + meta: { + title: 'VisualizationFromSavedSearch', + icon: 'visualizeApp', + editUrl: + '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + }, + ]); + }); + + it('should filter based on savedObjectTypes', async () => { + const resp = await supertest + .get( + relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357', ['visualization']) + ) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '8963ca30-3224-11e8-a572-ffca06da1357', + type: 'index-pattern', + meta: { + icon: 'indexPatternApp', + title: 'saved_objects*', + editUrl: '/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: + '/app/kibana#/management/kibana/index_patterns/8963ca30-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'management.kibana.index_patterns', + }, + }, + relationship: 'child', + }, + { + id: 'a42c0580-3224-11e8-a572-ffca06da1357', + type: 'visualization', + meta: { + icon: 'visualizeApp', + title: 'VisualizationFromSavedSearch', + editUrl: + '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + relationship: 'parent', + }, + ]); + }); + + // TODO: https://github.com/elastic/kibana/issues/19713 causes this test to fail. + it.skip('should return 404 if search finds no results', async () => { + await supertest + .get(relationshipsUrl('search', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .expect(404); + }); + }); + + describe('dashboards', () => { + it('should validate dashboard response schema', async () => { + const resp = await supertest + .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(() => { + responseSchema.validate(resp.body); + }).not.to.throwError(); + }); + + it('should work for dashboards', async () => { + const resp = await supertest + .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(resp.body).to.eql([ + { + id: 'add810b0-3224-11e8-a572-ffca06da1357', + type: 'visualization', + relationship: 'child', + meta: { + icon: 'visualizeApp', + title: 'Visualization', + editUrl: + '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + }, + { + id: 'a42c0580-3224-11e8-a572-ffca06da1357', + type: 'visualization', + relationship: 'child', + meta: { + icon: 'visualizeApp', + title: 'VisualizationFromSavedSearch', + editUrl: + '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + }, + ]); + }); + + it('should filter based on savedObjectTypes', async () => { + const resp = await supertest + .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357', ['search'])) + .expect(200); + + expect(resp.body).to.eql([ + { + id: 'add810b0-3224-11e8-a572-ffca06da1357', + type: 'visualization', + meta: { + icon: 'visualizeApp', + title: 'Visualization', + editUrl: + '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + relationship: 'child', + }, + { + id: 'a42c0580-3224-11e8-a572-ffca06da1357', + type: 'visualization', + meta: { + icon: 'visualizeApp', + title: 'VisualizationFromSavedSearch', + editUrl: + '/management/kibana/objects/savedVisualizations/a42c0580-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/a42c0580-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + relationship: 'child', + }, + ]); + }); + + // TODO: https://github.com/elastic/kibana/issues/19713 causes this test to fail. + it.skip('should return 404 if dashboard finds no results', async () => { + await supertest + .get(relationshipsUrl('dashboard', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .expect(404); + }); + }); + + describe('visualizations', () => { + it('should validate visualization response schema', async () => { + const resp = await supertest + .get(relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(() => { + responseSchema.validate(resp.body); + }).not.to.throwError(); + }); + + it('should work for visualizations', async () => { + const resp = await supertest + .get(relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '960372e0-3224-11e8-a572-ffca06da1357', + type: 'search', + relationship: 'child', + meta: { + icon: 'discoverApp', + title: 'OneRecord', + editUrl: + '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'discover.show', + }, + }, + }, + { + id: 'b70c7ae0-3224-11e8-a572-ffca06da1357', + type: 'dashboard', + relationship: 'parent', + meta: { + icon: 'dashboardApp', + title: 'Dashboard', + editUrl: + '/management/kibana/objects/savedDashboards/b70c7ae0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/dashboard/b70c7ae0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'dashboard.show', + }, + }, + }, + ]); + }); + + it('should filter based on savedObjectTypes', async () => { + const resp = await supertest + .get( + relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357', ['search']) + ) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '960372e0-3224-11e8-a572-ffca06da1357', + type: 'search', + meta: { + icon: 'discoverApp', + title: 'OneRecord', + editUrl: + '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'discover.show', + }, + }, + relationship: 'child', + }, + ]); + }); + + it('should return 404 if visualizations finds no results', async () => { + await supertest + .get(relationshipsUrl('visualization', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .expect(404); + }); + }); + + describe('index patterns', () => { + it('should validate visualization response schema', async () => { + const resp = await supertest + .get(relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(() => { + responseSchema.validate(resp.body); + }).not.to.throwError(); + }); + + it('should work for index patterns', async () => { + const resp = await supertest + .get(relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357')) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '960372e0-3224-11e8-a572-ffca06da1357', + type: 'search', + relationship: 'parent', + meta: { + icon: 'discoverApp', + title: 'OneRecord', + editUrl: + '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'discover.show', + }, + }, + }, + { + id: 'add810b0-3224-11e8-a572-ffca06da1357', + type: 'visualization', + relationship: 'parent', + meta: { + icon: 'visualizeApp', + title: 'Visualization', + editUrl: + '/management/kibana/objects/savedVisualizations/add810b0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/visualize/edit/add810b0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'visualize.show', + }, + }, + }, + ]); + }); + + it('should filter based on savedObjectTypes', async () => { + const resp = await supertest + .get( + relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357', ['search']) + ) + .expect(200); + + expect(resp.body).to.eql([ + { + id: '960372e0-3224-11e8-a572-ffca06da1357', + type: 'search', + meta: { + icon: 'discoverApp', + title: 'OneRecord', + editUrl: + '/management/kibana/objects/savedSearches/960372e0-3224-11e8-a572-ffca06da1357', + inAppUrl: { + path: '/app/kibana#/discover/960372e0-3224-11e8-a572-ffca06da1357', + uiCapabilitiesPath: 'discover.show', + }, + }, + relationship: 'parent', + }, + ]); + }); + + it('should return 404 if index pattern finds no results', async () => { + await supertest + .get(relationshipsUrl('index-pattern', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .expect(404); + }); + }); + }); +} diff --git a/test/api_integration/apis/saved_objects_management/scroll_count.ts b/test/api_integration/apis/saved_objects_management/scroll_count.ts new file mode 100644 index 0000000000000..3c29d45244dec --- /dev/null +++ b/test/api_integration/apis/saved_objects_management/scroll_count.ts @@ -0,0 +1,102 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SuperTest, Test } from 'supertest'; +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +const apiUrl = '/api/kibana/management/saved_objects/scroll/counts'; +const defaultTypes = ['visualization', 'index-pattern', 'search', 'dashboard']; + +export default function({ getService }: FtrProviderContext) { + const supertest = getService('supertest') as SuperTest; + const esArchiver = getService('esArchiver'); + + describe('scroll_count', () => { + before(async () => { + await esArchiver.load('management/saved_objects/scroll_count'); + }); + after(async () => { + await esArchiver.unload('management/saved_objects/scroll_count'); + }); + + it('returns the count for each included types', async () => { + const res = await supertest + .post(apiUrl) + .send({ + typesToInclude: defaultTypes, + }) + .expect(200); + + expect(res.body).to.eql({ + dashboard: 2, + 'index-pattern': 1, + search: 1, + visualization: 2, + }); + }); + + it('only returns count for types to include', async () => { + const res = await supertest + .post(apiUrl) + .send({ + typesToInclude: ['dashboard', 'search'], + }) + .expect(200); + + expect(res.body).to.eql({ + dashboard: 2, + search: 1, + }); + }); + + it('filters on title when `searchString` is provided', async () => { + const res = await supertest + .post(apiUrl) + .send({ + typesToInclude: defaultTypes, + searchString: 'Amazing', + }) + .expect(200); + + expect(res.body).to.eql({ + dashboard: 1, + visualization: 1, + 'index-pattern': 0, + search: 0, + }); + }); + + it('includes all requested types even when none match the search', async () => { + const res = await supertest + .post(apiUrl) + .send({ + typesToInclude: ['dashboard', 'search', 'visualization'], + searchString: 'nothing-will-match', + }) + .expect(200); + + expect(res.body).to.eql({ + dashboard: 0, + visualization: 0, + search: 0, + }); + }); + }); +} diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/data.json.gz b/test/api_integration/fixtures/es_archiver/management/saved_objects/relationships/data.json.gz similarity index 100% rename from test/api_integration/fixtures/es_archiver/management/saved_objects/data.json.gz rename to test/api_integration/fixtures/es_archiver/management/saved_objects/relationships/data.json.gz diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/mappings.json b/test/api_integration/fixtures/es_archiver/management/saved_objects/relationships/mappings.json similarity index 100% rename from test/api_integration/fixtures/es_archiver/management/saved_objects/mappings.json rename to test/api_integration/fixtures/es_archiver/management/saved_objects/relationships/mappings.json diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/data.json.gz b/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/data.json.gz new file mode 100644 index 0000000000000..1c327e7e0769b Binary files /dev/null and b/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/data.json.gz differ diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/mappings.json b/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/mappings.json new file mode 100644 index 0000000000000..8270c573e4c1e --- /dev/null +++ b/test/api_integration/fixtures/es_archiver/management/saved_objects/scroll_count/mappings.json @@ -0,0 +1,213 @@ +{ + "type": "index", + "value": { + "index": ".kibana", + "settings": { + "index": { + "number_of_shards": "1", + "auto_expand_replicas": "0-1", + "number_of_replicas": "0" + } + }, + "mappings": { + "dynamic": "strict", + "properties": { + "config": { + "dynamic": "true", + "properties": { + "buildNum": { + "type": "keyword" + }, + "defaultIndex": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "telemetry:optIn": { + "type": "boolean" + } + } + }, + "dashboard": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "optionsJSON": { + "type": "text" + }, + "panelsJSON": { + "type": "text" + }, + "refreshInterval": { + "properties": { + "display": { + "type": "keyword" + }, + "pause": { + "type": "boolean" + }, + "section": { + "type": "integer" + }, + "value": { + "type": "integer" + } + } + }, + "timeFrom": { + "type": "keyword" + }, + "timeRestore": { + "type": "boolean" + }, + "timeTo": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "index-pattern": { + "properties": { + "fieldFormatMap": { + "type": "text" + }, + "fields": { + "type": "text" + }, + "intervalName": { + "type": "keyword" + }, + "notExpandable": { + "type": "boolean" + }, + "sourceFilters": { + "type": "text" + }, + "timeFieldName": { + "type": "keyword" + }, + "title": { + "type": "text" + } + } + }, + "search": { + "properties": { + "columns": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "sort": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "server": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "url": { + "properties": { + "accessCount": { + "type": "long" + }, + "accessDate": { + "type": "date" + }, + "createDate": { + "type": "date" + }, + "url": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 2048 + } + } + } + } + }, + "visualization": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "savedSearchId": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "visState": { + "type": "text" + } + } + } + } + } + } +} diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/search/data.json.gz b/test/api_integration/fixtures/es_archiver/management/saved_objects/search/data.json.gz new file mode 100644 index 0000000000000..0834567abb66b Binary files /dev/null and b/test/api_integration/fixtures/es_archiver/management/saved_objects/search/data.json.gz differ diff --git a/test/api_integration/fixtures/es_archiver/management/saved_objects/search/mappings.json b/test/api_integration/fixtures/es_archiver/management/saved_objects/search/mappings.json new file mode 100644 index 0000000000000..c670508247b1a --- /dev/null +++ b/test/api_integration/fixtures/es_archiver/management/saved_objects/search/mappings.json @@ -0,0 +1,283 @@ +{ + "type": "index", + "value": { + "index": ".kibana", + "settings": { + "index": { + "number_of_shards": "1", + "auto_expand_replicas": "0-1", + "number_of_replicas": "0" + } + }, + "mappings": { + "dynamic": "strict", + "properties": { + "config": { + "dynamic": "true", + "properties": { + "buildNum": { + "type": "keyword" + }, + "defaultIndex": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "telemetry:optIn": { + "type": "boolean" + } + } + }, + "dashboard": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "optionsJSON": { + "type": "text" + }, + "panelsJSON": { + "type": "text" + }, + "refreshInterval": { + "properties": { + "display": { + "type": "keyword" + }, + "pause": { + "type": "boolean" + }, + "section": { + "type": "integer" + }, + "value": { + "type": "integer" + } + } + }, + "timeFrom": { + "type": "keyword" + }, + "timeRestore": { + "type": "boolean" + }, + "timeTo": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "graph-workspace": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "numLinks": { + "type": "integer" + }, + "numVertices": { + "type": "integer" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "wsState": { + "type": "text" + } + } + }, + "index-pattern": { + "properties": { + "fieldFormatMap": { + "type": "text" + }, + "fields": { + "type": "text" + }, + "intervalName": { + "type": "keyword" + }, + "notExpandable": { + "type": "boolean" + }, + "sourceFilters": { + "type": "text" + }, + "timeFieldName": { + "type": "keyword" + }, + "title": { + "type": "text" + } + } + }, + "search": { + "properties": { + "columns": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "sort": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "server": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "timelion-sheet": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "timelion_chart_height": { + "type": "integer" + }, + "timelion_columns": { + "type": "integer" + }, + "timelion_interval": { + "type": "keyword" + }, + "timelion_other_interval": { + "type": "keyword" + }, + "timelion_rows": { + "type": "integer" + }, + "timelion_sheet": { + "type": "text" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "url": { + "properties": { + "accessCount": { + "type": "long" + }, + "accessDate": { + "type": "date" + }, + "createDate": { + "type": "date" + }, + "url": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 2048 + } + } + } + } + }, + "visualization": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "savedSearchId": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "visState": { + "type": "text" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/api_integration/services/supertest.js b/test/api_integration/services/supertest.ts similarity index 83% rename from test/api_integration/services/supertest.js rename to test/api_integration/services/supertest.ts index b53b4ae0ef32f..d5505c080468a 100644 --- a/test/api_integration/services/supertest.js +++ b/test/api_integration/services/supertest.ts @@ -16,18 +16,18 @@ * specific language governing permissions and limitations * under the License. */ - +import { FtrProviderContext } from 'test/functional/ftr_provider_context'; import { format as formatUrl } from 'url'; import supertestAsPromised from 'supertest-as-promised'; -export function KibanaSupertestProvider({ getService }) { +export function KibanaSupertestProvider({ getService }: FtrProviderContext) { const config = getService('config'); const kibanaServerUrl = formatUrl(config.get('servers.kibana')); return supertestAsPromised(kibanaServerUrl); } -export function ElasticsearchSupertestProvider({ getService }) { +export function ElasticsearchSupertestProvider({ getService }: FtrProviderContext) { const config = getService('config'); const elasticSearchServerUrl = formatUrl(config.get('servers.elasticsearch')); return supertestAsPromised(elasticSearchServerUrl); diff --git a/test/common/fixtures/plugins/newsfeed/newsfeed_simulation.ts b/test/common/fixtures/plugins/newsfeed/newsfeed_simulation.ts index 4bf92868b0eca..5aa44b48f9d59 100644 --- a/test/common/fixtures/plugins/newsfeed/newsfeed_simulation.ts +++ b/test/common/fixtures/plugins/newsfeed/newsfeed_simulation.ts @@ -44,7 +44,7 @@ export async function initPlugin(server: Hapi.Server, path: string) { ], }, }, - handler: newsfeedHandler, + handler: newsfeedHandler as Hapi.Lifecycle.Method, }); server.route({ diff --git a/test/functional/apps/discover/_discover.js b/test/functional/apps/discover/_discover.js index 6cba92349ffc0..850b2773b5025 100644 --- a/test/functional/apps/discover/_discover.js +++ b/test/functional/apps/discover/_discover.js @@ -199,5 +199,22 @@ export default function({ getService, getPageObjects }) { expect(rowData.startsWith('Sep 22, 2015 @ 16:50:13.253')).to.be.ok(); }); }); + describe('usage of discover:searchOnPageLoad', () => { + it('should fetch data from ES initially when discover:searchOnPageLoad is false', async function() { + await kibanaServer.uiSettings.replace({ 'discover:searchOnPageLoad': false }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.awaitKibanaChrome(); + + expect(await PageObjects.discover.getNrOfFetches()).to.be(0); + }); + + it('should not fetch data from ES initially when discover:searchOnPageLoad is true', async function() { + await kibanaServer.uiSettings.replace({ 'discover:searchOnPageLoad': true }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.awaitKibanaChrome(); + + expect(await PageObjects.discover.getNrOfFetches()).to.be(1); + }); + }); }); } diff --git a/test/functional/apps/discover/_field_visualize.ts b/test/functional/apps/discover/_field_visualize.ts index 4a72d5bb34716..46238bf143290 100644 --- a/test/functional/apps/discover/_field_visualize.ts +++ b/test/functional/apps/discover/_field_visualize.ts @@ -17,13 +17,16 @@ * under the License. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); + const filterBar = getService('filterBar'); const inspector = getService('inspector'); const kibanaServer = getService('kibanaServer'); const log = getService('log'); + const queryBar = getService('queryBar'); const PageObjects = getPageObjects(['common', 'discover', 'header', 'timePicker']); const defaultSettings = { defaultIndex: 'logstash-*', @@ -76,5 +79,76 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await inspector.expectTableData(expectedTableData); await inspector.close(); }); + + it('should preserve app filters in visualize', async () => { + await filterBar.addFilter('bytes', 'is between', '3500', '4000'); + await PageObjects.discover.clickFieldListItem('geo.src'); + log.debug('visualize a geo.src field with filter applied'); + await PageObjects.discover.clickFieldListItemVisualize('geo.src'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await filterBar.hasFilter('bytes', '3,500 to 4,000')).to.be(true); + const expectedTableData = [ + ['CN', '133'], + ['IN', '120'], + ['US', '58'], + ['ID', '28'], + ['BD', '25'], + ['BR', '22'], + ['EG', '14'], + ['NG', '14'], + ['PK', '13'], + ['IR', '12'], + ['PH', '12'], + ['JP', '11'], + ['RU', '11'], + ['DE', '8'], + ['FR', '8'], + ['MX', '8'], + ['TH', '8'], + ['TR', '8'], + ['CA', '6'], + ['SA', '6'], + ]; + await inspector.open(); + await inspector.expectTableData(expectedTableData); + await inspector.close(); + }); + + it('should preserve query in visualize', async () => { + await queryBar.setQuery('machine.os : ios'); + await queryBar.submitQuery(); + await PageObjects.discover.clickFieldListItem('geo.dest'); + log.debug('visualize a geo.dest field with query applied'); + await PageObjects.discover.clickFieldListItemVisualize('geo.dest'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await queryBar.getQueryString()).to.equal('machine.os : ios'); + const expectedTableData = [ + ['CN', '519'], + ['IN', '495'], + ['US', '275'], + ['ID', '82'], + ['PK', '75'], + ['BR', '71'], + ['NG', '54'], + ['BD', '51'], + ['JP', '47'], + ['MX', '47'], + ['IR', '44'], + ['PH', '44'], + ['RU', '42'], + ['ET', '33'], + ['TH', '33'], + ['EG', '32'], + ['VN', '32'], + ['DE', '31'], + ['FR', '30'], + ['GB', '30'], + ]; + await inspector.open(); + await inspector.expectTableData(expectedTableData); + await inspector.close(); + }); }); } diff --git a/test/functional/apps/visualize/_area_chart.js b/test/functional/apps/visualize/_area_chart.js index bf836cfe778b4..ebbeb01cbc917 100644 --- a/test/functional/apps/visualize/_area_chart.js +++ b/test/functional/apps/visualize/_area_chart.js @@ -21,10 +21,12 @@ import expect from '@kbn/expect'; export default function({ getService, getPageObjects }) { const log = getService('log'); + const find = getService('find'); const inspector = getService('inspector'); const browser = getService('browser'); const retry = getService('retry'); const security = getService('security'); + const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects([ 'common', 'visualize', @@ -465,5 +467,92 @@ export default function({ getService, getPageObjects }) { expect(paths.length).to.eql(numberOfSegments); }); }); + + describe('date histogram when no date field', () => { + before(async () => { + await PageObjects.visualize.loadSavedVisualization('AreaChart [no date field]'); + await PageObjects.visChart.waitForVisualization(); + + log.debug('Click X-axis'); + await PageObjects.visEditor.clickBucket('X-axis'); + log.debug('Click Date Histogram'); + await PageObjects.visEditor.selectAggregation('Date Histogram'); + }); + + it('should show error message for field', async () => { + const fieldErrorMessage = await find.byCssSelector( + '[data-test-subj="visDefaultEditorField"] + .euiFormErrorText' + ); + const errorMessage = await fieldErrorMessage.getVisibleText(); + expect(errorMessage).to.be( + 'The index pattern test_index* does not contain any of the following compatible field types: date' + ); + }); + }); + + describe('date histogram when no time filter', () => { + before(async () => { + await PageObjects.visualize.loadSavedVisualization('AreaChart [no time filter]'); + await PageObjects.visChart.waitForVisualization(); + + log.debug('Click X-axis'); + await PageObjects.visEditor.clickBucket('X-axis'); + log.debug('Click Date Histogram'); + await PageObjects.visEditor.selectAggregation('Date Histogram'); + }); + + it('should not show error message on init when the field is not selected', async () => { + const fieldValues = await PageObjects.visEditor.getField(); + expect(fieldValues[0]).to.be(undefined); + const isFieldErrorMessageExists = await find.existsByCssSelector( + '[data-test-subj="visDefaultEditorField"] + .euiFormErrorText' + ); + expect(isFieldErrorMessageExists).to.be(false); + }); + + describe('interval errors', () => { + before(async () => { + // to trigger displaying of error messages + await testSubjects.clickWhenNotDisabled('visualizeEditorRenderButton'); + // this will avoid issues with the play tooltip covering the interval field + await testSubjects.scrollIntoView('advancedParams-2'); + }); + + it('should not fail during changing interval when the field is not selected', async () => { + await PageObjects.visEditor.setInterval('m'); + const intervalValues = await PageObjects.visEditor.getInterval(); + expect(intervalValues[0]).to.be('Millisecond'); + }); + + it('should not fail during changing custom interval when the field is not selected', async () => { + await PageObjects.visEditor.setInterval('4d', { type: 'custom' }); + const isInvalidIntervalExists = await find.existsByCssSelector( + '.euiComboBox-isInvalid[data-test-subj="visEditorInterval"]' + ); + expect(isInvalidIntervalExists).to.be(false); + }); + + it('should show error when interval invalid', async () => { + await PageObjects.visEditor.setInterval('xx', { type: 'custom' }); + const isIntervalErrorMessageExists = await find.existsByCssSelector( + '[data-test-subj="visEditorInterval"] + .euiFormErrorText' + ); + expect(isIntervalErrorMessageExists).to.be(true); + }); + + it('should show error when calendar interval invalid', async () => { + await PageObjects.visEditor.setInterval('14d', { type: 'custom' }); + const intervalErrorMessage = await find.byCssSelector( + '[data-test-subj="visEditorInterval"] + .euiFormErrorText' + ); + let errorMessage = await intervalErrorMessage.getVisibleText(); + expect(errorMessage).to.be('Invalid calendar interval: 2w, value must be 1'); + + await PageObjects.visEditor.setInterval('3w', { type: 'custom' }); + errorMessage = await intervalErrorMessage.getVisibleText(); + expect(errorMessage).to.be('Invalid calendar interval: 3w, value must be 1'); + }); + }); + }); }); } diff --git a/test/functional/fixtures/es_archiver/visualize/data.json b/test/functional/fixtures/es_archiver/visualize/data.json index 9fb8747a7376a..845e9a5e08825 100644 --- a/test/functional/fixtures/es_archiver/visualize/data.json +++ b/test/functional/fixtures/es_archiver/visualize/data.json @@ -174,3 +174,76 @@ } } } + +{ + "type": "doc", + "value": { + "id": "index-pattern:test_index*", + "index": ".kibana", + "source": { + "index-pattern": { + "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"message.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"message\"}}},{\"name\":\"user\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"user.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"user\"}}}]", + "title": "test_index*" + }, + "type": "test_index*" + } + } +} + +{ + "type": "doc", + "value": { + "id": "visualization:AreaChart-no-date-field", + "index": ".kibana", + "source": { + "type": "visualization", + "visualization": { + "description": "AreaChart", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"test_index*\",\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "title": "AreaChart [no date field]", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"title\":\"AreaChart [no date field]\",\"type\":\"area\",\"params\":{\"type\":\"area\",\"addTooltip\":true,\"addLegend\":true,\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}}]}" + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "index-pattern:log*", + "index": ".kibana", + "source": { + "index-pattern": { + "fieldFormatMap": "{\"bytes\":{\"id\":\"bytes\"}}", + "fields": "[{\"name\":\"referer\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"agent\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:image:width\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"xss.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"headings.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"meta.user.lastname\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.article:tag.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"geo.dest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.twitter:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.article:section.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"utc_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.twitter:card\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"meta.char\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"clientip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:image:height\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"host\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"machine.ram\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"links\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"id\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"@tags.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"phpmemory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.twitter:card.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.article:modified_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:site_name.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"request.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.article:tag\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"agent.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"spaces\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:site.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"headings\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"relatedContent.og:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"request\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"index.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"extension\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"memory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"relatedContent.twitter:site\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"geo.coordinates\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"meta.related\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"response.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"@message.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"machine.os\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.article:section\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"xss\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"links.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"geo.srcdest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"extension.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"machine.os.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"@tags\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"host.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:type.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"geo.src\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"spaces.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:image:height.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:site_name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"@message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.twitter:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"bytes\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"response\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"meta.user.firstname\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":true,\"doc_values\":false},{\"name\":\"relatedContent.og:image:width.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.og:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"relatedContent.article:published_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false}]", + "title": "log*" + }, + "type": "index-pattern" + } + } +} + +{ + "type": "doc", + "value": { + "id": "visualization:AreaChart-no-time-filter", + "index": ".kibana", + "source": { + "type": "visualization", + "visualization": { + "description": "AreaChart", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"log*\",\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "title": "AreaChart [no time filter]", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"title\":\"AreaChart [no time filter]\",\"type\":\"area\",\"params\":{\"type\":\"area\",\"addTooltip\":true,\"addLegend\":true,\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}}]}" + } + } + } +} diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index a126cfb1bce4b..1d4e51360f319 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -300,6 +300,11 @@ export function DiscoverPageProvider({ getService, getPageObjects }: FtrProvider 'true' ); } + public async getNrOfFetches() { + const el = await find.byCssSelector('[data-fetch-counter]'); + const nr = await el.getAttribute('data-fetch-counter'); + return Number(nr); + } } return new DiscoverPage(); diff --git a/test/plugin_functional/plugins/core_plugin_static_assets/kibana.json b/test/plugin_functional/plugins/core_plugin_static_assets/kibana.json new file mode 100644 index 0000000000000..6f9fb94e9b49c --- /dev/null +++ b/test/plugin_functional/plugins/core_plugin_static_assets/kibana.json @@ -0,0 +1,7 @@ +{ + "id": "corePluginStaticAssets", + "version": "0.0.1", + "kibanaVersion": "kibana", + "server": false, + "ui": true +} diff --git a/test/plugin_functional/plugins/core_plugin_static_assets/package.json b/test/plugin_functional/plugins/core_plugin_static_assets/package.json new file mode 100644 index 0000000000000..304e1b11fde42 --- /dev/null +++ b/test/plugin_functional/plugins/core_plugin_static_assets/package.json @@ -0,0 +1,17 @@ +{ + "name": "corePluginStaticAssets", + "version": "1.0.0", + "main": "target/test/plugin_functional/plugins/core_plugin_static_assets", + "kibana": { + "version": "kibana", + "templateVersion": "1.0.0" + }, + "license": "Apache-2.0", + "scripts": { + "kbn": "node ../../../../scripts/kbn.js", + "build": "rm -rf './target' && tsc" + }, + "devDependencies": { + "typescript": "3.7.2" + } +} diff --git a/test/plugin_functional/plugins/core_plugin_static_assets/public/assets/chart.svg b/test/plugin_functional/plugins/core_plugin_static_assets/public/assets/chart.svg new file mode 100644 index 0000000000000..44553960a5cce --- /dev/null +++ b/test/plugin_functional/plugins/core_plugin_static_assets/public/assets/chart.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/plugin_functional/plugins/core_plugin_static_assets/public/index.ts b/test/plugin_functional/plugins/core_plugin_static_assets/public/index.ts new file mode 100644 index 0000000000000..2bdb40cf19cb5 --- /dev/null +++ b/test/plugin_functional/plugins/core_plugin_static_assets/public/index.ts @@ -0,0 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CorePluginStaticAssets } from './plugin'; + +export const plugin = () => new CorePluginStaticAssets(); diff --git a/test/api_integration/apis/management/saved_objects/index.js b/test/plugin_functional/plugins/core_plugin_static_assets/public/plugin.tsx similarity index 80% rename from test/api_integration/apis/management/saved_objects/index.js rename to test/plugin_functional/plugins/core_plugin_static_assets/public/plugin.tsx index 01fab4a3c74b1..d9f3d62937584 100644 --- a/test/api_integration/apis/management/saved_objects/index.js +++ b/test/plugin_functional/plugins/core_plugin_static_assets/public/plugin.tsx @@ -17,9 +17,11 @@ * under the License. */ -export default function({ loadTestFile }) { - describe('saved_objects', () => { - loadTestFile(require.resolve('./find')); - loadTestFile(require.resolve('./relationships')); - }); +import { Plugin, CoreSetup } from 'kibana/public'; + +export class CorePluginStaticAssets implements Plugin { + public setup(core: CoreSetup, deps: {}) {} + + public start() {} + public stop() {} } diff --git a/test/plugin_functional/plugins/core_plugin_static_assets/tsconfig.json b/test/plugin_functional/plugins/core_plugin_static_assets/tsconfig.json new file mode 100644 index 0000000000000..4a564ee1e5578 --- /dev/null +++ b/test/plugin_functional/plugins/core_plugin_static_assets/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "../../../../typings/**/*" + ], + "exclude": [] +} diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js index 643d15c982792..7aa12ea7a1130 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js @@ -20,9 +20,9 @@ import { SelfChangingEditor } from './self_changing_editor'; import { SelfChangingComponent } from './self_changing_components'; -import { setup as visualizations } from '../../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/legacy'; +import { npSetup } from '../../../../../../src/legacy/ui/public/new_platform'; -visualizations.createReactVisualization({ +npSetup.plugins.visualizations.createReactVisualization({ name: 'self_changing_vis', title: 'Self Changing Vis', icon: 'controlsHorizontal', diff --git a/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts b/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts index 82267d73782af..8ddd0ff96ba8f 100644 --- a/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts +++ b/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts @@ -25,6 +25,7 @@ import '../../../../test/plugin_functional/plugins/core_provider_plugin/types'; export default function({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); + const supertest = getService('supertest'); describe('ui plugins', function() { describe('loading', function describeIndexTests() { @@ -97,5 +98,47 @@ export default function({ getService, getPageObjects }: PluginFunctionalProvider ).to.be('/core_plugin_b/system_request says: "System request? false"'); }); }); + + describe('Plugin static assets', function() { + it('exposes static assets from "public/assets" folder', async () => { + await supertest.get('/plugins/corePluginStaticAssets/assets/chart.svg').expect(200); + }); + + it('returns 404 if not found', async function() { + await supertest.get('/plugins/corePluginStaticAssets/assets/not-a-chart.svg').expect(404); + }); + + it('does not expose folder content', async function() { + await supertest.get('/plugins/corePluginStaticAssets/assets/').expect(403); + }); + + it('does not allow file tree traversing', async function() { + await supertest.get('/plugins/corePluginStaticAssets/assets/../../kibana.json').expect(404); + }); + + it('generates "etag" & "last-modified" headers', async () => { + const response = await supertest + .get('/plugins/corePluginStaticAssets/assets/chart.svg') + .expect(200); + + expect(response.header).to.have.property('etag'); + expect(response.header).to.have.property('last-modified'); + }); + + it('generates the same "etag" & "last-modified" for the same asset', async () => { + const firstResponse = await supertest + .get('/plugins/corePluginStaticAssets/assets/chart.svg') + .expect(200); + + expect(firstResponse.header).to.have.property('etag'); + + const secondResponse = await supertest + .get('/plugins/corePluginStaticAssets/assets/chart.svg') + .expect(200); + + expect(secondResponse.header.etag).to.be(firstResponse.header.etag); + expect(secondResponse.header['last-modified']).to.be(firstResponse.header['last-modified']); + }); + }); }); } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx index 54a1b4347e29b..7bdc6aebbd9a0 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx @@ -13,6 +13,7 @@ import React, { useRef, useState } from 'react'; +import { debounce } from 'lodash'; import { isRumAgentName } from '../../../../../../../plugins/apm/common/agent_name'; import { AGENT_NAME } from '../../../../../../../plugins/apm/common/elasticsearch_fieldnames'; import { @@ -171,8 +172,13 @@ export function Cytoscape({ } }); }; + // debounce hover tracking so it doesn't spam telemetry with redundant events + const trackNodeEdgeHover = debounce( + () => trackApmEvent({ metric: 'service_map_node_or_edge_hover' }), + 1000 + ); const mouseoverHandler: cytoscape.EventHandler = event => { - trackApmEvent({ metric: 'service_map_node_or_edge_hover' }); + trackNodeEdgeHover(); event.target.addClass('hover'); event.target.connectedEdges().addClass('nodeHover'); }; diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx index de058d6ef973a..c1afa433cb614 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx @@ -58,7 +58,7 @@ export function NoServicesMessage({ historicalDataFound, status }: Props) {

{i18n.translate('xpack.apm.servicesTable.7xUpgradeServerMessage', { defaultMessage: `Upgrading from a pre-7.x version? Make sure you've also upgraded - your APM server instance(s) to at least 7.0.` + your APM Server instance(s) to at least 7.0.` })}

diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap index 209b88f73b9e2..227becb9a9c4f 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap @@ -19,7 +19,7 @@ exports[`NoServicesMessage status: pending and historicalDataFound: false 1`] =

Upgrading from a pre-7.x version? Make sure you've also upgraded - your APM server instance(s) to at least 7.0. + your APM Server instance(s) to at least 7.0.

You may also have old data that needs to be migrated. @@ -64,7 +64,7 @@ exports[`NoServicesMessage status: success and historicalDataFound: false 1`] =

Upgrading from a pre-7.x version? Make sure you've also upgraded - your APM server instance(s) to at least 7.0. + your APM Server instance(s) to at least 7.0.

You may also have old data that needs to be migrated. diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap index d85c83661ea49..dd0c50af2b03f 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap @@ -72,7 +72,7 @@ NodeList [ >

Upgrading from a pre-7.x version? Make sure you've also upgraded - your APM server instance(s) to at least 7.0. + your APM Server instance(s) to at least 7.0.

You may also have old data that needs to be migrated. diff --git a/x-pack/legacy/plugins/canvas/.storybook/middleware.js b/x-pack/legacy/plugins/canvas/.storybook/middleware.js index 46ae7ac90f364..8bbd2b6c1a22f 100644 --- a/x-pack/legacy/plugins/canvas/.storybook/middleware.js +++ b/x-pack/legacy/plugins/canvas/.storybook/middleware.js @@ -9,5 +9,5 @@ const path = require('path'); // Extend the Storybook Middleware to include a route to access Legacy UI assets module.exports = function(router) { - router.get('/ui', serve(path.resolve(__dirname, '../../../../../src/legacy/ui/public/assets'))); + router.get('/ui', serve(path.resolve(__dirname, '../../../../../src/core/server/core_app/assets'))); }; diff --git a/x-pack/legacy/plugins/canvas/canvas_plugin_src/expression_types/embeddable_types.ts b/x-pack/legacy/plugins/canvas/canvas_plugin_src/expression_types/embeddable_types.ts index 538aa9f74e2a6..f5836fe91e040 100644 --- a/x-pack/legacy/plugins/canvas/canvas_plugin_src/expression_types/embeddable_types.ts +++ b/x-pack/legacy/plugins/canvas/canvas_plugin_src/expression_types/embeddable_types.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -// @ts-ignore -import { MAP_SAVED_OBJECT_TYPE } from '../../../maps/common/constants'; -import { VISUALIZE_EMBEDDABLE_TYPE } from '../../../../../../src/legacy/core_plugins/visualizations/public'; +import { MAP_SAVED_OBJECT_TYPE } from '../../../../../plugins/maps/public'; +import { VISUALIZE_EMBEDDABLE_TYPE } from '../../../../../../src/plugins/visualizations/public'; import { LENS_EMBEDDABLE_TYPE } from '../../../../../plugins/lens/common/constants'; import { SEARCH_EMBEDDABLE_TYPE } from '../../../../../../src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/constants'; diff --git a/x-pack/legacy/plugins/canvas/canvas_plugin_src/functions/common/saved_visualization.ts b/x-pack/legacy/plugins/canvas/canvas_plugin_src/functions/common/saved_visualization.ts index 9777eaebb36ed..d98fea2ec1be8 100644 --- a/x-pack/legacy/plugins/canvas/canvas_plugin_src/functions/common/saved_visualization.ts +++ b/x-pack/legacy/plugins/canvas/canvas_plugin_src/functions/common/saved_visualization.ts @@ -5,7 +5,7 @@ */ import { ExpressionFunctionDefinition } from 'src/plugins/expressions'; -import { VisualizeInput } from 'src/legacy/core_plugins/visualizations/public'; +import { VisualizeInput } from 'src/plugins/visualizations/public'; import { EmbeddableTypes, EmbeddableExpressionType, diff --git a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/input_type_to_expression/visualization.ts b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/input_type_to_expression/visualization.ts index be0dd6a79292f..4c8de2afd81ad 100644 --- a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/input_type_to_expression/visualization.ts +++ b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/input_type_to_expression/visualization.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { VisualizeInput } from 'src/legacy/core_plugins/visualizations/public'; +import { VisualizeInput } from 'src/plugins/visualizations/public'; export function toExpression(input: VisualizeInput): string { const expressionParts = [] as string[]; diff --git a/x-pack/legacy/plugins/grokdebugger/public/services/grokdebugger/grokdebugger_service.js b/x-pack/legacy/plugins/grokdebugger/public/services/grokdebugger/grokdebugger_service.js index 7a656b33d59ff..c6d28adcefd78 100644 --- a/x-pack/legacy/plugins/grokdebugger/public/services/grokdebugger/grokdebugger_service.js +++ b/x-pack/legacy/plugins/grokdebugger/public/services/grokdebugger/grokdebugger_service.js @@ -4,19 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; import { ROUTES } from '../../../common/constants'; import { GrokdebuggerResponse } from 'plugins/grokdebugger/models/grokdebugger_response'; export class GrokdebuggerService { constructor(http) { this.http = http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); } simulate(grokdebuggerRequest) { return this.http - .post(`${this.basePath}/simulate`, { body: JSON.stringify(grokdebuggerRequest.upstreamJSON) }) + .post(`${ROUTES.API_ROOT}/simulate`, { + body: JSON.stringify(grokdebuggerRequest.upstreamJSON), + }) .then(response => { return GrokdebuggerResponse.fromUpstreamJSON(response.grokdebuggerResponse); }) diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx b/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx index d18174baacdb9..c2ab1c72af545 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx +++ b/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx @@ -17,7 +17,7 @@ import { import { Subscription } from 'rxjs'; import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; -import { VIS_EVENT_TO_TRIGGER } from '../../../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events'; +import { VIS_EVENT_TO_TRIGGER } from '../../../../../../../src/plugins/visualizations/public'; import { Embeddable as AbstractEmbeddable, diff --git a/x-pack/legacy/plugins/lens/public/legacy_imports.ts b/x-pack/legacy/plugins/lens/public/legacy_imports.ts index d53842d209e2b..5c5afc1a87df0 100644 --- a/x-pack/legacy/plugins/lens/public/legacy_imports.ts +++ b/x-pack/legacy/plugins/lens/public/legacy_imports.ts @@ -4,5 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export { setup as visualizations } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/legacy'; -export { VisualizationsSetup } from '../../../../../src/legacy/core_plugins/visualizations/public'; +import { npSetup } from 'ui/new_platform'; +export const { visualizations } = npSetup.plugins; +export { VisualizationsSetup } from '../../../../../src/plugins/visualizations/public'; diff --git a/x-pack/legacy/plugins/lens/public/vis_type_alias.ts b/x-pack/legacy/plugins/lens/public/vis_type_alias.ts index c4e0a20110c81..123b994e6ccce 100644 --- a/x-pack/legacy/plugins/lens/public/vis_type_alias.ts +++ b/x-pack/legacy/plugins/lens/public/vis_type_alias.ts @@ -5,8 +5,8 @@ */ import { i18n } from '@kbn/i18n'; +import { VisTypeAlias } from 'src/plugins/visualizations/public'; import { getBasePath, getEditPath } from '../../../../plugins/lens/common'; -import { VisTypeAlias } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/vis_types'; export const getLensAliasConfig = (): VisTypeAlias => ({ aliasUrl: getBasePath(), diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx index d6abee101db31..cdc5fc2ff1c17 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx @@ -39,7 +39,12 @@ function sampleArgs() { formatHint: { id: 'number', params: { pattern: '0,0.000' } }, }, { id: 'b', name: 'b', formatHint: { id: 'number', params: { pattern: '000,0' } } }, - { id: 'c', name: 'c', formatHint: { id: 'string' } }, + { + id: 'c', + name: 'c', + formatHint: { id: 'string' }, + meta: { type: 'date-histogram', aggConfigParams: { interval: '10s' } }, + }, { id: 'd', name: 'ColD', formatHint: { id: 'string' } }, ], rows: [ @@ -179,6 +184,7 @@ describe('xy_expression', () => { Object { "max": 1546491600000, "min": 1546405200000, + "minInterval": 10000, } `); }); diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx index eaf3acf7bb2a7..a7d4b2a217f37 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -29,12 +29,13 @@ import { EuiIcon, EuiText, IconType, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { EmbeddableVisTriggerContext } from '../../../../../../src/plugins/embeddable/public'; -import { VIS_EVENT_TO_TRIGGER } from '../../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events'; +import { VIS_EVENT_TO_TRIGGER } from '../../../../../../src/plugins/visualizations/public'; import { LensMultiTable, FormatFactory } from '../types'; import { XYArgs, SeriesType, visualizationTypes } from './types'; import { VisualizationContainer } from '../visualization_container'; import { isHorizontalChart } from './state_helpers'; import { UiActionsStart } from '../../../../../../src/plugins/ui_actions/public'; +import { parseInterval } from '../../../../../../src/plugins/data/common'; import { getExecuteTriggerActions } from './services'; type InferPropType = T extends React.FunctionComponent ? P : T; @@ -210,11 +211,14 @@ export function XYChart({ const shouldRotate = isHorizontalChart(layers); const xTitle = (xAxisColumn && xAxisColumn.name) || args.xTitle; + const interval = parseInterval(xAxisColumn?.meta?.aggConfigParams?.interval); + const xDomain = data.dateRange && layers.every(l => l.xScaleType === 'time') ? { min: data.dateRange.fromDate.getTime(), max: data.dateRange.toDate.getTime(), + minInterval: interval?.asMilliseconds(), } : undefined; return ( diff --git a/x-pack/legacy/plugins/maps/public/actions/map_actions.d.ts b/x-pack/legacy/plugins/maps/public/actions/map_actions.d.ts index 48ab957089361..c1f5c31eb4210 100644 --- a/x-pack/legacy/plugins/maps/public/actions/map_actions.d.ts +++ b/x-pack/legacy/plugins/maps/public/actions/map_actions.d.ts @@ -5,6 +5,8 @@ */ /* eslint-disable @typescript-eslint/consistent-type-definitions */ +import { Filter, Query } from 'src/plugins/data/public'; +import { AnyAction } from 'redux'; import { LAYER_TYPE } from '../../common/constants'; import { DataMeta, MapFilters } from '../../common/descriptor_types'; @@ -24,3 +26,45 @@ export function updateSourceProp( value: unknown, newLayerType?: LAYER_TYPE ): void; + +export interface MapCenter { + lat: number; + lon: number; + zoom: number; +} + +export function setGotoWithCenter(config: MapCenter): AnyAction; + +export function replaceLayerList(layerList: unknown[]): AnyAction; + +export interface QueryGroup { + filters: Filter[]; + query?: Query; + timeFilters: unknown; + refresh: unknown; +} + +export function setQuery(query: QueryGroup): AnyAction; + +export interface RefreshConfig { + isPaused: boolean; + interval: number; +} + +export function setRefreshConfig(config: RefreshConfig): AnyAction; + +export function disableScrollZoom(): AnyAction; + +export function disableInteractive(): AnyAction; + +export function disableTooltipControl(): AnyAction; + +export function hideToolbarOverlay(): AnyAction; + +export function hideLayerControl(): AnyAction; + +export function hideViewControl(): AnyAction; + +export function setHiddenLayers(hiddenLayerIds: string[]): AnyAction; + +export function addLayerWithoutDataSync(layerDescriptor: unknown): AnyAction; diff --git a/x-pack/legacy/plugins/maps/public/actions/ui_actions.d.ts b/x-pack/legacy/plugins/maps/public/actions/ui_actions.d.ts new file mode 100644 index 0000000000000..233918847de08 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/actions/ui_actions.d.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AnyAction } from 'redux'; + +export function setOpenTOCDetails(layerIds?: string[]): AnyAction; + +export function setIsLayerTOCOpen(open: boolean): AnyAction; + +export function setReadOnly(readOnly: boolean): AnyAction; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/index.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.d.ts similarity index 71% rename from x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/index.js rename to x-pack/legacy/plugins/maps/public/angular/get_initial_layers.d.ts index 884481f9848dd..920888404b97d 100644 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/index.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.d.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { ClickOutside } from './click_outside'; +export function getInitialLayers(layerListJSON?: string, initialLayers?: unknown[]): unknown[]; diff --git a/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.d.ts b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.d.ts new file mode 100644 index 0000000000000..00a9400109dc1 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.d.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Filter } from 'src/plugins/data/public'; +import { RenderToolTipContent } from '../../layers/tooltips/tooltip_property'; + +export const GisMap: React.ComponentType<{ + addFilters: ((filters: Filter[]) => void) | null; + renderTooltipContent?: RenderToolTipContent; +}>; diff --git a/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/__snapshots__/feature_properties.test.js.snap b/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/__snapshots__/feature_properties.test.js.snap index a52c118bca8cd..3b3d82c92fbb7 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/__snapshots__/feature_properties.test.js.snap +++ b/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/__snapshots__/feature_properties.test.js.snap @@ -2,7 +2,7 @@ exports[`FeatureProperties should not show filter button 1`] = ` (this._node = node)}> +
(this._node = node)} + > {rows}
); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/index.js b/x-pack/legacy/plugins/maps/public/embeddable/index.ts similarity index 76% rename from x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/index.js rename to x-pack/legacy/plugins/maps/public/embeddable/index.ts index 98aedf068a987..a410a6699a01f 100644 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/index.js +++ b/x-pack/legacy/plugins/maps/public/embeddable/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { Suggestion } from './suggestion'; +export * from './map_embeddable'; +export * from './map_embeddable_factory'; diff --git a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.js b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx similarity index 70% rename from x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.js rename to x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx index 9af1a135794c0..69f55815d16a0 100644 --- a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.js +++ b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx @@ -10,16 +10,29 @@ import { Provider } from 'react-redux'; import { render, unmountComponentAtNode } from 'react-dom'; import 'mapbox-gl/dist/mapbox-gl.css'; -import { Embeddable } from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; -import { APPLY_FILTER_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; -import { esFilters } from '../../../../../../src/plugins/data/public'; - import { I18nContext } from 'ui/i18n'; +import { npStart } from 'ui/new_platform'; +import { Subscription } from 'rxjs'; +import { Unsubscribe } from 'redux'; +import { + Embeddable, + IContainer, + EmbeddableInput, + EmbeddableOutput, +} from '../../../../../../src/plugins/embeddable/public'; +import { APPLY_FILTER_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; +import { + esFilters, + IIndexPattern, + TimeRange, + Filter, + Query, + RefreshInterval, +} from '../../../../../../src/plugins/data/public'; import { GisMap } from '../connected_components/gis_map'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { createMapStore } from '../../../../../plugins/maps/public/reducers/store'; -import { npStart } from 'ui/new_platform'; +import { createMapStore, MapStore } from '../../../../../plugins/maps/public/reducers/store'; import { setGotoWithCenter, replaceLayerList, @@ -32,21 +45,72 @@ import { hideLayerControl, hideViewControl, setHiddenLayers, + MapCenter, } from '../actions/map_actions'; import { setReadOnly, setIsLayerTOCOpen, setOpenTOCDetails } from '../actions/ui_actions'; import { getIsLayerTOCOpen, getOpenTOCDetails } from '../selectors/ui_selectors'; import { getInspectorAdapters, setEventHandlers, + EventHandlers, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../plugins/maps/public/reducers/non_serializable_instances'; import { getMapCenter, getMapZoom, getHiddenLayerIds } from '../selectors/map_selectors'; import { MAP_SAVED_OBJECT_TYPE } from '../../common/constants'; +import { RenderToolTipContent } from '../layers/tooltips/tooltip_property'; + +interface MapEmbeddableConfig { + editUrl?: string; + indexPatterns: IIndexPattern[]; + editable: boolean; + title?: string; + layerList: unknown[]; +} + +export interface MapEmbeddableInput extends EmbeddableInput { + timeRange?: TimeRange; + filters: Filter[]; + query?: Query; + refresh?: unknown; + refreshConfig: RefreshInterval; + isLayerTOCOpen: boolean; + openTOCDetails?: string[]; + disableTooltipControl?: boolean; + disableInteractive?: boolean; + hideToolbarOverlay?: boolean; + hideLayerControl?: boolean; + hideViewControl?: boolean; + mapCenter?: MapCenter; + hiddenLayers?: string[]; + hideFilterActions?: boolean; +} -export class MapEmbeddable extends Embeddable { +export interface MapEmbeddableOutput extends EmbeddableOutput { + indexPatterns: IIndexPattern[]; +} + +export class MapEmbeddable extends Embeddable { type = MAP_SAVED_OBJECT_TYPE; - constructor(config, initialInput, parent, renderTooltipContent, eventHandlers) { + private _renderTooltipContent?: RenderToolTipContent; + private _eventHandlers?: EventHandlers; + private _layerList: unknown[]; + private _store: MapStore; + private _subscription: Subscription; + private _prevTimeRange?: TimeRange; + private _prevQuery?: Query; + private _prevRefreshConfig?: RefreshInterval; + private _prevFilters?: Filter[]; + private _domNode?: HTMLElement; + private _unsubscribeFromStore?: Unsubscribe; + + constructor( + config: MapEmbeddableConfig, + initialInput: MapEmbeddableInput, + parent?: IContainer, + renderTooltipContent?: RenderToolTipContent, + eventHandlers?: EventHandlers + ) { super( initialInput, { @@ -70,7 +134,7 @@ export class MapEmbeddable extends Embeddable { return getInspectorAdapters(this._store.getState()); } - onContainerStateChanged(containerState) { + onContainerStateChanged(containerState: MapEmbeddableInput) { if ( !_.isEqual(containerState.timeRange, this._prevTimeRange) || !_.isEqual(containerState.query, this._prevQuery) || @@ -84,7 +148,12 @@ export class MapEmbeddable extends Embeddable { } } - _dispatchSetQuery({ query, timeRange, filters, refresh }) { + _dispatchSetQuery({ + query, + timeRange, + filters, + refresh, + }: Pick) { this._prevTimeRange = timeRange; this._prevQuery = query; this._prevFilters = filters; @@ -98,7 +167,7 @@ export class MapEmbeddable extends Embeddable { ); } - _dispatchSetRefreshConfig({ refreshConfig }) { + _dispatchSetRefreshConfig({ refreshConfig }: Pick) { this._prevRefreshConfig = refreshConfig; this._store.dispatch( setRefreshConfig({ @@ -113,7 +182,7 @@ export class MapEmbeddable extends Embeddable { * @param {HTMLElement} domNode * @param {ContainerState} containerState */ - render(domNode) { + render(domNode: HTMLElement) { this._store.dispatch(setEventHandlers(this._eventHandlers)); this._store.dispatch(setReadOnly(true)); this._store.dispatch(disableScrollZoom()); @@ -127,23 +196,22 @@ export class MapEmbeddable extends Embeddable { } if (_.has(this.input, 'disableInteractive') && this.input.disableInteractive) { - this._store.dispatch(disableInteractive(this.input.disableInteractive)); + this._store.dispatch(disableInteractive()); } if (_.has(this.input, 'disableTooltipControl') && this.input.disableTooltipControl) { - this._store.dispatch(disableTooltipControl(this.input.disableTooltipControl)); + this._store.dispatch(disableTooltipControl()); } - if (_.has(this.input, 'hideToolbarOverlay') && this.input.hideToolbarOverlay) { - this._store.dispatch(hideToolbarOverlay(this.input.hideToolbarOverlay)); + this._store.dispatch(hideToolbarOverlay()); } if (_.has(this.input, 'hideLayerControl') && this.input.hideLayerControl) { - this._store.dispatch(hideLayerControl(this.input.hideLayerControl)); + this._store.dispatch(hideLayerControl()); } if (_.has(this.input, 'hideViewControl') && this.input.hideViewControl) { - this._store.dispatch(hideViewControl(this.input.hideViewControl)); + this._store.dispatch(hideViewControl()); } if (this.input.mapCenter) { @@ -182,12 +250,12 @@ export class MapEmbeddable extends Embeddable { }); } - async setLayerList(layerList) { + async setLayerList(layerList: unknown[]) { this._layerList = layerList; return await this._store.dispatch(replaceLayerList(this._layerList)); } - addFilters = filters => { + addFilters = (filters: Filter[]) => { npStart.plugins.uiActions.executeTriggerActions(APPLY_FILTER_TRIGGER, { embeddable: this, filters, @@ -213,7 +281,7 @@ export class MapEmbeddable extends Embeddable { this._dispatchSetQuery({ query: this._prevQuery, timeRange: this._prevTimeRange, - filters: this._prevFilters, + filters: this._prevFilters ?? [], refresh: true, }); } @@ -222,7 +290,7 @@ export class MapEmbeddable extends Embeddable { const center = getMapCenter(this._store.getState()); const zoom = getMapZoom(this._store.getState()); - const mapCenter = this.input.mapCenter || {}; + const mapCenter = this.input.mapCenter || undefined; if ( !mapCenter || mapCenter.lat !== center.lat || @@ -233,7 +301,7 @@ export class MapEmbeddable extends Embeddable { mapCenter: { lat: center.lat, lon: center.lon, - zoom: zoom, + zoom, }, }); } diff --git a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.js b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts similarity index 78% rename from x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.js rename to x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts index fcbae894dffa4..ddb937dd98926 100644 --- a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.js +++ b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts @@ -8,12 +8,16 @@ import _ from 'lodash'; import chrome from 'ui/chrome'; import { capabilities } from 'ui/capabilities'; import { i18n } from '@kbn/i18n'; +import { npSetup, npStart } from 'ui/new_platform'; +import { SavedObjectLoader } from 'src/plugins/saved_objects/public'; +import { IIndexPattern } from 'src/plugins/data/public'; import { EmbeddableFactory, ErrorEmbeddable, + IContainer, } from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; import { setup } from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy'; -import { MapEmbeddable } from './map_embeddable'; +import { MapEmbeddable, MapEmbeddableInput } from './map_embeddable'; import { getIndexPatternService } from '../kibana_services'; import { createMapPath, MAP_SAVED_OBJECT_TYPE, APP_ICON } from '../../common/constants'; @@ -25,7 +29,11 @@ import { getInitialLayers } from '../angular/get_initial_layers'; import { mergeInputWithSavedMap } from './merge_input_with_saved_map'; import '../angular/services/gis_map_saved_object_loader'; import { bindSetupCoreAndPlugins, bindStartCoreAndPlugins } from '../plugin'; -import { npSetup, npStart } from 'ui/new_platform'; +import { RenderToolTipContent } from '../layers/tooltips/tooltip_property'; +import { + EventHandlers, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../plugins/maps/public/reducers/non_serializable_instances'; export class MapEmbeddableFactory extends EmbeddableFactory { type = MAP_SAVED_OBJECT_TYPE; @@ -44,8 +52,9 @@ export class MapEmbeddableFactory extends EmbeddableFactory { bindSetupCoreAndPlugins(npSetup.core, npSetup.plugins); bindStartCoreAndPlugins(npStart.core, npStart.plugins); } - isEditable() { - return capabilities.get().maps.save; + + async isEditable() { + return capabilities.get().maps.save as boolean; } // Not supported yet for maps types. @@ -59,12 +68,12 @@ export class MapEmbeddableFactory extends EmbeddableFactory { }); } - async _getIndexPatterns(layerList) { + async _getIndexPatterns(layerList: unknown[]): Promise { // Need to extract layerList from store to get queryable index pattern ids const store = createMapStore(); let queryableIndexPatternIds; try { - layerList.forEach(layerDescriptor => { + layerList.forEach((layerDescriptor: unknown) => { store.dispatch(addLayerWithoutDataSync(layerDescriptor)); }); queryableIndexPatternIds = getQueryableUniqueIndexPatternIds(store.getState()); @@ -86,16 +95,20 @@ export class MapEmbeddableFactory extends EmbeddableFactory { } }); const indexPatterns = await Promise.all(promises); - return _.compact(indexPatterns); + return _.compact(indexPatterns) as IIndexPattern[]; } - async _fetchSavedMap(savedObjectId) { + async _fetchSavedMap(savedObjectId: string) { const $injector = await chrome.dangerouslyGetActiveInjector(); - const savedObjectLoader = $injector.get('gisMapSavedObjectLoader'); + const savedObjectLoader = $injector.get('gisMapSavedObjectLoader'); return await savedObjectLoader.get(savedObjectId); } - async createFromSavedObject(savedObjectId, input, parent) { + async createFromSavedObject( + savedObjectId: string, + input: MapEmbeddableInput, + parent?: IContainer + ) { const savedMap = await this._fetchSavedMap(savedObjectId); const layerList = getInitialLayers(savedMap.layerListJSON); const indexPatterns = await this._getIndexPatterns(layerList); @@ -106,7 +119,7 @@ export class MapEmbeddableFactory extends EmbeddableFactory { title: savedMap.title, editUrl: chrome.addBasePath(createMapPath(savedObjectId)), indexPatterns, - editable: this.isEditable(), + editable: await this.isEditable(), }, input, parent @@ -125,7 +138,13 @@ export class MapEmbeddableFactory extends EmbeddableFactory { return embeddable; } - async createFromState(state, input, parent, renderTooltipContent, eventHandlers) { + async createFromState( + state: { title?: string; layerList?: unknown[] }, + input: MapEmbeddableInput, + parent: IContainer, + renderTooltipContent: RenderToolTipContent, + eventHandlers: EventHandlers + ) { const layerList = state && state.layerList ? state.layerList : getInitialLayers(); const indexPatterns = await this._getIndexPatterns(layerList); @@ -133,7 +152,6 @@ export class MapEmbeddableFactory extends EmbeddableFactory { { layerList, title: state && state.title ? state.title : '', - editUrl: null, indexPatterns, editable: false, }, @@ -144,7 +162,7 @@ export class MapEmbeddableFactory extends EmbeddableFactory { ); } - async create(input) { + async create(input: MapEmbeddableInput) { window.location.href = chrome.addBasePath(createMapPath('')); return new ErrorEmbeddable( 'Maps can only be created with createFromSavedObject or createFromState', diff --git a/x-pack/legacy/plugins/maps/public/embeddable/merge_input_with_saved_map.d.ts b/x-pack/legacy/plugins/maps/public/embeddable/merge_input_with_saved_map.d.ts new file mode 100644 index 0000000000000..4ce4df02f6a39 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/embeddable/merge_input_with_saved_map.d.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MapEmbeddableInput } from './map_embeddable'; + +export function mergeInputWithSavedMap( + input: MapEmbeddableInput, + savedmap: unknown +): Partial; diff --git a/x-pack/legacy/plugins/maps/public/index.ts b/x-pack/legacy/plugins/maps/public/index.ts index 27cd64103eec9..2d13f005f1a70 100644 --- a/x-pack/legacy/plugins/maps/public/index.ts +++ b/x-pack/legacy/plugins/maps/public/index.ts @@ -25,3 +25,6 @@ import { MapsPlugin } from './plugin'; export const plugin = (initializerContext: PluginInitializerContext) => { return new MapsPlugin(); }; + +export { RenderTooltipContentParams, ITooltipProperty } from './layers/tooltips/tooltip_property'; +export { MapEmbeddable, MapEmbeddableInput } from './embeddable'; diff --git a/x-pack/legacy/plugins/maps/public/kibana_services.d.ts b/x-pack/legacy/plugins/maps/public/kibana_services.d.ts new file mode 100644 index 0000000000000..89b1fee1aa842 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/kibana_services.d.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IIndexPattern } from 'src/plugins/data/public'; + +export function getIndexPatternService(): { + get: (id: string) => IIndexPattern | undefined; +}; + +export function setLicenseId(args: unknown): void; +export function setInspector(args: unknown): void; +export function setFileUpload(args: unknown): void; +export function setIndexPatternSelect(args: unknown): void; +export function setHttp(args: unknown): void; +export function setTimeFilter(args: unknown): void; +export function setUiSettings(args: unknown): void; +export function setInjectedVarFunc(args: unknown): void; +export function setToasts(args: unknown): void; +export function setIndexPatternService(args: unknown): void; +export function setAutocompleteService(args: unknown): void; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js index 0d4cf322d2a40..bf57306df5697 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js @@ -123,6 +123,7 @@ export class ColorMapSelect extends Component { { value: CUSTOM_COLOR_MAP, inputDisplay: this.props.customOptionLabel, + 'data-test-subj': `colorMapSelectOption_${CUSTOM_COLOR_MAP}`, }, ...this.props.colorMapOptions, ]; @@ -150,6 +151,7 @@ export class ColorMapSelect extends Component { onChange={this._onColorMapSelect} valueOfSelected={valueOfSelected} hasDividers={true} + data-test-subj={`colorMapSelect_${this.props.styleProperty.getStyleName()}`} /> diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js index 124c2bf0cff55..edf230b0a945c 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js @@ -63,6 +63,7 @@ export const ColorStopsCategorical = ({ getValueSuggestions={getValueSuggestions} value={stopValue} onChange={onStopChange} + dataTestSubj={`colorStopInput${index}`} /> ); }; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js index c6b68b7e94409..a1c15e27c9eb3 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js @@ -123,6 +123,7 @@ export function DynamicColorForm({ { onChange({ field: selectedFields.length > 0 ? selectedFields[0].value : null, @@ -98,6 +98,7 @@ export function FieldSelect({ fields, selectedFieldName, onChange, ...rest }) { defaultMessage: 'Select a field', })} renderOption={renderOption} + data-test-subj={`styleFieldSelect_${styleName}`} {...rest} /> ); diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js index 0c9011b811f38..bbba6705f7de7 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js @@ -27,6 +27,7 @@ export function DynamicLabelForm({ ); diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js index 752e0e4213217..005bc11aa1bd8 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js @@ -77,6 +77,7 @@ export class StylePropEditor extends Component { defaultMessage: 'Select to style by fixed value or by data value', })} compressed + data-test-subj={`staticDynamicSelect_${this.props.styleProperty.getStyleName()}`} /> ); } diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js index 9065102dc8bd7..6b79ac17f2e22 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js @@ -59,6 +59,7 @@ export function DynamicIconForm({ ; } +export interface MapFeature { + id: number; + layerId: string; +} + +export interface LoadFeatureProps { + layerId: string; + featureId: number; +} + +export interface FeatureGeometry { + coordinates: [number]; + type: string; +} + +export interface RenderTooltipContentParams { + addFilters(filter: object): void; + closeTooltip(): void; + features: MapFeature[]; + isLocked: boolean; + getLayerName(layerId: string): Promise; + loadFeatureProperties({ layerId, featureId }: LoadFeatureProps): Promise; + loadFeatureGeometry({ layerId, featureId }: LoadFeatureProps): FeatureGeometry; +} + +export type RenderToolTipContent = (params: RenderTooltipContentParams) => JSX.Element; + export class TooltipProperty implements ITooltipProperty { private readonly _propertyKey: string; - private readonly _propertyName: string; private readonly _rawValue: string | undefined; + private readonly _propertyName: string; constructor(propertyKey: string, propertyName: string, rawValue: string | undefined) { this._propertyKey = propertyKey; diff --git a/x-pack/legacy/plugins/maps/public/plugin.ts b/x-pack/legacy/plugins/maps/public/plugin.ts index 1f5817aa33dcc..53c951ac787e1 100644 --- a/x-pack/legacy/plugins/maps/public/plugin.ts +++ b/x-pack/legacy/plugins/maps/public/plugin.ts @@ -24,7 +24,6 @@ import { setToasts, setIndexPatternService, setAutocompleteService, - // @ts-ignore } from './kibana_services'; // @ts-ignore import { setInjectedVarFunc as npSetInjectedVarFunc } from '../../../../plugins/maps/public/kibana_services'; // eslint-disable-line @kbn/eslint/no-restricted-paths diff --git a/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js b/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js index 4d87b6a055802..64a42173098ee 100644 --- a/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js +++ b/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js @@ -5,7 +5,7 @@ */ import chrome from 'ui/chrome'; -import { setup as visualizationsSetup } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/legacy'; +import { npSetup } from '../../../../../src/legacy/ui/public/new_platform'; import { i18n } from '@kbn/i18n'; import { APP_ID, APP_ICON, MAP_BASE_URL } from '../common/constants'; @@ -23,7 +23,7 @@ The Maps app offers more functionality and is easier to use.`, } ); -visualizationsSetup.registerAlias({ +npSetup.plugins.visualizations.registerAlias({ aliasUrl: MAP_BASE_URL, name: APP_ID, title: i18n.translate('xpack.maps.visTypeAlias.title', { @@ -37,5 +37,5 @@ visualizationsSetup.registerAlias({ }); if (!showMapVisualizationTypes) { - visualizationsSetup.hideTypes(['region_map', 'tile_map']); + npSetup.plugins.visualizations.hideTypes(['region_map', 'tile_map']); } diff --git a/x-pack/legacy/plugins/maps/public/selectors/map_selectors.d.ts b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.d.ts new file mode 100644 index 0000000000000..237a04027e21b --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AnyAction } from 'redux'; +import { MapCenter } from '../actions/map_actions'; + +export function getHiddenLayerIds(state: unknown): string[]; + +export function getMapZoom(state: unknown): number; + +export function getMapCenter(state: unknown): MapCenter; + +export function getQueryableUniqueIndexPatternIds(state: unknown): string[]; diff --git a/x-pack/legacy/plugins/maps/public/selectors/ui_selectors.d.ts b/x-pack/legacy/plugins/maps/public/selectors/ui_selectors.d.ts new file mode 100644 index 0000000000000..812e2082241bd --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/selectors/ui_selectors.d.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export function getOpenTOCDetails(state: unknown): string[]; + +export function getIsLayerTOCOpen(state: unknown): boolean; diff --git a/x-pack/legacy/plugins/siem/cypress/integration/signal_detection_rules_custom.spec.ts b/x-pack/legacy/plugins/siem/cypress/integration/signal_detection_rules_custom.spec.ts index 3f509c35b64ea..86b8ca1ff3894 100644 --- a/x-pack/legacy/plugins/siem/cypress/integration/signal_detection_rules_custom.spec.ts +++ b/x-pack/legacy/plugins/siem/cypress/integration/signal_detection_rules_custom.spec.ts @@ -10,6 +10,7 @@ import { ABOUT_FALSE_POSITIVES, ABOUT_MITRE, ABOUT_RISK, + ABOUT_RULE_DESCRIPTION, ABOUT_SEVERITY, ABOUT_STEP, ABOUT_TAGS, @@ -22,7 +23,6 @@ import { SCHEDULE_LOOPBACK, SCHEDULE_RUNS, SCHEDULE_STEP, - ABOUT_RULE_DESCRIPTION, } from '../screens/rule_details'; import { CUSTOM_RULES_BTN, @@ -31,6 +31,7 @@ import { RULES_ROW, RULES_TABLE, SEVERITY, + SHOWING_RULES_TEXT, } from '../screens/signal_detection_rules'; import { @@ -45,9 +46,12 @@ import { } from '../tasks/detections'; import { changeToThreeHundredRowsPerPage, + deleteFirstRule, + deleteSelectedRules, filterByCustomRules, goToCreateNewRule, goToRuleDetails, + selectNumberOfRules, waitForLoadElasticPrebuiltDetectionRulesTableToBeLoaded, waitForRulesToBeLoaded, } from '../tasks/signal_detection_rules'; @@ -192,3 +196,67 @@ describe('Signal detection rules, custom', () => { .should('eql', '1m'); }); }); + +describe('Deletes custom rules', () => { + beforeEach(() => { + esArchiverLoad('custom_rules'); + loginAndWaitForPageWithoutDateRange(DETECTIONS); + waitForSignalsPanelToBeLoaded(); + waitForSignalsIndexToBeCreated(); + goToManageSignalDetectionRules(); + }); + + after(() => { + esArchiverUnload('custom_rules'); + }); + + it('Deletes one rule', () => { + cy.get(RULES_TABLE) + .find(RULES_ROW) + .then(rules => { + const initialNumberOfRules = rules.length; + const expectedNumberOfRulesAfterDeletion = initialNumberOfRules - 1; + + cy.get(SHOWING_RULES_TEXT) + .invoke('text') + .should('eql', `Showing ${initialNumberOfRules} rules`); + + deleteFirstRule(); + waitForRulesToBeLoaded(); + + cy.get(RULES_TABLE).then($table => { + cy.wrap($table.find(RULES_ROW).length).should('eql', expectedNumberOfRulesAfterDeletion); + }); + cy.get(SHOWING_RULES_TEXT) + .invoke('text') + .should('eql', `Showing ${expectedNumberOfRulesAfterDeletion} rules`); + cy.get(CUSTOM_RULES_BTN) + .invoke('text') + .should('eql', `Custom rules (${expectedNumberOfRulesAfterDeletion})`); + }); + }); + + it('Deletes more than one rule', () => { + cy.get(RULES_TABLE) + .find(RULES_ROW) + .then(rules => { + const initialNumberOfRules = rules.length; + const numberOfRulesToBeDeleted = 3; + const expectedNumberOfRulesAfterDeletion = initialNumberOfRules - numberOfRulesToBeDeleted; + + selectNumberOfRules(numberOfRulesToBeDeleted); + deleteSelectedRules(); + waitForRulesToBeLoaded(); + + cy.get(RULES_TABLE).then($table => { + cy.wrap($table.find(RULES_ROW).length).should('eql', expectedNumberOfRulesAfterDeletion); + }); + cy.get(SHOWING_RULES_TEXT) + .invoke('text') + .should('eql', `Showing ${expectedNumberOfRulesAfterDeletion} rule`); + cy.get(CUSTOM_RULES_BTN) + .invoke('text') + .should('eql', `Custom rules (${expectedNumberOfRulesAfterDeletion})`); + }); + }); +}); diff --git a/x-pack/legacy/plugins/siem/cypress/screens/signal_detection_rules.ts b/x-pack/legacy/plugins/siem/cypress/screens/signal_detection_rules.ts index 65f24e3a765ea..09fbc2132302c 100644 --- a/x-pack/legacy/plugins/siem/cypress/screens/signal_detection_rules.ts +++ b/x-pack/legacy/plugins/siem/cypress/screens/signal_detection_rules.ts @@ -43,4 +43,6 @@ export const RULES_ROW = '.euiTableRow'; export const SEVERITY = '[data-test-subj="severity"]'; +export const SHOWING_RULES_TEXT = '[data-test-subj="showingRules"]'; + export const THREE_HUNDRED_ROWS = '[data-test-subj="tablePagination-300-rows"]'; diff --git a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx index d0b1d8ffcb5ae..a3c4a655a4937 100644 --- a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx +++ b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx @@ -22,7 +22,8 @@ import { createEmbeddable, findMatchingIndexPatterns } from './embedded_map_help import { IndexPatternsMissingPrompt } from './index_patterns_missing_prompt'; import { MapToolTip } from './map_tool_tip/map_tool_tip'; import * as i18n from './translations'; -import { MapEmbeddable, SetQuery } from './types'; +import { SetQuery } from './types'; +import { MapEmbeddable } from '../../../../../plugins/maps/public'; import { Query, Filter } from '../../../../../../../src/plugins/data/public'; import { useKibana, useUiSetting$ } from '../../lib/kibana'; import { getSavedObjectFinder } from '../../../../../../../src/plugins/saved_objects/public'; diff --git a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx index 888df8447a728..4b32fd8299ef7 100644 --- a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx +++ b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx @@ -9,10 +9,10 @@ import React from 'react'; import { OutPortal, PortalNode } from 'react-reverse-portal'; import minimatch from 'minimatch'; import { ViewMode } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; -import { IndexPatternMapping, MapEmbeddable, RenderTooltipContentParams, SetQuery } from './types'; +import { IndexPatternMapping, SetQuery } from './types'; import { getLayerList } from './map_config'; -// @ts-ignore Missing type defs as maps moves to Typescript -import { MAP_SAVED_OBJECT_TYPE } from '../../../../maps/common/constants'; +import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../plugins/maps/public'; +import { MapEmbeddable, RenderTooltipContentParams } from '../../../../maps/public'; import * as i18n from './translations'; import { Query, Filter } from '../../../../../../../src/plugins/data/public'; import { EmbeddableStart } from '../../../../../../../src/plugins/embeddable/public'; diff --git a/x-pack/legacy/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx b/x-pack/legacy/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx index 15c423a3b3dc1..fc55e3437dc21 100644 --- a/x-pack/legacy/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx +++ b/x-pack/legacy/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx @@ -64,7 +64,7 @@ export const MapToolTipComponent = ({ getLayerName(layerId), ]); - setFeatureProps(featureProperties); + setFeatureProps((featureProperties as unknown) as FeatureProperty[]); setFeatureGeometry(featureGeo); setLayerName(layerNameString); } catch (e) { diff --git a/x-pack/legacy/plugins/siem/public/components/embeddables/types.ts b/x-pack/legacy/plugins/siem/public/components/embeddables/types.ts index cc253beb08eae..216fe9105327c 100644 --- a/x-pack/legacy/plugins/siem/public/components/embeddables/types.ts +++ b/x-pack/legacy/plugins/siem/public/components/embeddables/types.ts @@ -4,26 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TimeRange } from 'src/plugins/data/public'; -import { - EmbeddableInput, - EmbeddableOutput, - IEmbeddable, -} from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; +import { RenderTooltipContentParams } from '../../../../maps/public'; import { inputsModel } from '../../store/inputs'; -import { Query, Filter } from '../../../../../../../src/plugins/data/public'; - -export interface MapEmbeddableInput extends EmbeddableInput { - filters: Filter[]; - query: Query; - refreshConfig: { - isPaused: boolean; - interval: number; - }; - timeRange?: TimeRange; -} - -export type MapEmbeddable = IEmbeddable; export interface IndexPatternMapping { title: string; @@ -73,14 +55,4 @@ export interface FeatureGeometry { type: string; } -export interface RenderTooltipContentParams { - addFilters(filter: object): void; - closeTooltip(): void; - features: MapFeature[]; - isLocked: boolean; - getLayerName(layerId: string): Promise; - loadFeatureProperties({ layerId, featureId }: LoadFeatureProps): Promise; - loadFeatureGeometry({ layerId, featureId }: LoadFeatureProps): FeatureGeometry; -} - export type MapToolTipProps = Partial; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/api.ts b/x-pack/legacy/plugins/siem/public/containers/case/api.ts index 16ee294224bb9..7d5ae53b78ff8 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/api.ts @@ -8,10 +8,10 @@ import { CaseResponse, CasesResponse, CasesFindResponse, - CaseRequest, + CasePatchRequest, + CasePostRequest, CasesStatusResponse, CommentRequest, - CommentResponse, User, CaseUserActionsResponse, CaseExternalServiceRequest, @@ -19,19 +19,22 @@ import { ServiceConnectorCaseResponse, ActionTypeExecutorResult, } from '../../../../../../plugins/case/common/api'; + import { KibanaServices } from '../../lib/kibana'; + import { ActionLicense, AllCases, BulkUpdateStatus, Case, CasesStatus, - Comment, FetchCasesProps, SortFieldCase, CaseUserActions, } from './types'; + import { CASES_URL } from './constants'; + import { convertToCamelCase, convertAllCasesToCamel, @@ -40,17 +43,21 @@ import { decodeCasesResponse, decodeCasesFindResponse, decodeCasesStatusResponse, - decodeCommentResponse, decodeCaseUserActionsResponse, decodeServiceConnectorCaseResponse, } from './utils'; -export const getCase = async (caseId: string, includeComments: boolean = true): Promise => { +export const getCase = async ( + caseId: string, + includeComments: boolean = true, + signal: AbortSignal +): Promise => { const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}`, { method: 'GET', query: { includeComments, }, + signal, }); return convertToCamelCase(decodeCaseResponse(response)); }; @@ -66,9 +73,10 @@ export const getCasesStatus = async (signal: AbortSignal): Promise return convertToCamelCase(decodeCasesStatusResponse(response)); }; -export const getTags = async (): Promise => { +export const getTags = async (signal: AbortSignal): Promise => { const response = await KibanaServices.get().http.fetch(`${CASES_URL}/tags`, { method: 'GET', + signal, }); return response ?? []; }; @@ -108,6 +116,7 @@ export const getCases = async ({ sortField: SortFieldCase.createdAt, sortOrder: 'desc', }, + signal, }: FetchCasesProps): Promise => { const query = { reporters: filterOptions.reporters.map(r => r.username), @@ -119,69 +128,85 @@ export const getCases = async ({ const response = await KibanaServices.get().http.fetch(`${CASES_URL}/_find`, { method: 'GET', query, + signal, }); return convertAllCasesToCamel(decodeCasesFindResponse(response)); }; -export const postCase = async (newCase: CaseRequest): Promise => { +export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise => { const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'POST', body: JSON.stringify(newCase), + signal, }); return convertToCamelCase(decodeCaseResponse(response)); }; export const patchCase = async ( caseId: string, - updatedCase: Partial, - version: string + updatedCase: Pick, + version: string, + signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'PATCH', body: JSON.stringify({ cases: [{ ...updatedCase, id: caseId, version }] }), + signal, }); return convertToCamelCase(decodeCasesResponse(response)); }; -export const patchCasesStatus = async (cases: BulkUpdateStatus[]): Promise => { +export const patchCasesStatus = async ( + cases: BulkUpdateStatus[], + signal: AbortSignal +): Promise => { const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'PATCH', body: JSON.stringify({ cases }), + signal, }); return convertToCamelCase(decodeCasesResponse(response)); }; -export const postComment = async (newComment: CommentRequest, caseId: string): Promise => { - const response = await KibanaServices.get().http.fetch( +export const postComment = async ( + newComment: CommentRequest, + caseId: string, + signal: AbortSignal +): Promise => { + const response = await KibanaServices.get().http.fetch( `${CASES_URL}/${caseId}/comments`, { method: 'POST', body: JSON.stringify(newComment), + signal, } ); - return convertToCamelCase(decodeCommentResponse(response)); + return convertToCamelCase(decodeCaseResponse(response)); }; export const patchComment = async ( caseId: string, commentId: string, commentUpdate: string, - version: string -): Promise> => { - const response = await KibanaServices.get().http.fetch( + version: string, + signal: AbortSignal +): Promise => { + const response = await KibanaServices.get().http.fetch( `${CASES_URL}/${caseId}/comments`, { method: 'PATCH', body: JSON.stringify({ comment: commentUpdate, id: commentId, version }), + signal, } ); - return convertToCamelCase(decodeCommentResponse(response)); + return convertToCamelCase(decodeCaseResponse(response)); }; -export const deleteCases = async (caseIds: string[]): Promise => { +export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise => { const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'DELETE', query: { ids: JSON.stringify(caseIds) }, + signal, }); return response === 'true' ? true : false; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/configure/use_configure.tsx b/x-pack/legacy/plugins/siem/public/containers/case/configure/use_configure.tsx index a24f8303824c5..b25667f070fdf 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/configure/use_configure.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/configure/use_configure.tsx @@ -10,6 +10,7 @@ import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; import { useStateToaster, errorToToaster } from '../../../components/toasters'; import * as i18n from '../translations'; import { ClosureType } from './types'; +import { CurrentConfiguration } from '../../../pages/case/components/configure_cases/reducer'; interface PersistCaseConfigure { connectorId: string; @@ -27,14 +28,17 @@ export interface ReturnUseCaseConfigure { interface UseCaseConfigure { setConnector: (newConnectorId: string, newConnectorName?: string) => void; setClosureType?: (newClosureType: ClosureType) => void; + setCurrentConfiguration?: (configuration: CurrentConfiguration) => void; } export const useCaseConfigure = ({ setConnector, setClosureType, + setCurrentConfiguration, }: UseCaseConfigure): ReturnUseCaseConfigure => { const [, dispatchToaster] = useStateToaster(); const [loading, setLoading] = useState(true); + const [firstLoad, setFirstLoad] = useState(false); const [persistLoading, setPersistLoading] = useState(false); const [version, setVersion] = useState(''); @@ -54,6 +58,16 @@ export const useCaseConfigure = ({ setClosureType(res.closureType); } setVersion(res.version); + + if (!firstLoad) { + setFirstLoad(true); + if (setCurrentConfiguration != null) { + setCurrentConfiguration({ + connectorId: res.connectorId, + closureType: res.closureType, + }); + } + } } } } catch (error) { @@ -104,6 +118,12 @@ export const useCaseConfigure = ({ setClosureType(res.closureType); } setVersion(res.version); + if (setCurrentConfiguration != null) { + setCurrentConfiguration({ + connectorId: res.connectorId, + closureType: res.closureType, + }); + } } } catch (error) { if (!didCancel) { diff --git a/x-pack/legacy/plugins/siem/public/containers/case/types.ts b/x-pack/legacy/plugins/siem/public/containers/case/types.ts index bbbb13788d53a..bb215d6ac271c 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/types.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/types.ts @@ -93,7 +93,7 @@ export interface ElasticUser { readonly username: string; } -export interface FetchCasesProps { +export interface FetchCasesProps extends ApiProps { queryParams?: QueryParams; filterOptions?: FilterOptions; } diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_bulk_update_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_bulk_update_case.tsx index 77d779ab906cf..f1129bae9f537 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_bulk_update_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_bulk_update_case.tsx @@ -66,10 +66,12 @@ export const useUpdateCases = (): UseUpdateCase => { const dispatchUpdateCases = useCallback((cases: BulkUpdateStatus[]) => { let cancel = false; + const abortCtrl = new AbortController(); + const patchData = async () => { try { dispatch({ type: 'FETCH_INIT' }); - await patchCasesStatus(cases); + await patchCasesStatus(cases, abortCtrl.signal); if (!cancel) { dispatch({ type: 'FETCH_SUCCESS', payload: true }); } @@ -87,6 +89,7 @@ export const useUpdateCases = (): UseUpdateCase => { patchData(); return () => { cancel = true; + abortCtrl.abort(); }; }, []); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_delete_cases.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_delete_cases.tsx index d5a3b3cf9314c..b44e01d06acaf 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_delete_cases.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_delete_cases.tsx @@ -74,10 +74,12 @@ export const useDeleteCases = (): UseDeleteCase => { const dispatchDeleteCases = useCallback((caseIds: string[]) => { let cancel = false; + const abortCtrl = new AbortController(); + const deleteData = async () => { try { dispatch({ type: 'FETCH_INIT' }); - await deleteCases(caseIds); + await deleteCases(caseIds, abortCtrl.signal); if (!cancel) { dispatch({ type: 'FETCH_SUCCESS', payload: true }); } @@ -94,6 +96,7 @@ export const useDeleteCases = (): UseDeleteCase => { }; deleteData(); return () => { + abortCtrl.abort(); cancel = true; }; }, []); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx index 02b41c9fc720f..835fb7153dc95 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useEffect, useReducer } from 'react'; +import { useEffect, useReducer, useCallback } from 'react'; import { Case } from './types'; import * as i18n from './translations'; @@ -20,7 +20,8 @@ interface CaseState { type Action = | { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS'; payload: Case } - | { type: 'FETCH_FAILURE' }; + | { type: 'FETCH_FAILURE' } + | { type: 'UPDATE_CASE'; payload: Case }; const dataFetchReducer = (state: CaseState, action: Action): CaseState => { switch (action.type) { @@ -43,6 +44,11 @@ const dataFetchReducer = (state: CaseState, action: Action): CaseState => { isLoading: false, isError: true, }; + case 'UPDATE_CASE': + return { + ...state, + data: action.payload, + }; default: return state; } @@ -67,7 +73,12 @@ const initialData: Case = { version: '', }; -export const useGetCase = (caseId: string): CaseState => { +interface UseGetCase extends CaseState { + fetchCase: () => void; + updateCase: (newCase: Case) => void; +} + +export const useGetCase = (caseId: string): UseGetCase => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: true, isError: false, @@ -75,12 +86,18 @@ export const useGetCase = (caseId: string): CaseState => { }); const [, dispatchToaster] = useStateToaster(); - const callFetch = () => { + const updateCase = useCallback((newCase: Case) => { + dispatch({ type: 'UPDATE_CASE', payload: newCase }); + }, []); + + const callFetch = useCallback(async () => { let didCancel = false; + const abortCtrl = new AbortController(); + const fetchData = async () => { dispatch({ type: 'FETCH_INIT' }); try { - const response = await getCase(caseId); + const response = await getCase(caseId, true, abortCtrl.signal); if (!didCancel) { dispatch({ type: 'FETCH_SUCCESS', payload: response }); } @@ -98,11 +115,12 @@ export const useGetCase = (caseId: string): CaseState => { fetchData(); return () => { didCancel = true; + abortCtrl.abort(); }; - }; + }, [caseId]); useEffect(() => { callFetch(); }, [caseId]); - return state; + return { ...state, fetchCase: callFetch, updateCase }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx index ae7b8f3c043fa..323dc23e1b24e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx @@ -149,12 +149,15 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { const fetchCases = useCallback((filterOptions: FilterOptions, queryParams: QueryParams) => { let didCancel = false; + const abortCtrl = new AbortController(); + const fetchData = async () => { dispatch({ type: 'FETCH_INIT', payload: 'cases' }); try { const response = await getCases({ filterOptions, queryParams, + signal: abortCtrl.signal, }); if (!didCancel) { dispatch({ @@ -175,6 +178,7 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { }; fetchData(); return () => { + abortCtrl.abort(); didCancel = true; }; }, []); @@ -187,13 +191,17 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { const dispatchUpdateCaseProperty = useCallback( ({ updateKey, updateValue, caseId, refetchCasesStatus, version }: UpdateCase) => { let didCancel = false; + const abortCtrl = new AbortController(); + const fetchData = async () => { dispatch({ type: 'FETCH_INIT', payload: 'caseUpdate' }); try { await patchCase( caseId, { [updateKey]: updateValue }, - version ?? '' // saved object versions are typed as string | undefined, hope that's not true + // saved object versions are typed as string | undefined, hope that's not true + version ?? '', + abortCtrl.signal ); if (!didCancel) { dispatch({ type: 'FETCH_UPDATE_CASE_SUCCESS' }); @@ -209,6 +217,7 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { }; fetchData(); return () => { + abortCtrl.abort(); didCancel = true; }; }, diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx index e3657f5b09da9..b41d5aab5c07a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx @@ -57,10 +57,12 @@ export const useGetTags = (): TagsState => { useEffect(() => { let didCancel = false; + const abortCtrl = new AbortController(); + const fetchData = async () => { dispatch({ type: 'FETCH_INIT' }); try { - const response = await getTags(); + const response = await getTags(abortCtrl.signal); if (!didCancel) { dispatch({ type: 'FETCH_SUCCESS', payload: response }); } @@ -77,6 +79,7 @@ export const useGetTags = (): TagsState => { }; fetchData(); return () => { + abortCtrl.abort(); didCancel = true; }; }, []); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx index 817101cf5e663..0e01364721dc5 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx @@ -6,7 +6,7 @@ import { useReducer, useCallback } from 'react'; -import { CaseRequest } from '../../../../../../plugins/case/common/api'; +import { CasePostRequest } from '../../../../../../plugins/case/common/api'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { postCase } from './api'; import * as i18n from './translations'; @@ -49,7 +49,7 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => }; interface UsePostCase extends NewCaseState { - postCase: (data: CaseRequest) => void; + postCase: (data: CasePostRequest) => void; } export const usePostCase = (): UsePostCase => { const [state, dispatch] = useReducer(dataFetchReducer, { @@ -59,11 +59,13 @@ export const usePostCase = (): UsePostCase => { }); const [, dispatchToaster] = useStateToaster(); - const postMyCase = useCallback(async (data: CaseRequest) => { + const postMyCase = useCallback(async (data: CasePostRequest) => { let cancel = false; + const abortCtrl = new AbortController(); + try { dispatch({ type: 'FETCH_INIT' }); - const response = await postCase({ ...data, status: 'open' }); + const response = await postCase(data, abortCtrl.signal); if (!cancel) { dispatch({ type: 'FETCH_SUCCESS', @@ -81,6 +83,7 @@ export const usePostCase = (): UsePostCase => { } } return () => { + abortCtrl.abort(); cancel = true; }; }, []); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx index a96cb97d7cc7b..207b05814717f 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx @@ -11,43 +11,28 @@ import { errorToToaster, useStateToaster } from '../../components/toasters'; import { postComment } from './api'; import * as i18n from './translations'; -import { Comment } from './types'; +import { Case } from './types'; interface NewCommentState { - commentData: Comment | null; isLoading: boolean; isError: boolean; - caseId: string; } -type Action = - | { type: 'RESET_COMMENT_DATA' } - | { type: 'FETCH_INIT' } - | { type: 'FETCH_SUCCESS'; payload: Comment } - | { type: 'FETCH_FAILURE' }; +type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentState => { switch (action.type) { - case 'RESET_COMMENT_DATA': - return { - ...state, - commentData: null, - }; case 'FETCH_INIT': return { - ...state, isLoading: true, isError: false, }; case 'FETCH_SUCCESS': return { - ...state, isLoading: false, isError: false, - commentData: action.payload ?? null, }; case 'FETCH_FAILURE': return { - ...state, isLoading: false, isError: true, }; @@ -57,43 +42,45 @@ const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentSta }; interface UsePostComment extends NewCommentState { - postComment: (data: CommentRequest) => void; - resetCommentData: () => void; + postComment: (data: CommentRequest, updateCase: (newCase: Case) => void) => void; } export const usePostComment = (caseId: string): UsePostComment => { const [state, dispatch] = useReducer(dataFetchReducer, { - commentData: null, isLoading: false, isError: false, - caseId, }); const [, dispatchToaster] = useStateToaster(); - const postMyComment = useCallback(async (data: CommentRequest) => { - let cancel = false; - try { - dispatch({ type: 'FETCH_INIT' }); - const response = await postComment(data, state.caseId); - if (!cancel) { - dispatch({ type: 'FETCH_SUCCESS', payload: response }); - } - } catch (error) { - if (!cancel) { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - dispatch({ type: 'FETCH_FAILURE' }); - } - } - return () => { - cancel = true; - }; - }, []); + const postMyComment = useCallback( + async (data: CommentRequest, updateCase: (newCase: Case) => void) => { + let cancel = false; + const abortCtrl = new AbortController(); - const resetCommentData = useCallback(() => dispatch({ type: 'RESET_COMMENT_DATA' }), []); + try { + dispatch({ type: 'FETCH_INIT' }); + const response = await postComment(data, caseId, abortCtrl.signal); + if (!cancel) { + dispatch({ type: 'FETCH_SUCCESS' }); + updateCase(response); + } + } catch (error) { + if (!cancel) { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + dispatch({ type: 'FETCH_FAILURE' }); + } + } + return () => { + abortCtrl.abort(); + cancel = true; + }; + }, + [caseId] + ); - return { ...state, postComment: postMyComment, resetCommentData }; + return { ...state, postComment: postMyComment }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_post_push_to_service.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_post_push_to_service.tsx index b6fb15f4fa083..03e10249317ee 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_post_push_to_service.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_post_push_to_service.tsx @@ -87,7 +87,7 @@ export const usePostPushToService = (): UsePostPushToService => { const abortCtrl = new AbortController(); try { dispatch({ type: 'FETCH_INIT' }); - const casePushData = await getCase(caseId); + const casePushData = await getCase(caseId, true, abortCtrl.signal); const responseService = await pushToService( connectorId, formatServiceRequestData(casePushData), @@ -143,7 +143,6 @@ const formatServiceRequestData = (myCase: Case): ServiceConnectorCaseParams => { updatedAt, updatedBy, } = myCase; - return { caseId, createdAt, @@ -151,23 +150,35 @@ const formatServiceRequestData = (myCase: Case): ServiceConnectorCaseParams => { fullName: createdBy.fullName ?? null, username: createdBy?.username, }, - comments: comments.map(c => ({ - commentId: c.id, - comment: c.comment, - createdAt: c.createdAt, - createdBy: { - fullName: c.createdBy.fullName ?? null, - username: c.createdBy.username, - }, - updatedAt: c.updatedAt, - updatedBy: - c.updatedBy != null - ? { - fullName: c.updatedBy.fullName ?? null, - username: c.updatedBy.username, - } - : null, - })), + comments: comments + .filter(c => { + const lastPush = c.pushedAt != null ? new Date(c.pushedAt) : null; + const lastUpdate = c.updatedAt != null ? new Date(c.updatedAt) : null; + if ( + lastPush === null || + (lastPush != null && lastUpdate != null && lastPush.getTime() < lastUpdate?.getTime()) + ) { + return true; + } + return false; + }) + .map(c => ({ + commentId: c.id, + comment: c.comment, + createdAt: c.createdAt, + createdBy: { + fullName: c.createdBy.fullName ?? null, + username: c.createdBy.username, + }, + updatedAt: c.updatedAt, + updatedBy: + c.updatedBy != null + ? { + fullName: c.updatedBy.fullName ?? null, + username: c.updatedBy.username, + } + : null, + })), description, incidentId: externalService?.externalId ?? null, title, diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx index f8af088f7e03b..85ad4fd3fc47a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx @@ -5,18 +5,16 @@ */ import { useReducer, useCallback } from 'react'; -import { cloneDeep } from 'lodash/fp'; -import { CaseRequest } from '../../../../../../plugins/case/common/api'; +import { CasePatchRequest } from '../../../../../../plugins/case/common/api'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { patchCase } from './api'; import * as i18n from './translations'; import { Case } from './types'; -type UpdateKey = keyof CaseRequest; +type UpdateKey = keyof Pick; interface NewCaseState { - caseData: Case; isLoading: boolean; isError: boolean; updateKey: UpdateKey | null; @@ -24,13 +22,15 @@ interface NewCaseState { export interface UpdateByKey { updateKey: UpdateKey; - updateValue: CaseRequest[UpdateKey]; + updateValue: CasePatchRequest[UpdateKey]; fetchCaseUserActions?: (caseId: string) => void; + updateCase?: (newCase: Case) => void; + version: string; } type Action = | { type: 'FETCH_INIT'; payload: UpdateKey } - | { type: 'FETCH_SUCCESS'; payload: Case } + | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { @@ -48,7 +48,6 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => ...state, isLoading: false, isError: false, - caseData: cloneDeep(action.payload), updateKey: null, }; case 'FETCH_FAILURE': @@ -65,36 +64,36 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => interface UseUpdateCase extends NewCaseState { updateCaseProperty: (updates: UpdateByKey) => void; - updateCase: (newCase: Case) => void; } -export const useUpdateCase = (caseId: string, initialData: Case): UseUpdateCase => { +export const useUpdateCase = ({ caseId }: { caseId: string }): UseUpdateCase => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: false, isError: false, - caseData: initialData, updateKey: null, }); const [, dispatchToaster] = useStateToaster(); - const updateCase = useCallback((newCase: Case) => { - dispatch({ type: 'FETCH_SUCCESS', payload: newCase }); - }, []); - const dispatchUpdateCaseProperty = useCallback( - async ({ fetchCaseUserActions, updateKey, updateValue }: UpdateByKey) => { + async ({ fetchCaseUserActions, updateKey, updateValue, updateCase, version }: UpdateByKey) => { let cancel = false; + const abortCtrl = new AbortController(); + try { dispatch({ type: 'FETCH_INIT', payload: updateKey }); const response = await patchCase( caseId, { [updateKey]: updateValue }, - state.caseData.version + version, + abortCtrl.signal ); if (!cancel) { if (fetchCaseUserActions != null) { fetchCaseUserActions(caseId); } - dispatch({ type: 'FETCH_SUCCESS', payload: response[0] }); + if (updateCase != null) { + updateCase(response[0]); + } + dispatch({ type: 'FETCH_SUCCESS' }); } } catch (error) { if (!cancel) { @@ -108,10 +107,11 @@ export const useUpdateCase = (caseId: string, initialData: Case): UseUpdateCase } return () => { cancel = true; + abortCtrl.abort(); }; }, - [state] + [] ); - return { ...state, updateCase, updateCaseProperty: dispatchUpdateCaseProperty }; + return { ...state, updateCaseProperty: dispatchUpdateCaseProperty }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx index c1b2bfde30126..faf9649a705c5 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx @@ -4,38 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useReducer, useCallback, Dispatch } from 'react'; +import { useReducer, useCallback } from 'react'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { patchComment } from './api'; import * as i18n from './translations'; -import { Comment } from './types'; +import { Case } from './types'; interface CommentUpdateState { - comments: Comment[]; isLoadingIds: string[]; isError: boolean; } - interface CommentUpdate { - update: Partial; commentId: string; } type Action = - | { type: 'APPEND_COMMENT'; payload: Comment } | { type: 'FETCH_INIT'; payload: string } | { type: 'FETCH_SUCCESS'; payload: CommentUpdate } | { type: 'FETCH_FAILURE'; payload: string }; const dataFetchReducer = (state: CommentUpdateState, action: Action): CommentUpdateState => { switch (action.type) { - case 'APPEND_COMMENT': - return { - ...state, - comments: [...state.comments, action.payload], - }; case 'FETCH_INIT': return { ...state, @@ -44,20 +35,10 @@ const dataFetchReducer = (state: CommentUpdateState, action: Action): CommentUpd }; case 'FETCH_SUCCESS': - const updatePayload = action.payload; - const foundIndex = state.comments.findIndex( - comment => comment.id === updatePayload.commentId - ); - const newComments = state.comments; - if (foundIndex !== -1) { - newComments[foundIndex] = { ...state.comments[foundIndex], ...updatePayload.update }; - } - return { ...state, - isLoadingIds: state.isLoadingIds.filter(id => updatePayload.commentId !== id), + isLoadingIds: state.isLoadingIds.filter(id => action.payload.commentId !== id), isError: false, - comments: newComments, }; case 'FETCH_FAILURE': return { @@ -75,38 +56,45 @@ interface UpdateComment { commentId: string; commentUpdate: string; fetchUserActions: () => void; + updateCase: (newCase: Case) => void; + version: string; } interface UseUpdateComment extends CommentUpdateState { - updateComment: ({ caseId, commentId, commentUpdate, fetchUserActions }: UpdateComment) => void; - addPostedComment: Dispatch; + patchComment: ({ caseId, commentId, commentUpdate, fetchUserActions }: UpdateComment) => void; } -export const useUpdateComment = (comments: Comment[]): UseUpdateComment => { +export const useUpdateComment = (): UseUpdateComment => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoadingIds: [], isError: false, - comments, }); const [, dispatchToaster] = useStateToaster(); const dispatchUpdateComment = useCallback( - async ({ caseId, commentId, commentUpdate, fetchUserActions }: UpdateComment) => { + async ({ + caseId, + commentId, + commentUpdate, + fetchUserActions, + updateCase, + version, + }: UpdateComment) => { let cancel = false; + const abortCtrl = new AbortController(); try { dispatch({ type: 'FETCH_INIT', payload: commentId }); - const currentComment = state.comments.find(comment => comment.id === commentId) ?? { - version: '', - }; const response = await patchComment( caseId, commentId, commentUpdate, - currentComment.version + version, + abortCtrl.signal ); if (!cancel) { + updateCase(response); fetchUserActions(); - dispatch({ type: 'FETCH_SUCCESS', payload: { update: response, commentId } }); + dispatch({ type: 'FETCH_SUCCESS', payload: { commentId } }); } } catch (error) { if (!cancel) { @@ -120,14 +108,11 @@ export const useUpdateComment = (comments: Comment[]): UseUpdateComment => { } return () => { cancel = true; + abortCtrl.abort(); }; }, - [state] - ); - const addPostedComment = useCallback( - (comment: Comment) => dispatch({ type: 'APPEND_COMMENT', payload: comment }), [] ); - return { ...state, updateComment: dispatchUpdateComment, addPostedComment }; + return { ...state, patchComment: dispatchUpdateComment }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/utils.ts b/x-pack/legacy/plugins/siem/public/containers/case/utils.ts index ce23ac6c440b6..1ec98bf5b5f1f 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/utils.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/utils.ts @@ -19,8 +19,6 @@ import { CasesStatusResponseRt, CasesStatusResponse, throwErrors, - CommentResponse, - CommentResponseRt, CasesConfigureResponse, CaseConfigureResponseRt, CaseUserActionsResponse, @@ -82,9 +80,6 @@ export const decodeCasesResponse = (respCase?: CasesResponse) => export const decodeCasesFindResponse = (respCases?: CasesFindResponse) => pipe(CasesFindResponseRt.decode(respCases), fold(throwErrors(createToasterPlainError), identity)); -export const decodeCommentResponse = (respComment?: CommentResponse) => - pipe(CommentResponseRt.decode(respComment), fold(throwErrors(createToasterPlainError), identity)); - export const decodeCaseConfigureResponse = (respCase?: CasesConfigureResponse) => pipe( CaseConfigureResponseRt.decode(respCase), diff --git a/x-pack/legacy/plugins/siem/public/lib/connectors/servicenow.tsx b/x-pack/legacy/plugins/siem/public/lib/connectors/servicenow.tsx index 8e947fbc0f9bb..d67007399abea 100644 --- a/x-pack/legacy/plugins/siem/public/lib/connectors/servicenow.tsx +++ b/x-pack/legacy/plugins/siem/public/lib/connectors/servicenow.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, ChangeEvent } from 'react'; +import React, { useCallback, ChangeEvent, useEffect } from 'react'; import { EuiFieldText, EuiFlexGroup, @@ -98,6 +98,21 @@ const ServiceNowConnectorFields: React.FunctionComponent 0 && username != null; const isPasswordInvalid: boolean = errors.password.length > 0 && password != null; + /** + * We need to distinguish between the add flyout and the edit flyout. + * useEffect will run only once on component mount. + * This guarantees that the function below will run only once. + * On the first render of the component the apiUrl can be either undefined or filled. + * If it is filled then we are on the edit flyout. Otherwise we are on the add flyout. + */ + + useEffect(() => { + if (!isEmpty(apiUrl)) { + editActionSecrets('username', ''); + editActionSecrets('password', ''); + } + }, []); + if (isEmpty(mapping)) { editActionConfig('casesConfiguration', { ...action.config.casesConfiguration, @@ -169,7 +184,7 @@ const ServiceNowConnectorFields: React.FunctionComponent diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx index 21e4724797c5d..46a777984c6e0 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx @@ -10,13 +10,14 @@ import styled from 'styled-components'; import { CommentRequest } from '../../../../../../../../plugins/case/common/api'; import { usePostComment } from '../../../../containers/case/use_post_comment'; +import { Case } from '../../../../containers/case/types'; import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; +import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; +import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; import { Form, useForm, UseField } from '../../../../shared_imports'; + import * as i18n from '../../translations'; import { schema } from './schema'; -import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; -import { Comment } from '../../../../containers/case/types'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -32,13 +33,13 @@ interface AddCommentProps { caseId: string; insertQuote: string | null; onCommentSaving?: () => void; - onCommentPosted: (commentResponse: Comment) => void; + onCommentPosted: (newCase: Case) => void; showLoading?: boolean; } export const AddComment = React.memo( ({ caseId, insertQuote, showLoading = true, onCommentPosted, onCommentSaving }) => { - const { commentData, isLoading, postComment, resetCommentData } = usePostComment(caseId); + const { isLoading, postComment } = usePostComment(caseId); const { form } = useForm({ defaultValue: initialCommentValue, options: { stripEmptyFields: false }, @@ -59,23 +60,16 @@ export const AddComment = React.memo( } }, [insertQuote]); - useEffect(() => { - if (commentData !== null) { - onCommentPosted(commentData); - form.reset(); - resetCommentData(); - } - }, [commentData]); - const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { if (onCommentSaving != null) { onCommentSaving(); } - await postComment(data); + await postComment(data, onCommentPosted); + form.reset(); } - }, [form]); + }, [form, onCommentPosted, onCommentSaving]); return ( diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx index 5ca54c7f429d2..7c61d7eb034dc 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx @@ -11,7 +11,6 @@ import { EuiTableActionsColumnType, EuiAvatar, EuiLink, - EuiLoadingSpinner, } from '@elastic/eui'; import styled from 'styled-components'; import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; @@ -21,7 +20,6 @@ import { FormattedRelativePreferenceDate } from '../../../../components/formatte import { CaseDetailsLink } from '../../../../components/links'; import { TruncatableText } from '../../../../components/truncatable_text'; import * as i18n from './translations'; -import { useGetCaseUserActions } from '../../../../containers/case/use_get_case_user_actions'; export type CasesColumns = | EuiTableFieldDataColumnType @@ -169,25 +167,30 @@ interface Props { } const ServiceNowColumn: React.FC = ({ theCase }) => { - const { hasDataToPush, isLoading } = useGetCaseUserActions(theCase.id); - const handleRenderDataToPush = useCallback( - () => - isLoading ? ( - - ) : ( -

- - {theCase.externalService?.externalTitle} - - {hasDataToPush ? i18n.REQUIRES_UPDATE : i18n.UP_TO_DATE} -

- ), - [hasDataToPush, isLoading, theCase.externalService] - ); + const handleRenderDataToPush = useCallback(() => { + const lastCaseUpdate = theCase.updatedAt != null ? new Date(theCase.updatedAt) : null; + const lastCasePush = + theCase.externalService?.pushedAt != null + ? new Date(theCase.externalService?.pushedAt) + : null; + const hasDataToPush = + lastCasePush === null || + (lastCasePush != null && + lastCaseUpdate != null && + lastCasePush.getTime() < lastCaseUpdate?.getTime()); + return ( +

+ + {theCase.externalService?.externalTitle} + + {hasDataToPush ? i18n.REQUIRES_UPDATE : i18n.UP_TO_DATE} +

+ ); + }, [theCase]); if (theCase.externalService !== null) { return handleRenderDataToPush(); } diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_status/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_status/index.tsx index 0420a71fea907..5037987845326 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_status/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_status/index.tsx @@ -8,6 +8,7 @@ import React from 'react'; import styled, { css } from 'styled-components'; import { EuiBadge, + EuiButtonEmpty, EuiButtonToggle, EuiDescriptionList, EuiDescriptionListDescription, @@ -18,6 +19,7 @@ import { import * as i18n from '../case_view/translations'; import { FormattedRelativePreferenceDate } from '../../../../components/formatted_date'; import { CaseViewActions } from '../case_view/actions'; +import { Case } from '../../../../containers/case/types'; const MyDescriptionList = styled(EuiDescriptionList)` ${({ theme }) => css` @@ -32,11 +34,11 @@ interface CaseStatusProps { 'data-test-subj': string; badgeColor: string; buttonLabel: string; - caseId: string; - caseTitle: string; + caseData: Case; icon: string; isLoading: boolean; isSelected: boolean; + onRefresh: () => void; status: string; title: string; toggleStatusCase: (evt: unknown) => void; @@ -46,11 +48,11 @@ const CaseStatusComp: React.FC = ({ 'data-test-subj': dataTestSubj, badgeColor, buttonLabel, - caseId, - caseTitle, + caseData, icon, isLoading, isSelected, + onRefresh, status, title, toggleStatusCase, @@ -79,6 +81,11 @@ const CaseStatusComp: React.FC = ({ + + + {i18n.CASE_REFRESH} + + = ({ /> - + diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx index 7aadea1a453a7..c4f1888df39e9 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx @@ -7,9 +7,12 @@ import { CaseProps } from '../index'; import { Case } from '../../../../../containers/case/types'; +const updateCase = jest.fn(); +const fetchCase = jest.fn(); + export const caseProps: CaseProps = { caseId: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', - initialData: { + caseData: { closedAt: null, closedBy: null, id: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', @@ -46,12 +49,14 @@ export const caseProps: CaseProps = { }, version: 'WzQ3LDFd', }, + fetchCase, + updateCase, }; export const caseClosedProps: CaseProps = { ...caseProps, - initialData: { - ...caseProps.initialData, + caseData: { + ...caseProps.caseData, closedAt: '2020-02-20T23:06:33.798Z', closedBy: { username: 'elastic', @@ -61,11 +66,11 @@ export const caseClosedProps: CaseProps = { }; export const data: Case = { - ...caseProps.initialData, + ...caseProps.caseData, }; export const dataClosed: Case = { - ...caseClosedProps.initialData, + ...caseClosedProps.caseData, }; export const caseUserActions = [ diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.test.tsx index 4e1e5ba753c36..1be0d6a3b5fcc 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.test.tsx @@ -6,15 +6,15 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseViewActions } from './actions'; -import { TestProviders } from '../../../../mock'; + import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; +import { TestProviders } from '../../../../mock'; +import { data } from './__mock__'; +import { CaseViewActions } from './actions'; jest.mock('../../../../containers/case/use_delete_cases'); const useDeleteCasesMock = useDeleteCases as jest.Mock; describe('CaseView actions', () => { - const caseTitle = 'Cool title'; - const caseId = 'cool-id'; const handleOnDeleteConfirm = jest.fn(); const handleToggleModal = jest.fn(); const dispatchResetIsDeleted = jest.fn(); @@ -34,7 +34,7 @@ describe('CaseView actions', () => { it('clicking trash toggles modal', () => { const wrapper = mount( - + ); @@ -54,12 +54,12 @@ describe('CaseView actions', () => { })); const wrapper = mount( - + ); expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeTruthy(); wrapper.find('button[data-test-subj="confirmModalConfirmButton"]').simulate('click'); - expect(handleOnDeleteConfirm.mock.calls[0][0]).toEqual([caseId]); + expect(handleOnDeleteConfirm.mock.calls[0][0]).toEqual([data.id]); }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.tsx index 88a717ac5fa6a..1d90470eab0e1 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/actions.tsx @@ -12,13 +12,13 @@ import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; import { SiemPageName } from '../../../home/types'; import { PropertyActions } from '../property_actions'; +import { Case } from '../../../../containers/case/types'; interface CaseViewActions { - caseId: string; - caseTitle: string; + caseData: Case; } -const CaseViewActionsComponent: React.FC = ({ caseId, caseTitle }) => { +const CaseViewActionsComponent: React.FC = ({ caseData }) => { // Delete case const { handleToggleModal, @@ -30,14 +30,14 @@ const CaseViewActionsComponent: React.FC = ({ caseId, caseTitle const confirmDeleteModal = useMemo( () => ( ), - [isDisplayConfirmDeleteModal] + [isDisplayConfirmDeleteModal, caseData] ); // TO DO refactor each of these const's into their own components const propertyActions = useMemo( @@ -47,18 +47,17 @@ const CaseViewActionsComponent: React.FC = ({ caseId, caseTitle label: i18n.DELETE_CASE, onClick: handleToggleModal, }, - { - iconType: 'popout', - label: 'View ServiceNow incident', - onClick: () => null, - }, - { - iconType: 'importAction', - label: 'Update ServiceNow incident', - onClick: () => null, - }, + ...(caseData.externalService?.externalUrl !== null + ? [ + { + iconType: 'popout', + label: i18n.VIEW_INCIDENT(caseData.externalService?.externalTitle ?? ''), + onClick: () => window.open(caseData.externalService?.externalUrl, '_blank'), + }, + ] + : []), ], - [handleToggleModal] + [handleToggleModal, caseData] ); if (isDeleted) { diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx index 18cc33d8a6d4d..92fc43eff53e9 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx @@ -67,7 +67,6 @@ describe('CaseView ', () => { /* eslint-enable no-console */ const defaultUpdateCaseState = { - caseData: data, isLoading: false, isError: false, updateKey: null, @@ -186,12 +185,7 @@ describe('CaseView ', () => { wrapper .find('input[data-test-subj="toggle-case-status"]') .simulate('change', { target: { checked: true } }); - - expect(updateCaseProperty).toBeCalledWith({ - fetchCaseUserActions, - updateKey: 'status', - updateValue: 'closed', - }); + expect(updateCaseProperty).toHaveBeenCalled(); }); it('should render comments', async () => { diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx index 5c20b53f5fcb9..07834c3fb0678 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx @@ -57,230 +57,252 @@ const MyEuiHorizontalRule = styled(EuiHorizontalRule)` export interface CaseProps { caseId: string; - initialData: Case; + fetchCase: () => void; + caseData: Case; + updateCase: (newCase: Case) => void; } -export const CaseComponent = React.memo(({ caseId, initialData }) => { - const basePath = window.location.origin + useBasePath(); - const caseLink = `${basePath}/app/siem#/case/${caseId}`; - const search = useGetUrlSearch(navTabs.case); +export const CaseComponent = React.memo( + ({ caseId, caseData, fetchCase, updateCase }) => { + const basePath = window.location.origin + useBasePath(); + const caseLink = `${basePath}/app/siem#/case/${caseId}`; + const search = useGetUrlSearch(navTabs.case); - const [initLoadingData, setInitLoadingData] = useState(true); - const { - caseUserActions, - fetchCaseUserActions, - firstIndexPushToService, - hasDataToPush, - isLoading: isLoadingUserActions, - lastIndexPushToService, - participants, - } = useGetCaseUserActions(caseId); - const { caseData, isLoading, updateKey, updateCase, updateCaseProperty } = useUpdateCase( - caseId, - initialData - ); + const [initLoadingData, setInitLoadingData] = useState(true); + const { + caseUserActions, + fetchCaseUserActions, + firstIndexPushToService, + hasDataToPush, + isLoading: isLoadingUserActions, + lastIndexPushToService, + participants, + } = useGetCaseUserActions(caseId); + const { isLoading, updateKey, updateCaseProperty } = useUpdateCase({ + caseId, + }); - // Update Fields - const onUpdateField = useCallback( - (newUpdateKey: keyof Case, updateValue: Case[keyof Case]) => { - switch (newUpdateKey) { - case 'title': - const titleUpdate = getTypedPayload(updateValue); - if (titleUpdate.length > 0) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'title', - updateValue: titleUpdate, - }); - } - break; - case 'description': - const descriptionUpdate = getTypedPayload(updateValue); - if (descriptionUpdate.length > 0) { + // Update Fields + const onUpdateField = useCallback( + (newUpdateKey: keyof Case, updateValue: Case[keyof Case]) => { + const handleUpdateNewCase = (newCase: Case) => + updateCase({ ...newCase, comments: caseData.comments }); + switch (newUpdateKey) { + case 'title': + const titleUpdate = getTypedPayload(updateValue); + if (titleUpdate.length > 0) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'title', + updateValue: titleUpdate, + updateCase: handleUpdateNewCase, + version: caseData.version, + }); + } + break; + case 'description': + const descriptionUpdate = getTypedPayload(updateValue); + if (descriptionUpdate.length > 0) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'description', + updateValue: descriptionUpdate, + updateCase: handleUpdateNewCase, + version: caseData.version, + }); + } + break; + case 'tags': + const tagsUpdate = getTypedPayload(updateValue); updateCaseProperty({ fetchCaseUserActions, - updateKey: 'description', - updateValue: descriptionUpdate, + updateKey: 'tags', + updateValue: tagsUpdate, + updateCase: handleUpdateNewCase, + version: caseData.version, }); - } - break; - case 'tags': - const tagsUpdate = getTypedPayload(updateValue); - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'tags', - updateValue: tagsUpdate, - }); - break; - case 'status': - const statusUpdate = getTypedPayload(updateValue); - if (caseData.status !== updateValue) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'status', - updateValue: statusUpdate, - }); - } - default: - return null; - } - }, - [fetchCaseUserActions, updateCaseProperty, caseData.status] - ); - const handleUpdateCase = useCallback( - (newCase: Case) => { - updateCase(newCase); - fetchCaseUserActions(newCase.id); - }, - [updateCase, fetchCaseUserActions] - ); + break; + case 'status': + const statusUpdate = getTypedPayload(updateValue); + if (caseData.status !== updateValue) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'status', + updateValue: statusUpdate, + updateCase: handleUpdateNewCase, + version: caseData.version, + }); + } + default: + return null; + } + }, + [fetchCaseUserActions, updateCaseProperty, updateCase, caseData] + ); + const handleUpdateCase = useCallback( + (newCase: Case) => { + updateCase(newCase); + fetchCaseUserActions(newCase.id); + }, + [updateCase, fetchCaseUserActions] + ); - const { pushButton, pushCallouts } = usePushToService({ - caseId: caseData.id, - caseStatus: caseData.status, - isNew: caseUserActions.filter(cua => cua.action === 'push-to-service').length === 0, - updateCase: handleUpdateCase, - }); + const { pushButton, pushCallouts } = usePushToService({ + caseId: caseData.id, + caseStatus: caseData.status, + isNew: caseUserActions.filter(cua => cua.action === 'push-to-service').length === 0, + updateCase: handleUpdateCase, + }); - const onSubmitTags = useCallback(newTags => onUpdateField('tags', newTags), [onUpdateField]); - const onSubmitTitle = useCallback(newTitle => onUpdateField('title', newTitle), [onUpdateField]); - const toggleStatusCase = useCallback( - e => onUpdateField('status', e.target.checked ? 'closed' : 'open'), - [onUpdateField] - ); - const spyState = useMemo(() => ({ caseTitle: caseData.title }), [caseData.title]); + const onSubmitTags = useCallback(newTags => onUpdateField('tags', newTags), [onUpdateField]); + const onSubmitTitle = useCallback(newTitle => onUpdateField('title', newTitle), [ + onUpdateField, + ]); + const toggleStatusCase = useCallback( + e => onUpdateField('status', e.target.checked ? 'closed' : 'open'), + [onUpdateField] + ); + const handleRefresh = useCallback(() => { + fetchCaseUserActions(caseData.id); + fetchCase(); + }, [caseData.id, fetchCase, fetchCaseUserActions]); - const caseStatusData = useMemo( - () => - caseData.status === 'open' - ? { - 'data-test-subj': 'case-view-createdAt', - value: caseData.createdAt, - title: i18n.CASE_OPENED, - buttonLabel: i18n.CLOSE_CASE, - status: caseData.status, - icon: 'folderCheck', - badgeColor: 'secondary', - isSelected: false, - } - : { - 'data-test-subj': 'case-view-closedAt', - value: caseData.closedAt ?? '', - title: i18n.CASE_CLOSED, - buttonLabel: i18n.REOPEN_CASE, - status: caseData.status, - icon: 'folderExclamation', - badgeColor: 'danger', - isSelected: true, - }, - [caseData.closedAt, caseData.createdAt, caseData.status] - ); - const emailContent = useMemo( - () => ({ - subject: i18n.EMAIL_SUBJECT(caseData.title), - body: i18n.EMAIL_BODY(caseLink), - }), - [caseLink, caseData.title] - ); + const spyState = useMemo(() => ({ caseTitle: caseData.title }), [caseData.title]); - useEffect(() => { - if (initLoadingData && !isLoadingUserActions) { - setInitLoadingData(false); - } - }, [initLoadingData, isLoadingUserActions]); + const caseStatusData = useMemo( + () => + caseData.status === 'open' + ? { + 'data-test-subj': 'case-view-createdAt', + value: caseData.createdAt, + title: i18n.CASE_OPENED, + buttonLabel: i18n.CLOSE_CASE, + status: caseData.status, + icon: 'folderCheck', + badgeColor: 'secondary', + isSelected: false, + } + : { + 'data-test-subj': 'case-view-closedAt', + value: caseData.closedAt ?? '', + title: i18n.CASE_CLOSED, + buttonLabel: i18n.REOPEN_CASE, + status: caseData.status, + icon: 'folderExclamation', + badgeColor: 'danger', + isSelected: true, + }, + [caseData.closedAt, caseData.createdAt, caseData.status] + ); + const emailContent = useMemo( + () => ({ + subject: i18n.EMAIL_SUBJECT(caseData.title), + body: i18n.EMAIL_BODY(caseLink), + }), + [caseLink, caseData.title] + ); - return ( - <> - - - } - title={caseData.title} - > - - - - + useEffect(() => { + if (initLoadingData && !isLoadingUserActions) { + setInitLoadingData(false); + } + }, [initLoadingData, isLoadingUserActions]); + + return ( + <> - {pushCallouts != null && pushCallouts} - - - {initLoadingData && } - {!initLoadingData && ( - <> - - - - - - - {hasDataToPush && {pushButton}} - - - )} - - - - - - - + } + title={caseData.title} + > + + - - - - ); -}); + + + {pushCallouts != null && pushCallouts} + + + {initLoadingData && } + {!initLoadingData && ( + <> + + + + + + + {hasDataToPush && {pushButton}} + + + )} + + + + + + + + + + + + ); + } +); export const CaseView = React.memo(({ caseId }: Props) => { - const { data, isLoading, isError } = useGetCase(caseId); + const { data, isLoading, isError, fetchCase, updateCase } = useGetCase(caseId); if (isError) { return null; } @@ -294,7 +316,9 @@ export const CaseView = React.memo(({ caseId }: Props) => { ); } - return ; + return ( + + ); }); CaseComponent.displayName = 'CaseComponent'; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/translations.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/translations.ts index c081567e3be72..3fc963fc23102 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/translations.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/translations.ts @@ -34,6 +34,14 @@ export const REMOVED_FIELD = i18n.translate('xpack.siem.case.caseView.actionLabe defaultMessage: 'removed', }); +export const VIEW_INCIDENT = (incidentNumber: string) => + i18n.translate('xpack.siem.case.caseView.actionLabel.viewIncident', { + defaultMessage: 'View {incidentNumber}', + values: { + incidentNumber, + }, + }); + export const PUSHED_NEW_INCIDENT = i18n.translate( 'xpack.siem.case.caseView.actionLabel.pushedNewIncident', { @@ -95,6 +103,10 @@ export const CASE_CLOSED = i18n.translate('xpack.siem.case.caseView.caseClosed', defaultMessage: 'Case closed', }); +export const CASE_REFRESH = i18n.translate('xpack.siem.case.caseView.caseRefresh', { + defaultMessage: 'Refresh case', +}); + export const EMAIL_SUBJECT = (caseTitle: string) => i18n.translate('xpack.siem.case.caseView.emailSubject', { values: { caseTitle }, diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/index.tsx index 5f99ec362cd5e..a1f24275df6cd 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/index.tsx @@ -4,7 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useReducer, useCallback, useEffect, useState } from 'react'; +import React, { + useReducer, + useCallback, + useEffect, + useState, + Dispatch, + SetStateAction, +} from 'react'; import styled, { css } from 'styled-components'; import { @@ -14,8 +21,9 @@ import { EuiCallOut, EuiBottomBar, EuiButtonEmpty, + EuiText, } from '@elastic/eui'; -import { isEmpty } from 'lodash/fp'; +import { isEmpty, difference } from 'lodash/fp'; import { useKibana } from '../../../../lib/kibana'; import { useConnectors } from '../../../../containers/case/configure/use_connectors'; import { useCaseConfigure } from '../../../../containers/case/configure/use_configure'; @@ -40,7 +48,7 @@ import { ClosureOptions } from '../configure_cases/closure_options'; import { Mapping } from '../configure_cases/mapping'; import { SectionWrapper } from '../wrappers'; import { navTabs } from '../../../../pages/home/home_navigations'; -import { configureCasesReducer, State } from './reducer'; +import { configureCasesReducer, State, CurrentConfiguration } from './reducer'; import * as i18n from './translations'; const FormWrapper = styled.div` @@ -58,6 +66,7 @@ const initialState: State = { connectorId: 'none', closureType: 'close-by-user', mapping: null, + currentConfiguration: { connectorId: 'none', closureType: 'close-by-user' }, }; const actionTypes: ActionType[] = [ @@ -83,14 +92,20 @@ const ConfigureCasesComponent: React.FC = () => { ); const [actionBarVisible, setActionBarVisible] = useState(false); + const [totalConfigurationChanges, setTotalConfigurationChanges] = useState(0); - const handleShowAddFlyout = useCallback(() => setAddFlyoutVisibility(true), []); - - const [{ connectorId, closureType, mapping }, dispatch] = useReducer( + const [{ connectorId, closureType, mapping, currentConfiguration }, dispatch] = useReducer( configureCasesReducer(), initialState ); + const setCurrentConfiguration = useCallback((configuration: CurrentConfiguration) => { + dispatch({ + type: 'setCurrentConfiguration', + currentConfiguration: { ...configuration }, + }); + }, []); + const setConnectorId = useCallback((newConnectorId: string) => { dispatch({ type: 'setConnectorId', @@ -115,6 +130,7 @@ const ConfigureCasesComponent: React.FC = () => { const { loading: loadingCaseConfigure, persistLoading, persistCaseConfigure } = useCaseConfigure({ setConnector: setConnectorId, setClosureType, + setCurrentConfiguration, }); const { loading: isLoadingConnectors, connectors, refetchConnectors } = useConnectors(); @@ -137,16 +153,47 @@ const ConfigureCasesComponent: React.FC = () => { [connectorId, connectors, closureType, mapping] ); - const onChangeConnector = useCallback((newConnectorId: string) => { - setActionBarVisible(true); - setConnectorId(newConnectorId); + const onClickAddConnector = useCallback(() => { + setActionBarVisible(false); + setAddFlyoutVisibility(true); }, []); - const onChangeClosureType = useCallback((newClosureType: ClosureType) => { - setActionBarVisible(true); - setClosureType(newClosureType); + const onClickUpdateConnector = useCallback(() => { + setActionBarVisible(false); + setEditFlyoutVisibility(true); }, []); + const handleActionBar = useCallback(() => { + const unsavedChanges = difference(Object.values(currentConfiguration), [ + connectorId, + closureType, + ]).length; + + if (unsavedChanges === 0) { + setActionBarVisible(false); + } else { + setActionBarVisible(true); + } + + setTotalConfigurationChanges(unsavedChanges); + }, [currentConfiguration, connectorId, closureType]); + + const handleSetAddFlyoutVisibility = useCallback( + (isVisible: boolean) => { + handleActionBar(); + setAddFlyoutVisibility(isVisible); + }, + [currentConfiguration, connectorId, closureType] + ); + + const handleSetEditFlyoutVisibility = useCallback( + (isVisible: boolean) => { + handleActionBar(); + setEditFlyoutVisibility(isVisible); + }, + [currentConfiguration, connectorId, closureType] + ); + useEffect(() => { if ( !isEmpty(connectors) && @@ -188,6 +235,10 @@ const ConfigureCasesComponent: React.FC = () => { } }, [connectors, connectorId]); + useEffect(() => { + handleActionBar(); + }, [connectors, connectorId, closureType, currentConfiguration]); + return ( {!connectorIsValid && ( @@ -202,8 +253,8 @@ const ConfigureCasesComponent: React.FC = () => { connectors={connectors ?? []} disabled={persistLoading || isLoadingConnectors} isLoading={isLoadingConnectors} - onChangeConnector={onChangeConnector} - handleShowAddFlyout={handleShowAddFlyout} + onChangeConnector={setConnectorId} + handleShowAddFlyout={onClickAddConnector} selectedConnector={connectorId} /> @@ -211,7 +262,7 @@ const ConfigureCasesComponent: React.FC = () => { @@ -220,12 +271,17 @@ const ConfigureCasesComponent: React.FC = () => { updateConnectorDisabled={updateConnectorDisabled} mapping={mapping} onChangeMapping={setMapping} - setEditFlyoutVisibility={setEditFlyoutVisibility} + setEditFlyoutVisibility={onClickUpdateConnector} /> {actionBarVisible && ( - + + + + {i18n.UNSAVED_CHANGES(totalConfigurationChanges)} + + @@ -269,7 +325,7 @@ const ConfigureCasesComponent: React.FC = () => { > >} actionTypes={actionTypes} /> {editedConnectorItem && ( @@ -277,7 +333,9 @@ const ConfigureCasesComponent: React.FC = () => { key={editedConnectorItem.id} initialConnector={editedConnectorItem} editFlyoutVisible={editFlyoutVisible} - setEditFlyoutVisibility={setEditFlyoutVisibility} + setEditFlyoutVisibility={ + handleSetEditFlyoutVisibility as Dispatch> + } /> )} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx index 2600a9f4e13ac..8cba73d1249df 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback } from 'react'; +import React from 'react'; import styled from 'styled-components'; import { @@ -25,7 +25,7 @@ interface MappingProps { updateConnectorDisabled: boolean; mapping: CasesConfigurationMapping[] | null; onChangeMapping: (newMapping: CasesConfigurationMapping[]) => void; - setEditFlyoutVisibility: React.Dispatch>; + setEditFlyoutVisibility: () => void; } const EuiButtonEmptyExtended = styled(EuiButtonEmpty)` @@ -40,8 +40,6 @@ const MappingComponent: React.FC = ({ onChangeMapping, setEditFlyoutVisibility, }) => { - const onClick = useCallback(() => setEditFlyoutVisibility(true), []); - return ( = ({ - + {i18n.UPDATE_CONNECTOR} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/reducer.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/reducer.ts index f9e4a73b3c396..f6b9d38a76de3 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/reducer.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/reducer.ts @@ -13,9 +13,19 @@ export interface State { mapping: CasesConfigurationMapping[] | null; connectorId: string; closureType: ClosureType; + currentConfiguration: CurrentConfiguration; +} + +export interface CurrentConfiguration { + connectorId: State['connectorId']; + closureType: State['closureType']; } export type Action = + | { + type: 'setCurrentConfiguration'; + currentConfiguration: CurrentConfiguration; + } | { type: 'setConnectorId'; connectorId: string; @@ -31,6 +41,12 @@ export type Action = export const configureCasesReducer = () => (state: State, action: Action) => { switch (action.type) { + case 'setCurrentConfiguration': { + return { + ...state, + currentConfiguration: { ...action.currentConfiguration }, + }; + } case 'setConnectorId': { return { ...state, diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/translations.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/translations.ts index dd9bf82fb0b0d..d1f04a34b7bad 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/translations.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/configure_cases/translations.ts @@ -104,7 +104,7 @@ export const FIELD_MAPPING_FIRST_COL = i18n.translate( export const FIELD_MAPPING_SECOND_COL = i18n.translate( 'xpack.siem.case.configureCases.fieldMappingSecondCol', { - defaultMessage: 'Third-party incident field', + defaultMessage: 'External incident field', } ); @@ -190,3 +190,10 @@ export const FIELD_MAPPING_FIELD_COMMENTS = i18n.translate( export const UPDATE_CONNECTOR = i18n.translate('xpack.siem.case.configureCases.updateConnector', { defaultMessage: 'Update connector', }); + +export const UNSAVED_CHANGES = (unsavedChanges: number): string => { + return i18n.translate('xpack.siem.case.configureCases.unsavedChanges', { + values: { unsavedChanges }, + defaultMessage: '{unsavedChanges} unsaved changes', + }); +}; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx index 20712c3c5a815..740909db408ec 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx @@ -15,7 +15,7 @@ import { import styled, { css } from 'styled-components'; import { Redirect } from 'react-router-dom'; -import { CaseRequest } from '../../../../../../../../plugins/case/common/api'; +import { CasePostRequest } from '../../../../../../../../plugins/case/common/api'; import { Field, Form, getUseField, useForm, UseField } from '../../../../shared_imports'; import { usePostCase } from '../../../../containers/case/use_post_case'; import { schema } from './schema'; @@ -45,9 +45,8 @@ const MySpinner = styled(EuiLoadingSpinner)` z-index: 99; `; -const initialCaseValue: CaseRequest = { +const initialCaseValue: CasePostRequest = { description: '', - status: 'open', tags: [], title: '', }; @@ -55,12 +54,12 @@ const initialCaseValue: CaseRequest = { export const Create = React.memo(() => { const { caseData, isLoading, postCase } = usePostCase(); const [isCancel, setIsCancel] = useState(false); - const { form } = useForm({ + const { form } = useForm({ defaultValue: initialCaseValue, options: { stripEmptyFields: false }, schema, }); - const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( + const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'description' ); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx index 91d3b77493b03..4653dbc67d5a1 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CaseRequest } from '../../../../../../../../plugins/case/common/api'; +import { CasePostRequest } from '../../../../../../../../plugins/case/common/api'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; import * as i18n from '../../translations'; @@ -18,7 +18,7 @@ export const schemaTags = { labelAppend: OptionalFieldLabel, }; -export const schema: FormSchema = { +export const schema: FormSchema = { title: { type: FIELD_TYPES.TEXT, label: i18n.NAME, diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx index d8b9ac115426a..75013c0afde5d 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx @@ -11,7 +11,7 @@ import styled from 'styled-components'; import * as i18n from '../case_view/translations'; -import { Case, CaseUserActions, Comment } from '../../../../containers/case/types'; +import { Case, CaseUserActions } from '../../../../containers/case/types'; import { useUpdateComment } from '../../../../containers/case/use_update_comment'; import { useCurrentUser } from '../../../../lib/kibana'; import { AddComment } from '../add_comment'; @@ -28,6 +28,7 @@ export interface UserActionTreeProps { isLoadingUserActions: boolean; lastIndexPushToService: number; onUpdateField: (updateKey: keyof Case, updateValue: string | string[]) => void; + updateCase: (newCase: Case) => void; } const MyEuiFlexGroup = styled(EuiFlexGroup)` @@ -47,14 +48,13 @@ export const UserActionTree = React.memo( isLoadingUserActions, lastIndexPushToService, onUpdateField, + updateCase, }: UserActionTreeProps) => { const { commentId } = useParams(); const handlerTimeoutId = useRef(0); const [initLoading, setInitLoading] = useState(true); const [selectedOutlineCommentId, setSelectedOutlineCommentId] = useState(''); - const { comments, isLoadingIds, updateComment, addPostedComment } = useUpdateComment( - caseData.comments - ); + const { isLoadingIds, patchComment } = useUpdateComment(); const currentUser = useCurrentUser(); const [manageMarkdownEditIds, setManangeMardownEditIds] = useState([]); const [insertQuote, setInsertQuote] = useState(null); @@ -71,16 +71,18 @@ export const UserActionTree = React.memo( ); const handleSaveComment = useCallback( - (id: string, content: string) => { + ({ id, version }: { id: string; version: string }, content: string) => { handleManageMarkdownEditId(id); - updateComment({ + patchComment({ caseId: caseData.id, commentId: id, commentUpdate: content, fetchUserActions, + version, + updateCase, }); }, - [handleManageMarkdownEditId, updateComment] + [caseData, handleManageMarkdownEditId, patchComment, updateCase] ); const handleOutlineComment = useCallback( @@ -117,11 +119,11 @@ export const UserActionTree = React.memo( ); const handleUpdate = useCallback( - (comment: Comment) => { - addPostedComment(comment); + (newCase: Case) => { + updateCase(newCase); fetchUserActions(); }, - [addPostedComment, fetchUserActions] + [fetchUserActions, updateCase] ); const MarkdownDescription = useMemo( @@ -176,12 +178,12 @@ export const UserActionTree = React.memo( markdown={MarkdownDescription} onEdit={handleManageMarkdownEditId.bind(null, DESCRIPTION_ID)} onQuote={handleManageQuote.bind(null, caseData.description)} - userName={caseData.createdBy.username} + username={caseData.createdBy.username} /> {caseUserActions.map((action, index) => { if (action.commentId != null && action.action === 'create') { - const comment = comments.find(c => c.id === action.commentId); + const comment = caseData.comments.find(c => c.id === action.commentId); if (comment != null) { return ( } onEdit={handleManageMarkdownEditId.bind(null, comment.id)} onQuote={handleManageQuote.bind(null, comment.comment)} outlineComment={handleOutlineComment} - userName={comment.createdBy.username} + username={comment.createdBy.username} updatedAt={comment.updatedAt} /> ); @@ -243,7 +248,7 @@ export const UserActionTree = React.memo( index === lastIndexPushToService && index < caseUserActions.length - 1 } - userName={action.actionBy.username} + username={action.actionBy.username} /> ); } @@ -263,7 +268,7 @@ export const UserActionTree = React.memo( isLoading={isLoadingIds.includes(NEW_ID)} fullName={currentUser != null ? currentUser.fullName : ''} markdown={MarkdownNewComment} - userName={currentUser != null ? currentUser.username : ''} + username={currentUser != null ? currentUser.username : ''} /> ); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx index c1dbe3b5fdbfa..cc36e791e35b4 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx @@ -28,11 +28,11 @@ interface UserActionItemProps { labelQuoteAction?: string; labelTitle?: JSX.Element; linkId?: string | null; - fullName: string; + fullName?: string | null; markdown?: React.ReactNode; onEdit?: (id: string) => void; onQuote?: (id: string) => void; - userName: string; + username: string; updatedAt?: string | null; outlineComment?: (id: string) => void; showBottomFooter?: boolean; @@ -125,15 +125,15 @@ export const UserActionItem = ({ outlineComment, showBottomFooter, showTopFooter, - userName, + username, updatedAt, }: UserActionItemProps) => ( - {fullName.length > 0 || userName.length > 0 ? ( - + {(fullName && fullName.length > 0) || username.length > 0 ? ( + ) : ( )} @@ -154,7 +154,7 @@ export const UserActionItem = ({ labelQuoteAction={labelQuoteAction} labelTitle={labelTitle ?? <>} linkId={linkId} - userName={userName} + username={username} updatedAt={updatedAt} onEdit={onEdit} onQuote={onQuote} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx index 391f54da7e972..94185cb4d130c 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx @@ -34,7 +34,7 @@ interface UserActionTitleProps { labelTitle: JSX.Element; linkId?: string | null; updatedAt?: string | null; - userName: string; + username: string; onEdit?: (id: string) => void; onQuote?: (id: string) => void; outlineComment?: (id: string) => void; @@ -48,7 +48,7 @@ export const UserActionTitle = ({ labelQuoteAction, labelTitle, linkId, - userName, + username, updatedAt, onEdit, onQuote, @@ -105,7 +105,7 @@ export const UserActionTitle = ({ - {userName} + {username} {labelTitle} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_list/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_list/index.tsx index 9ace36eea1e9e..3109f2382c362 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_list/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_list/index.tsx @@ -12,6 +12,7 @@ import { EuiAvatar, EuiFlexGroup, EuiFlexItem, + EuiLoadingSpinner, } from '@elastic/eui'; import styled, { css } from 'styled-components'; import { ElasticUser } from '../../../../containers/case/types'; @@ -22,6 +23,7 @@ interface UserListProps { body: string; }; headline: string; + loading?: boolean; users: ElasticUser[]; } @@ -67,7 +69,7 @@ const renderUsers = ( )); }; -export const UserList = React.memo(({ email, headline, users }: UserListProps) => { +export const UserList = React.memo(({ email, headline, loading, users }: UserListProps) => { const handleSendEmail = useCallback( (emailAddress: string | undefined | null) => { if (emailAddress && emailAddress != null) { @@ -80,6 +82,13 @@ export const UserList = React.memo(({ email, headline, users }: UserListProps) =

{headline}

+ {loading && ( + + + + + + )} {renderUsers(users, handleSendEmail)}
); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx index 8458b32368525..4003b71b95d77 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx @@ -300,7 +300,9 @@ export const AllRules = React.memo( - {i18n.SHOWING_RULES(pagination.total ?? 0)} + + {i18n.SHOWING_RULES(pagination.total ?? 0)} + diff --git a/x-pack/legacy/plugins/siem/public/pages/timelines/timelines_page.tsx b/x-pack/legacy/plugins/siem/public/pages/timelines/timelines_page.tsx index 73070d2b94aac..a269c46208edf 100644 --- a/x-pack/legacy/plugins/siem/public/pages/timelines/timelines_page.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/timelines/timelines_page.tsx @@ -28,6 +28,7 @@ type OwnProps = TimelinesProps; export const DEFAULT_SEARCH_RESULTS_PER_PAGE = 10; + export const TimelinesPageComponent: React.FC = ({ apolloClient }) => { const [importDataModalToggle, setImportDataModalToggle] = useState(false); const onImportTimelineBtnClick = useCallback(() => { diff --git a/x-pack/legacy/plugins/spaces/public/legacy.ts b/x-pack/legacy/plugins/spaces/public/legacy.ts index c6740dae81717..277d6a10547b2 100644 --- a/x-pack/legacy/plugins/spaces/public/legacy.ts +++ b/x-pack/legacy/plugins/spaces/public/legacy.ts @@ -4,22 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { SavedObjectsManagementAction } from 'src/legacy/core_plugins/management/public'; import { npSetup } from 'ui/new_platform'; import routes from 'ui/routes'; import { SpacesPluginSetup } from '../../../../plugins/spaces/public'; -import { setup as managementSetup } from '../../../../../src/legacy/core_plugins/management/public/legacy'; - -const legacyAPI = { - registerSavedObjectsManagementAction: (action: SavedObjectsManagementAction) => { - managementSetup.savedObjects.registry.register(action); - }, -}; const spaces = (npSetup.plugins as any).spaces as SpacesPluginSetup; if (spaces) { - spaces.registerLegacyAPI(legacyAPI); - routes.when('/management/spaces/list', { redirectTo: '/management/kibana/spaces' }); routes.when('/management/spaces/create', { redirectTo: '/management/kibana/spaces/create' }); routes.when('/management/spaces/edit/:spaceId', { diff --git a/x-pack/legacy/plugins/uptime/common/graphql/types.ts b/x-pack/legacy/plugins/uptime/common/graphql/types.ts index bd017e6cfaf4c..c8beb91d807d5 100644 --- a/x-pack/legacy/plugins/uptime/common/graphql/types.ts +++ b/x-pack/legacy/plugins/uptime/common/graphql/types.ts @@ -8,7 +8,6 @@ // Scalars // ==================================================== - export type UnsignedInteger = any; // ==================================================== @@ -367,7 +366,6 @@ export interface DocCount { count: UnsignedInteger; } - export interface Snapshot { counts: SnapshotCount; } @@ -380,7 +378,6 @@ export interface SnapshotCount { total: number; } - /** The primary object returned for monitor states. */ export interface MonitorSummaryResult { /** Used to go to the next page of results */ @@ -524,7 +521,6 @@ export interface SummaryHistogramPoint { down: number; } - export interface AllPingsQueryArgs { /** Optional: the direction to sort by. Accepts 'asc' and 'desc'. Defaults to 'desc'. */ sort?: string | null; @@ -540,6 +536,7 @@ export interface AllPingsQueryArgs { dateRangeEnd: string; /** Optional: agent location to filter by. */ location?: string | null; + page?: number; } export interface GetMonitorStatesQueryArgs { diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx index 11f6565734782..cfed52f4e5d27 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx @@ -8,13 +8,13 @@ import React, { useEffect, useState, useContext, useRef } from 'react'; import uuid from 'uuid'; import styled from 'styled-components'; +import { ViewMode } from '../../../../../../../../../src/plugins/embeddable/public'; import { start } from '../../../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy'; import * as i18n from './translations'; -// @ts-ignore -import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../maps/common/constants'; +import { MapEmbeddable, MapEmbeddableInput } from '../../../../../../maps/public'; +import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../../../plugins/maps/public'; import { Location } from '../../../../../common/runtime_types'; -import { MapEmbeddable } from './types'; import { getLayerList } from './map_config'; import { UptimeThemeContext } from '../../../../contexts'; @@ -49,7 +49,7 @@ export const EmbeddedMap = React.memo(({ upPoints, downPoints }: EmbeddedMapProp const embeddableRoot: React.RefObject = useRef(null); const factory = start.getEmbeddableFactory(MAP_SAVED_OBJECT_TYPE); - const input = { + const input: MapEmbeddableInput = { id: uuid.v4(), filters: [], hidePanelTitles: true, @@ -57,7 +57,7 @@ export const EmbeddedMap = React.memo(({ upPoints, downPoints }: EmbeddedMapProp value: 0, pause: false, }, - viewMode: 'view', + viewMode: ViewMode.VIEW, isLayerTOCOpen: false, hideFilterActions: true, // Zoom Lat/Lon values are set to make sure map is in center in the panel diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/types.ts b/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/types.ts deleted file mode 100644 index 03cb33c3459d2..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Query } from 'src/plugins/data/common'; -import { TimeRange } from 'src/plugins/data/public'; -import { - EmbeddableInput, - EmbeddableOutput, - IEmbeddable, -} from '../../../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; - -import { Filter } from '../../../../../../../../../src/plugins/data/public'; - -export interface MapEmbeddableInput extends EmbeddableInput { - filters: Filter[]; - query: Query; - refreshConfig: { - isPaused: boolean; - interval: number; - }; - timeRange?: TimeRange; -} - -export interface CustomProps { - setLayerList: Function; -} - -export type MapEmbeddable = IEmbeddable & CustomProps; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap index d19de73c16c5f..2e59ec5e57337 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap +++ b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap @@ -364,17 +364,16 @@ exports[`PingList component renders sorted list without errors 1`] = ` onChange={[Function]} pagination={ Object { - "initialPageSize": 20, + "initialPageSize": 25, "pageIndex": 0, - "pageSize": 30, + "pageSize": 10, "pageSizeOptions": Array [ - 5, 10, - 20, + 25, 50, 100, ], - "totalItemCount": 30, + "totalItemCount": 9231, } } responsive={true} diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx index 36586b182de43..68d285bd0baf1 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx @@ -204,9 +204,11 @@ describe('PingList component', () => { loading={false} data={{ allPings }} onPageCountChange={jest.fn()} + onPageIndexChange={jest.fn()} onSelectedLocationChange={(_loc: any[]) => {}} onSelectedStatusChange={jest.fn()} - pageSize={30} + pageIndex={0} + pageSize={10} selectedOption="down" selectedLocation={AllLocationOption.value} /> diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx index d245bc1456e6a..19768c7104e91 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx @@ -41,7 +41,9 @@ interface PingListProps { onSelectedStatusChange: (status: string | undefined) => void; onSelectedLocationChange: (location: any) => void; onPageCountChange: (itemCount: number) => void; + onPageIndexChange: (index: number) => void; pageSize: number; + pageIndex: number; selectedOption: string; selectedLocation: string | undefined; } @@ -78,8 +80,10 @@ export const PingListComponent = ({ data, loading, onPageCountChange, + onPageIndexChange, onSelectedLocationChange, onSelectedStatusChange, + pageIndex, pageSize, selectedOption, selectedLocation, @@ -232,15 +236,11 @@ export const PingListComponent = ({ ]; const pagination: Pagination = { - initialPageSize: 20, - pageIndex: 0, + initialPageSize: 25, + pageIndex, pageSize, - pageSizeOptions: [5, 10, 20, 50, 100], - /** - * we're not currently supporting pagination in this component - * so the first page is the only page - */ - totalItemCount: pageSize, + pageSizeOptions: [10, 25, 50, 100], + totalItemCount: data?.allPings?.total ?? pageSize, }; return ( @@ -323,9 +323,10 @@ export const PingListComponent = ({ itemId="id" itemIdToExpandedRowMap={itemIdToExpandedRowMap} pagination={pagination} - onChange={(criteria: CriteriaWithPagination) => - onPageCountChange(criteria.page!.size) - } + onChange={(criteria: CriteriaWithPagination) => { + onPageCountChange(criteria.page!.size); + onPageIndexChange(criteria.page!.index); + }} /> diff --git a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx b/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx index 5871783dffdeb..3de636cac6ecd 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx @@ -51,6 +51,7 @@ export const MonitorPageComponent: React.FC = ({ const { dateRangeStart, dateRangeEnd, selectedPingStatus } = params; const [selectedLocation, setSelectedLocation] = useState(undefined); + const [pingListIndex, setPingListIndex] = useState(0); const sharedVariables = { dateRangeStart, @@ -81,11 +82,14 @@ export const MonitorPageComponent: React.FC = ({ updateUrlParams({ selectedPingStatus: selectedStatus || '' }); refreshApp(); }} + onPageIndexChange={(index: number) => setPingListIndex(index)} + pageIndex={pingListIndex} pageSize={pingListPageCount} selectedOption={selectedPingStatus} selectedLocation={selectedLocation} variables={{ ...sharedVariables, + page: pingListIndex, size: pingListPageCount, status: selectedPingStatus, }} diff --git a/x-pack/legacy/plugins/uptime/public/queries/pings_query.ts b/x-pack/legacy/plugins/uptime/public/queries/pings_query.ts index 203c7ef426c19..ed20fe8eb2931 100644 --- a/x-pack/legacy/plugins/uptime/public/queries/pings_query.ts +++ b/x-pack/legacy/plugins/uptime/public/queries/pings_query.ts @@ -15,6 +15,7 @@ query PingList( $sort: String $size: Int $location: String + $page: Int ) { allPings( dateRangeStart: $dateRangeStart @@ -24,6 +25,7 @@ query PingList( sort: $sort size: $size location: $location + page: $page ) { total locations diff --git a/x-pack/package.json b/x-pack/package.json index 1677748e4c9e1..2072b6d8d46e9 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -232,7 +232,7 @@ "dedent": "^0.7.0", "del": "^5.1.0", "dragselect": "1.13.1", - "elasticsearch": "^16.5.0", + "elasticsearch": "^16.7.0", "extract-zip": "^1.7.0", "file-saver": "^1.3.8", "file-type": "^10.9.0", diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/action_handlers.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/action_handlers.test.ts index 2712b8f6ea9b5..aa9b1dcfcf239 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/action_handlers.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/action_handlers.test.ts @@ -226,15 +226,19 @@ describe('handleUpdateIncident', () => { const res = await handleUpdateIncident({ incidentId: '123', serviceNow, - params, + params: { + ...params, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, + }, comments: [], mapping: finalMapping, }); expect(serviceNow.updateIncident).toHaveBeenCalled(); expect(serviceNow.updateIncident).toHaveBeenCalledWith('123', { - short_description: 'a title (updated at 2020-03-13T08:34:53.450Z by Elastic User)', - description: 'a description (updated at 2020-03-13T08:34:53.450Z by Elastic User)', + short_description: 'a title (updated at 2020-03-15T08:34:53.450Z by Another User)', + description: 'a description (updated at 2020-03-15T08:34:53.450Z by Another User)', }); expect(serviceNow.updateIncident).toHaveReturned(); expect(serviceNow.batchCreateComments).not.toHaveBeenCalled(); @@ -256,7 +260,11 @@ describe('handleUpdateIncident', () => { const res = await handleUpdateIncident({ incidentId: '123', serviceNow, - params, + params: { + ...params, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, + }, comments: [ { comment: 'first comment', @@ -278,10 +286,10 @@ describe('handleUpdateIncident', () => { fullName: 'Elastic User', username: 'elastic', }, - updatedAt: '2020-03-13T08:34:53.450Z', + updatedAt: '2020-03-16T08:34:53.450Z', updatedBy: { - fullName: 'Elastic User', - username: 'elastic', + fullName: 'Another User', + username: 'anotherUser', }, version: 'WzU3LDFd', }, @@ -291,8 +299,8 @@ describe('handleUpdateIncident', () => { expect(serviceNow.updateIncident).toHaveBeenCalled(); expect(serviceNow.updateIncident).toHaveBeenCalledWith('123', { - description: 'a description (updated at 2020-03-13T08:34:53.450Z by Elastic User)', - short_description: 'a title (updated at 2020-03-13T08:34:53.450Z by Elastic User)', + description: 'a description (updated at 2020-03-15T08:34:53.450Z by Another User)', + short_description: 'a title (updated at 2020-03-15T08:34:53.450Z by Another User)', }); expect(serviceNow.updateIncident).toHaveReturned(); expect(serviceNow.batchCreateComments).toHaveBeenCalled(); @@ -312,17 +320,17 @@ describe('handleUpdateIncident', () => { version: 'WzU3LDFd', }, { - comment: 'second comment (added at 2020-03-13T08:34:53.450Z by Elastic User)', + comment: 'second comment (added at 2020-03-16T08:34:53.450Z by Another User)', commentId: '789', createdAt: '2020-03-13T08:34:53.450Z', createdBy: { fullName: 'Elastic User', username: 'elastic', }, - updatedAt: '2020-03-13T08:34:53.450Z', + updatedAt: '2020-03-16T08:34:53.450Z', updatedBy: { - fullName: 'Elastic User', - username: 'elastic', + fullName: 'Another User', + username: 'anotherUser', }, version: 'WzU3LDFd', }, diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.test.ts index ce8c3542ab69f..cbcefe6364e8f 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.test.ts @@ -191,13 +191,21 @@ describe('transformFields', () => { test('transform fields for update correctly', () => { const fields = prepareFieldsForTransformation({ - params: fullParams, + params: { + ...fullParams, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { username: 'anotherUser', fullName: 'Another User' }, + }, mapping: finalMapping, defaultPipes: ['informationUpdated'], }); const res = transformFields({ - params: fullParams, + params: { + ...fullParams, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { username: 'anotherUser', fullName: 'Another User' }, + }, fields, currentIncident: { short_description: 'first title (created at 2020-03-13T08:34:53.450Z by Elastic User)', @@ -205,9 +213,9 @@ describe('transformFields', () => { }, }); expect(res).toEqual({ - short_description: 'a title (updated at 2020-03-13T08:34:53.450Z by Elastic User)', + short_description: 'a title (updated at 2020-03-15T08:34:53.450Z by Another User)', description: - 'first description (created at 2020-03-13T08:34:53.450Z by Elastic User) \r\na description (updated at 2020-03-13T08:34:53.450Z by Elastic User)', + 'first description (created at 2020-03-13T08:34:53.450Z by Elastic User) \r\na description (updated at 2020-03-15T08:34:53.450Z by Another User)', }); }); @@ -229,7 +237,7 @@ describe('transformFields', () => { expect(res.description?.includes('\r\n')).toBe(true); }); - test('append username if fullname is undefined', () => { + test('append username if fullname is undefined when create', () => { const fields = prepareFieldsForTransformation({ params: fullParams, mapping: finalMapping, @@ -245,6 +253,32 @@ describe('transformFields', () => { description: 'a description (created at 2020-03-13T08:34:53.450Z by elastic)', }); }); + + test('append username if fullname is undefined when update', () => { + const fields = prepareFieldsForTransformation({ + params: { + ...fullParams, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { username: 'anotherUser', fullName: 'Another User' }, + }, + mapping: finalMapping, + defaultPipes: ['informationUpdated'], + }); + + const res = transformFields({ + params: { + ...fullParams, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { username: 'anotherUser', fullName: null }, + }, + fields, + }); + + expect(res).toEqual({ + short_description: 'a title (updated at 2020-03-15T08:34:53.450Z by anotherUser)', + description: 'a description (updated at 2020-03-15T08:34:53.450Z by anotherUser)', + }); + }); }); describe('appendField', () => { @@ -330,8 +364,8 @@ describe('transformComments', () => { comment: 'first comment', createdAt: '2020-03-13T08:34:53.450Z', createdBy: { fullName: 'Elastic User', username: 'elastic' }, - updatedAt: null, - updatedBy: null, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, }, ]; const res = transformComments(comments, fullParams, ['informationUpdated']); @@ -339,11 +373,11 @@ describe('transformComments', () => { { commentId: 'b5b4c4d0-574e-11ea-9e2e-21b90f8a9631', version: 'WzU3LDFd', - comment: 'first comment (updated at 2020-03-13T08:34:53.450Z by Elastic User)', + comment: 'first comment (updated at 2020-03-15T08:34:53.450Z by Another User)', createdAt: '2020-03-13T08:34:53.450Z', createdBy: { fullName: 'Elastic User', username: 'elastic' }, - updatedAt: null, - updatedBy: null, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, }, ]); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.ts index 46d4789e0bd53..750fda93b60d6 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/helpers.ts @@ -83,8 +83,11 @@ export const transformFields = ({ const transform = flow(...cur.pipes.map(p => t[p])); prev[cur.key] = transform({ value: cur.value, - date: params.createdAt, - user: params.createdBy.fullName ?? params.createdBy.username, + date: params.updatedAt ?? params.createdAt, + user: + params.updatedBy != null + ? params.updatedBy.fullName ?? params.updatedBy.username + : params.createdBy.fullName ?? params.createdBy.username, previousValue: currentIncident ? currentIncident[cur.key] : '', }).value; return prev; @@ -112,8 +115,11 @@ export const transformComments = ( ...c, comment: flow(...pipes.map(p => t[p]))({ value: c.comment, - date: params.createdAt, - user: params.createdBy.fullName ?? '', + date: c.updatedAt ?? c.createdAt, + user: + c.updatedBy != null + ? c.updatedBy.fullName ?? c.updatedBy.username + : c.createdBy.fullName ?? c.createdBy.username, }).value, })); }; diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts index 7eda7060df846..1a23354e6490d 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts @@ -226,7 +226,11 @@ describe('execute()', () => { const executorOptions: ActionTypeExecutorOptions = { actionId, config: mockOptions.config, - params: { ...mockOptions.params, executorAction: 'updateIncident' }, + params: { + ...mockOptions.params, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, + }, secrets: mockOptions.secrets, services, }; @@ -244,7 +248,11 @@ describe('execute()', () => { const executorOptions: ActionTypeExecutorOptions = { actionId, config: mockOptions.config, - params: { ...mockOptions.params, executorAction: 'updateIncident' }, + params: { + ...mockOptions.params, + updatedAt: '2020-03-15T08:34:53.450Z', + updatedBy: { fullName: 'Another User', username: 'anotherUser' }, + }, secrets: mockOptions.secrets, services, }; diff --git a/x-pack/plugins/actions/server/usage/actions_telemetry.test.ts b/x-pack/plugins/actions/server/usage/actions_telemetry.test.ts new file mode 100644 index 0000000000000..1b0fe03633531 --- /dev/null +++ b/x-pack/plugins/actions/server/usage/actions_telemetry.test.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getTotalCount } from './actions_telemetry'; + +describe('actions telemetry', () => { + test('getTotalCount should replace action types names with . to __', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue({ + aggregations: { + byActionTypeId: { + value: { + types: { '.index': 1, '.server-log': 1 }, + }, + }, + }, + hits: { + hits: [ + { + _id: 'action:541efb3d-f82a-4d2c-a5c3-636d1ce49b53', + _index: '.kibana_1', + _score: 0, + _source: { + action: { + actionTypeId: '.index', + config: { + index: 'kibana_sample_data_ecommerce', + refresh: true, + executionTimeField: null, + }, + name: 'test', + secrets: + 'UPyn6cit6zBTPMmldfKh/8S2JWypwaLhhEQWBXp+OyTc6TtLHOnW92wehCqTq1FhIY3vA8hwVsggj+tbIoCcfPArpzP5SO7hh8vd6pY13x5TkiM083UgjjaAxbPvKQ==', + }, + references: [], + type: 'action', + updated_at: '2020-03-26T18:46:44.449Z', + }, + }, + { + _id: 'action:00000000-f82a-4d2c-a5c3-636d1ce49b53', + _index: '.kibana_1', + _score: 0, + _source: { + action: { + actionTypeId: '.server-log', + config: {}, + name: 'test server log', + secrets: '', + }, + references: [], + type: 'action', + updated_at: '2020-03-26T18:46:44.449Z', + }, + }, + ], + }, + }); + + const telemetry = await getTotalCount(mockEsClient, 'test'); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + + expect(telemetry).toMatchInlineSnapshot(` +Object { + "countByType": Object { + "__index": 1, + "__server-log": 1, + }, + "countTotal": 2, +} +`); + }); +}); diff --git a/x-pack/plugins/actions/server/usage/actions_telemetry.ts b/x-pack/plugins/actions/server/usage/actions_telemetry.ts index ccdb4ecec2012..eabb38e61d17d 100644 --- a/x-pack/plugins/actions/server/usage/actions_telemetry.ts +++ b/x-pack/plugins/actions/server/usage/actions_telemetry.ts @@ -54,7 +54,13 @@ export async function getTotalCount(callCluster: APICaller, kibanaIndex: string) parseInt(searchResult.aggregations.byActionTypeId.value.types[key], 0) + total, 0 ), - countByType: searchResult.aggregations.byActionTypeId.value.types, + countByType: Object.keys(searchResult.aggregations.byActionTypeId.value.types).reduce( + (obj: any, key: string) => ({ + ...obj, + [key.replace('.', '__')]: searchResult.aggregations.byActionTypeId.value.types[key], + }), + {} + ), }; } diff --git a/x-pack/plugins/alerting/server/alerts_client.ts b/x-pack/plugins/alerting/server/alerts_client.ts index 49c80af0072c9..5538b44b69fcb 100644 --- a/x-pack/plugins/alerting/server/alerts_client.ts +++ b/x-pack/plugins/alerting/server/alerts_client.ts @@ -27,7 +27,7 @@ import { import { validateAlertTypeParams } from './lib'; import { InvalidateAPIKeyParams, - CreateAPIKeyResult as SecurityPluginCreateAPIKeyResult, + GrantAPIKeyResult as SecurityPluginGrantAPIKeyResult, InvalidateAPIKeyResult as SecurityPluginInvalidateAPIKeyResult, } from '../../../plugins/security/server'; import { EncryptedSavedObjectsPluginStart } from '../../../plugins/encrypted_saved_objects/server'; @@ -37,7 +37,7 @@ import { taskInstanceToAlertTaskInstance } from './task_runner/alert_task_instan type NormalizedAlertAction = Omit; export type CreateAPIKeyResult = | { apiKeysEnabled: false } - | { apiKeysEnabled: true; result: SecurityPluginCreateAPIKeyResult }; + | { apiKeysEnabled: true; result: SecurityPluginGrantAPIKeyResult }; export type InvalidateAPIKeyResult = | { apiKeysEnabled: false } | { apiKeysEnabled: true; result: SecurityPluginInvalidateAPIKeyResult }; diff --git a/x-pack/plugins/alerting/server/alerts_client_factory.test.ts b/x-pack/plugins/alerting/server/alerts_client_factory.test.ts index b0558ef1ea98c..4c74ca54a0d2f 100644 --- a/x-pack/plugins/alerting/server/alerts_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client_factory.test.ts @@ -17,7 +17,7 @@ jest.mock('./alerts_client'); const savedObjectsClient = savedObjectsClientMock.create(); const securityPluginSetup = { authc: { - createAPIKey: jest.fn(), + grantAPIKeyAsInternalUser: jest.fn(), getCurrentUser: jest.fn(), }, }; @@ -110,7 +110,7 @@ test('createAPIKey() returns { apiKeysEnabled: false } when security is enabled factory.create(KibanaRequest.from(fakeRequest), savedObjectsClient); const constructorCall = jest.requireMock('./alerts_client').AlertsClient.mock.calls[0][0]; - securityPluginSetup.authc.createAPIKey.mockResolvedValueOnce(null); + securityPluginSetup.authc.grantAPIKeyAsInternalUser.mockResolvedValueOnce(null); const createAPIKeyResult = await constructorCall.createAPIKey(); expect(createAPIKeyResult).toEqual({ apiKeysEnabled: false }); }); @@ -124,7 +124,10 @@ test('createAPIKey() returns an API key when security is enabled', async () => { factory.create(KibanaRequest.from(fakeRequest), savedObjectsClient); const constructorCall = jest.requireMock('./alerts_client').AlertsClient.mock.calls[0][0]; - securityPluginSetup.authc.createAPIKey.mockResolvedValueOnce({ api_key: '123', id: 'abc' }); + securityPluginSetup.authc.grantAPIKeyAsInternalUser.mockResolvedValueOnce({ + api_key: '123', + id: 'abc', + }); const createAPIKeyResult = await constructorCall.createAPIKey(); expect(createAPIKeyResult).toEqual({ apiKeysEnabled: true, @@ -141,7 +144,9 @@ test('createAPIKey() throws when security plugin createAPIKey throws an error', factory.create(KibanaRequest.from(fakeRequest), savedObjectsClient); const constructorCall = jest.requireMock('./alerts_client').AlertsClient.mock.calls[0][0]; - securityPluginSetup.authc.createAPIKey.mockRejectedValueOnce(new Error('TLS disabled')); + securityPluginSetup.authc.grantAPIKeyAsInternalUser.mockRejectedValueOnce( + new Error('TLS disabled') + ); await expect(constructorCall.createAPIKey()).rejects.toThrowErrorMatchingInlineSnapshot( `"TLS disabled"` ); diff --git a/x-pack/plugins/alerting/server/alerts_client_factory.ts b/x-pack/plugins/alerting/server/alerts_client_factory.ts index c502c0e5bf1cf..fd480658e236a 100644 --- a/x-pack/plugins/alerting/server/alerts_client_factory.ts +++ b/x-pack/plugins/alerting/server/alerts_client_factory.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import uuid from 'uuid'; import { AlertsClient } from './alerts_client'; import { AlertTypeRegistry, SpaceIdToNamespaceFunction } from './types'; import { KibanaRequest, Logger, SavedObjectsClientContract } from '../../../../src/core/server'; @@ -71,10 +70,12 @@ export class AlertsClientFactory { if (!securityPluginSetup) { return { apiKeysEnabled: false }; } - const createAPIKeyResult = await securityPluginSetup.authc.createAPIKey(request, { - name: `source: alerting, generated uuid: "${uuid.v4()}"`, - role_descriptors: {}, - }); + // Create an API key using the new grant API - in this case the Kibana system user is creating the + // API key for the user, instead of having the user create it themselves, which requires api_key + // privileges + const createAPIKeyResult = await securityPluginSetup.authc.grantAPIKeyAsInternalUser( + request + ); if (!createAPIKeyResult) { return { apiKeysEnabled: false }; } @@ -87,8 +88,7 @@ export class AlertsClientFactory { if (!securityPluginSetup) { return { apiKeysEnabled: false }; } - const invalidateAPIKeyResult = await securityPluginSetup.authc.invalidateAPIKey( - request, + const invalidateAPIKeyResult = await securityPluginSetup.authc.invalidateAPIKeyAsInternalUser( params ); // Null when Elasticsearch security is disabled diff --git a/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts b/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts new file mode 100644 index 0000000000000..171f80cf11cb8 --- /dev/null +++ b/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getTotalCountInUse } from './alerts_telemetry'; + +describe('alerts telemetry', () => { + test('getTotalCountInUse should replace action types names with . to __', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue({ + aggregations: { + byAlertTypeId: { + value: { + types: { '.index-threshold': 2 }, + }, + }, + }, + hits: { + hits: [], + }, + }); + + const telemetry = await getTotalCountInUse(mockEsClient, 'test'); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + + expect(telemetry).toMatchInlineSnapshot(` +Object { + "countByType": Object { + "__index-threshold": 2, + }, + "countTotal": 2, +} +`); + }); +}); diff --git a/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts b/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts index 9ab63b7755500..9c710fa3b3b8e 100644 --- a/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts +++ b/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts @@ -245,7 +245,13 @@ export async function getTotalCountAggregations(callCluster: APICaller, kibanaIn return { count_total: totalAlertsCount, - count_by_type: results.aggregations.byAlertTypeId.value.types, + count_by_type: Object.keys(results.aggregations.byAlertTypeId.value.types).reduce( + (obj: any, key: string) => ({ + ...obj, + [key.replace('.', '__')]: results.aggregations.byAlertTypeId.value.types[key], + }), + {} + ), throttle_time: { min: `${results.aggregations.throttleTime.value.min}s`, avg: `${ @@ -298,7 +304,13 @@ export async function getTotalCountInUse(callCluster: APICaller, kibanaInex: str parseInt(searchResult.aggregations.byAlertTypeId.value.types[key], 0) + total, 0 ), - countByType: searchResult.aggregations.byAlertTypeId.value.types, + countByType: Object.keys(searchResult.aggregations.byAlertTypeId.value.types).reduce( + (obj: any, key: string) => ({ + ...obj, + [key.replace('.', '__')]: searchResult.aggregations.byAlertTypeId.value.types[key], + }), + {} + ), }; } diff --git a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/__snapshots__/index.test.ts.snap b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/__snapshots__/index.test.ts.snap index 365d8838a24a6..0c585bec22f6c 100644 --- a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/__snapshots__/index.test.ts.snap +++ b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/__snapshots__/index.test.ts.snap @@ -2,11 +2,6 @@ exports[`settingDefinitions should have correct default values 1`] = ` Array [ - Object { - "key": "active", - "type": "boolean", - "validationName": "(\\"true\\" | \\"false\\")", - }, Object { "key": "api_request_size", "type": "bytes", @@ -105,6 +100,11 @@ Array [ "validationError": "Please specify an integer and a unit", "validationName": "durationRt", }, + Object { + "key": "recording", + "type": "boolean", + "validationName": "(\\"true\\" | \\"false\\")", + }, Object { "key": "server_timeout", "type": "duration", diff --git a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/general_settings.ts b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/general_settings.ts index b83c03c543295..6a0e2d65d1949 100644 --- a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/general_settings.ts +++ b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/general_settings.ts @@ -13,21 +13,6 @@ import { RawSettingDefinition } from './types'; * Settings added here will show up in the UI and will be validated on the client and server */ export const generalSettings: RawSettingDefinition[] = [ - // Active - { - key: 'active', - type: 'boolean', - defaultValue: 'true', - label: i18n.translate('xpack.apm.agentConfig.active.label', { - defaultMessage: 'Active' - }), - description: i18n.translate('xpack.apm.agentConfig.active.description', { - defaultMessage: - 'A boolean specifying if the agent should be active or not.\nWhen active, the agent instruments incoming HTTP requests, tracks errors and collects and sends metrics.\nWhen inactive, the agent works as a noop, not collecting data and not communicating with the APM Server.\nAs this is a reversible switch, agent threads are not being killed when inactivated, but they will be \nmostly idle in this state, so the overhead should be negligible.\n\nYou can use this setting to dynamically disable Elastic APM at runtime.' - }), - excludeAgents: ['js-base', 'rum-js', 'python', 'dotnet'] - }, - // API Request Size { key: 'api_request_size', @@ -40,7 +25,7 @@ export const generalSettings: RawSettingDefinition[] = [ 'xpack.apm.agentConfig.apiRequestSize.description', { defaultMessage: - 'The maximum total compressed size of the request body which is sent to the APM server intake api via a chunked encoding (HTTP streaming).\nNote that a small overshoot is possible.\n\nAllowed byte units are `b`, `kb` and `mb`. `1kb` is equal to `1024b`.' + 'The maximum total compressed size of the request body which is sent to the APM Server intake api via a chunked encoding (HTTP streaming).\nNote that a small overshoot is possible.\n\nAllowed byte units are `b`, `kb` and `mb`. `1kb` is equal to `1024b`.' } ), excludeAgents: ['js-base', 'rum-js', 'dotnet'] @@ -121,6 +106,20 @@ export const generalSettings: RawSettingDefinition[] = [ excludeAgents: ['js-base', 'rum-js', 'python'] }, + // Recording + { + key: 'recording', + type: 'boolean', + defaultValue: 'true', + label: i18n.translate('xpack.apm.agentConfig.recording.label', { + defaultMessage: 'Recording' + }), + description: i18n.translate('xpack.apm.agentConfig.recording.description', { + defaultMessage: + 'When recording, the agent instruments incoming HTTP requests, tracks errors, and collects and sends metrics. When inactive, the agent works as a noop, not collecting data and not communicating with the APM Server except for polling for updated configuration. As this is a reversible switch, agent threads are not being killed when inactivated, but they will be mostly idle in this state, so the overhead should be negligible. You can use this setting to dynamically control whether Elastic APM is enabled or disabled.' + }) + }, + // SERVER_TIMEOUT { key: 'server_timeout', @@ -133,7 +132,7 @@ export const generalSettings: RawSettingDefinition[] = [ 'xpack.apm.agentConfig.serverTimeout.description', { defaultMessage: - 'If a request to the APM server takes longer than the configured timeout,\nthe request is cancelled and the event (exception or transaction) is discarded.\nSet to 0 to disable timeouts.\n\nWARNING: If timeouts are disabled or set to a high value, your app could experience memory issues if the APM server times out.' + 'If a request to the APM Server takes longer than the configured timeout,\nthe request is cancelled and the event (exception or transaction) is discarded.\nSet to 0 to disable timeouts.\n\nWARNING: If timeouts are disabled or set to a high value, your app could experience memory issues if the APM Server times out.' } ), includeAgents: ['nodejs', 'java', 'go'] diff --git a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.test.ts b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.test.ts index fe55442324c92..b0255d2d828bb 100644 --- a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.test.ts +++ b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.test.ts @@ -43,12 +43,12 @@ describe('filterByAgent', () => { describe('options per agent', () => { it('go', () => { expect(getSettingKeysForAgent('go')).toEqual([ - 'active', 'api_request_size', 'api_request_time', 'capture_body', 'capture_headers', 'log_level', + 'recording', 'server_timeout', 'span_frames_min_duration', 'stack_trace_limit', @@ -59,7 +59,6 @@ describe('filterByAgent', () => { it('java', () => { expect(getSettingKeysForAgent('java')).toEqual([ - 'active', 'api_request_size', 'api_request_time', 'capture_body', @@ -72,6 +71,7 @@ describe('filterByAgent', () => { 'profiling_inferred_spans_included_classes', 'profiling_inferred_spans_min_duration', 'profiling_inferred_spans_sampling_interval', + 'recording', 'server_timeout', 'span_frames_min_duration', 'stack_trace_limit', @@ -88,24 +88,26 @@ describe('filterByAgent', () => { it('js-base', () => { expect(getSettingKeysForAgent('js-base')).toEqual([ + 'recording', 'transaction_sample_rate' ]); }); it('rum-js', () => { expect(getSettingKeysForAgent('rum-js')).toEqual([ + 'recording', 'transaction_sample_rate' ]); }); it('nodejs', () => { expect(getSettingKeysForAgent('nodejs')).toEqual([ - 'active', 'api_request_size', 'api_request_time', 'capture_body', 'capture_headers', 'log_level', + 'recording', 'server_timeout', 'stack_trace_limit', 'transaction_max_spans', @@ -119,6 +121,7 @@ describe('filterByAgent', () => { 'api_request_time', 'capture_body', 'capture_headers', + 'recording', 'span_frames_min_duration', 'transaction_max_spans', 'transaction_sample_rate' @@ -130,6 +133,7 @@ describe('filterByAgent', () => { 'capture_body', 'capture_headers', 'log_level', + 'recording', 'span_frames_min_duration', 'stack_trace_limit', 'transaction_max_spans', @@ -139,12 +143,12 @@ describe('filterByAgent', () => { it('ruby', () => { expect(getSettingKeysForAgent('ruby')).toEqual([ - 'active', 'api_request_size', 'api_request_time', 'capture_body', 'capture_headers', 'log_level', + 'recording', 'span_frames_min_duration', 'transaction_max_spans', 'transaction_sample_rate' @@ -155,6 +159,7 @@ describe('filterByAgent', () => { expect(getSettingKeysForAgent(undefined)).toEqual([ 'capture_body', 'capture_headers', + 'recording', 'transaction_max_spans', 'transaction_sample_rate' ]); diff --git a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts b/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts index 01d6a2e2e81bc..572d73e368c7a 100644 --- a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts @@ -140,4 +140,21 @@ describe('dedupeConnections', () => { // @ts-ignore expect(nodejsNode?.data[SPAN_SUBTYPE]).toBe('aa'); }); + + it('processes connections without a matching "service" aggregation', () => { + const response: ServiceMapResponse = { + services: [javaService], + discoveredServices: [], + connections: [ + { + source: javaService, + destination: nodejsService + } + ] + }; + + const { elements } = dedupeConnections(response); + + expect(elements.length).toBe(3); + }); }); diff --git a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts b/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts index 6a433367d8217..e5d7c0b2de10c 100644 --- a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts +++ b/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts @@ -88,7 +88,7 @@ export function dedupeConnections(response: ServiceMapResponse) { serviceName = node[SERVICE_NAME]; } - const matchedServiceNodes = services.filter( + const matchedServiceNodes = serviceNodes.filter( serviceNode => serviceNode[SERVICE_NAME] === serviceName ); diff --git a/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts b/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts index d076008da9d8e..9695c331e0504 100644 --- a/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts +++ b/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts @@ -437,7 +437,7 @@ export const createJsAgentInstructions = (apmServerUrl = '') => [ title: i18n.translate( 'xpack.apm.tutorial.jsClient.enableRealUserMonitoring.title', { - defaultMessage: 'Enable Real User Monitoring support in APM server' + defaultMessage: 'Enable Real User Monitoring support in APM Server' } ), textPre: i18n.translate( diff --git a/x-pack/plugins/case/common/api/cases/case.ts b/x-pack/plugins/case/common/api/cases/case.ts index ee244dd205113..3c5d3405f395e 100644 --- a/x-pack/plugins/case/common/api/cases/case.ts +++ b/x-pack/plugins/case/common/api/cases/case.ts @@ -54,7 +54,11 @@ export const CaseAttributesRt = rt.intersection([ }), ]); -export const CaseRequestRt = CaseBasicRt; +export const CasePostRequestRt = rt.type({ + description: rt.string, + tags: rt.array(rt.string), + title: rt.string, +}); export const CaseExternalServiceRequestRt = CaseExternalServiceBasicRt; @@ -95,7 +99,7 @@ export const CasesFindResponseRt = rt.intersection([ ]); export const CasePatchRequestRt = rt.intersection([ - rt.partial(CaseRequestRt.props), + rt.partial(CaseBasicRt.props), rt.type({ id: rt.string, version: rt.string }), ]); @@ -157,7 +161,7 @@ export const ServiceConnectorCaseResponseRt = rt.intersection([ ]); export type CaseAttributes = rt.TypeOf; -export type CaseRequest = rt.TypeOf; +export type CasePostRequest = rt.TypeOf; export type CaseResponse = rt.TypeOf; export type CasesResponse = rt.TypeOf; export type CasesFindResponse = rt.TypeOf; diff --git a/x-pack/plugins/case/common/api/runtime_types.ts b/x-pack/plugins/case/common/api/runtime_types.ts index d5b858df38def..4717d7c3c48c4 100644 --- a/x-pack/plugins/case/common/api/runtime_types.ts +++ b/x-pack/plugins/case/common/api/runtime_types.ts @@ -4,22 +4,55 @@ * you may not use this file except in compliance with the Elastic License. */ -import { fold } from 'fp-ts/lib/Either'; +import { either, fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; import { pipe } from 'fp-ts/lib/pipeable'; -import { Errors, Type } from 'io-ts'; +import * as rt from 'io-ts'; import { failure } from 'io-ts/lib/PathReporter'; type ErrorFactory = (message: string) => Error; export const createPlainError = (message: string) => new Error(message); -export const throwErrors = (createError: ErrorFactory) => (errors: Errors) => { +export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => { throw createError(failure(errors).join('\n')); }; export const decodeOrThrow = ( - runtimeType: Type, + runtimeType: rt.Type, createError: ErrorFactory = createPlainError ) => (inputValue: I) => pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); + +const getExcessProps = (props: rt.Props, r: Record): string[] => { + const ex: string[] = []; + for (const k of Object.keys(r)) { + if (!props.hasOwnProperty(k)) { + ex.push(k); + } + } + return ex; +}; + +export function excess>(codec: C): C { + const r = new rt.InterfaceType( + codec.name, + codec.is, + (i, c) => + either.chain(rt.UnknownRecord.validate(i, c), (s: Record) => { + const ex = getExcessProps(codec.props, s); + return ex.length > 0 + ? rt.failure( + i, + c, + `Invalid value ${JSON.stringify(i)} supplied to : ${ + codec.name + }, excess properties: ${JSON.stringify(ex)}` + ) + : codec.validate(i, c); + }), + codec.encode, + codec.props + ); + return r as any; +} diff --git a/x-pack/plugins/case/common/api/user.ts b/x-pack/plugins/case/common/api/user.ts index 651cd08f08a02..3adb78ccdac07 100644 --- a/x-pack/plugins/case/common/api/user.ts +++ b/x-pack/plugins/case/common/api/user.ts @@ -7,8 +7,8 @@ import * as rt from 'io-ts'; export const UserRT = rt.type({ - email: rt.union([rt.undefined, rt.string]), - full_name: rt.union([rt.undefined, rt.string]), + email: rt.union([rt.undefined, rt.null, rt.string]), + full_name: rt.union([rt.undefined, rt.null, rt.string]), username: rt.string, }); diff --git a/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts b/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts index 5051f78a47cce..95cd66a9c51a2 100644 --- a/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts +++ b/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts @@ -29,7 +29,7 @@ export const createMockSavedObjectsRepository = ({ if (!result.length) { throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); } - return result[0]; + return result; } const result = caseSavedObject.filter(s => s.id === id); if (!result.length) { @@ -100,8 +100,9 @@ export const createMockSavedObjectsRepository = ({ if (attributes.description === 'Throw an error' || attributes.comment === 'Throw an error') { throw SavedObjectsErrorHelpers.createBadRequestError('Error thrown for testing'); } + if (type === CASE_COMMENT_SAVED_OBJECT) { - return { + const newCommentObj = { type, id: 'mock-comment', attributes, @@ -109,6 +110,8 @@ export const createMockSavedObjectsRepository = ({ updated_at: '2019-12-02T22:48:08.327Z', version: 'WzksMV0=', }; + caseCommentSavedObject = [...caseCommentSavedObject, newCommentObj]; + return newCommentObj; } return { type, @@ -124,6 +127,16 @@ export const createMockSavedObjectsRepository = ({ if (!caseCommentSavedObject.find(s => s.id === id)) { throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); } + caseCommentSavedObject = [ + ...caseCommentSavedObject, + { + id, + type, + updated_at: '2019-11-22T22:50:55.191Z', + version: 'WzE3LDFd', + attributes, + }, + ]; } else if (type === CASE_SAVED_OBJECT) { if (!caseSavedObject.find(s => s.id === id)) { throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts index 941ac90f2e90e..1dfab165eccd7 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts @@ -53,7 +53,7 @@ export function initDeleteAllCommentsApi({ caseService, router, userActionServic ), }); - return response.ok({ body: 'true' }); + return response.noContent(); } catch (error) { return response.customError(wrapError(error)); } diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts index 8f05fbce391f8..b2022e6dec26d 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts @@ -21,7 +21,7 @@ describe('DELETE comment', () => { beforeAll(async () => { routeHandler = await createRoute(initDeleteCommentApi, 'delete'); }); - it(`deletes the comment. responds with 200`, async () => { + it(`deletes the comment. responds with 204`, async () => { const request = httpServerMock.createKibanaRequest({ path: '/api/cases/{case_id}/comments/{comment_id}', method: 'delete', @@ -39,7 +39,7 @@ describe('DELETE comment', () => { ); const response = await routeHandler(theContext, request, kibanaResponseFactory); - expect(response.status).toEqual(200); + expect(response.status).toEqual(204); }); it(`returns an error when thrown from deleteComment service`, async () => { const request = httpServerMock.createKibanaRequest({ diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts index 44e57fc809e04..ff0729afed96a 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts @@ -64,7 +64,7 @@ export function initDeleteCommentApi({ caseService, router, userActionService }: ], }); - return response.ok({ body: 'true' }); + return response.noContent(); } catch (error) { return response.customError(wrapError(error)); } diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts index 4e7e266f326a2..8d9906c2abe7f 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts @@ -43,7 +43,9 @@ describe('PATCH comment', () => { const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); - expect(response.payload.comment).toEqual('Update my comment'); + expect(response.payload.comments[response.payload.comments.length - 1].comment).toEqual( + 'Update my comment' + ); }); it(`Fails with 409 if version does not match`, async () => { diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts index c67ad1bdaea71..3b38afc02ed81 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts @@ -10,11 +10,11 @@ import { pipe } from 'fp-ts/lib/pipeable'; import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; -import { CommentPatchRequestRt, CommentResponseRt, throwErrors } from '../../../../../common/api'; +import { CommentPatchRequestRt, CaseResponseRt, throwErrors } from '../../../../../common/api'; import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; -import { escapeHatch, wrapError, flattenCommentSavedObject } from '../../utils'; +import { escapeHatch, wrapError, flattenCaseSavedObject } from '../../utils'; export function initPatchCommentApi({ caseService, router, userActionService }: RouteDeps) { router.patch( @@ -30,11 +30,17 @@ export function initPatchCommentApi({ caseService, router, userActionService }: async (context, request, response) => { try { const client = context.core.savedObjects.client; + const caseId = request.params.case_id; const query = pipe( CommentPatchRequestRt.decode(request.body), fold(throwErrors(Boom.badRequest), identity) ); + const myCase = await caseService.getCase({ + client, + caseId, + }); + const myComment = await caseService.getComment({ client, commentId: query.id, @@ -45,10 +51,8 @@ export function initPatchCommentApi({ caseService, router, userActionService }: } const caseRef = myComment.references.find(c => c.type === CASE_SAVED_OBJECT); - if (caseRef == null || (caseRef != null && caseRef.id !== request.params.case_id)) { - throw Boom.notFound( - `This comment ${query.id} does not exist in ${request.params.case_id}).` - ); + if (caseRef == null || (caseRef != null && caseRef.id !== caseId)) { + throw Boom.notFound(`This comment ${query.id} does not exist in ${caseId}).`); } if (query.version !== myComment.version) { @@ -59,40 +63,77 @@ export function initPatchCommentApi({ caseService, router, userActionService }: const { username, full_name, email } = await caseService.getUser({ request, response }); const updatedDate = new Date().toISOString(); - const updatedComment = await caseService.patchComment({ + const [updatedComment, updatedCase] = await Promise.all([ + caseService.patchComment({ + client, + commentId: query.id, + updatedAttributes: { + comment: query.comment, + updated_at: updatedDate, + updated_by: { email, full_name, username }, + }, + version: query.version, + }), + caseService.patchCase({ + client, + caseId, + updatedAttributes: { + updated_at: updatedDate, + updated_by: { username, full_name, email }, + }, + version: myCase.version, + }), + ]); + + const totalCommentsFindByCases = await caseService.getAllCaseComments({ client, - commentId: query.id, - updatedAttributes: { - comment: query.comment, - updated_at: updatedDate, - updated_by: { email, full_name, username }, + caseId, + options: { + fields: [], + page: 1, + perPage: 1, }, - version: query.version, }); - await userActionService.postUserActions({ - client, - actions: [ - buildCommentUserActionItem({ - action: 'update', - actionAt: updatedDate, - actionBy: { username, full_name, email }, - caseId: request.params.case_id, - commentId: updatedComment.id, - fields: ['comment'], - newValue: query.comment, - oldValue: myComment.attributes.comment, - }), - ], - }); + const [comments] = await Promise.all([ + caseService.getAllCaseComments({ + client, + caseId: request.params.case_id, + options: { + fields: [], + page: 1, + perPage: totalCommentsFindByCases.total, + }, + }), + userActionService.postUserActions({ + client, + actions: [ + buildCommentUserActionItem({ + action: 'update', + actionAt: updatedDate, + actionBy: { username, full_name, email }, + caseId: request.params.case_id, + commentId: updatedComment.id, + fields: ['comment'], + newValue: query.comment, + oldValue: myComment.attributes.comment, + }), + ], + }), + ]); return response.ok({ - body: CommentResponseRt.encode( - flattenCommentSavedObject({ - ...updatedComment, - attributes: { ...myComment.attributes, ...updatedComment.attributes }, - references: myComment.references, - }) + body: CaseResponseRt.encode( + flattenCaseSavedObject( + { + ...myCase, + ...updatedCase, + attributes: { ...myCase.attributes, ...updatedCase.attributes }, + version: updatedCase.version ?? myCase.version, + references: myCase.references, + }, + comments.saved_objects + ) ), }); } catch (error) { diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts index e51ec7c894d08..af6f8bf223ee5 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts @@ -42,7 +42,9 @@ describe('POST comment', () => { const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); - expect(response.payload.id).toEqual('mock-comment'); + expect(response.payload.comments[response.payload.comments.length - 1].id).toEqual( + 'mock-comment' + ); }); it(`Returns an error if the case does not exist`, async () => { const request = httpServerMock.createKibanaRequest({ diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts index 2410505872a3a..70405af26f576 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts @@ -10,15 +10,10 @@ import { pipe } from 'fp-ts/lib/pipeable'; import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; -import { CommentRequestRt, CommentResponseRt, throwErrors } from '../../../../../common/api'; +import { CaseResponseRt, CommentRequestRt, excess, throwErrors } from '../../../../../common/api'; import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; -import { - escapeHatch, - transformNewComment, - wrapError, - flattenCommentSavedObject, -} from '../../utils'; +import { escapeHatch, transformNewComment, wrapError, flattenCaseSavedObject } from '../../utils'; import { RouteDeps } from '../../types'; export function initPostCommentApi({ caseService, router, userActionService }: RouteDeps) { @@ -35,54 +30,98 @@ export function initPostCommentApi({ caseService, router, userActionService }: R async (context, request, response) => { try { const client = context.core.savedObjects.client; + const caseId = request.params.case_id; const query = pipe( - CommentRequestRt.decode(request.body), + excess(CommentRequestRt).decode(request.body), fold(throwErrors(Boom.badRequest), identity) ); const myCase = await caseService.getCase({ client, - caseId: request.params.case_id, + caseId, }); const { username, full_name, email } = await caseService.getUser({ request, response }); const createdDate = new Date().toISOString(); - const newComment = await caseService.postNewComment({ - client, - attributes: transformNewComment({ - createdDate, - ...query, - username, - full_name, - email, + const [newComment, updatedCase] = await Promise.all([ + caseService.postNewComment({ + client, + attributes: transformNewComment({ + createdDate, + ...query, + username, + full_name, + email, + }), + references: [ + { + type: CASE_SAVED_OBJECT, + name: `associated-${CASE_SAVED_OBJECT}`, + id: myCase.id, + }, + ], }), - references: [ - { - type: CASE_SAVED_OBJECT, - name: `associated-${CASE_SAVED_OBJECT}`, - id: myCase.id, + caseService.patchCase({ + client, + caseId, + updatedAttributes: { + updated_at: createdDate, + updated_by: { username, full_name, email }, }, - ], - }); + version: myCase.version, + }), + ]); - await userActionService.postUserActions({ + const totalCommentsFindByCases = await caseService.getAllCaseComments({ client, - actions: [ - buildCommentUserActionItem({ - action: 'create', - actionAt: createdDate, - actionBy: { username, full_name, email }, - caseId: myCase.id, - commentId: newComment.id, - fields: ['comment'], - newValue: query.comment, - }), - ], + caseId, + options: { + fields: [], + page: 1, + perPage: 1, + }, }); + const [comments] = await Promise.all([ + caseService.getAllCaseComments({ + client, + caseId, + options: { + fields: [], + page: 1, + perPage: totalCommentsFindByCases.total, + }, + }), + userActionService.postUserActions({ + client, + actions: [ + buildCommentUserActionItem({ + action: 'create', + actionAt: createdDate, + actionBy: { username, full_name, email }, + caseId: myCase.id, + commentId: newComment.id, + fields: ['comment'], + newValue: query.comment, + }), + ], + }), + ]); + return response.ok({ - body: CommentResponseRt.encode(flattenCommentSavedObject(newComment)), + body: CaseResponseRt.encode( + flattenCaseSavedObject( + { + ...myCase, + ...updatedCase, + attributes: { ...myCase.attributes, ...updatedCase.attributes }, + version: updatedCase.version ?? myCase.version, + references: myCase.references, + }, + comments.saved_objects + ) + ), }); } catch (error) { return response.customError(wrapError(error)); diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts index cee705694f21d..c5be6f78a1570 100644 --- a/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts @@ -22,7 +22,7 @@ describe('DELETE case', () => { beforeAll(async () => { routeHandler = await createRoute(initDeleteCasesApi, 'delete'); }); - it(`deletes the case. responds with 200`, async () => { + it(`deletes the case. responds with 204`, async () => { const request = httpServerMock.createKibanaRequest({ path: '/api/cases', method: 'delete', @@ -39,7 +39,7 @@ describe('DELETE case', () => { ); const response = await routeHandler(theContext, request, kibanaResponseFactory); - expect(response.status).toEqual(200); + expect(response.status).toEqual(204); }); it(`returns an error when thrown from deleteCase service`, async () => { const request = httpServerMock.createKibanaRequest({ diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts index 8b0384c12edce..0214017ae5c29 100644 --- a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts @@ -70,7 +70,7 @@ export function initDeleteCasesApi({ caseService, router, userActionService }: R ), }); - return response.ok({ body: 'true' }); + return response.noContent(); } catch (error) { return response.customError(wrapError(error)); } diff --git a/x-pack/plugins/case/server/routes/api/cases/helpers.ts b/x-pack/plugins/case/server/routes/api/cases/helpers.ts index 747b5195da7ec..46c2209d79f7d 100644 --- a/x-pack/plugins/case/server/routes/api/cases/helpers.ts +++ b/x-pack/plugins/case/server/routes/api/cases/helpers.ts @@ -62,11 +62,14 @@ export const getCaseToUpdate = ( Object.entries(queryCase).reduce( (acc, [key, value]) => { const currentValue = get(currentCase, key); - if (isTwoArraysDifference(value, currentValue)) { - return { - ...acc, - [key]: value, - }; + if (Array.isArray(currentValue) && Array.isArray(value)) { + if (isTwoArraysDifference(value, currentValue)) { + return { + ...acc, + [key]: value, + }; + } + return acc; } else if (currentValue != null && value !== currentValue) { return { ...acc, diff --git a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts index 3d0b7bc79f88b..c36ea8964dc80 100644 --- a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts @@ -11,9 +11,10 @@ import { identity } from 'fp-ts/lib/function'; import { CasesPatchRequestRt, - throwErrors, CasesResponseRt, CasePatchRequest, + excess, + throwErrors, } from '../../../../common/api'; import { escapeHatch, wrapError, flattenCaseSavedObject } from '../utils'; import { RouteDeps } from '../types'; @@ -32,7 +33,7 @@ export function initPatchCasesApi({ caseService, router, userActionService }: Ro try { const client = context.core.savedObjects.client; const query = pipe( - CasesPatchRequestRt.decode(request.body), + excess(CasesPatchRequestRt).decode(request.body), fold(throwErrors(Boom.badRequest), identity) ); const myCases = await caseService.getCases({ @@ -116,6 +117,7 @@ export function initPatchCasesApi({ caseService, router, userActionService }: Ro ...updatedCase, attributes: { ...myCase.attributes, ...updatedCase?.attributes }, references: myCase.references, + version: updatedCase?.version ?? myCase.version, }); }); diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts index 5b716e5a2d490..96ce3c1a7eead 100644 --- a/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts @@ -27,7 +27,6 @@ describe('POST cases', () => { body: { description: 'This is a brand new case of a bad meanie defacing data', title: 'Super Bad Security Issue', - status: 'open', tags: ['defacement'], }, }); @@ -43,6 +42,28 @@ describe('POST cases', () => { expect(response.payload.id).toEqual('mock-it'); expect(response.payload.created_by.username).toEqual('awesome'); }); + + it(`Error if you passing status for a new case`, async () => { + const request = httpServerMock.createKibanaRequest({ + path: '/api/cases', + method: 'post', + body: { + description: 'This is a brand new case of a bad meanie defacing data', + title: 'Super Bad Security Issue', + status: 'open', + tags: ['defacement'], + }, + }); + + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); + + const response = await routeHandler(theContext, request, kibanaResponseFactory); + expect(response.status).toEqual(400); + }); it(`Returns an error if postNewCase throws`, async () => { const request = httpServerMock.createKibanaRequest({ path: '/api/cases', @@ -50,7 +71,6 @@ describe('POST cases', () => { body: { description: 'Throw an error', title: 'Super Bad Security Issue', - status: 'open', tags: ['error'], }, }); @@ -74,7 +94,6 @@ describe('POST cases', () => { body: { description: 'This is a brand new case of a bad meanie defacing data', title: 'Super Bad Security Issue', - status: 'open', tags: ['defacement'], }, }); diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.ts index 75be68013bcd4..239b8bfdf9b29 100644 --- a/x-pack/plugins/case/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.ts @@ -11,7 +11,7 @@ import { identity } from 'fp-ts/lib/function'; import { flattenCaseSavedObject, transformNewCase, wrapError, escapeHatch } from '../utils'; -import { CaseRequestRt, throwErrors, CaseResponseRt } from '../../../../common/api'; +import { CasePostRequestRt, throwErrors, excess, CaseResponseRt } from '../../../../common/api'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; @@ -27,7 +27,7 @@ export function initPostCaseApi({ caseService, router, userActionService }: Rout try { const client = context.core.savedObjects.client; const query = pipe( - CaseRequestRt.decode(request.body), + excess(CasePostRequestRt).decode(request.body), fold(throwErrors(Boom.badRequest), identity) ); diff --git a/x-pack/plugins/case/server/routes/api/cases/push_case.ts b/x-pack/plugins/case/server/routes/api/cases/push_case.ts index 6ae3df180d9e4..1b24904ce03b7 100644 --- a/x-pack/plugins/case/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/push_case.ts @@ -15,6 +15,7 @@ import { flattenCaseSavedObject, wrapError, escapeHatch } from '../utils'; import { CaseExternalServiceRequestRt, CaseResponseRt, throwErrors } from '../../../../common/api'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; +import { CASE_COMMENT_SAVED_OBJECT } from '../../../saved_object_types'; export function initPushCaseUserActionApi({ caseConfigureService, @@ -53,6 +54,7 @@ export function initPushCaseUserActionApi({ client, caseId, options: { + filter: `not ${CASE_COMMENT_SAVED_OBJECT}.attributes.pushed_at: *`, fields: [], page: 1, perPage: 1, @@ -70,6 +72,7 @@ export function initPushCaseUserActionApi({ client, caseId, options: { + filter: `not ${CASE_COMMENT_SAVED_OBJECT}.attributes.pushed_at: *`, fields: [], page: 1, perPage: totalCommentsFindByCases.total, @@ -140,7 +143,6 @@ export function initPushCaseUserActionApi({ ], }), ]); - return response.ok({ body: CaseResponseRt.encode( flattenCaseSavedObject( diff --git a/x-pack/plugins/case/server/routes/api/utils.ts b/x-pack/plugins/case/server/routes/api/utils.ts index 9d90eb8ef4a6d..822d6d70c7d61 100644 --- a/x-pack/plugins/case/server/routes/api/utils.ts +++ b/x-pack/plugins/case/server/routes/api/utils.ts @@ -14,7 +14,7 @@ import { } from 'kibana/server'; import { - CaseRequest, + CasePostRequest, CaseResponse, CasesFindResponse, CaseAttributes, @@ -35,17 +35,18 @@ export const transformNewCase = ({ createdDate: string; email?: string; full_name?: string; - newCase: CaseRequest; + newCase: CasePostRequest; username: string; }): CaseAttributes => ({ + ...newCase, closed_at: null, closed_by: null, created_at: createdDate, created_by: { email, full_name, username }, external_service: null, + status: 'open', updated_at: null, updated_by: null, - ...newCase, }); interface NewCommentArgs { diff --git a/x-pack/plugins/case/server/saved_object_types/comments.ts b/x-pack/plugins/case/server/saved_object_types/comments.ts index 8776dd39b11fa..73b1852bafe58 100644 --- a/x-pack/plugins/case/server/saved_object_types/comments.ts +++ b/x-pack/plugins/case/server/saved_object_types/comments.ts @@ -44,6 +44,9 @@ export const caseCommentSavedObjectType: SavedObjectsType = { full_name: { type: 'keyword', }, + email: { + type: 'keyword', + }, }, }, updated_at: { diff --git a/x-pack/plugins/case/server/services/index.ts b/x-pack/plugins/case/server/services/index.ts index 09d726228d309..52f41aae293ab 100644 --- a/x-pack/plugins/case/server/services/index.ts +++ b/x-pack/plugins/case/server/services/index.ts @@ -75,13 +75,13 @@ interface PatchCasesArgs extends ClientArgs { } interface UpdateCommentArgs extends ClientArgs { commentId: string; - updatedAttributes: Partial; + updatedAttributes: Partial; version?: string; } interface PatchComment { commentId: string; - updatedAttributes: Partial; + updatedAttributes: Partial; version?: string; } diff --git a/x-pack/plugins/case/server/services/user_actions/helpers.ts b/x-pack/plugins/case/server/services/user_actions/helpers.ts index 59d193f0f30d5..95d35d5a57a57 100644 --- a/x-pack/plugins/case/server/services/user_actions/helpers.ts +++ b/x-pack/plugins/case/server/services/user_actions/helpers.ts @@ -31,8 +31,8 @@ export const transformNewUserAction = ({ actionField: UserActionField; action: UserAction; actionAt: string; - email?: string; - full_name?: string; + email?: string | null; + full_name?: string | null; newValue?: string | null; oldValue?: string | null; username: string; diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts new file mode 100644 index 0000000000000..88c576c70bdf0 --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { coreMock, pluginInitializerContextConfigMock } from '../../../../../src/core/server/mocks'; +import { enhancedEsSearchStrategyProvider } from './es_search_strategy'; + +const mockAsyncResponse = { + id: 'foo', + response: { + _shards: { + total: 10, + failed: 1, + skipped: 2, + successful: 7, + }, + }, +}; + +const mockRollupResponse = { + _shards: { + total: 10, + failed: 1, + skipped: 2, + successful: 7, + }, +}; + +describe('ES search strategy', () => { + const mockCoreSetup = coreMock.createSetup(); + const mockApiCaller = jest.fn(); + const mockSearch = jest.fn(); + const mockConfig$ = pluginInitializerContextConfigMock({}).legacy.globalConfig$; + + beforeEach(() => { + mockApiCaller.mockClear(); + mockSearch.mockClear(); + }); + + it('returns a strategy with `search`', () => { + const esSearch = enhancedEsSearchStrategyProvider( + { + core: mockCoreSetup, + config$: mockConfig$, + }, + mockApiCaller, + mockSearch + ); + + expect(typeof esSearch.search).toBe('function'); + }); + + it('makes a POST request to async search with params when no ID is provided', async () => { + mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); + + const params = { index: 'logstash-*', body: { query: {} } }; + const esSearch = enhancedEsSearchStrategyProvider( + { + core: mockCoreSetup, + config$: mockConfig$, + }, + mockApiCaller, + mockSearch + ); + + await esSearch.search({ params }); + + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toBe('transport.request'); + const { method, path, body } = mockApiCaller.mock.calls[0][1]; + expect(method).toBe('POST'); + expect(path).toBe('logstash-*/_async_search'); + expect(body).toEqual({ query: {} }); + }); + + it('makes a GET request to async search with ID when ID is provided', async () => { + mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); + + const params = { index: 'logstash-*', body: { query: {} } }; + const esSearch = enhancedEsSearchStrategyProvider( + { + core: mockCoreSetup, + config$: mockConfig$, + }, + mockApiCaller, + mockSearch + ); + + await esSearch.search({ id: 'foo', params }); + + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toBe('transport.request'); + const { method, path, body } = mockApiCaller.mock.calls[0][1]; + expect(method).toBe('GET'); + expect(path).toBe('_async_search/foo'); + expect(body).toEqual(undefined); + }); + + it('encodes special characters in the path', async () => { + mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); + + const params = { index: 'foo-程', body: {} }; + const esSearch = enhancedEsSearchStrategyProvider( + { + core: mockCoreSetup, + config$: mockConfig$, + }, + mockApiCaller, + mockSearch + ); + + await esSearch.search({ params }); + + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toBe('transport.request'); + const { method, path } = mockApiCaller.mock.calls[0][1]; + expect(method).toBe('POST'); + expect(path).toBe('foo-%E7%A8%8B/_async_search'); + }); + + it('calls the rollup API if the index is a rollup type', async () => { + mockApiCaller.mockResolvedValueOnce(mockRollupResponse); + + const params = { index: 'foo-程', body: {} }; + const esSearch = enhancedEsSearchStrategyProvider( + { + core: mockCoreSetup, + config$: mockConfig$, + }, + mockApiCaller, + mockSearch + ); + + await esSearch.search({ indexType: 'rollup', params }); + + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toBe('transport.request'); + const { method, path } = mockApiCaller.mock.calls[0][1]; + expect(method).toBe('POST'); + expect(path).toBe('foo-%E7%A8%8B/_rollup_search'); + }); +}); diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 004e57f71464a..612c4fdbac037 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -16,6 +16,7 @@ import { ISearchOptions, ISearchCancel, getDefaultSearchParams, + getTotalLoaded, } from '../../../../../src/plugins/data/server'; import { IEnhancedEsSearchRequest } from '../../common'; @@ -36,31 +37,21 @@ export const enhancedEsSearchStrategyProvider: TSearchStrategyProvider) - : (response as AsyncSearchResponse).response; - - const id = (response as AsyncSearchResponse).id; - const { total, failed, successful } = rawResponse._shards; - const loaded = failed + successful; - return { id, total, loaded, rawResponse }; + : asyncSearch(caller, { ...request, params }, options); }; const cancel: ISearchCancel = async id => { const method = 'DELETE'; - const path = `_async_search/${id}`; + const path = encodeURI(`_async_search/${id}`); await caller('transport.request', { method, path }); }; return { search, cancel }; }; -function asyncSearch( +async function asyncSearch( caller: APICaller, request: IEnhancedEsSearchRequest, options?: ISearchOptions @@ -69,12 +60,18 @@ function asyncSearch( // If we have an ID, then just poll for that ID, otherwise send the entire request body const method = request.id ? 'GET' : 'POST'; - const path = request.id ? `_async_search/${request.id}` : `${index}/_async_search`; + const path = encodeURI(request.id ? `_async_search/${request.id}` : `${index}/_async_search`); // Wait up to 1s for the response to return const query = toSnakeCase({ waitForCompletion: '1s', ...params }); - return caller('transport.request', { method, path, body, query }, options); + const { response: rawResponse, id } = (await caller( + 'transport.request', + { method, path, body, query }, + options + )) as AsyncSearchResponse; + + return { id, rawResponse, ...getTotalLoaded(rawResponse._shards) }; } async function rollupSearch( @@ -84,9 +81,16 @@ async function rollupSearch( ) { const { body, index, ...params } = request.params; const method = 'POST'; - const path = `${index}/_rollup_search`; + const path = encodeURI(`${index}/_rollup_search`); const query = toSnakeCase(params); - return caller('transport.request', { method, path, body, query }, options); + + const rawResponse = await ((caller( + 'transport.request', + { method, path, body, query }, + options + ) as unknown) as SearchResponse); + + return { rawResponse, ...getTotalLoaded(rawResponse._shards) }; } function toSnakeCase(obj: Record) { diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts index d101b55d6ad37..f691e62b9352a 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts @@ -743,6 +743,34 @@ describe('#bulkGet', () => { undefined ); }); + + it('redirects request to underlying base client and return errors result if type is registered', async () => { + const mockedResponse = { + saved_objects: [ + { + id: 'bad', + type: 'known-type', + error: { statusCode: 404, message: 'Not found' }, + }, + ], + total: 1, + per_page: 1, + page: 1, + }; + mockBaseClient.bulkGet.mockResolvedValue(mockedResponse as any); + const bulkGetParams = [{ type: 'known-type', id: 'bad' }]; + + const options = { namespace: 'some-ns' }; + await expect(wrapper.bulkGet(bulkGetParams, options)).resolves.toEqual({ + ...mockedResponse, + saved_objects: [ + { + ...mockedResponse.saved_objects[0], + }, + ], + }); + expect(mockBaseClient.bulkGet).toHaveBeenCalledTimes(1); + }); }); describe('#get', () => { diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts index 849bfda2bc86f..b4f1de52c9ce3 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts @@ -195,7 +195,7 @@ export class EncryptedSavedObjectsClientWrapper implements SavedObjectsClientCon private stripEncryptedAttributesFromResponse( response: T ): T { - if (this.options.service.isRegistered(response.type)) { + if (this.options.service.isRegistered(response.type) && response.attributes) { response.attributes = this.options.service.stripEncryptedAttributes( response.type, response.attributes as Record @@ -214,7 +214,7 @@ export class EncryptedSavedObjectsClientWrapper implements SavedObjectsClientCon T extends SavedObjectsBulkResponse | SavedObjectsFindResponse | SavedObjectsBulkUpdateResponse >(response: T): T { for (const savedObject of response.saved_objects) { - if (this.options.service.isRegistered(savedObject.type)) { + if (this.options.service.isRegistered(savedObject.type) && savedObject.attributes) { savedObject.attributes = this.options.service.stripEncryptedAttributes( savedObject.type, savedObject.attributes as Record diff --git a/x-pack/plugins/endpoint/common/schema/alert_index.ts b/x-pack/plugins/endpoint/common/schema/alert_index.ts index ca27bb646d625..7b48780f2d86b 100644 --- a/x-pack/plugins/endpoint/common/schema/alert_index.ts +++ b/x-pack/plugins/endpoint/common/schema/alert_index.ts @@ -18,6 +18,7 @@ export const alertingIndexGetQuerySchema = schema.object( schema.number({ min: 1, max: 100, + defaultValue: EndpointAppConstants.ALERT_LIST_DEFAULT_PAGE_SIZE, }) ), page_index: schema.maybe( @@ -37,6 +38,7 @@ export const alertingIndexGetQuerySchema = schema.object( maxSize: 2, }) as Type<[string, string]> // Cast this to a string tuple. `@kbn/config-schema` doesn't do this automatically ), + empty_string_is_undefined: schema.maybe(schema.boolean()), sort: schema.maybe(schema.string()), order: schema.maybe(schema.oneOf([schema.literal('asc'), schema.literal('desc')])), query: schema.maybe( @@ -103,18 +105,6 @@ export const alertingIndexGetQuerySchema = schema.object( defaultMessage: '[before] cannot be used with [after]', }); } - if ( - value.before !== undefined && - value.sort !== undefined && - value.sort !== EndpointAppConstants.ALERT_LIST_DEFAULT_SORT - ) { - return i18n.translate( - 'xpack.endpoint.alerts.errors.before_cannot_be_used_with_custom_sort', - { - defaultMessage: '[before] cannot be used with custom sort', - } - ); - } }, } ); diff --git a/x-pack/plugins/endpoint/common/types.ts b/x-pack/plugins/endpoint/common/types.ts index 7e4cf3d700ec8..b3eb518e35ae3 100644 --- a/x-pack/plugins/endpoint/common/types.ts +++ b/x-pack/plugins/endpoint/common/types.ts @@ -44,6 +44,7 @@ export class EndpointAppConstants { **/ static ALERT_LIST_DEFAULT_PAGE_SIZE = 10; static ALERT_LIST_DEFAULT_SORT = '@timestamp'; + static MAX_LONG_INT = '9223372036854775807'; // 2^63-1 } export interface AlertResultList { @@ -238,11 +239,19 @@ interface AlertMetadata { prev: string | null; } +interface AlertState { + state: { + host_metadata: HostMetadata; + }; +} + /** * Union of alert data and metadata. */ export type AlertData = AlertEvent & AlertMetadata; +export type AlertDetails = AlertData & AlertState; + export type HostMetadata = Immutable<{ '@timestamp': number; event: { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/link_to_app.test.tsx.snap b/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/link_to_app.test.tsx.snap new file mode 100644 index 0000000000000..6838b673b90d8 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/link_to_app.test.tsx.snap @@ -0,0 +1,40 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LinkToApp component should render with href 1`] = ` + + + + link + + + +`; + +exports[`LinkToApp component should render with minimum input 1`] = ` + + + + + +`; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/page_view.test.tsx.snap b/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/page_view.test.tsx.snap new file mode 100644 index 0000000000000..34420e653049c --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/__snapshots__/page_view.test.tsx.snap @@ -0,0 +1,646 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PageView component should display body header custom element 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + body header +

+ } +> + + +
+ +
+ + +
+ +
+ +
+

+ body header +

+
+
+
+
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should display body header wrapped in EuiTitle 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ + +
+ +
+ +
+ +

+ body header +

+
+
+
+
+
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should display header left and right 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ +
+ +
+ +

+ page title +

+
+
+
+ +
+ right side actions +
+
+
+
+ + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should display only body if not header props used 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should display only header left 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ +
+ +
+ +

+ page title +

+
+
+
+
+
+ + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should display only header right but include an empty left side 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ +
+ +
+ + +
+ right side actions +
+
+
+ + + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should pass through EuiPage props 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + + +
+ +
+ + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; + +exports[`PageView component should use custom element for header left and not wrap in EuiTitle 1`] = ` +.c0 { + padding: 0; +} + +.c0 .endpoint-header { + padding: 24px; +} + +.c0 .endpoint-page-content { + border-left: none; + border-right: none; +} + + + title here +

+ } +> + + +
+ +
+ +
+ +
+

+ title here +

+
+
+
+
+ + +
+ +
+ body content +
+
+
+
+
+
+
+
+
+
+
+`; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/header_nav.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/components/header_nav.tsx index 1bafcbec93f5f..3fb06d6b4a56e 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/components/header_nav.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/header_nav.tsx @@ -4,10 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { MouseEvent } from 'react'; +import React, { MouseEvent, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiTabs, EuiTab } from '@elastic/eui'; import { useHistory, useLocation } from 'react-router-dom'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; export interface NavTabs { name: string; @@ -46,30 +47,33 @@ export const navTabs: NavTabs[] = [ }, ]; -export const HeaderNavigation: React.FunctionComponent<{ basename: string }> = React.memo( - ({ basename }) => { - const history = useHistory(); - const location = useLocation(); +export const HeaderNavigation: React.FunctionComponent = React.memo(() => { + const history = useHistory(); + const location = useLocation(); + const { services } = useKibana(); + const BASE_PATH = services.application.getUrlForApp('endpoint'); - function renderNavTabs(tabs: NavTabs[]) { - return tabs.map((tab, index) => { - return ( - { - event.preventDefault(); - history.push(tab.href); - }} - isSelected={tab.href === location.pathname} - > - {tab.name} - - ); - }); - } + const tabList = useMemo(() => { + return navTabs.map((tab, index) => { + return ( + { + event.preventDefault(); + history.push(tab.href); + }} + isSelected={ + tab.href === location.pathname || + (tab.href !== '/' && location.pathname.startsWith(tab.href)) + } + > + {tab.name} + + ); + }); + }, [BASE_PATH, history, location.pathname]); - return {renderNavTabs(navTabs)}; - } -); + return {tabList}; +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.test.tsx new file mode 100644 index 0000000000000..902c215434aac --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.test.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { LinkToApp } from './link_to_app'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { CoreStart } from 'kibana/public'; + +describe('LinkToApp component', () => { + let fakeCoreStart: jest.Mocked; + const render = (ui: Parameters[0]) => + mount(ui, { + wrappingComponent: KibanaContextProvider, + wrappingComponentProps: { + services: { application: fakeCoreStart.application }, + }, + }); + + beforeEach(() => { + fakeCoreStart = coreMock.createStart(); + }); + + it('should render with minimum input', () => { + expect(render(link)).toMatchSnapshot(); + }); + it('should render with href', () => { + expect( + render( + + link + + ) + ).toMatchSnapshot(); + }); + it('should support onClick prop', () => { + const spyOnClickHandler = jest.fn(); + const renderResult = render( + + link + + ); + + renderResult.find('EuiLink').simulate('click', { button: 0 }); + const clickEventArg = spyOnClickHandler.mock.calls[0][0]; + + expect(spyOnClickHandler).toHaveBeenCalled(); + expect(clickEventArg.preventDefault).toBeInstanceOf(Function); + expect(clickEventArg.isDefaultPrevented()).toBe(true); + expect(fakeCoreStart.application.navigateToApp).toHaveBeenCalledWith('ingestManager', { + path: undefined, + state: undefined, + }); + }); + it('should navigate to App with specific path', () => { + const renderResult = render( + + link + + ); + renderResult.find('EuiLink').simulate('click', { button: 0 }); + expect(fakeCoreStart.application.navigateToApp).toHaveBeenCalledWith('ingestManager', { + path: '/some/path', + state: undefined, + }); + }); + it('should passes through EuiLinkProps', () => { + const renderResult = render( + + link + + ); + expect(renderResult.find('EuiLink').props()).toEqual({ + children: 'link', + className: 'my-class', + color: 'primary', + 'data-test-subj': 'my-test-subject', + href: '/app/ingest', + onClick: expect.any(Function), + }); + }); + it('should still preventDefault if onClick callback throws', () => { + const spyOnClickHandler = jest.fn(ev => { + throw new Error('test'); + }); + const renderResult = render( + + link + + ); + expect(() => renderResult.find('EuiLink').simulate('click')).toThrow(); + const clickEventArg = spyOnClickHandler.mock.calls[0][0]; + expect(clickEventArg.isDefaultPrevented()).toBe(true); + }); + it('should not navigate if onClick callback prevents defalut', () => { + const spyOnClickHandler = jest.fn(ev => { + ev.preventDefault(); + }); + const renderResult = render( + + link + + ); + renderResult.find('EuiLink').simulate('click', { button: 0 }); + expect(fakeCoreStart.application.navigateToApp).not.toHaveBeenCalled(); + }); + it('should not to navigate if it was not left click', () => { + const renderResult = render(link); + renderResult.find('EuiLink').simulate('click', { button: 1 }); + expect(fakeCoreStart.application.navigateToApp).not.toHaveBeenCalled(); + }); + it('should not to navigate if it includes an anchor target', () => { + const renderResult = render( + + link + + ); + renderResult.find('EuiLink').simulate('click', { button: 0 }); + expect(fakeCoreStart.application.navigateToApp).not.toHaveBeenCalled(); + }); + it('should not to navigate if if meta|alt|ctrl|shift keys are pressed', () => { + const renderResult = render( + + link + + ); + const euiLink = renderResult.find('EuiLink'); + ['meta', 'alt', 'ctrl', 'shift'].forEach(key => { + euiLink.simulate('click', { button: 0, [`${key}Key`]: true }); + expect(fakeCoreStart.application.navigateToApp).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.tsx new file mode 100644 index 0000000000000..b110d32442c2c --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/link_to_app.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo, MouseEventHandler } from 'react'; +import { EuiLink } from '@elastic/eui'; +import { EuiLinkProps } from '@elastic/eui'; +import { useNavigateToAppEventHandler } from '../hooks/use_navigate_to_app_event_handler'; + +export type LinkToAppProps = EuiLinkProps & { + /** the app id - normally the value of the `id` in that plugin's `kibana.json` */ + appId: string; + /** Any app specic path (route) */ + appPath?: string; + appState?: any; + onClick?: MouseEventHandler; +}; + +/** + * An `EuiLink` that will use Kibana's `.application.navigateToApp()` to redirect the user to the + * a given app without causing a full browser refresh + */ +export const LinkToApp = memo( + ({ appId, appPath: path, appState: state, onClick, children, ...otherProps }) => { + const handleOnClick = useNavigateToAppEventHandler(appId, { path, state, onClick }); + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {children} + + ); + } +); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.test.tsx new file mode 100644 index 0000000000000..867c9101fe79b --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.test.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { PageView } from './page_view'; +import { EuiThemeProvider } from '../../../../../../legacy/common/eui_styled_components'; + +describe('PageView component', () => { + const render = (ui: Parameters[0]) => + mount(ui, { wrappingComponent: EuiThemeProvider }); + + it('should display only body if not header props used', () => { + expect(render(body content)).toMatchSnapshot(); + }); + it('should display header left and right', () => { + expect( + render( + + body content + + ) + ).toMatchSnapshot(); + }); + it('should display only header left', () => { + expect(render(body content)).toMatchSnapshot(); + }); + it('should display only header right but include an empty left side', () => { + expect( + render(body content) + ).toMatchSnapshot(); + }); + it(`should use custom element for header left and not wrap in EuiTitle`, () => { + expect( + render(title here

}>body content
) + ).toMatchSnapshot(); + }); + it('should display body header wrapped in EuiTitle', () => { + expect(render(body content)).toMatchSnapshot(); + }); + it('should display body header custom element', () => { + expect( + render(body header

}>body content
) + ).toMatchSnapshot(); + }); + it('should pass through EuiPage props', () => { + expect( + render( + + body content + + ) + ).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.tsx new file mode 100644 index 0000000000000..04401f06d344a --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/components/page_view.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiPage, + EuiPageBody, + EuiPageContent, + EuiPageContentBody, + EuiPageContentHeader, + EuiPageContentHeaderSection, + EuiPageHeader, + EuiPageHeaderSection, + EuiPageProps, + EuiTitle, +} from '@elastic/eui'; +import React, { memo, ReactNode } from 'react'; +import styled from 'styled-components'; + +const StyledEuiPage = styled(EuiPage)` + padding: 0; + + .endpoint-header { + padding: ${props => props.theme.eui.euiSizeL}; + } + .endpoint-page-content { + border-left: none; + border-right: none; + } +`; + +const isStringOrNumber = /(string|number)/; + +/** + * Page View layout for use in Endpoint + */ +export const PageView = memo< + EuiPageProps & { + /** + * content to be placed on the left side of the header. If a `string` is used, then it will + * be wrapped with `

`, else it will just be used as is. + */ + headerLeft?: ReactNode; + /** Content for the right side of the header */ + headerRight?: ReactNode; + /** + * body (sub-)header section. If a `string` is used, then it will be wrapped with + * `

` + */ + bodyHeader?: ReactNode; + children?: ReactNode; + } +>(({ children, headerLeft, headerRight, bodyHeader, ...otherProps }) => { + return ( + + + {(headerLeft || headerRight) && ( + + + {isStringOrNumber.test(typeof headerLeft) ? ( + +

{headerLeft}

+
+ ) : ( + headerLeft + )} +
+ {headerRight && ( + + {headerRight} + + )} +
+ )} + + {bodyHeader && ( + + + {isStringOrNumber.test(typeof bodyHeader) ? ( + +

{bodyHeader}

+
+ ) : ( + bodyHeader + )} +
+
+ )} + {children} +
+
+
+ ); +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/hooks/use_navigate_to_app_event_handler.ts b/x-pack/plugins/endpoint/public/applications/endpoint/hooks/use_navigate_to_app_event_handler.ts new file mode 100644 index 0000000000000..5fbfa5e0e58a8 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/hooks/use_navigate_to_app_event_handler.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MouseEventHandler, useCallback } from 'react'; +import { ApplicationStart } from 'kibana/public'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; + +type NavigateToAppHandlerProps = Parameters; +type EventHandlerCallback = MouseEventHandler; + +/** + * Provides an event handlers that can be used with (for example) `onClick` to prevent the + * event's default behaviour and instead use Kibana's `navigateToApp()` to send user to a + * different app. Use of `navigateToApp()` prevents a full browser refresh for apps that have + * been converted to the New Platform. + * + * @param appId + * @param [options] + * + * @example + * + * const handleOnClick = useNavigateToAppEventHandler('ingestManager', {path: '#/configs'}) + * return See configs + */ +export const useNavigateToAppEventHandler = ( + /** the app id - normally the value of the `id` in that plugin's `kibana.json` */ + appId: NavigateToAppHandlerProps[0], + + /** Options, some of which are passed along to the app route */ + options?: NavigateToAppHandlerProps[1] & { + onClick?: EventHandlerCallback; + } +): EventHandlerCallback => { + const { services } = useKibana(); + const { path, state, onClick } = options || {}; + return useCallback( + ev => { + try { + if (onClick) { + onClick(ev); + } + } catch (error) { + ev.preventDefault(); + throw error; + } + + if (ev.defaultPrevented) { + return; + } + + if (ev.button !== 0) { + return; + } + + if ( + ev.currentTarget instanceof HTMLAnchorElement && + ev.currentTarget.target !== '' && + ev.currentTarget.target !== '_self' + ) { + return; + } + + if (ev.metaKey || ev.altKey || ev.ctrlKey || ev.shiftKey) { + return; + } + + ev.preventDefault(); + services.application.navigateToApp(appId, { path, state }); + }, + [appId, onClick, path, services.application, state] + ); +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/index.tsx index 884646369b4b1..fa9055e0d9bbd 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/index.tsx @@ -6,9 +6,9 @@ import * as React from 'react'; import ReactDOM from 'react-dom'; -import { CoreStart, AppMountParameters } from 'kibana/public'; +import { CoreStart, AppMountParameters, ScopedHistory } from 'kibana/public'; import { I18nProvider, FormattedMessage } from '@kbn/i18n/react'; -import { Route, Switch, BrowserRouter } from 'react-router-dom'; +import { Route, Switch, Router } from 'react-router-dom'; import { Provider } from 'react-redux'; import { Store } from 'redux'; import { useObservable } from 'react-use'; @@ -29,12 +29,11 @@ import { EuiThemeProvider } from '../../../../../legacy/common/eui_styled_compon export function renderApp( coreStart: CoreStart, depsStart: EndpointPluginStartDependencies, - { appBasePath, element }: AppMountParameters + { element, history }: AppMountParameters ) { - coreStart.http.get('/api/endpoint/hello-world'); const store = appStoreFactory({ coreStart, depsStart }); ReactDOM.render( - , + , element ); return () => { @@ -43,7 +42,7 @@ export function renderApp( } interface RouterProps { - basename: string; + history: ScopedHistory; store: Store; coreStart: CoreStart; depsStart: EndpointPluginStartDependencies; @@ -51,7 +50,7 @@ interface RouterProps { const AppRoot: React.FunctionComponent = React.memo( ({ - basename, + history, store, coreStart: { http, notifications, uiSettings, application }, depsStart: { data }, @@ -63,9 +62,9 @@ const AppRoot: React.FunctionComponent = React.memo( - + - + = React.memo( /> - + diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts index 42c24400d12d3..80b7fd87e13be 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts @@ -5,7 +5,7 @@ */ import { IIndexPattern } from 'src/plugins/data/public'; -import { Immutable, AlertData } from '../../../../../common/types'; +import { Immutable, AlertDetails } from '../../../../../common/types'; import { AlertListData } from '../../types'; interface ServerReturnedAlertsData { @@ -15,7 +15,7 @@ interface ServerReturnedAlertsData { interface ServerReturnedAlertDetailsData { readonly type: 'serverReturnedAlertDetailsData'; - readonly payload: Immutable; + readonly payload: Immutable; } interface ServerReturnedSearchBarIndexPatterns { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts index b37ba0c0983d3..2c6ebf52189f5 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts @@ -5,7 +5,7 @@ */ import { IIndexPattern } from 'src/plugins/data/public'; -import { AlertResultList, AlertData } from '../../../../../common/types'; +import { AlertResultList, AlertDetails } from '../../../../../common/types'; import { AppAction } from '../action'; import { MiddlewareFactory, AlertListState } from '../../types'; import { isOnAlertPage, apiQueryParams, hasSelectedAlert, uiQueryParams } from './selectors'; @@ -40,7 +40,7 @@ export const alertMiddlewareFactory: MiddlewareFactory = (coreSt if (action.type === 'userChangedUrl' && isOnAlertPage(state) && hasSelectedAlert(state)) { const uiParams = uiQueryParams(state); - const response: AlertData = await coreStart.http.get( + const response: AlertDetails = await coreStart.http.get( `/api/endpoint/alerts/${uiParams.selected_alert}` ); api.dispatch({ type: 'serverReturnedAlertDetailsData', payload: response }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/mock_alert_result_list.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/mock_alert_result_list.ts index 3931723a55505..6a13e0f92471b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/mock_alert_result_list.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/mock_alert_result_list.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AlertResultList } from '../../../../../common/types'; +import { AlertResultList, AlertDetails } from '../../../../../common/types'; import { EndpointDocGenerator } from '../../../../../common/generate_data'; export const mockAlertResultList: (options?: { @@ -47,3 +47,18 @@ export const mockAlertResultList: (options?: { }; return mock; }; + +export const mockAlertDetailsResult = (): AlertDetails => { + const generator = new EndpointDocGenerator(); + return { + ...generator.generateAlert(new Date().getTime()), + ...{ + id: 'xDUYMHABAKk0XnHd8rrd', + prev: null, + next: null, + state: { + host_metadata: generator.generateHostMetadata(), + }, + }, + }; +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts index 6c5330bd78baf..7947a35068234 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts @@ -12,6 +12,7 @@ import { AlertResultList, Immutable, ImmutableArray, + AlertDetails, } from '../../../common/types'; import { EndpointPluginStartDependencies } from '../../plugin'; import { AppAction } from './store/action'; @@ -196,7 +197,7 @@ export interface AlertListState { readonly location?: Immutable; /** Specific Alert data to be shown in the details view */ - readonly alertDetails?: Immutable; + readonly alertDetails?: Immutable; /** Search bar state including indexPatterns */ readonly searchBar: AlertsSearchBarState; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/alert_details.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/alert_details.test.tsx index 0f5a9dd7fed17..e3639bf1cacbc 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/alert_details.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/alert_details.test.tsx @@ -9,7 +9,7 @@ import { appStoreFactory } from '../../store'; import { fireEvent } from '@testing-library/react'; import { MemoryHistory } from 'history'; import { AppAction } from '../../types'; -import { mockAlertResultList } from '../../store/alerts/mock_alert_result_list'; +import { mockAlertDetailsResult } from '../../store/alerts/mock_alert_result_list'; import { alertPageTestRender } from './test_helpers/render_alert_page'; describe('when the alert details flyout is open', () => { @@ -34,7 +34,7 @@ describe('when the alert details flyout is open', () => { reactTestingLibrary.act(() => { const action: AppAction = { type: 'serverReturnedAlertDetailsData', - payload: mockAlertResultList().alerts[0], + payload: mockAlertDetailsResult(), }; store.dispatch(action); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx index 7317bd5e03ed9..a64b3293ec6cd 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx @@ -6,11 +6,6 @@ import React from 'react'; import { - EuiTitle, - EuiPage, - EuiPageBody, - EuiPageHeader, - EuiPageHeaderSection, EuiFlexGroup, EuiFlexItem, EuiButton, @@ -19,64 +14,49 @@ import { EuiSpacer, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; import { usePolicyDetailsSelector } from './policy_hooks'; import { policyDetails } from '../../store/policy_details/selectors'; import { WindowsEventing } from './policy_forms/eventing/windows'; +import { PageView } from '../../components/page_view'; export const PolicyDetails = React.memo(() => { const policyItem = usePolicyDetailsSelector(policyDetails); - function policyName() { - if (policyItem) { - return {policyItem.name}; - } else { - return ( - - - - ); - } - } + const headerLeftContent = + policyItem?.name ?? + i18n.translate('xpack.endpoint.policyDetails.notFound', { + defaultMessage: 'Policy Not Found', + }); + + const headerRightContent = ( + + + + + + + + + + + + + ); return ( - - - - - -

{policyName()}

-
-
- - - - - - - - - - - - -
- -

- -

-
- - -
-
+ + +

+ +

+
+ + +
); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx index f949efa46a2bd..7af302de8576e 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx @@ -4,20 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { SyntheticEvent, useCallback, useEffect, useMemo } from 'react'; -import { - EuiPage, - EuiPageBody, - EuiPageContent, - EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, - EuiTitle, - EuiBasicTable, - EuiText, - EuiTableFieldDataColumnType, - EuiLink, -} from '@elastic/eui'; +import React, { useCallback, useEffect, useMemo } from 'react'; +import { EuiBasicTable, EuiText, EuiTableFieldDataColumnType, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { useDispatch } from 'react-redux'; @@ -35,6 +23,8 @@ import { usePolicyListSelector } from './policy_hooks'; import { PolicyListAction } from '../../store/policy_list'; import { PolicyData } from '../../types'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; +import { PageView } from '../../components/page_view'; +import { LinkToApp } from '../../components/link_to_app'; interface TableChangeCallbackArguments { page: { index: number; size: number }; @@ -145,18 +135,13 @@ export const PolicyList = React.memo(() => { }), render(version: string) { return ( - // eslint-disable-next-line @elastic/eui/href-or-on-click - { - ev.preventDefault(); - services.application.navigateToApp('ingestManager', { - path: `#/configs/${version}`, - }); - }} > {version} - + ); }, }, @@ -165,42 +150,29 @@ export const PolicyList = React.memo(() => { ); return ( - - - - - - -

- -

-
-

- - - -

-
-
- - - -
-
-
+ + + + } + > + + ); }); diff --git a/x-pack/plugins/endpoint/public/plugin.ts b/x-pack/plugins/endpoint/public/plugin.ts index 2759db26bb6c8..ee5bbe71ae8aa 100644 --- a/x-pack/plugins/endpoint/public/plugin.ts +++ b/x-pack/plugins/endpoint/public/plugin.ts @@ -47,6 +47,7 @@ export class EndpointPlugin title: i18n.translate('xpack.endpoint.pluginTitle', { defaultMessage: 'Endpoint', }), + euiIconType: 'securityApp', async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./applications/endpoint'); diff --git a/x-pack/plugins/endpoint/server/plugin.ts b/x-pack/plugins/endpoint/server/plugin.ts index 4b4afd8088744..6d2e9e510551a 100644 --- a/x-pack/plugins/endpoint/server/plugin.ts +++ b/x-pack/plugins/endpoint/server/plugin.ts @@ -9,7 +9,6 @@ import { PluginSetupContract as FeaturesPluginSetupContract } from '../../featur import { createConfig$, EndpointConfigType } from './config'; import { EndpointAppContext } from './types'; -import { addRoutes } from './routes'; import { registerEndpointRoutes } from './routes/metadata'; import { registerAlertRoutes } from './routes/alerts'; import { registerResolverRoutes } from './routes/resolver'; @@ -71,7 +70,6 @@ export class EndpointPlugin }, } as EndpointAppContext; const router = core.http.createRouter(); - addRoutes(router); registerEndpointRoutes(router, endpointContext); registerResolverRoutes(router, endpointContext); registerAlertRoutes(router, endpointContext); diff --git a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts index 3497573918fac..b95c1aaf87c14 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts @@ -9,6 +9,7 @@ import { AlertEvent, EndpointAppConstants } from '../../../../common/types'; import { EndpointAppContext } from '../../../types'; import { AlertDetailsRequestParams } from '../types'; import { AlertDetailsPagination } from './lib'; +import { getHostData } from '../../../routes/metadata'; export const alertDetailsHandlerWrapper = function( endpointAppContext: EndpointAppContext @@ -33,10 +34,15 @@ export const alertDetailsHandlerWrapper = function( response ); + const currentHostInfo = await getHostData(ctx, response._source.host.id); + return res.ok({ body: { id: response._id, ...response._source, + state: { + host_metadata: currentHostInfo, + }, next: await pagination.getNextUrl(), prev: await pagination.getPrevUrl(), }, diff --git a/x-pack/plugins/endpoint/server/routes/alerts/lib/index.ts b/x-pack/plugins/endpoint/server/routes/alerts/lib/index.ts index d3ed7e7b953c3..dc1ce767a715b 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/lib/index.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/lib/index.ts @@ -13,6 +13,7 @@ import { AlertSearchRequest, AlertSearchRequestWrapper, AlertSort, + UndefinedResultPosition, } from '../types'; export { Pagination } from './pagination'; @@ -68,6 +69,8 @@ function buildSort(query: AlertSearchQuery): AlertSort { { [query.sort]: { order: query.order, + missing: + query.order === 'asc' ? UndefinedResultPosition.last : UndefinedResultPosition.first, }, }, // Secondary sort for tie-breaking @@ -82,6 +85,8 @@ function buildSort(query: AlertSearchQuery): AlertSort { // Reverse sort order for search_before functionality const newDirection = reverseSortDirection(query.order); sort[0][query.sort].order = newDirection; + sort[0][query.sort].missing = + newDirection === 'asc' ? UndefinedResultPosition.last : UndefinedResultPosition.first; sort[1]['event.id'].order = newDirection; } diff --git a/x-pack/plugins/endpoint/server/routes/alerts/list/lib/index.ts b/x-pack/plugins/endpoint/server/routes/alerts/list/lib/index.ts index b076561ddbee2..95c8e4662cfce 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/list/lib/index.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/list/lib/index.ts @@ -49,6 +49,7 @@ export const getRequestData = async ( pageIndex: request.query.page_index, searchAfter: request.query.after, searchBefore: request.query.before, + emptyStringIsUndefined: request.query.empty_string_is_undefined, }; if (reqData.searchAfter === undefined && reqData.searchBefore === undefined) { @@ -59,6 +60,24 @@ export const getRequestData = async ( reqData.fromIndex = reqData.pageIndex * reqData.pageSize; } + // See: https://github.com/elastic/elasticsearch-js/issues/662 + // and https://github.com/elastic/endpoint-app-team/issues/221 + if ( + reqData.searchBefore !== undefined && + reqData.searchBefore[0] === '' && + reqData.emptyStringIsUndefined + ) { + reqData.searchBefore[0] = EndpointAppConstants.MAX_LONG_INT; + } + + if ( + reqData.searchAfter !== undefined && + reqData.searchAfter[0] === '' && + reqData.emptyStringIsUndefined + ) { + reqData.searchAfter[0] = EndpointAppConstants.MAX_LONG_INT; + } + return reqData; }; diff --git a/x-pack/plugins/endpoint/server/routes/alerts/types.ts b/x-pack/plugins/endpoint/server/routes/alerts/types.ts index 3d099447a9bd0..cf4eac5d25f80 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/types.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/types.ts @@ -13,6 +13,7 @@ import { Direction } from '../../../common/types'; export interface AlertSortParam { [key: string]: { order: Direction; + missing?: UndefinedResultPosition; }; } @@ -40,6 +41,7 @@ export interface AlertSearchQuery { order: Direction; searchAfter?: SearchCursor; searchBefore?: SearchCursor; + emptyStringIsUndefined?: boolean; } /** @@ -84,4 +86,14 @@ export interface AlertListRequestQuery { order: Direction; after?: SearchCursor; before?: SearchCursor; + empty_string_is_undefined?: boolean; +} + +/** + * Indicates whether undefined results are sorted to the beginning (_first) or end (_last) + * of a result set. + */ +export enum UndefinedResultPosition { + first = '_first', + last = '_last', } diff --git a/x-pack/plugins/endpoint/server/routes/index.ts b/x-pack/plugins/endpoint/server/routes/index.ts deleted file mode 100644 index 8b0476ea7b229..0000000000000 --- a/x-pack/plugins/endpoint/server/routes/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { IRouter } from 'kibana/server'; - -export function addRoutes(router: IRouter) { - router.get( - { - path: '/api/endpoint/hello-world', - validate: false, - options: { - tags: ['access:resolver'], - }, - }, - async function greetingIndex(_context, _request, response) { - return response.ok({ - body: { hello: 'world' }, - headers: { - 'Content-Type': 'application/json', - }, - }); - } - ); -} diff --git a/x-pack/plugins/endpoint/server/routes/metadata.ts b/x-pack/plugins/endpoint/server/routes/metadata.ts index 463a071ab0c77..787ffe58a5372 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter } from 'kibana/server'; +import { IRouter, RequestHandlerContext } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { schema } from '@kbn/config-schema'; import { kibanaRequestToMetadataListESQuery, - kibanaRequestToMetadataGetESQuery, + getESQueryHostMetadataByID, } from '../services/endpoint/metadata_query_builders'; import { HostMetadata, HostResultList } from '../../common/types'; import { EndpointAppContext } from '../types'; @@ -75,17 +75,11 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp }, async (context, req, res) => { try { - const query = kibanaRequestToMetadataGetESQuery(req, endpointAppContext); - const response = (await context.core.elasticsearch.dataClient.callAsCurrentUser( - 'search', - query - )) as SearchResponse; - - if (response.hits.hits.length === 0) { - return res.notFound({ body: 'Endpoint Not Found' }); + const doc = await getHostData(context, req.params.id); + if (doc) { + return res.ok({ body: doc }); } - - return res.ok({ body: response.hits.hits[0]._source }); + return res.notFound({ body: 'Endpoint Not Found' }); } catch (err) { return res.internalError({ body: err }); } @@ -93,6 +87,23 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp ); } +export async function getHostData( + context: RequestHandlerContext, + id: string +): Promise { + const query = getESQueryHostMetadataByID(id); + const response = (await context.core.elasticsearch.dataClient.callAsCurrentUser( + 'search', + query + )) as SearchResponse; + + if (response.hits.hits.length === 0) { + return undefined; + } + + return response.hits.hits[0]._source; +} + function mapToHostResultList( queryParams: Record, searchResponse: SearchResponse diff --git a/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.test.ts b/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.test.ts index a3090361d4965..0966b52c79f7d 100644 --- a/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.test.ts +++ b/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.test.ts @@ -7,7 +7,7 @@ import { httpServerMock, loggingServiceMock } from '../../../../../../src/core/s import { EndpointConfigSchema } from '../../config'; import { kibanaRequestToMetadataListESQuery, - kibanaRequestToMetadataGetESQuery, + getESQueryHostMetadataByID, } from './metadata_query_builders'; import { EndpointAppConstants } from '../../../common/types'; @@ -118,15 +118,7 @@ describe('query builder', () => { describe('MetadataGetQuery', () => { it('searches for the correct ID', () => { const mockID = 'AABBCCDD-0011-2233-AA44-DEADBEEF8899'; - const mockRequest = httpServerMock.createKibanaRequest({ - params: { - id: mockID, - }, - }); - const query = kibanaRequestToMetadataGetESQuery(mockRequest, { - logFactory: loggingServiceMock.create(), - config: () => Promise.resolve(EndpointConfigSchema.validate({})), - }); + const query = getESQueryHostMetadataByID(mockID); expect(query).toEqual({ body: { query: { match: { 'host.id.keyword': mockID } }, diff --git a/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.ts b/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.ts index 300e837c4af1e..57b0a4ef10519 100644 --- a/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.ts +++ b/x-pack/plugins/endpoint/server/services/endpoint/metadata_query_builders.ts @@ -74,15 +74,12 @@ function buildQueryBody(request: KibanaRequest): Record, - endpointAppContext: EndpointAppContext -) => { +export function getESQueryHostMetadataByID(hostID: string) { return { body: { query: { match: { - 'host.id.keyword': request.params.id, + 'host.id.keyword': hostID, }, }, sort: [ @@ -96,4 +93,4 @@ export const kibanaRequestToMetadataGetESQuery = ( }, index: EndpointAppConstants.ENDPOINT_INDEX_NAME, }; -}; +} diff --git a/x-pack/plugins/event_log/generated/mappings.json b/x-pack/plugins/event_log/generated/mappings.json index fc1fdb71b0c37..50e7fdd5a9048 100644 --- a/x-pack/plugins/event_log/generated/mappings.json +++ b/x-pack/plugins/event_log/generated/mappings.json @@ -1,12 +1,15 @@ { - "dynamic": "strict", + "dynamic": "false", "properties": { "@timestamp": { "type": "date" }, "tags": { "ignore_above": 1024, - "type": "keyword" + "type": "keyword", + "meta": { + "isArray": true + } }, "message": { "norms": false, @@ -18,8 +21,7 @@ "ignore_above": 1024, "type": "keyword" } - }, - "dynamic": "strict" + } }, "event": { "properties": { @@ -40,8 +42,7 @@ "end": { "type": "date" } - }, - "dynamic": "strict" + } }, "error": { "properties": { @@ -49,8 +50,7 @@ "norms": false, "type": "text" } - }, - "dynamic": "strict" + } }, "user": { "properties": { @@ -58,8 +58,7 @@ "ignore_above": 1024, "type": "keyword" } - }, - "dynamic": "strict" + } }, "kibana": { "properties": { @@ -86,11 +85,9 @@ "ignore_above": 1024 } }, - "type": "nested", - "dynamic": "strict" + "type": "nested" } - }, - "dynamic": "strict" + } } } } \ No newline at end of file diff --git a/x-pack/plugins/event_log/scripts/create_schemas.js b/x-pack/plugins/event_log/scripts/create_schemas.js index 6e9ab00d04d1f..b46f7f295ddc7 100755 --- a/x-pack/plugins/event_log/scripts/create_schemas.js +++ b/x-pack/plugins/event_log/scripts/create_schemas.js @@ -30,11 +30,13 @@ function main() { const exportedProperties = mappings.EcsEventLogProperties; const multiValuedProperties = new Set(mappings.EcsEventLogMultiValuedProperties); + augmentMappings(ecsMappings.mappings, multiValuedProperties); + const elMappings = getEventLogMappings(ecsMappings, exportedProperties); console.log(`generating files in ${PLUGIN_DIR}`); writeEventLogMappings(elMappings); - writeEventLogConfigSchema(elMappings, ecsVersion, multiValuedProperties); + writeEventLogConfigSchema(elMappings, ecsVersion); } // return a stripped down version of the ecs schema, with only exportedProperties @@ -57,7 +59,6 @@ function getEventLogMappings(ecsSchema, exportedProperties) { const elValue = lodash.get(result.mappings.properties, prop); elValue.type = ecsValue.type; - elValue.dynamic = 'strict'; } return result; @@ -86,7 +87,7 @@ function writeEventLogMappings(elSchema) { // fixObjectTypes(elSchema.mappings); const mappings = { - dynamic: 'strict', + dynamic: 'false', properties: elSchema.mappings.properties, }; @@ -94,11 +95,10 @@ function writeEventLogMappings(elSchema) { console.log('generated:', EVENT_LOG_MAPPINGS_FILE); } -function writeEventLogConfigSchema(elSchema, ecsVersion, multiValuedProperties) { +function writeEventLogConfigSchema(elSchema, ecsVersion) { const lineWriter = LineWriter.createLineWriter(); - const elSchemaMappings = augmentMappings(elSchema.mappings, multiValuedProperties); - generateSchemaLines(lineWriter, null, elSchemaMappings); + generateSchemaLines(lineWriter, null, elSchema.mappings); // last line will have an extraneous comma const schemaLines = lineWriter.getContent().replace(/,$/, ''); @@ -113,22 +113,21 @@ const StringTypes = new Set(['string', 'keyword', 'text', 'ip']); const NumberTypes = new Set(['long', 'integer', 'float']); function augmentMappings(mappings, multiValuedProperties) { - // clone the mappings, as we're adding some additional properties - mappings = JSON.parse(JSON.stringify(mappings)); - for (const prop of multiValuedProperties) { const fullProp = replaceDotWithProperties(prop); - lodash.set(mappings.properties, `${fullProp}.multiValued`, true); + const metaPropName = `${fullProp}.meta`; + const meta = lodash.get(mappings.properties, metaPropName) || {}; + meta.isArray = true; + lodash.set(mappings.properties, metaPropName, meta); } - - return mappings; } function generateSchemaLines(lineWriter, prop, mappings) { const propKey = legalPropertyName(prop); + if (mappings == null) return; if (StringTypes.has(mappings.type)) { - if (mappings.multiValued) { + if (mappings.meta && mappings.meta.isArray) { lineWriter.addLine(`${propKey}: ecsStringMulti(),`); } else { lineWriter.addLine(`${propKey}: ecsString(),`); @@ -169,6 +168,7 @@ function generateSchemaLines(lineWriter, prop, mappings) { // write the object properties lineWriter.indent(); for (const prop of Object.keys(mappings.properties)) { + if (prop === 'meta') continue; generateSchemaLines(lineWriter, prop, mappings.properties[prop]); } lineWriter.dedent(); diff --git a/x-pack/plugins/infra/common/log_analysis/log_analysis.ts b/x-pack/plugins/infra/common/log_analysis/log_analysis.ts index 9b2f1a55eb8c1..f0aa2067a24c2 100644 --- a/x-pack/plugins/infra/common/log_analysis/log_analysis.ts +++ b/x-pack/plugins/infra/common/log_analysis/log_analysis.ts @@ -14,19 +14,28 @@ export type JobStatus = | 'finished' | 'failed'; +export type SetupStatusRequiredReason = + | 'missing' // jobs are missing + | 'reconfiguration' // the configurations don't match the source configurations + | 'update'; // the definitions don't match the module definitions + export type SetupStatus = - | 'initializing' // acquiring job statuses to determine setup status - | 'unknown' // job status could not be acquired (failed request etc) - | 'required' // jobs are missing - | 'requiredForReconfiguration' // the configurations don't match the source configurations - | 'requiredForUpdate' // the definitions don't match the module definitions - | 'pending' // In the process of setting up the module for the first time or retrying, waiting for response - | 'succeeded' // setup succeeded, notifying user - | 'failed' // setup failed, notifying user - | 'hiddenAfterSuccess' // hide the setup screen and we show the results for the first time - | 'skipped' // setup hidden because the module is in a correct state already - | 'skippedButReconfigurable' // setup hidden even though the job configurations are outdated - | 'skippedButUpdatable'; // setup hidden even though the job definitions are outdated + | { type: 'initializing' } // acquiring job statuses to determine setup status + | { type: 'unknown' } // job status could not be acquired (failed request etc) + | { + type: 'required'; + reason: SetupStatusRequiredReason; + } // setup required + | { type: 'pending' } // In the process of setting up the module for the first time or retrying, waiting for response + | { type: 'succeeded' } // setup succeeded, notifying user + | { + type: 'failed'; + reasons: string[]; + } // setup failed, notifying user + | { + type: 'skipped'; + newlyCreated?: boolean; + }; // setup is hidden /** * Maps a job status to the possibility that results have already been produced @@ -43,9 +52,7 @@ export const isHealthyJobStatus = (jobStatus: JobStatus) => * produced before this state was reached. */ export const isSetupStatusWithResults = (setupStatus: SetupStatus) => - ['skipped', 'hiddenAfterSuccess', 'skippedButReconfigurable', 'skippedButUpdatable'].includes( - setupStatus - ); + setupStatus.type === 'skipped'; const KIBANA_SAMPLE_DATA_INDICES = ['kibana_sample_data_logs*']; diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_job_status/log_analysis_job_problem_indicator.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_job_status/log_analysis_job_problem_indicator.tsx index 8a16d819e12c2..e7e89bb365e4f 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_job_status/log_analysis_job_problem_indicator.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_job_status/log_analysis_job_problem_indicator.tsx @@ -6,33 +6,36 @@ import React from 'react'; -import { JobStatus, SetupStatus } from '../../../../common/log_analysis'; import { JobConfigurationOutdatedCallout } from './job_configuration_outdated_callout'; import { JobDefinitionOutdatedCallout } from './job_definition_outdated_callout'; import { JobStoppedCallout } from './job_stopped_callout'; +import { FirstUseCallout } from '../log_analysis_results'; export const LogAnalysisJobProblemIndicator: React.FC<{ - jobStatus: JobStatus; - setupStatus: SetupStatus; + hasOutdatedJobConfigurations: boolean; + hasOutdatedJobDefinitions: boolean; + hasStoppedJobs: boolean; + isFirstUse: boolean; onRecreateMlJobForReconfiguration: () => void; onRecreateMlJobForUpdate: () => void; -}> = ({ jobStatus, setupStatus, onRecreateMlJobForReconfiguration, onRecreateMlJobForUpdate }) => { - if (isStopped(jobStatus)) { - return ; - } else if (isUpdatable(setupStatus)) { - return ; - } else if (isReconfigurable(setupStatus)) { - return ; - } - - return null; // no problem to indicate +}> = ({ + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, + isFirstUse, + onRecreateMlJobForReconfiguration, + onRecreateMlJobForUpdate, +}) => { + return ( + <> + {hasOutdatedJobDefinitions ? ( + + ) : null} + {hasOutdatedJobConfigurations ? ( + + ) : null} + {hasStoppedJobs ? : null} + {isFirstUse ? : null} + + ); }; - -const isStopped = (jobStatus: JobStatus) => jobStatus === 'stopped'; - -const isUpdatable = (setupStatus: SetupStatus) => setupStatus === 'skippedButUpdatable'; - -const isReconfigurable = (setupStatus: SetupStatus) => setupStatus === 'skippedButReconfigurable'; - -export const jobHasProblem = (jobStatus: JobStatus, setupStatus: SetupStatus) => - isStopped(jobStatus) || isUpdatable(setupStatus) || isReconfigurable(setupStatus); diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/initial_configuration_step/initial_configuration_step.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/initial_configuration_step/initial_configuration_step.tsx index de20dd12c17bd..4ec895dfed4bc 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/initial_configuration_step/initial_configuration_step.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/initial_configuration_step/initial_configuration_step.tsx @@ -45,7 +45,7 @@ export const InitialConfigurationStep: React.FunctionComponent { - const disabled = useMemo(() => !editableFormStatus.includes(setupStatus), [setupStatus]); + const disabled = useMemo(() => !editableFormStatus.includes(setupStatus.type), [setupStatus]); return ( <> @@ -72,12 +72,7 @@ export const InitialConfigurationStep: React.FunctionComponent, status: - props.setupStatus === 'pending' + props.setupStatus.type === 'pending' ? 'incomplete' - : props.setupStatus === 'failed' + : props.setupStatus.type === 'failed' ? 'danger' - : props.setupStatus === 'succeeded' + : props.setupStatus.type === 'succeeded' ? 'complete' : undefined, }); @@ -55,7 +55,7 @@ export const ProcessStep: React.FunctionComponent = ({ }) => { return ( - {setupStatus === 'pending' ? ( + {setupStatus.type === 'pending' ? ( @@ -67,7 +67,7 @@ export const ProcessStep: React.FunctionComponent = ({ /> - ) : setupStatus === 'failed' ? ( + ) : setupStatus.type === 'failed' ? ( <> = ({ /> - ) : setupStatus === 'succeeded' ? ( + ) : setupStatus.type === 'succeeded' ? ( <> = ({ /> - ) : setupStatus === 'requiredForUpdate' || setupStatus === 'requiredForReconfiguration' ? ( + ) : setupStatus.type === 'required' && + (setupStatus.reason === 'update' || setupStatus.reason === 'reconfiguration') ? ( ) : ( diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts index 49112dd8ec8d8..c3c119f51ff7d 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts @@ -54,6 +54,22 @@ const jobStateRT = rt.keyof({ opening: null, }); +const jobCategorizationStatusRT = rt.keyof({ + ok: null, + warn: null, +}); + +const jobModelSizeStatsRT = rt.type({ + categorization_status: jobCategorizationStatusRT, + categorized_doc_count: rt.number, + dead_category_count: rt.number, + frequent_category_count: rt.number, + rare_category_count: rt.number, + total_category_count: rt.number, +}); + +export type JobModelSizeStats = rt.TypeOf; + export const jobSummaryRT = rt.intersection([ rt.type({ id: rt.string, @@ -65,6 +81,7 @@ export const jobSummaryRT = rt.intersection([ fullJob: rt.partial({ custom_settings: jobCustomSettingsRT, finished_time: rt.number, + model_size_stats: jobModelSizeStatsRT, }), }), ]); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/index.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/index.ts index 185f6936662bd..9828ad72ec909 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/index.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/index.ts @@ -7,6 +7,10 @@ export * from './log_analysis_capabilities'; export * from './log_analysis_cleanup'; export * from './log_analysis_module'; +export * from './log_analysis_module_configuration'; +export * from './log_analysis_module_definition'; export * from './log_analysis_module_status'; export * from './log_analysis_module_types'; export * from './log_analysis_setup_state'; + +export { JobModelSizeStats, JobSummary } from './api/ml_get_jobs_summary_api'; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx index efe9629e84e42..99c5a3df7c9b1 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useCallback, useEffect, useMemo } from 'react'; +import { useCallback, useMemo } from 'react'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { useModuleStatus } from './log_analysis_module_status'; @@ -17,36 +17,10 @@ export const useLogAnalysisModule = ({ sourceConfiguration: ModuleSourceConfiguration; moduleDescriptor: ModuleDescriptor; }) => { - const { spaceId, sourceId, timestampField, indices } = sourceConfiguration; - const [moduleStatus, dispatchModuleStatus] = useModuleStatus(moduleDescriptor.jobTypes, { - bucketSpan: moduleDescriptor.bucketSpan, - indexPattern: indices.join(','), - timestampField, - }); + const { spaceId, sourceId, timestampField } = sourceConfiguration; + const [moduleStatus, dispatchModuleStatus] = useModuleStatus(moduleDescriptor.jobTypes); - const [fetchModuleDefinitionRequest, fetchModuleDefinition] = useTrackedPromise( - { - cancelPreviousOn: 'resolution', - createPromise: async () => { - dispatchModuleStatus({ type: 'fetchingModuleDefinition' }); - return await moduleDescriptor.getModuleDefinition(); - }, - onResolve: response => { - dispatchModuleStatus({ - type: 'fetchedModuleDefinition', - spaceId, - sourceId, - moduleDefinition: response, - }); - }, - onReject: () => { - dispatchModuleStatus({ type: 'failedFetchingModuleDefinition' }); - }, - }, - [moduleDescriptor.getModuleDefinition, spaceId, sourceId] - ); - - const [fetchJobStatusRequest, fetchJobStatus] = useTrackedPromise( + const [, fetchJobStatus] = useTrackedPromise( { cancelPreviousOn: 'resolution', createPromise: async () => { @@ -68,12 +42,6 @@ export const useLogAnalysisModule = ({ [spaceId, sourceId] ); - const isLoadingModuleStatus = useMemo( - () => - fetchJobStatusRequest.state === 'pending' || fetchModuleDefinitionRequest.state === 'pending', - [fetchJobStatusRequest.state, fetchModuleDefinitionRequest.state] - ); - const [, setUpModule] = useTrackedPromise( { cancelPreviousOn: 'resolution', @@ -83,15 +51,24 @@ export const useLogAnalysisModule = ({ end: number | undefined ) => { dispatchModuleStatus({ type: 'startedSetup' }); - return await moduleDescriptor.setUpModule(start, end, { + const setupResult = await moduleDescriptor.setUpModule(start, end, { indices: selectedIndices, sourceId, spaceId, timestampField, }); + const jobSummaries = await moduleDescriptor.getJobSummary(spaceId, sourceId); + return { setupResult, jobSummaries }; }, - onResolve: ({ datafeeds, jobs }) => { - dispatchModuleStatus({ type: 'finishedSetup', datafeeds, jobs, spaceId, sourceId }); + onResolve: ({ setupResult: { datafeeds, jobs }, jobSummaries }) => { + dispatchModuleStatus({ + type: 'finishedSetup', + datafeedSetupResults: datafeeds, + jobSetupResults: jobs, + jobSummaries, + spaceId, + sourceId, + }); }, onReject: () => { dispatchModuleStatus({ type: 'failedSetup' }); @@ -146,36 +123,14 @@ export const useLogAnalysisModule = ({ sourceId, ]); - useEffect(() => { - dispatchModuleStatus({ - type: 'updatedSourceConfiguration', - spaceId, - sourceId, - sourceConfiguration: { - timestampField, - indexPattern: indices.join(','), - bucketSpan: moduleDescriptor.bucketSpan, - }, - }); - }, [ - dispatchModuleStatus, - indices, - moduleDescriptor.bucketSpan, - sourceConfiguration, - sourceId, - spaceId, - timestampField, - ]); - return { cleanUpAndSetUpModule, cleanUpModule, fetchJobStatus, - fetchModuleDefinition, isCleaningUp, - isLoadingModuleStatus, jobIds, jobStatus: moduleStatus.jobStatus, + jobSummaries: moduleStatus.jobSummaries, lastSetupErrorMessages: moduleStatus.lastSetupErrorMessages, moduleDescriptor, setUpModule, diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts new file mode 100644 index 0000000000000..ba2185ff83784 --- /dev/null +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useMemo } from 'react'; +import { JobSummary } from './api/ml_get_jobs_summary_api'; +import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; + +export const useLogAnalysisModuleConfiguration = ({ + moduleDescriptor, + sourceConfiguration, +}: { + moduleDescriptor: ModuleDescriptor; + sourceConfiguration: ModuleSourceConfiguration; +}) => { + const getIsJobConfigurationOutdated = useMemo( + () => isJobConfigurationOutdated(moduleDescriptor, sourceConfiguration), + [sourceConfiguration, moduleDescriptor] + ); + + return { + getIsJobConfigurationOutdated, + }; +}; + +export const isJobConfigurationOutdated = ( + { bucketSpan }: ModuleDescriptor, + currentSourceConfiguration: ModuleSourceConfiguration +) => (jobSummary: JobSummary): boolean => { + if (!jobSummary.fullJob || !jobSummary.fullJob.custom_settings) { + return false; + } + + const jobConfiguration = jobSummary.fullJob.custom_settings.logs_source_config; + + return !( + jobConfiguration && + jobConfiguration.bucketSpan === bucketSpan && + jobConfiguration.indexPattern && + isSubset( + new Set(jobConfiguration.indexPattern.split(',')), + new Set(currentSourceConfiguration.indices) + ) && + jobConfiguration.timestampField === currentSourceConfiguration.timestampField + ); +}; + +const isSubset = (subset: Set, superset: Set) => { + return Array.from(subset).every(subsetElement => superset.has(subsetElement)); +}; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx new file mode 100644 index 0000000000000..ea0cd32c0b93e --- /dev/null +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useCallback, useMemo, useState } from 'react'; +import { getJobId } from '../../../../common/log_analysis'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { JobSummary } from './api/ml_get_jobs_summary_api'; +import { GetMlModuleResponsePayload, JobDefinition } from './api/ml_get_module'; +import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; + +export const useLogAnalysisModuleDefinition = ({ + sourceConfiguration: { spaceId, sourceId }, + moduleDescriptor, +}: { + sourceConfiguration: ModuleSourceConfiguration; + moduleDescriptor: ModuleDescriptor; +}) => { + const [moduleDefinition, setModuleDefinition] = useState< + GetMlModuleResponsePayload | undefined + >(); + + const jobDefinitionByJobId = useMemo( + () => + moduleDefinition + ? moduleDefinition.jobs.reduce>( + (accumulatedJobDefinitions, jobDefinition) => ({ + ...accumulatedJobDefinitions, + [getJobId(spaceId, sourceId, jobDefinition.id)]: jobDefinition, + }), + {} + ) + : {}, + [moduleDefinition, sourceId, spaceId] + ); + + const [fetchModuleDefinitionRequest, fetchModuleDefinition] = useTrackedPromise( + { + cancelPreviousOn: 'resolution', + createPromise: async () => { + return await moduleDescriptor.getModuleDefinition(); + }, + onResolve: response => { + setModuleDefinition(response); + }, + onReject: () => { + setModuleDefinition(undefined); + }, + }, + [moduleDescriptor.getModuleDefinition, spaceId, sourceId] + ); + + const getIsJobDefinitionOutdated = useCallback( + (jobSummary: JobSummary): boolean => { + const jobDefinition: JobDefinition | undefined = jobDefinitionByJobId[jobSummary.id]; + + if (jobDefinition == null) { + return false; + } + + const currentRevision = jobDefinition?.config.custom_settings.job_revision; + return (jobSummary.fullJob?.custom_settings?.job_revision ?? 0) < (currentRevision ?? 0); + }, + [jobDefinitionByJobId] + ); + + return { + fetchModuleDefinition, + fetchModuleDefinitionRequestState: fetchModuleDefinitionRequest.state, + getIsJobDefinitionOutdated, + jobDefinitionByJobId, + moduleDefinition, + }; +}; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx index cf248f419f6f2..b5530f9ebf72e 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx @@ -7,25 +7,21 @@ import { useReducer } from 'react'; import { - JobSourceConfiguration, JobStatus, - SetupStatus, getDatafeedId, getJobId, isJobStatusWithResults, + SetupStatus, } from '../../../../common/log_analysis'; import { FetchJobStatusResponsePayload, JobSummary } from './api/ml_get_jobs_summary_api'; -import { GetMlModuleResponsePayload, JobDefinition } from './api/ml_get_module'; import { SetupMlModuleResponsePayload } from './api/ml_setup_module_api'; import { MandatoryProperty } from '../../../../common/utility_types'; interface StatusReducerState { - jobDefinitions: JobDefinition[]; jobStatus: Record; jobSummaries: JobSummary[]; lastSetupErrorMessages: string[]; setupStatus: SetupStatus; - sourceConfiguration: JobSourceConfiguration; } type StatusReducerAction = @@ -34,8 +30,9 @@ type StatusReducerAction = type: 'finishedSetup'; sourceId: string; spaceId: string; - jobs: SetupMlModuleResponsePayload['jobs']; - datafeeds: SetupMlModuleResponsePayload['datafeeds']; + jobSetupResults: SetupMlModuleResponsePayload['jobs']; + jobSummaries: FetchJobStatusResponsePayload; + datafeedSetupResults: SetupMlModuleResponsePayload['datafeeds']; } | { type: 'failedSetup' } | { type: 'fetchingJobStatuses' } @@ -46,32 +43,15 @@ type StatusReducerAction = payload: FetchJobStatusResponsePayload; } | { type: 'failedFetchingJobStatuses' } - | { type: 'fetchingModuleDefinition' } - | { - type: 'fetchedModuleDefinition'; - spaceId: string; - sourceId: string; - moduleDefinition: GetMlModuleResponsePayload; - } - | { type: 'failedFetchingModuleDefinition' } - | { - type: 'updatedSourceConfiguration'; - spaceId: string; - sourceId: string; - sourceConfiguration: JobSourceConfiguration; - } | { type: 'requestedJobConfigurationUpdate' } | { type: 'requestedJobDefinitionUpdate' } | { type: 'viewedResults' }; const createInitialState = ({ jobTypes, - sourceConfiguration, }: { jobTypes: JobType[]; - sourceConfiguration: JobSourceConfiguration; }): StatusReducerState => ({ - jobDefinitions: [], jobStatus: jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, @@ -81,8 +61,7 @@ const createInitialState = ({ ), jobSummaries: [], lastSetupErrorMessages: [], - setupStatus: 'initializing', - sourceConfiguration, + setupStatus: { type: 'initializing' }, }); const createStatusReducer = (jobTypes: JobType[]) => ( @@ -100,39 +79,44 @@ const createStatusReducer = (jobTypes: JobType[]) => ( }), {} as Record ), - setupStatus: 'pending', + setupStatus: { type: 'pending' }, }; } case 'finishedSetup': { - const { jobs, datafeeds, spaceId, sourceId } = action; + const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, sourceId } = action; const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, [jobType]: - hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobs) && - hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))(datafeeds) + hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobSetupResults) && + hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))( + datafeedSetupResults + ) ? 'started' : 'failed', }), {} as Record ); - const nextSetupStatus = Object.values(nextJobStatus).every( + const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( jobState => jobState === 'started' ) - ? 'succeeded' - : 'failed'; - const nextErrorMessages = [ - ...Object.values(datafeeds) - .filter(hasError) - .map(datafeed => datafeed.error.msg), - ...Object.values(jobs) - .filter(hasError) - .map(job => job.error.msg), - ]; + ? { type: 'succeeded' } + : { + type: 'failed', + reasons: [ + ...Object.values(datafeedSetupResults) + .filter(hasError) + .map(datafeed => datafeed.error.msg), + ...Object.values(jobSetupResults) + .filter(hasError) + .map(job => job.error.msg), + ], + }; + return { ...state, jobStatus: nextJobStatus, - lastSetupErrorMessages: nextErrorMessages, + jobSummaries, setupStatus: nextSetupStatus, }; } @@ -146,19 +130,19 @@ const createStatusReducer = (jobTypes: JobType[]) => ( }), {} as Record ), - setupStatus: 'failed', + setupStatus: { type: 'failed', reasons: ['unknown'] }, }; } - case 'fetchingModuleDefinition': case 'fetchingJobStatuses': { return { ...state, - setupStatus: state.setupStatus === 'unknown' ? 'initializing' : state.setupStatus, + setupStatus: + state.setupStatus.type === 'unknown' ? { type: 'initializing' } : state.setupStatus, }; } case 'fetchedJobStatuses': { const { payload: jobSummaries, spaceId, sourceId } = action; - const { jobDefinitions, setupStatus, sourceConfiguration } = state; + const { setupStatus } = state; const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ @@ -167,14 +151,7 @@ const createStatusReducer = (jobTypes: JobType[]) => ( }), {} as Record ); - const nextSetupStatus = getSetupStatus( - spaceId, - sourceId, - sourceConfiguration, - nextJobStatus, - jobDefinitions, - jobSummaries - )(setupStatus); + const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); return { ...state, @@ -186,7 +163,7 @@ const createStatusReducer = (jobTypes: JobType[]) => ( case 'failedFetchingJobStatuses': { return { ...state, - setupStatus: 'unknown', + setupStatus: { type: 'unknown' }, jobStatus: jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, @@ -196,60 +173,22 @@ const createStatusReducer = (jobTypes: JobType[]) => ( ), }; } - case 'fetchedModuleDefinition': { - const { spaceId, sourceId, moduleDefinition } = action; - const { jobStatus, jobSummaries, setupStatus, sourceConfiguration } = state; - - const nextSetupStatus = getSetupStatus( - spaceId, - sourceId, - sourceConfiguration, - jobStatus, - moduleDefinition.jobs, - jobSummaries - )(setupStatus); - - return { - ...state, - jobDefinitions: moduleDefinition.jobs, - setupStatus: nextSetupStatus, - }; - } - case 'updatedSourceConfiguration': { - const { spaceId, sourceId, sourceConfiguration } = action; - const { jobDefinitions, jobStatus, jobSummaries, setupStatus } = state; - - const nextSetupStatus = getSetupStatus( - spaceId, - sourceId, - sourceConfiguration, - jobStatus, - jobDefinitions, - jobSummaries - )(setupStatus); - - return { - ...state, - setupStatus: nextSetupStatus, - sourceConfiguration, - }; - } case 'requestedJobConfigurationUpdate': { return { ...state, - setupStatus: 'requiredForReconfiguration', + setupStatus: { type: 'required', reason: 'reconfiguration' }, }; } case 'requestedJobDefinitionUpdate': { return { ...state, - setupStatus: 'requiredForUpdate', + setupStatus: { type: 'required', reason: 'update' }, }; } case 'viewedResults': { return { ...state, - setupStatus: 'hiddenAfterSuccess', + setupStatus: { type: 'skipped', newlyCreated: true }, }; } default: { @@ -307,100 +246,28 @@ const getJobStatus = (jobId: string) => (jobSummaries: FetchJobStatusResponsePay } )[0] || 'missing'; -const getSetupStatus = ( - spaceId: string, - sourceId: string, - sourceConfiguration: JobSourceConfiguration, - everyJobStatus: Record, - jobDefinitions: JobDefinition[], - jobSummaries: JobSummary[] -) => (previousSetupStatus: SetupStatus) => - Object.entries(everyJobStatus).reduce( - (setupStatus, [jobType, jobStatus]) => { - const jobId = getJobId(spaceId, sourceId, jobType); - const jobDefinition = jobDefinitions.find(({ id }) => id === jobType); - - if (jobStatus === 'missing') { - return 'required'; - } else if ( - setupStatus === 'required' || - setupStatus === 'requiredForUpdate' || - setupStatus === 'requiredForReconfiguration' - ) { - return setupStatus; - } else if ( - jobDefinition && - !isJobRevisionCurrent( - jobId, - jobDefinition.config.custom_settings.job_revision || 0 - )(jobSummaries) - ) { - return 'skippedButUpdatable'; - } else if (!isJobConfigurationConsistent(jobId, sourceConfiguration)(jobSummaries)) { - return 'skippedButReconfigurable'; - } else if (setupStatus === 'hiddenAfterSuccess') { - return setupStatus; - } else if (setupStatus === 'skipped' || isJobStatusWithResults(jobStatus)) { - return 'skipped'; - } - +const getSetupStatus = (everyJobStatus: Record) => ( + previousSetupStatus: SetupStatus +): SetupStatus => + Object.entries(everyJobStatus).reduce((setupStatus, [, jobStatus]) => { + if (jobStatus === 'missing') { + return { type: 'required', reason: 'missing' }; + } else if (setupStatus.type === 'required') { return setupStatus; - }, - previousSetupStatus - ); - -const isJobRevisionCurrent = (jobId: string, currentRevision: number) => ( - jobSummaries: FetchJobStatusResponsePayload -): boolean => - jobSummaries - .filter(jobSummary => jobSummary.id === jobId) - .every( - jobSummary => (jobSummary?.fullJob?.custom_settings?.job_revision ?? 0) >= currentRevision - ); - -const isJobConfigurationConsistent = ( - jobId: string, - sourceConfiguration: { - bucketSpan: number; - indexPattern: string; - timestampField: string; - } -) => (jobSummaries: FetchJobStatusResponsePayload): boolean => - jobSummaries - .filter(jobSummary => jobSummary.id === jobId) - .every(jobSummary => { - if (!jobSummary.fullJob || !jobSummary.fullJob.custom_settings) { - return false; - } - - const jobConfiguration = jobSummary.fullJob.custom_settings.logs_source_config; - - return ( - jobConfiguration && - jobConfiguration.bucketSpan === sourceConfiguration.bucketSpan && - jobConfiguration.indexPattern && - isIndexPatternSubset(jobConfiguration.indexPattern, sourceConfiguration.indexPattern) && - jobConfiguration.timestampField === sourceConfiguration.timestampField - ); - }); - -const isIndexPatternSubset = (indexPatternSubset: string, indexPatternSuperset: string) => { - const subsetSubPatterns = indexPatternSubset.split(','); - const supersetSubPatterns = new Set(indexPatternSuperset.split(',')); + } else if (setupStatus.type === 'skipped' || isJobStatusWithResults(jobStatus)) { + return { + type: 'skipped', + // preserve newlyCreated status + newlyCreated: setupStatus.type === 'skipped' && setupStatus.newlyCreated, + }; + } - return subsetSubPatterns.every(subPattern => supersetSubPatterns.has(subPattern)); -}; + return setupStatus; + }, previousSetupStatus); const hasError = (value: Value): value is MandatoryProperty => value.error != null; -export const useModuleStatus = ( - jobTypes: JobType[], - sourceConfiguration: JobSourceConfiguration -) => { - return useReducer( - createStatusReducer(jobTypes), - { jobTypes, sourceConfiguration }, - createInitialState - ); +export const useModuleStatus = (jobTypes: JobType[]) => { + return useReducer(createStatusReducer(jobTypes), { jobTypes }, createInitialState); }; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx index d1c10820f7c9c..ed1aa9e72ebae 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx @@ -37,18 +37,13 @@ export const LogEntryCategoriesPageContent = () => { hasLogAnalysisSetupCapabilities, } = useLogAnalysisCapabilitiesContext(); - const { - fetchJobStatus, - fetchModuleDefinition, - setupStatus, - } = useLogEntryCategoriesModuleContext(); + const { fetchJobStatus, setupStatus } = useLogEntryCategoriesModuleContext(); useEffect(() => { if (hasLogAnalysisReadCapabilities) { - fetchModuleDefinition(); fetchJobStatus(); } - }, [fetchJobStatus, fetchModuleDefinition, hasLogAnalysisReadCapabilities]); + }, [fetchJobStatus, hasLogAnalysisReadCapabilities]); if (isLoadingSource || isUninitialized) { return ; @@ -58,7 +53,7 @@ export const LogEntryCategoriesPageContent = () => { return ; } else if (!hasLogAnalysisReadCapabilities) { return ; - } else if (setupStatus === 'initializing') { + } else if (setupStatus.type === 'initializing') { return ( { })} /> ); - } else if (setupStatus === 'unknown') { + } else if (setupStatus.type === 'unknown') { return ; } else if (isSetupStatusWithResults(setupStatus)) { return ; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx index b783aa9c79007..e304a8835e99c 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx @@ -9,17 +9,11 @@ import { EuiFlexGroup, EuiFlexItem, EuiPage, EuiPanel, EuiSuperDatePicker } from import { i18n } from '@kbn/i18n'; import moment from 'moment'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; - import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { euiStyled } from '../../../../../observability/public'; +import { euiStyled, useTrackPageview } from '../../../../../observability/public'; import { TimeRange } from '../../../../common/http_api/shared/time_range'; -import { - LogAnalysisJobProblemIndicator, - jobHasProblem, -} from '../../../components/logging/log_analysis_job_status'; -import { FirstUseCallout } from '../../../components/logging/log_analysis_results'; import { useInterval } from '../../../hooks/use_interval'; -import { useTrackPageview } from '../../../../../observability/public'; +import { CategoryJobNoticesSection } from './sections/notices/notices_section'; import { TopCategoriesSection } from './sections/top_categories'; import { useLogEntryCategoriesModuleContext } from './use_log_entry_categories_module'; import { useLogEntryCategoriesResults } from './use_log_entry_categories_results'; @@ -36,11 +30,15 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent = () => { const { fetchJobStatus, - jobStatus, + fetchModuleDefinition, setupStatus, viewSetupForReconfiguration, viewSetupForUpdate, + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, jobIds, + categoryQualityWarnings, sourceConfiguration: { sourceId }, } = useLogEntryCategoriesModuleContext(); @@ -124,12 +122,15 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent = () => { [setAutoRefresh] ); - const isFirstUse = useMemo(() => setupStatus === 'hiddenAfterSuccess', [setupStatus]); - const hasResults = useMemo(() => topLogEntryCategories.length > 0, [ topLogEntryCategories.length, ]); + const isFirstUse = useMemo( + () => setupStatus.type === 'skipped' && !!setupStatus.newlyCreated && !hasResults, + [hasResults, setupStatus] + ); + useEffect(() => { getTopLogEntryCategories(); }, [getTopLogEntryCategories, categoryQueryDatasets, categoryQueryTimeRange.lastChangedTime]); @@ -138,6 +139,10 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent = () => { getLogEntryCategoryDatasets(); }, [getLogEntryCategoryDatasets, categoryQueryTimeRange.lastChangedTime]); + useEffect(() => { + fetchModuleDefinition(); + }, [fetchModuleDefinition]); + useInterval(() => { fetchJobStatus(); }, JOB_STATUS_POLLING_INTERVAL); @@ -172,21 +177,17 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent = () => {
- {jobHasProblem(jobStatus['log-entry-categories-count'], setupStatus) ? ( - - - - ) : null} - {isFirstUse && !hasResults ? ( - - - - ) : null} + + + void; + onRecreateMlJobForUpdate: () => void; + qualityWarnings: QualityWarning[]; +}> = ({ + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, + isFirstUse, + onRecreateMlJobForReconfiguration, + onRecreateMlJobForUpdate, + qualityWarnings, +}) => ( + <> + + + +); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warning_notices.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warning_notices.tsx new file mode 100644 index 0000000000000..73b6b88db873a --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warning_notices.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiCallOut } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React from 'react'; +import { CategoryQualityWarningReason, QualityWarning } from './quality_warnings'; + +export const CategoryQualityWarnings: React.FC<{ qualityWarnings: QualityWarning[] }> = ({ + qualityWarnings, +}) => ( + <> + {qualityWarnings.map((qualityWarning, qualityWarningIndex) => ( + +

+ +

+
    + {qualityWarning.reasons.map((reason, reasonIndex) => ( +
  • + +
  • + ))} +
+
+ ))} + +); + +const categoryQualityWarningCalloutTitle = i18n.translate( + 'xpack.infra.logs.logEntryCategories.categoryQUalityWarningCalloutTitle', + { + defaultMessage: 'Quality warning', + } +); + +const CategoryQualityWarningReasonDescription: React.FC<{ + reason: CategoryQualityWarningReason; +}> = ({ reason }) => { + switch (reason.type) { + case 'singleCategory': + return ( + + ); + case 'manyRareCategories': + return ( + + ); + case 'manyCategories': + return ( + + ); + case 'noFrequentCategories': + return ( + + ); + case 'manyDeadCategories': + return ( + + ); + } +}; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warnings.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warnings.tsx new file mode 100644 index 0000000000000..e0d3aa105e004 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/notices/quality_warnings.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +interface ManyCategoriesWarningReason { + type: 'manyCategories'; + categoriesDocumentRatio: number; +} + +interface ManyDeadCategoriesWarningReason { + type: 'manyDeadCategories'; + deadCategoriesRatio: number; +} + +interface ManyRareCategoriesWarningReason { + type: 'manyRareCategories'; + rareCategoriesRatio: number; +} + +interface NoFrequentCategoriesWarningReason { + type: 'noFrequentCategories'; +} + +interface SingleCategoryWarningReason { + type: 'singleCategory'; +} + +export type CategoryQualityWarningReason = + | ManyCategoriesWarningReason + | ManyDeadCategoriesWarningReason + | ManyRareCategoriesWarningReason + | NoFrequentCategoriesWarningReason + | SingleCategoryWarningReason; + +export type CategoryQualityWarningReasonType = CategoryQualityWarningReason['type']; + +export interface CategoryQualityWarning { + type: 'categoryQualityWarning'; + jobId: string; + reasons: CategoryQualityWarningReason[]; +} + +export type QualityWarning = CategoryQualityWarning; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_module.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_module.tsx index 918c252f6350c..2917719af283b 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_module.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_module.tsx @@ -6,12 +6,14 @@ import createContainer from 'constate'; import { useMemo } from 'react'; - import { - useLogAnalysisModule, ModuleSourceConfiguration, + useLogAnalysisModule, + useLogAnalysisModuleConfiguration, + useLogAnalysisModuleDefinition, } from '../../../containers/logs/log_analysis'; import { logEntryCategoriesModule } from './module_descriptor'; +import { useLogEntryCategoriesQuality } from './use_log_entry_categories_quality'; export const useLogEntryCategoriesModule = ({ indexPattern, @@ -34,10 +36,51 @@ export const useLogEntryCategoriesModule = ({ [indexPattern, sourceId, spaceId, timestampField] ); - return useLogAnalysisModule({ + const logAnalysisModule = useLogAnalysisModule({ + moduleDescriptor: logEntryCategoriesModule, + sourceConfiguration, + }); + + const { getIsJobConfigurationOutdated } = useLogAnalysisModuleConfiguration({ + sourceConfiguration, moduleDescriptor: logEntryCategoriesModule, + }); + + const { fetchModuleDefinition, getIsJobDefinitionOutdated } = useLogAnalysisModuleDefinition({ sourceConfiguration, + moduleDescriptor: logEntryCategoriesModule, + }); + + const { categoryQualityWarnings } = useLogEntryCategoriesQuality({ + jobSummaries: logAnalysisModule.jobSummaries, }); + + const hasOutdatedJobConfigurations = useMemo( + () => logAnalysisModule.jobSummaries.some(getIsJobConfigurationOutdated), + [getIsJobConfigurationOutdated, logAnalysisModule.jobSummaries] + ); + + const hasOutdatedJobDefinitions = useMemo( + () => logAnalysisModule.jobSummaries.some(getIsJobDefinitionOutdated), + [getIsJobDefinitionOutdated, logAnalysisModule.jobSummaries] + ); + + const hasStoppedJobs = useMemo( + () => + Object.values(logAnalysisModule.jobStatus).some( + currentJobStatus => currentJobStatus === 'stopped' + ), + [logAnalysisModule.jobStatus] + ); + + return { + ...logAnalysisModule, + categoryQualityWarnings, + fetchModuleDefinition, + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, + }; }; export const [ diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_quality.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_quality.ts new file mode 100644 index 0000000000000..031479e66386f --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_quality.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useMemo } from 'react'; + +import { JobModelSizeStats, JobSummary } from '../../../containers/logs/log_analysis'; +import { QualityWarning, CategoryQualityWarningReason } from './sections/notices/quality_warnings'; + +export const useLogEntryCategoriesQuality = ({ jobSummaries }: { jobSummaries: JobSummary[] }) => { + const categoryQualityWarnings: QualityWarning[] = useMemo( + () => + jobSummaries + .filter( + jobSummary => jobSummary.fullJob?.model_size_stats?.categorization_status === 'warn' + ) + .map(jobSummary => ({ + type: 'categoryQualityWarning', + jobId: jobSummary.id, + reasons: jobSummary.fullJob?.model_size_stats + ? getCategoryQualityWarningReasons(jobSummary.fullJob.model_size_stats) + : [], + })), + [jobSummaries] + ); + + return { + categoryQualityWarnings, + }; +}; + +const getCategoryQualityWarningReasons = ({ + categorized_doc_count: categorizedDocCount, + dead_category_count: deadCategoryCount, + frequent_category_count: frequentCategoryCount, + rare_category_count: rareCategoryCount, + total_category_count: totalCategoryCount, +}: JobModelSizeStats): CategoryQualityWarningReason[] => { + const rareCategoriesRatio = rareCategoryCount / totalCategoryCount; + const categoriesDocumentRatio = totalCategoryCount / categorizedDocCount; + const deadCategoriesRatio = deadCategoryCount / totalCategoryCount; + + return [ + ...(totalCategoryCount === 1 + ? [ + { + type: 'singleCategory' as const, + }, + ] + : []), + ...(rareCategoriesRatio >= 0.9 + ? [ + { + type: 'manyRareCategories' as const, + rareCategoriesRatio, + }, + ] + : []), + ...(categorizedDocCount > 100 && categoriesDocumentRatio >= 0.5 + ? [ + { + type: 'manyCategories' as const, + categoriesDocumentRatio, + }, + ] + : []), + ...(frequentCategoryCount === 0 + ? [ + { + type: 'noFrequentCategories' as const, + }, + ] + : []), + ...(deadCategoriesRatio >= 0.5 + ? [ + { + type: 'manyDeadCategories' as const, + deadCategoriesRatio, + }, + ] + : []), + ]; +}; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx index fe12ca5455a75..2f34e62d8e611 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx @@ -37,14 +37,13 @@ export const LogEntryRatePageContent = () => { hasLogAnalysisSetupCapabilities, } = useLogAnalysisCapabilitiesContext(); - const { fetchJobStatus, fetchModuleDefinition, setupStatus } = useLogEntryRateModuleContext(); + const { fetchJobStatus, setupStatus } = useLogEntryRateModuleContext(); useEffect(() => { if (hasLogAnalysisReadCapabilities) { - fetchModuleDefinition(); fetchJobStatus(); } - }, [fetchJobStatus, fetchModuleDefinition, hasLogAnalysisReadCapabilities]); + }, [fetchJobStatus, hasLogAnalysisReadCapabilities]); if (isLoadingSource || isUninitialized) { return ; @@ -54,7 +53,7 @@ export const LogEntryRatePageContent = () => { return ; } else if (!hasLogAnalysisReadCapabilities) { return ; - } else if (setupStatus === 'initializing') { + } else if (setupStatus.type === 'initializing') { return ( { })} /> ); - } else if (setupStatus === 'unknown') { + } else if (setupStatus.type === 'unknown') { return ; } else if (isSetupStatusWithResults(setupStatus)) { return ; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx index 50d58865e9746..156c9a919440e 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx @@ -11,21 +11,19 @@ import { EuiFlexItem, EuiPage, EuiPanel, - EuiSpacer, EuiSuperDatePicker, EuiText, } from '@elastic/eui'; import numeral from '@elastic/numeral'; import { FormattedMessage } from '@kbn/i18n/react'; import moment from 'moment'; -import React, { useCallback, useMemo, useState, useEffect } from 'react'; - -import { euiStyled } from '../../../../../observability/public'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { euiStyled, useTrackPageview } from '../../../../../observability/public'; import { TimeRange } from '../../../../common/http_api/shared/time_range'; import { bucketSpan } from '../../../../common/log_analysis'; import { LoadingOverlayWrapper } from '../../../components/loading_overlay_wrapper'; +import { LogAnalysisJobProblemIndicator } from '../../../components/logging/log_analysis_job_status'; import { useInterval } from '../../../hooks/use_interval'; -import { useTrackPageview } from '../../../../../observability/public'; import { useKibanaUiSetting } from '../../../utils/use_kibana_ui_setting'; import { AnomaliesResults } from './sections/anomalies'; import { LogRateResults } from './sections/log_rate'; @@ -35,7 +33,6 @@ import { StringTimeRange, useLogAnalysisResultsUrlState, } from './use_log_entry_rate_results_url_state'; -import { FirstUseCallout } from '../../../components/logging/log_analysis_results'; const JOB_STATUS_POLLING_INTERVAL = 30000; @@ -47,10 +44,13 @@ export const LogEntryRateResultsContent: React.FunctionComponent = () => { const { fetchJobStatus, - jobStatus, + fetchModuleDefinition, setupStatus, viewSetupForReconfiguration, viewSetupForUpdate, + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, jobIds, sourceConfiguration: { sourceId }, } = useLogEntryRateModuleContext(); @@ -82,10 +82,6 @@ export const LogEntryRateResultsContent: React.FunctionComponent = () => { bucketDuration, }); - const hasResults = useMemo(() => (logEntryRate?.histogramBuckets?.length ?? 0) > 0, [ - logEntryRate, - ]); - const handleQueryTimeRangeChange = useCallback( ({ start: startTime, end: endTime }: { start: string; end: string }) => { setQueryTimeRange({ @@ -131,12 +127,23 @@ export const LogEntryRateResultsContent: React.FunctionComponent = () => { [setAutoRefresh] ); - const isFirstUse = useMemo(() => setupStatus === 'hiddenAfterSuccess', [setupStatus]); + const hasResults = useMemo(() => (logEntryRate?.histogramBuckets?.length ?? 0) > 0, [ + logEntryRate, + ]); + + const isFirstUse = useMemo( + () => setupStatus.type === 'skipped' && !!setupStatus.newlyCreated && !hasResults, + [hasResults, setupStatus] + ); useEffect(() => { getLogEntryRate(); }, [getLogEntryRate, queryTimeRange.lastChangedTime]); + useEffect(() => { + fetchModuleDefinition(); + }, [fetchModuleDefinition]); + useInterval(() => { fetchJobStatus(); }, JOB_STATUS_POLLING_INTERVAL); @@ -195,14 +202,18 @@ export const LogEntryRateResultsContent: React.FunctionComponent = () => {
+ + + - {isFirstUse && !hasResults ? ( - <> - - - - ) : null} { diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/sections/anomalies/index.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/sections/anomalies/index.tsx index 2551170c44f4e..e216162d7a295 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/sections/anomalies/index.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/sections/anomalies/index.tsx @@ -20,7 +20,7 @@ import React, { useMemo } from 'react'; import { euiStyled } from '../../../../../../../observability/public'; import { LogEntryRateResults } from '../../use_log_entry_rate_results'; import { TimeRange } from '../../../../../../common/http_api/shared/time_range'; -import { formatAnomalyScore, JobStatus, SetupStatus } from '../../../../../../common/log_analysis'; +import { formatAnomalyScore } from '../../../../../../common/log_analysis'; import { getAnnotationsForAll, getLogEntryRateCombinedSeries, @@ -28,34 +28,18 @@ import { } from '../helpers/data_formatters'; import { AnomaliesChart } from './chart'; import { AnomaliesTable } from './table'; -import { - LogAnalysisJobProblemIndicator, - RecreateJobButton, -} from '../../../../../components/logging/log_analysis_job_status'; +import { RecreateJobButton } from '../../../../../components/logging/log_analysis_job_status'; import { AnalyzeInMlButton } from '../../../../../components/logging/log_analysis_results'; import { LoadingOverlayWrapper } from '../../../../../components/loading_overlay_wrapper'; export const AnomaliesResults: React.FunctionComponent<{ isLoading: boolean; - jobStatus: JobStatus; results: LogEntryRateResults | null; setTimeRange: (timeRange: TimeRange) => void; - setupStatus: SetupStatus; timeRange: TimeRange; viewSetupForReconfiguration: () => void; - viewSetupForUpdate: () => void; jobId: string; -}> = ({ - isLoading, - jobStatus, - results, - setTimeRange, - setupStatus, - timeRange, - viewSetupForReconfiguration, - viewSetupForUpdate, - jobId, -}) => { +}> = ({ isLoading, results, setTimeRange, timeRange, viewSetupForReconfiguration, jobId }) => { const hasAnomalies = useMemo(() => { return results && results.histogramBuckets ? results.histogramBuckets.some(bucket => { @@ -100,20 +84,13 @@ export const AnomaliesResults: React.FunctionComponent<{ - +
- - }> {!results || (results && results.histogramBuckets && !results.histogramBuckets.length) ? ( logAnalysisModule.jobSummaries.some(getIsJobConfigurationOutdated), + [getIsJobConfigurationOutdated, logAnalysisModule.jobSummaries] + ); + + const hasOutdatedJobDefinitions = useMemo( + () => logAnalysisModule.jobSummaries.some(getIsJobDefinitionOutdated), + [getIsJobDefinitionOutdated, logAnalysisModule.jobSummaries] + ); + + const hasStoppedJobs = useMemo( + () => + Object.values(logAnalysisModule.jobStatus).some( + currentJobStatus => currentJobStatus === 'stopped' + ), + [logAnalysisModule.jobStatus] + ); + + return { + ...logAnalysisModule, + fetchModuleDefinition, + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, + }; }; export const [LogEntryRateModuleProvider, useLogEntryRateModuleContext] = createContainer( diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/markdown_renderers.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/markdown_renderers.tsx index 2e321e8bfc36f..c164138e35740 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/markdown_renderers.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/markdown_renderers.tsx @@ -28,9 +28,7 @@ export const markdownRenderers = { {children} ), table: ({ children }: { children: React.ReactNode[] }) => ( - - {children} -
+ {children}
), tableRow: ({ children }: { children: React.ReactNode[] }) => ( {children} diff --git a/x-pack/plugins/maps/public/index.ts b/x-pack/plugins/maps/public/index.ts index c465700a4f9c5..e3feb47691877 100644 --- a/x-pack/plugins/maps/public/index.ts +++ b/x-pack/plugins/maps/public/index.ts @@ -10,3 +10,5 @@ import { MapsPlugin, MapsPluginSetup, MapsPluginStart } from './plugin'; export const plugin: PluginInitializer = () => { return new MapsPlugin(); }; + +export { MAP_SAVED_OBJECT_TYPE } from '../common/constants'; diff --git a/x-pack/plugins/maps/public/reducers/non_serializable_instances.d.ts b/x-pack/plugins/maps/public/reducers/non_serializable_instances.d.ts new file mode 100644 index 0000000000000..6d216eb60c45d --- /dev/null +++ b/x-pack/plugins/maps/public/reducers/non_serializable_instances.d.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Adapters } from 'src/plugins/inspector/public'; +import { AnyAction } from 'redux'; + +interface EventHandlers { + /** + * Take action on data load. + */ + onDataLoad: (layerId: string, dataId: string) => void; + /** + * Take action on data load end. + */ + onDataLoadEnd: (layerId: string, dataId: string, resultMeta: object) => void; + /** + * Take action on data load error. + */ + onDataLoadError: (layerId: string, dataId: string, errorMessage: string) => void; +} + +export function setEventHandlers(eventHandlers?: EventHandlers): AnyAction; + +export function getInspectorAdapters(args: unknown): Adapters | undefined; diff --git a/x-pack/plugins/maps/public/reducers/store.d.ts b/x-pack/plugins/maps/public/reducers/store.d.ts new file mode 100644 index 0000000000000..ebed396e20399 --- /dev/null +++ b/x-pack/plugins/maps/public/reducers/store.d.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Store } from 'redux'; + +export type MapStore = Store; + +export function createMapStore(): MapStore; diff --git a/x-pack/plugins/ml/common/constants/search.ts b/x-pack/plugins/ml/common/constants/search.ts index e17f6b3098421..da65748668a4f 100644 --- a/x-pack/plugins/ml/common/constants/search.ts +++ b/x-pack/plugins/ml/common/constants/search.ts @@ -11,3 +11,8 @@ export enum SEARCH_QUERY_LANGUAGE { KUERY = 'kuery', LUCENE = 'lucene', } + +export interface ErrorMessage { + query: string; + message: string; +} diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js index 7da49a378ec96..2a34f12330a75 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js @@ -21,7 +21,7 @@ import { checkPermission } from '../../privilege/check_privilege'; import { SEARCH_QUERY_LANGUAGE } from '../../../../common/constants/search'; import { isRuleSupported } from '../../../../common/util/anomaly_utils'; import { parseInterval } from '../../../../common/util/parse_interval'; -import { escapeDoubleQuotes } from '../kql_filter_bar/utils'; +import { escapeDoubleQuotes } from '../../explorer/explorer_utils'; import { getFieldTypeFromMapping } from '../../services/mapping_service'; import { ml } from '../../services/ml_api_service'; import { mlJobService } from '../../services/job_service'; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/__snapshots__/kql_filter_bar.test.js.snap b/x-pack/plugins/ml/public/application/components/kql_filter_bar/__snapshots__/kql_filter_bar.test.js.snap deleted file mode 100644 index f2eeb00b6c643..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/__snapshots__/kql_filter_bar.test.js.snap +++ /dev/null @@ -1,15 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`KqlFilterBar snapshot 1`] = ` - - - -`; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/__tests__/utils.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/__tests__/utils.js deleted file mode 100644 index 6029799ffe8b8..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/__tests__/utils.js +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { removeFilterFromQueryString, getQueryPattern, escapeRegExp } from '../utils'; - -describe('ML - KqlFilterBar utils', () => { - const fieldName = 'http.response.status_code'; - const fieldValue = '200'; - const speciaCharFieldName = 'normal(brackets)name'; - const speciaCharFieldValue = '<>:;[})'; - - describe('removeFilterFromQueryString', () => { - it('removes selected fieldName/fieldValue from query string with one value', () => { - const currentQueryString = 'http.response.status_code : "200"'; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it('removes selected fieldName/fieldValue of type number from existing query string with one value', () => { - const currentQueryString = 'http.response.status_code : 200'; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it('removes selected fieldName/fieldValue from query string with multiple values', () => { - const currentQueryString = 'test_field : test_value or http.response.status_code : "200"'; - const expectedOutput = 'test_field : test_value'; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it('removes selected fieldName/fieldValue of type number from existing query string with multiple values', () => { - const currentQueryString = 'http.response.status_code : 200 or test_field : test_value'; - const expectedOutput = 'test_field : test_value'; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it("removes 'and' from end of the query to ensure kuery syntax is valid", () => { - const currentQueryString = 'http.response.status_code : "200" and'; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it("removes 'or' from end of the query to ensure kuery syntax is valid", () => { - const currentQueryString = 'http.response.status_code : "200" or'; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it("removes 'and' from start of the query to ensure kuery syntax is valid", () => { - const currentQueryString = ' and http.response.status_code : "200"'; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it("removes 'or' from start of the query to ensure kuery syntax is valid", () => { - const currentQueryString = ' or http.response.status_code : "200" '; - const expectedOutput = ''; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it('removes selected fieldName/fieldValue correctly from AND query string when it is the middle value', () => { - const currentQueryString = `http.response.status_code : "400" and http.response.status_code : "200" - and http.response.status_code : "300"`; - const expectedOutput = - 'http.response.status_code : "400" and http.response.status_code : "300"'; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - - it('removes selected fieldName/fieldValue correctly from OR query string when it is the middle value', () => { - const currentQueryString = `http.response.status_code : "400" or http.response.status_code : "200" - or http.response.status_code : "300"`; - const expectedOutput = - 'http.response.status_code : "400" or http.response.status_code : "300"'; - const result = removeFilterFromQueryString(currentQueryString, fieldName, fieldValue); - expect(result).to.be(expectedOutput); - }); - }); - - describe('getQueryPattern', () => { - it('creates a regular expression pattern for given fieldName/fieldValue', () => { - // The source property returns a String containing the source text of the regexp object - // and it doesn't contain the two forward slashes on both sides and any flags. - const expectedOutput = /(http\.response\.status_code)\s?:\s?(")?(200)(")?/i.source; - const result = getQueryPattern(fieldName, fieldValue).source; - expect(result).to.be(expectedOutput); - }); - - it('creates a regular expression pattern for given fieldName/fieldValue containing special characters', () => { - // The source property returns a String containing the source text of the regexp object - // and it doesn't contain the two forward slashes on both sides and any flags. - const expectedOutput = /(normal\(brackets\)name)\s?:\s?(")?(<>:;\[\}\))(")?/i.source; - const result = getQueryPattern(speciaCharFieldName, speciaCharFieldValue).source; - expect(result).to.be(expectedOutput); - }); - }); - - describe('escapeRegExp', () => { - it('escapes regex special characters for given fieldName/fieldValue', () => { - // The source property returns a String containing the source text of the regexp object - // and it doesn't contain the two forward slashes on both sides and any flags. - const expectedFieldName = 'normal\\(brackets\\)name'; - const expectedFieldValue = '<>:;\\[\\}\\)'; - const resultFieldName = escapeRegExp(speciaCharFieldName); - const resultFieldValue = escapeRegExp(speciaCharFieldValue); - - expect(resultFieldName).to.be(expectedFieldName); - expect(resultFieldValue).to.be(expectedFieldValue); - }); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/__snapshots__/click_outside.test.js.snap b/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/__snapshots__/click_outside.test.js.snap deleted file mode 100644 index eb3e5e6005dee..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/__snapshots__/click_outside.test.js.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ClickOutside snapshot 1`] = `
`; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.js deleted file mode 100644 index 02d6750dca965..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -export class ClickOutside extends Component { - componentDidMount() { - document.addEventListener('mousedown', this.onClick); - } - - componentWillUnmount() { - document.removeEventListener('mousedown', this.onClick); - } - - setNodeRef = node => { - this.nodeRef = node; - }; - - onClick = event => { - if (this.nodeRef && !this.nodeRef.contains(event.target)) { - this.props.onClickOutside(); - } - }; - - render() { - const { style, children } = this.props; - - return ( -
- {children} -
- ); - } -} - -ClickOutside.propTypes = { - onClickOutside: PropTypes.func.isRequired, -}; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.test.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.test.js deleted file mode 100644 index 1cd1dc6e4d715..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/click_outside/click_outside.test.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { ClickOutside } from './click_outside'; - -describe('ClickOutside', () => { - test('snapshot', () => { - const wrapper = shallow( {}} />); - expect(wrapper).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/__snapshots__/filter_bar.test.js.snap b/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/__snapshots__/filter_bar.test.js.snap deleted file mode 100644 index f3c825a66ee2f..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/__snapshots__/filter_bar.test.js.snap +++ /dev/null @@ -1,133 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FilterBar snapshot suggestions not shown 1`] = ` - -
- -
- Test description for fieldValueOne

", - "end": 1, - "start": 0, - "text": "fieldValueOne", - "type": "field", - }, - Object { - "description": "

Test description for fieldValueTwo

", - "end": 1, - "start": 0, - "text": "fieldValueTwo", - "type": "field", - }, - ] - } - /> -
-`; - -exports[`FilterBar snapshot suggestions shown 1`] = ` - -
- -
- Test description for fieldValueOne

", - "end": 1, - "start": 0, - "text": "fieldValueOne", - "type": "field", - }, - Object { - "description": "

Test description for fieldValueTwo

", - "end": 1, - "start": 0, - "text": "fieldValueTwo", - "type": "field", - }, - ] - } - /> -
-`; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.js deleted file mode 100644 index 0c1796a6e01ca..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.js +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { Suggestions } from '../suggestions'; -import { ClickOutside } from '../click_outside'; -import { EuiFieldSearch, EuiProgress, keyCodes } from '@elastic/eui'; - -export class FilterBar extends Component { - state = { - isSuggestionsVisible: false, - index: null, - value: '', - inputIsPristine: true, - }; - - static getDerivedStateFromProps(props, state) { - if (state.inputIsPristine && props.initialValue) { - return { - value: props.initialValue, - }; - } - - return null; - } - - // Set value to filter created via filter table - componentDidUpdate(oldProps) { - const newProps = this.props; - if (oldProps.valueExternal !== newProps.valueExternal) { - this.setState({ value: newProps.valueExternal, index: null }); - } - } - - incrementIndex = currentIndex => { - let nextIndex = currentIndex + 1; - if (currentIndex === null || nextIndex >= this.props.suggestions.length) { - nextIndex = 0; - } - this.setState({ index: nextIndex }); - }; - - decrementIndex = currentIndex => { - let previousIndex = currentIndex - 1; - if (previousIndex < 0) { - previousIndex = null; - } - this.setState({ index: previousIndex }); - }; - - onKeyUp = event => { - const { selectionStart } = event.target; - const { value } = this.state; - switch (event.keyCode) { - case keyCodes.LEFT: - case keyCodes.RIGHT: - this.setState({ isSuggestionsVisible: true }); - this.props.onChange(value, selectionStart); - break; - } - }; - - onKeyDown = event => { - const { isSuggestionsVisible, index, value } = this.state; - switch (event.keyCode) { - case keyCodes.DOWN: - event.preventDefault(); - if (isSuggestionsVisible) { - this.incrementIndex(index); - } else { - this.setState({ isSuggestionsVisible: true, index: 0 }); - } - break; - case keyCodes.UP: - event.preventDefault(); - if (isSuggestionsVisible) { - this.decrementIndex(index); - } - break; - case keyCodes.ENTER: - event.preventDefault(); - if (isSuggestionsVisible && this.props.suggestions[index]) { - this.selectSuggestion(this.props.suggestions[index]); - } else { - this.setState({ isSuggestionsVisible: false }); - this.props.onSubmit(value); - } - break; - case keyCodes.ESC: - event.preventDefault(); - this.setState({ isSuggestionsVisible: false }); - break; - case keyCodes.TAB: - this.setState({ isSuggestionsVisible: false }); - break; - } - }; - - selectSuggestion = suggestion => { - const nextInputValue = - this.state.value.substr(0, suggestion.start) + - suggestion.text + - this.state.value.substr(suggestion.end); - - this.setState({ value: nextInputValue, index: null }); - this.props.onChange(nextInputValue, nextInputValue.length); - }; - - onClickOutside = () => { - this.setState({ isSuggestionsVisible: false }); - }; - - onChangeInputValue = event => { - const { value, selectionStart } = event.target; - const hasValue = Boolean(value.trim()); - this.setState({ - value, - inputIsPristine: false, - isSuggestionsVisible: hasValue, - index: null, - }); - - if (!hasValue) { - this.props.onSubmit(value); - } - this.props.onChange(value, selectionStart); - }; - - onClickInput = event => { - const { selectionStart } = event.target; - this.props.onChange(this.state.value, selectionStart); - }; - - onClickSuggestion = suggestion => { - this.selectSuggestion(suggestion); - this.inputRef.focus(); - }; - - onMouseEnterSuggestion = index => { - this.setState({ index }); - }; - - onSubmit = () => { - this.props.onSubmit(this.state.value); - this.setState({ isSuggestionsVisible: false }); - }; - - render() { - const { disabled } = this.props; - const { value } = this.state; - - return ( - -
- { - if (node) { - this.inputRef = node; - } - }} - disabled={disabled} - value={value} - onKeyDown={this.onKeyDown} - onKeyUp={this.onKeyUp} - onChange={this.onChangeInputValue} - onClick={this.onClickInput} - autoComplete="off" - spellCheck={false} - data-test-subj={this.props.testSubj} - /> - - {this.props.isLoading && ( - - )} -
- - -
- ); - } -} - -FilterBar.propTypes = { - initialValue: PropTypes.string, - isLoading: PropTypes.bool, - disabled: PropTypes.bool, - onChange: PropTypes.func.isRequired, - placeholder: PropTypes.string, - onSubmit: PropTypes.func.isRequired, - valueExternal: PropTypes.string, - suggestions: PropTypes.array.isRequired, - testSubj: PropTypes.string, -}; - -FilterBar.defaultProps = { - isLoading: false, - disabled: false, - placeholder: 'tag : engineering OR tag : marketing', - suggestions: [], - testSubj: undefined, -}; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.test.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.test.js deleted file mode 100644 index 287803f9eb40a..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/filter_bar/filter_bar.test.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { shallow, mount } from 'enzyme'; -import { keyCodes } from '@elastic/eui'; -import { FilterBar } from './filter_bar'; - -const defaultProps = { - disabled: false, - initialValue: '', - placeholder: 'Test placeholder', - isLoading: false, - onChange: () => {}, - onSubmit: () => {}, - suggestions: [ - { - description: '

Test description for fieldValueOne

', - end: 1, - start: 0, - text: 'fieldValueOne', - type: 'field', - }, - { - description: '

Test description for fieldValueTwo

', - end: 1, - start: 0, - text: 'fieldValueTwo', - type: 'field', - }, - ], -}; - -describe('FilterBar', () => { - test('snapshot suggestions not shown', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - test('snapshot suggestions shown', () => { - const wrapper = shallow(); - wrapper.setState({ isSuggestionsVisible: true }); - expect(wrapper).toMatchSnapshot(); - }); - - test('index updated in state when suggestion is navigated to via mouse', () => { - const wrapper = mount(); - wrapper.setState({ isSuggestionsVisible: true }); - - expect(wrapper.state('index')).toEqual(null); - - const firstSuggestion = wrapper.find('li').first(); - firstSuggestion.simulate('mouseenter'); - expect(wrapper.state('index')).toEqual(0); - }); - - test('index updated and suggestions set to visible when input added', () => { - const wrapper = shallow(); - // default values - expect(wrapper.state('index')).toEqual(null); - expect(wrapper.state('isSuggestionsVisible')).toBe(false); - - const searchBar = wrapper.find('EuiFieldSearch'); - searchBar.simulate('keydown', { preventDefault: () => {}, keyCode: keyCodes.DOWN }); - wrapper.update(); - // updated values - expect(wrapper.state('index')).toEqual(0); - expect(wrapper.state('isSuggestionsVisible')).toBe(true); - }); - - test('index updated in state when suggestion is navigated to via keyboard', () => { - const wrapper = shallow(); - wrapper.setState({ isSuggestionsVisible: true, value: 'f', index: 0 }); - const searchBar = wrapper.find('EuiFieldSearch'); - searchBar.simulate('keydown', { preventDefault: () => {}, keyCode: keyCodes.DOWN }); - wrapper.update(); - - expect(wrapper.state('index')).toEqual(1); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.js deleted file mode 100644 index 0f3c6d25fe641..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; -import { uniqueId } from 'lodash'; -import { FilterBar } from './filter_bar'; -import { EuiCallOut, EuiLink, EuiText } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { getSuggestions, getKqlQueryValues } from './utils'; -import { getDocLinks } from '../../util/dependency_cache'; - -function getErrorWithLink(errorMessage) { - const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = getDocLinks(); - return ( - - {`${errorMessage} Input must be valid `} - - {'Kibana Query Language'} - - {' (KQL) syntax.'} - - ); -} - -export class KqlFilterBar extends Component { - state = { - error: null, - suggestions: [], - isLoadingSuggestions: false, - isLoadingIndexPattern: true, - }; - - onChange = async (inputValue, selectionStart) => { - const { indexPattern } = this.props; - - this.setState({ error: null, suggestions: [], isLoadingSuggestions: true }); - - const currentRequest = uniqueId(); - this.currentRequest = currentRequest; - const boolFilter = []; - - try { - const suggestions = - (await getSuggestions(inputValue, selectionStart, indexPattern, boolFilter)) || []; - - if (currentRequest !== this.currentRequest) { - return; - } - - this.setState({ suggestions, isLoadingSuggestions: false }); - } catch (e) { - console.error('Error while fetching suggestions', e); - const errorMessage = i18n.translate('xpack.ml.explorer.fetchingSuggestionsErrorMessage', { - defaultMessage: 'Error while fetching suggestions', - }); - this.setState({ isLoadingSuggestions: false, error: e.message ? e.message : errorMessage }); - } - }; - - onSubmit = inputValue => { - const { indexPattern } = this.props; - const { onSubmit } = this.props; - - try { - // returns object with properties: { influencersFilterQuery, filteredFields, queryString, isAndOperator } - const kqlQueryValues = getKqlQueryValues(inputValue, indexPattern); - onSubmit(kqlQueryValues); - } catch (e) { - console.log('Invalid kuery syntax', e); // eslint-disable-line no-console - const errorWithLink = getErrorWithLink(e.message); - const errorMessage = i18n.translate('xpack.ml.explorer.invalidKuerySyntaxErrorMessage', { - defaultMessage: 'Invalid kuery syntax', - }); - this.setState({ error: e.message ? errorWithLink : errorMessage }); - } - }; - - render() { - const { error } = this.state; - const { initialValue, placeholder, valueExternal, testSubj } = this.props; - - return ( - - - {error && {error}} - - ); - } -} - -KqlFilterBar.propTypes = { - indexPattern: PropTypes.object.isRequired, - initialValue: PropTypes.string, - onSubmit: PropTypes.func.isRequired, - placeholder: PropTypes.string, - valueExternal: PropTypes.string, - testSubj: PropTypes.string, -}; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.test.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.test.js deleted file mode 100644 index 610d924651406..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/kql_filter_bar.test.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { KqlFilterBar } from './kql_filter_bar'; - -const defaultProps = { - indexPattern: { - title: '.ml-anomalies-*', - fields: [ - { - name: 'nginx.access.geoip.country_iso_code', - type: 'string', - aggregatable: true, - searchable: true, - }, - { - name: 'nginx.access.url', - type: 'string', - aggregatable: true, - searchable: true, - }, - ], - }, - initialValue: '', - onSubmit: () => {}, - placeholder: undefined, -}; - -jest.mock('../../util/dependency_cache', () => ({ - getAutocomplete: () => ({ - getQuerySuggestions: () => {}, - }), -})); - -describe('KqlFilterBar', () => { - test('snapshot', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - test('error message callout when error is present', () => { - const wrapper = shallow(); - wrapper.setState({ error: 'Invalid syntax' }); - wrapper.update(); - const callout = wrapper.find('EuiCallOut'); - - expect(callout.contains('Invalid syntax')).toBe(true); - }); - - test('suggestions loading when typing into search bar', () => { - const wrapper = shallow(); - expect(wrapper.state('isLoadingSuggestions')).toBe(false); - // Simulate typing in by triggering change with inputValue and selectionStart - const filterBar = wrapper.find('FilterBar'); - filterBar.simulate('change', 'n', 1); - expect(wrapper.state('isLoadingSuggestions')).toBe(true); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/__snapshots__/suggestion.test.js.snap b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/__snapshots__/suggestion.test.js.snap deleted file mode 100644 index 4eb236f50be05..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/__snapshots__/suggestion.test.js.snap +++ /dev/null @@ -1,24 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Suggestion snapshot 1`] = ` - - - - - - fieldValue - - - <p>Test description for fieldValue</p> - - -`; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.js deleted file mode 100644 index 121082a776c80..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.js +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { EuiIcon } from '@elastic/eui'; -import { tint } from 'polished'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; - -function getIconColor(type) { - switch (type) { - case 'field': - return theme.euiColorVis7; - case 'value': - return theme.euiColorVis0; - case 'operator': - return theme.euiColorVis1; - case 'conjunction': - return theme.euiColorVis3; - case 'recentSearch': - return theme.euiColorMediumShade; - } -} - -const Description = styled.div` - color: ${theme.euiColorDarkShade}; - - p { - display: inline; - - span { - font-family: ${theme.euiFontFamily}; - color: ${theme.euiColorFullShade}; - padding: 0 ${theme.euiSizeXS}; - display: inline-block; - } - } -`; - -const ListItem = styled.li` - font-size: ${theme.euiFontSizeXS}; - height: ${theme.euiSizeXL}; - align-items: center; - display: flex; - background: ${props => (props.selected ? theme.euiColorLightestShade : 'initial')}; - cursor: pointer; - border-radius: ${theme.euiSizeXS}; - - ${Description} { - p span { - background: ${props => - props.selected ? theme.euiColorEmptyShade : theme.euiColorLightestShade}; - } - } -`; - -const Icon = styled.div` - flex: 0 0 ${theme.euiSizeXL}; - background: ${props => tint(0.1, getIconColor(props.type))}; - color: ${props => getIconColor(props.type)}; - width: 100%; - height: 100%; - text-align: center; - line-height: ${theme.euiSizeXL}; -`; - -const TextValue = styled.div` - flex: 0 0 ${theme.euiSize * 16}px; - color: ${theme.euiColorDarkestShade}; - padding: 0 ${theme.euiSizeS}; -`; - -function getEuiIconType(type) { - switch (type) { - case 'field': - return 'kqlField'; - case 'value': - return 'kqlValue'; - case 'recentSearch': - return 'search'; - case 'conjunction': - return 'kqlSelector'; - case 'operator': - return 'kqlOperand'; - default: - throw new Error('Unknown type', type); - } -} - -export const Suggestion = props => { - return ( - props.onClick(props.suggestion)} - onMouseEnter={props.onMouseEnter} - > - - - - {props.suggestion.text} - {props.suggestion.description} - - ); -}; - -Suggestion.propTypes = { - onClick: PropTypes.func.isRequired, - onMouseEnter: PropTypes.func.isRequired, - selected: PropTypes.bool, - suggestion: PropTypes.object.isRequired, - innerRef: PropTypes.func.isRequired, -}; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.test.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.test.js deleted file mode 100644 index d60f2004db445..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestion/suggestion.test.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { Suggestion } from './suggestion'; - -const defaultProps = { - innerRef: () => {}, - onClick: () => {}, - onMouseEnter: () => {}, - selected: true, - suggestion: { - description: '

Test description for fieldValue

', - end: 1, - start: 0, - text: 'fieldValue', - type: 'field', - }, -}; - -describe('Suggestion', () => { - test('snapshot', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/__snapshots__/suggestions.test.js.snap b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/__snapshots__/suggestions.test.js.snap deleted file mode 100644 index 869e321d4a7af..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/__snapshots__/suggestions.test.js.snap +++ /dev/null @@ -1,40 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Suggestions snapshot 1`] = ` - - Test description for fieldValueOne

", - "end": 1, - "start": 0, - "text": "fieldValueOne", - "type": "field", - } - } - /> - Test description for fieldValueTwo

", - "end": 1, - "start": 0, - "text": "fieldValueTwo", - "type": "field", - } - } - /> -
-`; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/index.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/index.js deleted file mode 100644 index 70fb46e06bfa0..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { Suggestions } from './suggestions'; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.js deleted file mode 100644 index 94960e1fcc865..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Suggestion } from '../suggestion'; -import { rgba } from 'polished'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; - -const List = styled.ul` - width: 100%; - border: 1px solid ${theme.euiColorLightShade}; - border-radius: ${theme.euiSizeXS}; - box-shadow: 0px ${theme.euiSizeXS} ${theme.euiSizeXL} ${rgba(theme.euiTextColor, 0.1)}; - position: absolute; - background: #fff; - z-index: 10; - left: 0; - max-height: ${theme.euiSize * 20}px; - overflow: scroll; -`; - -export class Suggestions extends Component { - childNodes = []; - - scrollIntoView = () => { - const parent = this.parentNode; - const child = this.childNodes[this.props.index]; - - if (this.props.index == null || !parent || !child) { - return; - } - - const scrollTop = Math.max( - Math.min(parent.scrollTop, child.offsetTop), - child.offsetTop + child.offsetHeight - parent.offsetHeight - ); - - parent.scrollTop = scrollTop; - }; - - componentDidUpdate(prevProps) { - if (prevProps.index !== this.props.index) { - this.scrollIntoView(); - } - } - - render() { - if (!this.props.show || this.props.suggestions.length === 0) { - return null; - } - - const suggestions = this.props.suggestions.map((suggestion, index) => { - const key = `${suggestion}_${index}`; - return ( - (this.childNodes[index] = node)} - selected={index === this.props.index} - suggestion={suggestion} - onClick={this.props.onClick} - onMouseEnter={() => this.props.onMouseEnter(index)} - key={key} - /> - ); - }); - - return (this.parentNode = node)}>{suggestions}; - } -} - -Suggestions.propTypes = { - index: PropTypes.number, - onClick: PropTypes.func.isRequired, - onMouseEnter: PropTypes.func.isRequired, - show: PropTypes.bool, - suggestions: PropTypes.array.isRequired, -}; diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.test.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.test.js deleted file mode 100644 index 666bfa4cfa1fa..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/suggestions/suggestions.test.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { shallow, mount } from 'enzyme'; -import { Suggestions } from './suggestions'; - -const defaultProps = { - index: 0, - onClick: () => {}, - onMouseEnter: () => {}, - show: true, - suggestions: [ - { - description: '

Test description for fieldValueOne

', - end: 1, - start: 0, - text: 'fieldValueOne', - type: 'field', - }, - { - description: '

Test description for fieldValueTwo

', - end: 1, - start: 0, - text: 'fieldValueTwo', - type: 'field', - }, - ], -}; - -describe('Suggestions', () => { - test('snapshot', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - test('is null when show is false', () => { - const noShowProps = { ...defaultProps, show: false }; - const wrapper = shallow(); - expect(wrapper.isEmptyRender()).toBeTruthy(); - }); - - test('is null when no suggestions are available', () => { - const noSuggestions = { ...defaultProps, suggestions: [] }; - const wrapper = shallow(); - expect(wrapper.isEmptyRender()).toBeTruthy(); - }); - - test('creates suggestion list item for each suggestion passed in via props', () => { - const wrapper = mount(); - const suggestions = wrapper.find('li'); - expect(suggestions.length).toEqual(2); - }); -}); diff --git a/x-pack/plugins/ml/public/application/components/kql_filter_bar/utils.js b/x-pack/plugins/ml/public/application/components/kql_filter_bar/utils.js deleted file mode 100644 index d632f4079e5b9..0000000000000 --- a/x-pack/plugins/ml/public/application/components/kql_filter_bar/utils.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { esKuery } from '../../../../../../../src/plugins/data/public'; -import { getAutocomplete } from '../../util/dependency_cache'; - -export function getSuggestions(query, selectionStart, indexPattern, boolFilter) { - const autocomplete = getAutocomplete(); - return autocomplete.getQuerySuggestions({ - language: 'kuery', - indexPatterns: [indexPattern], - boolFilter, - query, - selectionStart, - selectionEnd: selectionStart, - }); -} - -function convertKueryToEsQuery(kuery, indexPattern) { - const ast = esKuery.fromKueryExpression(kuery); - return esKuery.toElasticsearchQuery(ast, indexPattern); -} -// Recommended by MDN for escaping user input to be treated as a literal string within a regular expression -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions -export function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -export function escapeParens(string) { - return string.replace(/[()]/g, '\\$&'); -} - -export function escapeDoubleQuotes(string) { - return string.replace(/\"/g, '\\$&'); -} - -export function getKqlQueryValues(inputValue, indexPattern) { - const ast = esKuery.fromKueryExpression(inputValue); - const isAndOperator = ast.function === 'and'; - const query = convertKueryToEsQuery(inputValue, indexPattern); - const filteredFields = []; - - if (!query) { - return; - } - - // if ast.type == 'function' then layout of ast.arguments: - // [{ arguments: [ { type: 'literal', value: 'AAL' } ] },{ arguments: [ { type: 'literal', value: 'AAL' } ] }] - if (ast && Array.isArray(ast.arguments)) { - ast.arguments.forEach(arg => { - if (arg.arguments !== undefined) { - arg.arguments.forEach(nestedArg => { - if (typeof nestedArg.value === 'string') { - filteredFields.push(nestedArg.value); - } - }); - } else if (typeof arg.value === 'string') { - filteredFields.push(arg.value); - } - }); - } - - return { - filterQuery: query, - filteredFields, - queryString: inputValue, - isAndOperator, - tableQueryString: inputValue, - }; -} - -export function getQueryPattern(fieldName, fieldValue) { - const sanitizedFieldName = escapeRegExp(fieldName); - const sanitizedFieldValue = escapeRegExp(fieldValue); - - return new RegExp(`(${sanitizedFieldName})\\s?:\\s?(")?(${sanitizedFieldValue})(")?`, 'i'); -} - -export function removeFilterFromQueryString(currentQueryString, fieldName, fieldValue) { - let newQueryString = ''; - // Remove the passed in fieldName and value from the existing filter - const queryPattern = getQueryPattern(fieldName, fieldValue); - newQueryString = currentQueryString.replace(queryPattern, ''); - // match 'and' or 'or' at the start/end of the string - const endPattern = /\s(and|or)\s*$/gi; - const startPattern = /^\s*(and|or)\s/gi; - // If string has a double operator (e.g. tag:thing or or tag:other) remove and replace with the first occurring operator - const invalidOperatorPattern = /\s+(and|or)\s+(and|or)\s+/gi; - newQueryString = newQueryString.replace(invalidOperatorPattern, ' $1 '); - // If string starts/ends with 'and' or 'or' remove that as that is illegal kuery syntax - newQueryString = newQueryString.replace(endPattern, ''); - newQueryString = newQueryString.replace(startPattern, ''); - - return newQueryString; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/results_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/results_table.tsx index 84abbda71643c..20d126f4ac6ca 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/results_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/results_table.tsx @@ -44,6 +44,7 @@ import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES, isKeywordAndTextType, + sortRegressionResultsFields, } from '../../../../common/fields'; import { @@ -134,79 +135,81 @@ export const ResultsTable: FC = React.memo( tableItems, } = useExploreData(jobConfig, selectedFields, setSelectedFields, setDocFields, setDepVarType); - const columns: Array> = selectedFields.map(field => { - const { type } = field; - const isNumber = - type !== undefined && - (BASIC_NUMERICAL_TYPES.has(type) || EXTENDED_NUMERICAL_TYPES.has(type)); - - const column: ColumnType = { - field: field.name, - name: field.name, - sortable: true, - truncateText: true, - }; - - const render = (d: any, fullItem: EsDoc) => { - if (Array.isArray(d) && d.every(item => typeof item === 'string')) { - // If the cells data is an array of strings, return as a comma separated list. - // The list will get limited to 5 items with `…` at the end if there's more in the original array. - return `${d.slice(0, 5).join(', ')}${d.length > 5 ? ', …' : ''}`; - } else if (Array.isArray(d)) { - // If the cells data is an array of e.g. objects, display a 'array' badge with a - // tooltip that explains that this type of field is not supported in this table. - return ( - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.classificationExploration.indexArrayBadgeContent', + const columns: Array> = selectedFields + .sort(({ name: a }, { name: b }) => sortRegressionResultsFields(a, b, jobConfig)) + .map(field => { + const { type } = field; + const isNumber = + type !== undefined && + (BASIC_NUMERICAL_TYPES.has(type) || EXTENDED_NUMERICAL_TYPES.has(type)); + + const column: ColumnType = { + field: field.name, + name: field.name, + sortable: true, + truncateText: true, + }; + + const render = (d: any, fullItem: EsDoc) => { + if (Array.isArray(d) && d.every(item => typeof item === 'string')) { + // If the cells data is an array of strings, return as a comma separated list. + // The list will get limited to 5 items with `…` at the end if there's more in the original array. + return `${d.slice(0, 5).join(', ')}${d.length > 5 ? ', …' : ''}`; + } else if (Array.isArray(d)) { + // If the cells data is an array of e.g. objects, display a 'array' badge with a + // tooltip that explains that this type of field is not supported in this table. + return ( + - - ); - } - - return d; - }; + > + + {i18n.translate( + 'xpack.ml.dataframe.analytics.classificationExploration.indexArrayBadgeContent', + { + defaultMessage: 'array', + } + )} + + + ); + } - if (isNumber) { - column.dataType = 'number'; - column.render = render; - } else if (typeof type !== 'undefined') { - switch (type) { - case ES_FIELD_TYPES.BOOLEAN: - column.dataType = ES_FIELD_TYPES.BOOLEAN; - break; - case ES_FIELD_TYPES.DATE: - column.align = 'right'; - column.render = (d: any) => { - if (d !== undefined) { - return formatHumanReadableDateTimeSeconds(moment(d).unix() * 1000); - } - return d; - }; - break; - default: - column.render = render; - break; + return d; + }; + + if (isNumber) { + column.dataType = 'number'; + column.render = render; + } else if (typeof type !== 'undefined') { + switch (type) { + case ES_FIELD_TYPES.BOOLEAN: + column.dataType = ES_FIELD_TYPES.BOOLEAN; + break; + case ES_FIELD_TYPES.DATE: + column.align = 'right'; + column.render = (d: any) => { + if (d !== undefined) { + return formatHumanReadableDateTimeSeconds(moment(d).unix() * 1000); + } + return d; + }; + break; + default: + column.render = render; + break; + } + } else { + column.render = render; } - } else { - column.render = render; - } - return column; - }); + return column; + }); const docFieldsCount = docFields.length; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/results_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/results_table.tsx index 4e9571ca4a34d..7a6b2b23ba7a3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/results_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/results_table.tsx @@ -45,6 +45,7 @@ import { EXTENDED_NUMERICAL_TYPES, toggleSelectedField, isKeywordAndTextType, + sortRegressionResultsFields, } from '../../../../common/fields'; import { @@ -134,79 +135,81 @@ export const ResultsTable: FC = React.memo( tableItems, } = useExploreData(jobConfig, selectedFields, setSelectedFields, setDocFields, setDepVarType); - const columns: Array> = selectedFields.map(field => { - const { type } = field; - const isNumber = - type !== undefined && - (BASIC_NUMERICAL_TYPES.has(type) || EXTENDED_NUMERICAL_TYPES.has(type)); - - const column: ColumnType = { - field: field.name, - name: field.name, - sortable: true, - truncateText: true, - }; - - const render = (d: any, fullItem: EsDoc) => { - if (Array.isArray(d) && d.every(item => typeof item === 'string')) { - // If the cells data is an array of strings, return as a comma separated list. - // The list will get limited to 5 items with `…` at the end if there's more in the original array. - return `${d.slice(0, 5).join(', ')}${d.length > 5 ? ', …' : ''}`; - } else if (Array.isArray(d)) { - // If the cells data is an array of e.g. objects, display a 'array' badge with a - // tooltip that explains that this type of field is not supported in this table. - return ( - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.regressionExploration.indexArrayBadgeContent', + const columns: Array> = selectedFields + .sort(({ name: a }, { name: b }) => sortRegressionResultsFields(a, b, jobConfig)) + .map(field => { + const { type } = field; + const isNumber = + type !== undefined && + (BASIC_NUMERICAL_TYPES.has(type) || EXTENDED_NUMERICAL_TYPES.has(type)); + + const column: ColumnType = { + field: field.name, + name: field.name, + sortable: true, + truncateText: true, + }; + + const render = (d: any, fullItem: EsDoc) => { + if (Array.isArray(d) && d.every(item => typeof item === 'string')) { + // If the cells data is an array of strings, return as a comma separated list. + // The list will get limited to 5 items with `…` at the end if there's more in the original array. + return `${d.slice(0, 5).join(', ')}${d.length > 5 ? ', …' : ''}`; + } else if (Array.isArray(d)) { + // If the cells data is an array of e.g. objects, display a 'array' badge with a + // tooltip that explains that this type of field is not supported in this table. + return ( + - - ); - } - - return d; - }; + > + + {i18n.translate( + 'xpack.ml.dataframe.analytics.regressionExploration.indexArrayBadgeContent', + { + defaultMessage: 'array', + } + )} + + + ); + } - if (isNumber) { - column.dataType = 'number'; - column.render = render; - } else if (typeof type !== 'undefined') { - switch (type) { - case ES_FIELD_TYPES.BOOLEAN: - column.dataType = ES_FIELD_TYPES.BOOLEAN; - break; - case ES_FIELD_TYPES.DATE: - column.align = 'right'; - column.render = (d: any) => { - if (d !== undefined) { - return formatHumanReadableDateTimeSeconds(moment(d).unix() * 1000); - } - return d; - }; - break; - default: - column.render = render; - break; + return d; + }; + + if (isNumber) { + column.dataType = 'number'; + column.render = render; + } else if (typeof type !== 'undefined') { + switch (type) { + case ES_FIELD_TYPES.BOOLEAN: + column.dataType = ES_FIELD_TYPES.BOOLEAN; + break; + case ES_FIELD_TYPES.DATE: + column.align = 'right'; + column.render = (d: any) => { + if (d !== undefined) { + return formatHumanReadableDateTimeSeconds(moment(d).unix() * 1000); + } + return d; + }; + break; + default: + column.render = render; + break; + } + } else { + column.render = render; } - } else { - column.render = render; - } - return column; - }); + return column; + }); const docFieldsCount = docFields.length; diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx index ef13fec3589fb..16004475eb44f 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx @@ -6,14 +6,22 @@ import React, { FC, useState } from 'react'; -import { EuiFlexItem, EuiFlexGroup, EuiIconTip, EuiSuperSelect, EuiText } from '@elastic/eui'; +import { + EuiCode, + EuiFlexItem, + EuiFlexGroup, + EuiIconTip, + EuiInputPopover, + EuiSuperSelect, + EuiText, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { IndexPattern } from '../../../../../../../../../src/plugins/data/public'; -import { SEARCH_QUERY_LANGUAGE } from '../../../../../../common/constants/search'; +import { SEARCH_QUERY_LANGUAGE, ErrorMessage } from '../../../../../../common/constants/search'; import { esKuery, @@ -22,8 +30,6 @@ import { QueryStringInput, } from '../../../../../../../../../src/plugins/data/public'; -import { getToastNotifications } from '../../../../util/dependency_cache'; - interface Props { indexPattern: IndexPattern; searchString: Query['query']; @@ -73,6 +79,7 @@ export const SearchPanel: FC = ({ query: searchString || '', language: searchQueryLanguage, }); + const [errorMessage, setErrorMessage] = useState(undefined); const searchHandler = (query: Query) => { let filterQuery; @@ -93,13 +100,7 @@ export const SearchPanel: FC = ({ setSearchQueryLanguage(query.language); } catch (e) { console.log('Invalid syntax', JSON.stringify(e, null, 2)); // eslint-disable-line no-console - const toastNotifications = getToastNotifications(); - toastNotifications.addError(e, { - title: i18n.translate('xpack.ml.datavisualizer.invalidSyntaxErrorMessage', { - defaultMessage: 'Invalid syntax in search bar', - }), - toastMessage: e.message ? e.message : e, - }); + setErrorMessage({ query: query.query as string, message: e.message }); } }; const searchChangeHandler = (query: Query) => setSearchInput(query); @@ -107,22 +108,40 @@ export const SearchPanel: FC = ({ return ( - + setErrorMessage(undefined)} + input={ + + } + isOpen={errorMessage?.query === searchInput.query && errorMessage?.message !== ''} + > + + {i18n.translate( + 'xpack.ml.datavisualizer.searchPanel.invalidKuerySyntaxErrorMessageQueryBar', + { + defaultMessage: 'Invalid query', + } + )} + {': '} + {errorMessage?.message.split('\n')[0]} + + diff --git a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx index 0789a7f8ef5ff..0263ad08b03cf 100644 --- a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx @@ -5,6 +5,8 @@ */ import React, { FC, useState, useEffect } from 'react'; +import { EuiCode, EuiInputPopover } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { Query, esKuery, @@ -12,10 +14,10 @@ import { QueryStringInput, } from '../../../../../../../../src/plugins/data/public'; import { IIndexPattern } from '../../../../../../../../src/plugins/data/common/index_patterns'; -import { QUERY_LANGUAGE_KUERY, QUERY_LANGUAGE_LUCENE } from '../../explorer_constants'; +import { SEARCH_QUERY_LANGUAGE, ErrorMessage } from '../../../../../common/constants/search'; import { explorerService } from '../../explorer_dashboard_service'; -export const DEFAULT_QUERY_LANG = QUERY_LANGUAGE_KUERY; +export const DEFAULT_QUERY_LANG = SEARCH_QUERY_LANGUAGE.KUERY; export function getKqlQueryValues({ inputString, @@ -25,11 +27,11 @@ export function getKqlQueryValues({ inputString: string | { [key: string]: any }; queryLanguage: string; indexPattern: IIndexPattern; -}) { +}): { clearSettings: boolean; settings: any } { let influencersFilterQuery: any = {}; - const ast = esKuery.fromKueryExpression(inputString); - const isAndOperator = ast.function === 'and'; const filteredFields: string[] = []; + const ast = esKuery.fromKueryExpression(inputString); + const isAndOperator = ast && ast.function === 'and'; // if ast.type == 'function' then layout of ast.arguments: // [{ arguments: [ { type: 'literal', value: 'AAL' } ] },{ arguments: [ { type: 'literal', value: 'AAL' } ] }] if (ast && Array.isArray(ast.arguments)) { @@ -45,12 +47,12 @@ export function getKqlQueryValues({ } }); } - if (queryLanguage === QUERY_LANGUAGE_KUERY) { + if (queryLanguage === SEARCH_QUERY_LANGUAGE.KUERY) { influencersFilterQuery = esKuery.toElasticsearchQuery( esKuery.fromKueryExpression(inputString), indexPattern ); - } else if (queryLanguage === QUERY_LANGUAGE_LUCENE) { + } else if (queryLanguage === SEARCH_QUERY_LANGUAGE.LUCENE) { influencersFilterQuery = esQuery.luceneStringToDsl(inputString); } @@ -78,7 +80,7 @@ function getInitSearchInputState({ }) { if (queryString !== undefined && filterActive === true) { return { - language: QUERY_LANGUAGE_KUERY, + language: SEARCH_QUERY_LANGUAGE.KUERY, query: queryString, }; } else { @@ -110,6 +112,7 @@ export const ExplorerQueryBar: FC = ({ const [searchInput, setSearchInput] = useState( getInitSearchInputState({ filterActive, queryString }) ); + const [errorMessage, setErrorMessage] = useState(undefined); useEffect(() => { if (filterIconTriggeredQuery !== undefined) { @@ -127,30 +130,50 @@ export const ExplorerQueryBar: FC = ({ setSearchInput(query); }; const applyInfluencersFilterQuery = (query: Query) => { - const { clearSettings, settings } = getKqlQueryValues({ - inputString: query.query, - queryLanguage: query.language, - indexPattern, - }); + try { + const { clearSettings, settings } = getKqlQueryValues({ + inputString: query.query, + queryLanguage: query.language, + indexPattern, + }); - if (clearSettings === true) { - explorerService.clearInfluencerFilterSettings(); - } else { - explorerService.setInfluencerFilterSettings(settings); + if (clearSettings === true) { + explorerService.clearInfluencerFilterSettings(); + } else { + explorerService.setInfluencerFilterSettings(settings); + } + } catch (e) { + console.log('Invalid query syntax in search bar', e); // eslint-disable-line no-console + setErrorMessage({ query: query.query as string, message: e.message }); } }; return ( - + setErrorMessage(undefined)} + input={ + + } + isOpen={errorMessage?.query === searchInput.query && errorMessage?.message !== ''} + > + + {i18n.translate('xpack.ml.explorer.invalidKuerySyntaxErrorMessageQueryBar', { + defaultMessage: 'Invalid query', + })} + {': '} + {errorMessage?.message.split('\n')[0]} + + ); }; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.js b/x-pack/plugins/ml/public/application/explorer/explorer.js index 9b02150bae9bb..d61d56d07b644 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer.js @@ -58,13 +58,12 @@ import { DEFAULT_QUERY_LANG, } from './components/explorer_query_bar/explorer_query_bar'; import { + getDateFormatTz, removeFilterFromQueryString, getQueryPattern, escapeParens, escapeDoubleQuotes, -} from '../components/kql_filter_bar/utils'; - -import { getDateFormatTz } from './explorer_utils'; +} from './explorer_utils'; import { getSwimlaneContainerWidth } from './legacy_utils'; import { @@ -266,7 +265,7 @@ export class Explorer extends React.Component { explorerService.setInfluencerFilterSettings(settings); } } catch (e) { - console.log('Invalid kuery syntax', e); // eslint-disable-line no-console + console.log('Invalid query syntax from table', e); // eslint-disable-line no-console const toastNotifications = getToastNotifications(); toastNotifications.addDanger( diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/_index.scss b/x-pack/plugins/ml/public/application/explorer/explorer_charts/_index.scss index dfa03861e32f3..4b3bf40b7b368 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/_index.scss +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/_index.scss @@ -1,4 +1,3 @@ @import 'components/explorer_chart_label/index'; @import 'explorer_chart'; -@import 'explorer_chart_tooltip'; -@import 'explorer_charts_container'; \ No newline at end of file +@import 'explorer_charts_container'; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js index ea8bb3159202f..a9bff36461292 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import './_explorer_chart_label.scss'; import PropTypes from 'prop-types'; import React from 'react'; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_info_tooltip.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_info_tooltip.js index 5cf8245cd4739..0ee1eac19f64d 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_info_tooltip.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_info_tooltip.js @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import './_explorer_chart_tooltip.scss'; import PropTypes from 'prop-types'; import React from 'react'; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_constants.ts b/x-pack/plugins/ml/public/application/explorer/explorer_constants.ts index afec50eae06aa..b084f503272cc 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_constants.ts +++ b/x-pack/plugins/ml/public/application/explorer/explorer_constants.ts @@ -25,7 +25,6 @@ export const EXPLORER_ACTION = { SET_EXPLORER_DATA: 'setExplorerData', SET_FILTER_DATA: 'setFilterData', SET_INFLUENCER_FILTER_SETTINGS: 'setInfluencerFilterSettings', - SET_SEARCH_INPUT: 'setSearchInput', SET_SELECTED_CELLS: 'setSelectedCells', SET_SWIMLANE_CONTAINER_WIDTH: 'setSwimlaneContainerWidth', SET_SWIMLANE_LIMIT: 'setSwimlaneLimit', @@ -56,7 +55,3 @@ export const MAX_INFLUENCER_FIELD_NAMES = 50; export const VIEW_BY_JOB_LABEL = i18n.translate('xpack.ml.explorer.jobIdLabel', { defaultMessage: 'job ID', }); - -export const QUERY_LANGUAGE_KUERY = 'kuery'; -export const QUERY_LANGUAGE_LUCENE = 'lucene'; -export type QUERY_LANGUAGE = 'kuery' | 'lucene'; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_dashboard_service.ts b/x-pack/plugins/ml/public/application/explorer/explorer_dashboard_service.ts index 277c1aa6f4566..89e1a908b1ecc 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_dashboard_service.ts +++ b/x-pack/plugins/ml/public/application/explorer/explorer_dashboard_service.ts @@ -132,12 +132,6 @@ export const explorerService = { payload, }); }, - setSearchInput: (query: any) => { - explorerAction$.next({ - type: EXPLORER_ACTION.SET_SEARCH_INPUT, - payload: query, - }); - }, setSelectedCells: (payload: AppStateSelectedCells | undefined) => { explorerAction$.next({ type: EXPLORER_ACTION.SET_SELECTED_CELLS, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.js b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.js index a229537ba3ca1..e8cb8377a656d 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.js @@ -387,9 +387,17 @@ export class ExplorerSwimlane extends React.Component { .each(function() { if (swimlaneData.fieldName !== undefined) { d3.select(this) - .on('mouseover', label => { + .on('mouseover', value => { mlChartTooltipService.show( - [{ skipHeader: true }, { name: swimlaneData.fieldName, value: label }], + [ + { skipHeader: true }, + { + label: swimlaneData.fieldName, + value, + seriesIdentifier: { key: value }, + valueAccessor: 'fieldName', + }, + ], this, { x: laneLabelWidth, @@ -400,7 +408,7 @@ export class ExplorerSwimlane extends React.Component { .on('mouseout', () => { mlChartTooltipService.hide(); }) - .attr('aria-label', label => `${mlEscape(swimlaneData.fieldName)}: ${mlEscape(label)}`); + .attr('aria-label', value => `${mlEscape(swimlaneData.fieldName)}: ${mlEscape(value)}`); } }); diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js index 0b41f789bb571..852b16ec581bb 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js @@ -883,3 +883,42 @@ export async function loadTopInfluencers( } }); } + +// Recommended by MDN for escaping user input to be treated as a literal string within a regular expression +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions +export function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +export function escapeParens(string) { + return string.replace(/[()]/g, '\\$&'); +} + +export function escapeDoubleQuotes(string) { + return string.replace(/\"/g, '\\$&'); +} + +export function getQueryPattern(fieldName, fieldValue) { + const sanitizedFieldName = escapeRegExp(fieldName); + const sanitizedFieldValue = escapeRegExp(fieldValue); + + return new RegExp(`(${sanitizedFieldName})\\s?:\\s?(")?(${sanitizedFieldValue})(")?`, 'i'); +} + +export function removeFilterFromQueryString(currentQueryString, fieldName, fieldValue) { + let newQueryString = ''; + // Remove the passed in fieldName and value from the existing filter + const queryPattern = getQueryPattern(fieldName, fieldValue); + newQueryString = currentQueryString.replace(queryPattern, ''); + // match 'and' or 'or' at the start/end of the string + const endPattern = /\s(and|or)\s*$/gi; + const startPattern = /^\s*(and|or)\s/gi; + // If string has a double operator (e.g. tag:thing or or tag:other) remove and replace with the first occurring operator + const invalidOperatorPattern = /\s+(and|or)\s+(and|or)\s+/gi; + newQueryString = newQueryString.replace(invalidOperatorPattern, ' $1 '); + // If string starts/ends with 'and' or 'or' remove that as that is illegal kuery syntax + newQueryString = newQueryString.replace(endPattern, ''); + newQueryString = newQueryString.replace(startPattern, ''); + + return newQueryString; +} diff --git a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts index ff659029e38d7..c31b26b7adb7b 100644 --- a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts +++ b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts @@ -68,13 +68,6 @@ export const explorerReducer = (state: ExplorerState, nextAction: Action): Explo nextState = setInfluencerFilterSettings(state, payload); break; - case EXPLORER_ACTION.SET_SEARCH_INPUT: - nextState = { - ...state, - searchInput: payload, - }; - break; - case EXPLORER_ACTION.SET_SELECTED_CELLS: const selectedCells = payload; nextState = { diff --git a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts index 44e1486508ea3..0a2dbf5bcff35 100644 --- a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts +++ b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts @@ -20,8 +20,6 @@ import { TimeRangeBounds, } from '../../explorer_utils'; -import { QUERY_LANGUAGE_KUERY, QUERY_LANGUAGE } from '../../explorer_constants'; // QUERY_LANGUAGE_LUCENE - export interface ExplorerState { annotationsData: any[]; bounds: TimeRangeBounds | undefined; @@ -39,10 +37,6 @@ export interface ExplorerState { noInfluencersConfigured: boolean; overallSwimlaneData: SwimlaneData; queryString: string; - searchInput: { - query: string; - language: QUERY_LANGUAGE; - }; selectedCells: AppStateSelectedCells | undefined; selectedJobs: ExplorerJob[] | null; swimlaneBucketInterval: any; @@ -79,10 +73,6 @@ export function getExplorerDefaultState(): ExplorerState { noInfluencersConfigured: true, overallSwimlaneData: getDefaultSwimlaneData(), queryString: '', - searchInput: { - query: '', - language: QUERY_LANGUAGE_KUERY, - }, selectedCells: undefined, selectedJobs: null, swimlaneBucketInterval: undefined, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts index 2800cd362d426..0b45209ca4f37 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts @@ -83,6 +83,10 @@ export class JobCreator { return this._type; } + public get indexPatternTitle(): string { + return this._indexPatternTitle; + } + protected _addDetector(detector: Detector, agg: Aggregation, field: Field) { this._detectors.push(detector); this._aggs.push(agg); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts index f115c203624eb..035af2d81adbc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts @@ -14,12 +14,7 @@ import { } from '../../../../../../common/types/fields'; import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; import { createBasicDetector } from './util/default_configs'; -import { - JOB_TYPE, - CREATED_BY_LABEL, - DEFAULT_MODEL_MEMORY_LIMIT, -} from '../../../../../../common/constants/new_job'; -import { ml } from '../../../../services/ml_api_service'; +import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; import { getRichDetectors } from './util/general'; import { IndexPattern } from '../../../../../../../../../src/plugins/data/public'; @@ -27,7 +22,7 @@ export class MultiMetricJobCreator extends JobCreator { // a multi metric job has one optional overall partition field // which is the same for all detectors. private _splitField: SplitField = null; - private _lastEstimatedModelMemoryLimit = DEFAULT_MODEL_MEMORY_LIMIT; + protected _type: JOB_TYPE = JOB_TYPE.MULTI_METRIC; constructor( @@ -86,60 +81,6 @@ export class MultiMetricJobCreator extends JobCreator { this._removeDetector(index); } - // called externally to set the model memory limit based current detector configuration - public async calculateModelMemoryLimit() { - if (this.jobConfig.analysis_config.detectors.length === 0) { - this.modelMemoryLimit = DEFAULT_MODEL_MEMORY_LIMIT; - } else { - const { modelMemoryLimit } = await ml.calculateModelMemoryLimit({ - analysisConfig: this.jobConfig.analysis_config, - indexPattern: this._indexPatternTitle, - query: this._datafeed_config.query, - timeFieldName: this._job_config.data_description.time_field, - earliestMs: this._start, - latestMs: this._end, - }); - - try { - if (this.modelMemoryLimit === null) { - this.modelMemoryLimit = modelMemoryLimit; - } else { - // To avoid overwriting a possible custom set model memory limit, - // it only gets set to the estimation if the current limit is either - // the default value or the value of the previous estimation. - // That's our best guess if the value hasn't been customized. - // It doesn't get it if the user intentionally for whatever reason (re)set - // the value to either the default or pervious estimate. - // Because the string based limit could contain e.g. MB/Mb/mb - // all strings get lower cased for comparison. - const currentModelMemoryLimit = this.modelMemoryLimit.toLowerCase(); - const defaultModelMemoryLimit = DEFAULT_MODEL_MEMORY_LIMIT.toLowerCase(); - if ( - currentModelMemoryLimit === defaultModelMemoryLimit || - currentModelMemoryLimit === this._lastEstimatedModelMemoryLimit - ) { - this.modelMemoryLimit = modelMemoryLimit; - } - } - this._lastEstimatedModelMemoryLimit = modelMemoryLimit.toLowerCase(); - } catch (error) { - if (this.modelMemoryLimit === null) { - this.modelMemoryLimit = DEFAULT_MODEL_MEMORY_LIMIT; - } else { - // To avoid overwriting a possible custom set model memory limit, - // the limit is reset to the default only if the current limit matches - // the previous estimated limit. - const currentModelMemoryLimit = this.modelMemoryLimit.toLowerCase(); - if (currentModelMemoryLimit === this._lastEstimatedModelMemoryLimit) { - this.modelMemoryLimit = DEFAULT_MODEL_MEMORY_LIMIT; - } - // eslint-disable-next-line no-console - console.error('Model memory limit could not be calculated', error); - } - } - } - } - public get aggFieldPairs(): AggFieldPair[] { return this.detectors.map((d, i) => ({ field: this._fields[i], diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts new file mode 100644 index 0000000000000..f85223db65399 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useFakeTimers, SinonFakeTimers } from 'sinon'; +import { CalculatePayload, modelMemoryEstimatorProvider } from './model_memory_estimator'; +import { JobValidator } from '../../job_validator'; +import { DEFAULT_MODEL_MEMORY_LIMIT } from '../../../../../../../common/constants/new_job'; +import { ml } from '../../../../../services/ml_api_service'; + +jest.mock('../../../../../services/ml_api_service', () => { + return { + ml: { + calculateModelMemoryLimit$: jest.fn(() => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { of } = require('rxjs'); + return of({ modelMemoryLimit: '15MB' }); + }), + }, + }; +}); + +describe('delay', () => { + let clock: SinonFakeTimers; + let modelMemoryEstimator: ReturnType; + let mockJobValidator: JobValidator; + + beforeEach(() => { + clock = useFakeTimers(); + mockJobValidator = { + isModelMemoryEstimationPayloadValid: true, + } as JobValidator; + modelMemoryEstimator = modelMemoryEstimatorProvider(mockJobValidator); + }); + afterEach(() => { + clock.restore(); + jest.clearAllMocks(); + }); + + test('should emit a default value first', () => { + const spy = jest.fn(); + modelMemoryEstimator.updates$.subscribe(spy); + expect(spy).toHaveBeenCalledWith(DEFAULT_MODEL_MEMORY_LIMIT); + }); + + test('should debounce it for 600 ms', () => { + const spy = jest.fn(); + + modelMemoryEstimator.updates$.subscribe(spy); + + modelMemoryEstimator.update({ analysisConfig: { detectors: [{}] } } as CalculatePayload); + + clock.tick(601); + expect(spy).toHaveBeenCalledWith('15MB'); + }); + + test('should not proceed further if the payload has not been changed', () => { + const spy = jest.fn(); + + modelMemoryEstimator.updates$.subscribe(spy); + + modelMemoryEstimator.update({ + analysisConfig: { detectors: [{ by_field_name: 'test' }] }, + } as CalculatePayload); + + clock.tick(601); + + modelMemoryEstimator.update({ + analysisConfig: { detectors: [{ by_field_name: 'test' }] }, + } as CalculatePayload); + + clock.tick(601); + + modelMemoryEstimator.update({ + analysisConfig: { detectors: [{ by_field_name: 'test' }] }, + } as CalculatePayload); + + clock.tick(601); + + expect(ml.calculateModelMemoryLimit$).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(2); + }); + + test('should call the endpoint only with a valid payload', () => { + const spy = jest.fn(); + + modelMemoryEstimator.updates$.subscribe(spy); + + modelMemoryEstimator.update(({ + analysisConfig: { detectors: [] }, + } as unknown) as CalculatePayload); + // @ts-ignore + mockJobValidator.isModelMemoryEstimationPayloadValid = false; + + clock.tick(601); + + expect(ml.calculateModelMemoryLimit$).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts new file mode 100644 index 0000000000000..501a63492da56 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { Observable, of, Subject, Subscription } from 'rxjs'; +import { isEqual, cloneDeep } from 'lodash'; +import { + catchError, + debounceTime, + distinctUntilChanged, + pluck, + startWith, + switchMap, + map, + pairwise, +} from 'rxjs/operators'; +import { useEffect, useState } from 'react'; +import { DEFAULT_MODEL_MEMORY_LIMIT } from '../../../../../../../common/constants/new_job'; +import { ml } from '../../../../../services/ml_api_service'; +import { JobValidator, VALIDATION_DELAY_MS } from '../../job_validator/job_validator'; +import { ErrorResponse } from '../../../../../../../common/types/errors'; +import { useMlKibana } from '../../../../../contexts/kibana'; +import { JobCreator } from '../job_creator'; + +export type CalculatePayload = Parameters[0]; + +export const modelMemoryEstimatorProvider = (jobValidator: JobValidator) => { + const modelMemoryCheck$ = new Subject(); + const error$ = new Subject(); + + return { + get error$(): Observable { + return error$.asObservable(); + }, + get updates$(): Observable { + return modelMemoryCheck$.pipe( + // delay the request, making sure the validation is completed + debounceTime(VALIDATION_DELAY_MS + 100), + // clone the object to compare payloads and proceed further only + // if the configuration has been changed + map(cloneDeep), + distinctUntilChanged(isEqual), + switchMap(payload => { + const isPayloadValid = jobValidator.isModelMemoryEstimationPayloadValid; + + return isPayloadValid + ? ml.calculateModelMemoryLimit$(payload).pipe( + pluck('modelMemoryLimit'), + catchError(error => { + // eslint-disable-next-line no-console + console.error('Model memory limit could not be calculated', error.body); + error$.next(error.body); + return of(DEFAULT_MODEL_MEMORY_LIMIT); + }) + ) + : of(DEFAULT_MODEL_MEMORY_LIMIT); + }), + startWith(DEFAULT_MODEL_MEMORY_LIMIT) + ); + }, + update(payload: CalculatePayload) { + modelMemoryCheck$.next(payload); + }, + }; +}; + +export const useModelMemoryEstimator = ( + jobCreator: JobCreator, + jobValidator: JobValidator, + jobCreatorUpdate: Function, + jobCreatorUpdated: number +) => { + const { + services: { notifications }, + } = useMlKibana(); + + // Initialize model memory estimator only once + const [modelMemoryEstimator] = useState(modelMemoryEstimatorProvider(jobValidator)); + + // Listen for estimation results and errors + useEffect(() => { + const subscription = new Subscription(); + + subscription.add( + modelMemoryEstimator.updates$ + .pipe(pairwise()) + .subscribe(([previousEstimation, currentEstimation]) => { + // to make sure we don't overwrite a manual input + if ( + jobCreator.modelMemoryLimit === null || + jobCreator.modelMemoryLimit === previousEstimation + ) { + jobCreator.modelMemoryLimit = currentEstimation; + // required in order to trigger changes on the input + jobCreatorUpdate(); + } + }) + ); + + subscription.add( + modelMemoryEstimator.error$.subscribe(error => { + notifications.toasts.addWarning({ + title: i18n.translate('xpack.ml.newJob.wizard.estimateModelMemoryError', { + defaultMessage: 'Model memory limit could not be calculated', + }), + text: error.message, + }); + }) + ); + + return () => { + subscription.unsubscribe(); + }; + }, []); + + // Update model memory estimation payload on the job creator updates + useEffect(() => { + modelMemoryEstimator.update({ + analysisConfig: jobCreator.jobConfig.analysis_config, + indexPattern: jobCreator.indexPatternTitle, + query: jobCreator.datafeedConfig.query, + timeFieldName: jobCreator.jobConfig.data_description.time_field, + earliestMs: jobCreator.start, + latestMs: jobCreator.end, + }); + }, [jobCreatorUpdated]); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/job_validator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/job_validator.ts index 82e5e15a24d5c..2650f89cf25ca 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/job_validator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/job_validator.ts @@ -6,7 +6,7 @@ import { ReactElement } from 'react'; import { combineLatest, Observable, ReplaySubject, Subject } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; +import { map, startWith, tap } from 'rxjs/operators'; import { basicJobValidation, basicDatafeedValidation, @@ -17,11 +17,12 @@ import { populateValidationMessages, checkForExistingJobAndGroupIds } from './ut import { ExistingJobsAndGroups } from '../../../../services/job_service'; import { cardinalityValidator, CardinalityValidatorResult } from './validators'; import { CATEGORY_EXAMPLES_VALIDATION_STATUS } from '../../../../../../common/constants/categorization_job'; +import { JOB_TYPE } from '../../../../../../common/constants/new_job'; // delay start of validation to allow the user to make changes // e.g. if they are typing in a new value, try not to validate // after every keystroke -const VALIDATION_DELAY_MS = 500; +export const VALIDATION_DELAY_MS = 500; type AsyncValidatorsResult = Partial; @@ -109,7 +110,8 @@ export class JobValidator { ...(curr ? curr : {}), }; }, {}); - }) + }), + startWith({}) ); this.validationResult$ = combineLatest([ @@ -270,4 +272,30 @@ export class JobValidator { public set categorizationField(valid: boolean) { this._advancedValidations.categorizationFieldValid.valid = valid; } + + /** + * Indicates if the Pick Fields step has a valid input + */ + public get isPickFieldsStepValid(): boolean { + return ( + this._jobCreator.detectors.length > 0 && + (this._jobCreator.type !== JOB_TYPE.ADVANCED || + (this._jobCreator.type === JOB_TYPE.ADVANCED && this.modelMemoryLimit.valid)) && + this.bucketSpan.valid && + this.duplicateDetectors.valid && + !this.validating && + (this._jobCreator.type !== JOB_TYPE.CATEGORIZATION || + (this._jobCreator.type === JOB_TYPE.CATEGORIZATION && this.categorizationField)) + ); + } + + public get isModelMemoryEstimationPayloadValid(): boolean { + return ( + this._jobCreator.detectors.length > 0 && + this.bucketSpan.valid && + this.duplicateDetectors.valid && + (this._jobCreator.type !== JOB_TYPE.CATEGORIZATION || + (this._jobCreator.type === JOB_TYPE.CATEGORIZATION && this.categorizationField)) + ); + } } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx index 5c5ba38b1c5a1..c55bdeef4dde8 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx @@ -25,9 +25,6 @@ export const Influencers: FC = () => { useEffect(() => { jobCreator.removeAllInfluencers(); influencers.forEach(i => jobCreator.addInfluencer(i)); - if (jobCreator instanceof MultiMetricJobCreator) { - jobCreator.calculateModelMemoryLimit(); - } jobCreatorUpdate(); }, [influencers.join()]); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx index ffa991388fbe2..cbd7c0ab72ffc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx @@ -79,7 +79,6 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { aggFieldPairList.forEach(pair => { jobCreator.addDetector(pair.agg, pair.field); }); - jobCreator.calculateModelMemoryLimit(); jobCreatorUpdate(); loadCharts(); setIsValid(aggFieldPairList.length > 0); @@ -115,7 +114,6 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { } else { setFieldValues([]); } - jobCreator.calculateModelMemoryLimit(); }, [splitField]); // watch for changes in the split field values diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx index bfec49678bc34..6f03b9a3c3321 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx @@ -25,16 +25,7 @@ export const PickFieldsStep: FC = ({ setCurrentStep, isCurrentStep }) const jobType = jobCreator.type; useEffect(() => { - const active = - jobCreator.detectors.length > 0 && - (jobCreator.type !== JOB_TYPE.ADVANCED || - (jobCreator.type === JOB_TYPE.ADVANCED && jobValidator.modelMemoryLimit.valid)) && - jobValidator.bucketSpan.valid && - jobValidator.duplicateDetectors.valid && - jobValidator.validating === false && - (jobCreator.type !== JOB_TYPE.CATEGORIZATION || - (jobCreator.type === JOB_TYPE.CATEGORIZATION && jobValidator.categorizationField)); - setNextActive(active); + setNextActive(jobValidator.isPickFieldsStepValid); }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx index 6fe27457428b1..2ca0607f81a1e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx @@ -5,6 +5,7 @@ */ import React, { FC, useReducer, useState, useEffect } from 'react'; +import { useModelMemoryEstimator } from '../../common/job_creator/util/model_memory_estimator'; import { WIZARD_STEPS } from '../components/step_types'; @@ -78,6 +79,8 @@ export const Wizard: FC = ({ stringifyConfigs(jobCreator.jobConfig, jobCreator.datafeedConfig) ); + useModelMemoryEstimator(jobCreator, jobValidator, jobCreatorUpdate, jobCreatorUpdated); + useEffect(() => { const subscription = jobValidator.validationResult$.subscribe(() => { setJobValidatorUpdate(jobValidatorUpdated); diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts index df59678452e2f..3be8679830423 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts @@ -535,7 +535,7 @@ export const ml = { }); }, - calculateModelMemoryLimit({ + calculateModelMemoryLimit$({ analysisConfig, indexPattern, query, @@ -559,7 +559,7 @@ export const ml = { latestMs, }); - return http<{ modelMemoryLimit: string }>({ + return http$<{ modelMemoryLimit: string }>({ path: `${basePath()}/validate/calculate_model_memory_limit`, method: 'POST', body, diff --git a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts index 277e1547e4b23..bcdc58e61ad7c 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts +++ b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts @@ -17,39 +17,6 @@ describe('ML - data recognizer', () => { } as never) as SavedObjectsClientContract ); - const moduleIds = [ - 'apache_ecs', - 'apm_jsbase', - 'apm_nodejs', - 'apm_transaction', - 'auditbeat_process_docker_ecs', - 'auditbeat_process_hosts_ecs', - 'logs_ui_analysis', - 'logs_ui_categories', - 'metricbeat_system_ecs', - 'nginx_ecs', - 'sample_data_ecommerce', - 'sample_data_weblogs', - 'siem_auditbeat', - 'siem_auditbeat_auth', - 'siem_packetbeat', - 'siem_winlogbeat', - 'siem_winlogbeat_auth', - 'uptime_heartbeat', - ]; - - // check all module IDs are the same as the list above - it('listModules - check all module IDs', async () => { - const modules = await dr.listModules(); - const ids = modules.map(m => m.id); - expect(ids.join()).toEqual(moduleIds.join()); - }); - - it('getModule - load a single module', async () => { - const module = await dr.getModule(moduleIds[0]); - expect(module.id).toEqual(moduleIds[0]); - }); - describe('jobOverrides', () => { it('should apply job overrides correctly', () => { // arrange diff --git a/x-pack/plugins/painless_lab/public/application/components/main.tsx b/x-pack/plugins/painless_lab/public/application/components/main.tsx index 10907536e9cc2..5aed3f25a51b9 100644 --- a/x-pack/plugins/painless_lab/public/application/components/main.tsx +++ b/x-pack/plugins/painless_lab/public/application/components/main.tsx @@ -55,7 +55,7 @@ export const Main: React.FunctionComponent = () => { return (
- +

{i18n.translate('xpack.painlessLab.title', { diff --git a/x-pack/plugins/painless_lab/public/styles/_index.scss b/x-pack/plugins/painless_lab/public/styles/_index.scss index f68dbe302511a..cad0d8229524b 100644 --- a/x-pack/plugins/painless_lab/public/styles/_index.scss +++ b/x-pack/plugins/painless_lab/public/styles/_index.scss @@ -5,12 +5,17 @@ * This is a very brittle way of preventing the editor and other content from disappearing * behind the bottom bar. */ -$bottomBarHeight: calc(#{$euiSize} * 3); +$bottomBarHeight: calc(#{$euiSize} * 3); .painlessLabBottomBarPlaceholder { height: $bottomBarHeight } +.painlessLabLeftPane { + padding-top: $euiSizeM; + background-color: $euiColorEmptyShade; +} + .painlessLabRightPane { border-right: none; border-top: none; @@ -25,7 +30,7 @@ $bottomBarHeight: calc(#{$euiSize} * 3); flex-direction: column; height: 100%; - [role="tabpanel"] { + [role='tabpanel'] { height: 100%; overflow-y: auto; } diff --git a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.test.ts b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.test.ts index 7fd8b4a894989..a204bd44901b7 100644 --- a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.test.ts +++ b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.test.ts @@ -112,6 +112,40 @@ describe('cluster_serialization', () => { }, 'localhost:9300' ) + ).toEqual({ + name: 'test_cluster', + proxyAddress: 'localhost:9300', + mode: 'proxy', + hasDeprecatedProxySetting: true, + isConnected: true, + connectedNodesCount: 1, + maxConnectionsPerCluster: 3, + initialConnectTimeout: '30s', + skipUnavailable: false, + transportPingSchedule: '-1', + transportCompress: false, + }); + }); + + it('should deserialize a cluster that contains a deprecated proxy address and is in cloud', () => { + expect( + deserializeCluster( + 'test_cluster', + { + seeds: ['localhost:9300'], + connected: true, + num_nodes_connected: 1, + max_connections_per_cluster: 3, + initial_connect_timeout: '30s', + skip_unavailable: false, + transport: { + ping_schedule: '-1', + compress: false, + }, + }, + 'localhost:9300', + true + ) ).toEqual({ name: 'test_cluster', proxyAddress: 'localhost:9300', diff --git a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts index 3d8ffa13b8218..07dbe8da28d8a 100644 --- a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts +++ b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts @@ -68,7 +68,8 @@ export interface ClusterSettingsPayloadEs { export function deserializeCluster( name: string, esClusterObject: ClusterInfoEs, - deprecatedProxyAddress?: string | undefined + deprecatedProxyAddress?: string | undefined, + isCloudEnabled?: boolean | undefined ): Cluster { if (!name || !esClusterObject || typeof esClusterObject !== 'object') { throw new Error('Unable to deserialize cluster'); @@ -117,7 +118,7 @@ export function deserializeCluster( // If a user has a remote cluster with the deprecated proxy setting, // we transform the data to support the new implementation and also flag the deprecation if (deprecatedProxyAddress) { - // Create server name (address, without port), since field doesn't exist in deprecated implementation + // Cloud-specific logic: Create default server name, since field doesn't exist in deprecated implementation const defaultServerName = deprecatedProxyAddress.split(':')[0]; deserializedClusterObject = { @@ -126,7 +127,7 @@ export function deserializeCluster( seeds: undefined, hasDeprecatedProxySetting: true, mode: PROXY_MODE, - serverName: defaultServerName, + serverName: isCloudEnabled ? defaultServerName : undefined, }; } diff --git a/x-pack/plugins/remote_clusters/kibana.json b/x-pack/plugins/remote_clusters/kibana.json index 8922bf621aa03..f1b9d20f762d3 100644 --- a/x-pack/plugins/remote_clusters/kibana.json +++ b/x-pack/plugins/remote_clusters/kibana.json @@ -11,7 +11,8 @@ "indexManagement" ], "optionalPlugins": [ - "usageCollection" + "usageCollection", + "cloud" ], "server": true, "ui": true diff --git a/x-pack/plugins/remote_clusters/public/application/app_context.tsx b/x-pack/plugins/remote_clusters/public/application/app_context.tsx new file mode 100644 index 0000000000000..86c0b401d416d --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/app_context.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { createContext } from 'react'; + +export interface Context { + isCloudEnabled: boolean; +} + +export const AppContext = createContext({} as any); + +export const AppContextProvider = ({ + children, + context, +}: { + children: React.ReactNode; + context: Context; +}) => { + return {children}; +}; diff --git a/x-pack/plugins/remote_clusters/public/application/index.d.ts b/x-pack/plugins/remote_clusters/public/application/index.d.ts index b5c5ad5522134..b021dca51bacd 100644 --- a/x-pack/plugins/remote_clusters/public/application/index.d.ts +++ b/x-pack/plugins/remote_clusters/public/application/index.d.ts @@ -8,5 +8,8 @@ import { RegisterManagementAppArgs, I18nStart } from '../types'; export declare const renderApp: ( elem: HTMLElement | null, - I18nContext: I18nStart['Context'] + I18nContext: I18nStart['Context'], + appDependencies: { + isCloudEnabled?: boolean; + } ) => ReturnType; diff --git a/x-pack/plugins/remote_clusters/public/application/index.js b/x-pack/plugins/remote_clusters/public/application/index.js index 0b8b26ace5daa..f2d788c741342 100644 --- a/x-pack/plugins/remote_clusters/public/application/index.js +++ b/x-pack/plugins/remote_clusters/public/application/index.js @@ -11,14 +11,17 @@ import { Provider } from 'react-redux'; import { App } from './app'; import { remoteClustersStore } from './store'; +import { AppContextProvider } from './app_context'; -export const renderApp = (elem, I18nContext) => { +export const renderApp = (elem, I18nContext, appDependencies) => { render( - - - + + + + + , elem diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap index 6ff8c538ca89c..4c109c557fdb0 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap @@ -5,7 +5,6 @@ exports[`RemoteClusterForm proxy mode renders correct connection settings when u disabledFields={Object {}} fields={ Object { - "mode": "sniff", "name": "", "nodeConnections": 3, "proxyAddress": "", @@ -805,6 +804,7 @@ exports[`RemoteClusterForm proxy mode renders correct connection settings when u data-test-subj="remoteClusterFormServerNameFormRow" describedByIds={Array []} display="row" + error={null} fullWidth={true} hasChildLabel={true} hasEmptyLabelSpace={false} @@ -827,10 +827,11 @@ exports[`RemoteClusterForm proxy mode renders correct connection settings when u } /> } + isInvalid={false} label={ } @@ -845,18 +846,21 @@ exports[`RemoteClusterForm proxy mode renders correct connection settings when u className="euiFormRow__labelWrapper" >