1. Document Exporter

1.1. Introduction

The app Document Exporter is used to export data from any table to Word documents within the Now platform. For this purpose, Microsoft Word document templates with placeholders are created, which are later replaced by the app with the data from ServiceNow. The document templates are saved in a ServiceNow table as an attachment to a descriptive data set.

It is possible to export both single and multiple data sets. In the case of several data records, these can either be output as individual documents or together in one document.

The export is started within ServiceNow optionally via a button or link in the form, an entry in the context menu of the record or entries in the list selection menu of a table. For a table in ServiceNow several alternative document templates can be stored, which the user can select during the export. After the export, the document is offered for download in .docx format within the browser.

1.2. Main features

  • Creates documents from any records.
  • can add and process data from linked tables to the data of the exported record.
  • Can provide and use multiple templates to select from for the same records.
  • Uses docx templates from Microsoft Word or other compatible applications.
  • Completely DS-GVO-compliant processing of all data by the customer.
  • Available in English and German.

1.3. System requirements

  • ServiceNow Istanbul, Jakarta, Kingston, London or Madrid Release.
  • Microsoft Word or any other application that can be used to create docx files as templates.
  • Optional: I18N Plugin for the German language.
  • Optional: Our free Microsoft Word Add-In for easy creation of templates for ServiceNow.

1.4. Try, buy and install

servicenow now certified app

Document Exporter is an app certified by ServiceNow. A Now Certified App has passed certification criteria such as metadata, interoperability, security and performance testing.

Document Exporter you can easily download via the ServiceNow-App-Store under Document Exporter in the ServiceNow-App-Store. There you will also get access to a current trial version of Document Exporter. If you don't know the ServiceNow app store yet, the following video shows you how to test, buy and install an app from the ServiceNow store.

The video applies to UI16, the latest version of the user interface, in the Madrid version. It may also apply to future versions. UI16 is the default user interface for new instances, starting with the Geneva release. To get UI16 on updated instances, the UI16 plugin must be enabled.

The following castors are required for execution:

  • To try and buy: HI account
  • For installation: Administrator role on the ServiceNow instance

The video shows ab

  • 00:36 Request an App test version
  • 01:44 Buying an App
  • 03:08 Installation of an App

Further information about the ServiceNow Store can be found at store.servicenow.com.

2. Menu entries

The App creates an additional application menu ‚Document Exporter‘ in the ServiceNow navigator. The menu entries are being introduced in the following section.

2.1. Getting Started

This link opens a page from which the external online documentation and the contact form from syscovery could be opened.

2.2. Templates

This link navigates to the table in ServiceNow where the Word templates and their corresponding metadata are stored. The table will open in the default list view and can (provided that the permissions are sufficient) be edited right there.

More information regarding permissions and the handling of this table is provided in the next chapters.

2.3. Administration / Properties

This link is only available to administrators of the App. It allows to manage the settings of the App through a UI page in ServiceNow.

More details about this function could be found in the chapter „Administration“.

2.4. Administration / Manage UI Action

This link is only available to administrators of the App. It allows to enable and disable the action ‚export to document‘ for a table (or globally for all tables) in ServiceNow.

More details about this function could be found in the chapter „Administration“.

3. Permissions

The App defines three new roles inside ServiceNow: normal user, template admin and admin. These roles are described in detail in the next section.

3.1. Normal user (x_sssgh_docex.user)

A normal user is someone, who should be able to export data from ServiceNow tables into documents using the provided templates. Users could only use already provided and activated templates stored in the table ‘templates’. They are not able to change or add templates. Users also could not change the settings of the App or manage the UI action.

3.2. Template admin (x_sssgh_docex.template_admin)

Users with that role are able to manage the records of the table ‘templates’ in ServiceNow. This includes adding, removing and changing those records as well as attaching templates and activating or deactivating templates for normal users.

Template admins also always have the normal user role. Therefore, they are also able to export data using the App but they can’t change the settings of the App or manage the UI action.

3.3. Administrator (x_sssgh_docex.admin)

Admins have full access to all parts of the App. This role includes the permissions of the normal user and template admin roles. Additionally, admins could modify the settings of the App and enable or disable the UI action ‘export to document’ for different tables in ServiceNow.

4. Managing templates

4.1. Table ‚templates‘

The Word templates used by the data export are managed in the table ‚templates (x_sssgh_docex_templates)‘ in ServiceNow. This table is linked to the module ‚templates‘ in the application menu ‚Document Exporter‘. To manage the records in this table a user must have at least the ‘template admin (x_sssgh_docex.template_admin)’ role. The templates themselves are stored as attachments to the records.

The templates are assigned to a target table in ServiceNow using the metadata of the records in the table ‘templates’.

4.1.1. Table fields

Name Type Description
Titel Text The title of the template. Will be shown to the user for choosing a template in the export dialog.
Table Reference Selection of the target (base) table for this template. If, for example, the table is set to ‘Incident’ then this template could later be used for exporting from the Incidents table.
Aktive True/false True = This template could be used for exporting data. False = This template is currently not available
Type Choice ‚Single record‘: This template is aimed for exporting only one record. It will not be listed when merging multiple records in one document.
‚Multiple records‘: This template is aimed for containing multiple records. It may include a table for listing the records or it may contain page breaks to generate multi page documents.

 

4.1.2. Attachment

The Word templates are attached to the individual records. This is done by using the default functionality of ServiceNow for managing attachments of records in a table. The placeholders used in the template must fit to the selected target table in the metadata (this is not being checked by the system!). The attached file must use the Microsoft Word .docx format. As the filename is not actively used by the App it could be freely chosen.

4.2. Creating the Word document template

The template could be created with Microsoft Word or any other application that supports creating files in the Microsoft Word .docx format. Files using the older binary .doc format are not supported!

The template ist always assigned to a specific table in ServiceNow. This is the so called ‘base table’ of the document. This base table is basically the table from which the export is started. For instance, if the base table is Users (sys_user), then the export is started from a record or the list view of the user table.

Based on the base table it is possible to add data from other related tables. There are 2 ways to achieve this:

  1. References (so called dot-walking): If a reference field is selected from a table that reference could be followed while exporting. Example: The table ‘Incidents’ contains the field ‘caller’. This field refers to the table ‘users’. If that field contains ‘John Doe’ it is possible to export user data like for example John Doe’s phone number. This could also be continued in the users table. If, for instance, John Doe’s record has the department field set to IT the phone number or department head of the IT department could also be exported.
  2. Related lists: If the base table is the user table it is possible to export the list of open incidents which are assigned to the currently exported user to the document. An export could contain more than one related list. The only restriction is that all additional lists must have a clear relationship to the base table, e.g. ‘assigned to’ from Incidents must relate to the user’s Id in the base table.

The Word template itself could be created as usual. It can contain formattings, headers/footers, images etc. without issues.

At the positions where data from ServiceNow should be placed later on placeholders are being used. These placeholders are surrounded by curly brackets and contain the internal name of the field whose data should be inserted. Additionally, there are placeholders containing commands for executing advanced functions.

Syscovery provides a free add-in for Microsoft Word Version 2016 and newer which facilitates creating the templates. This add-in is described in a separate documentation.

4.2.1. Field-Placeholder

In the most basic case placeholders for fields consist of the internal field name surrounded by curly brackets.

Example: Mail address of a user in the user table:

{email}

This requires the table ‚users‘ to be the base table of the template which must be set in the table ‘templates’ for this template.

The easiest way to find the internal name of field is to open a record of the corresponding table and then right-clicking on the field label in the form. This opens a context menu which shows the internal field name in its lower part:

Den internen Feldnamen in ServiceNow herausfinden

For reference fields, which reference records in different tables, the ServiceNow ‘Dot-walking’ comes into play. That means, that for accessing the field of a related record its internal field name is appended to the internal field name of the reference field, separated by a dot.

Example: Mail address of the user’s department head of department

{department.dept_head.email}

Department is the field from the base table ‘users’. Dept_head is the field which contains the head of department in the referenced table ‘department’. Email is the field in the table ‘users’ which is referenced by Dept_head and contains the mail address of the person who is the head of department.

The internal field names of the referenced table could be found by clicking on the button with the circled i at the right side of the reference field and then clicking on ‘Open Record’ in the dialog that opens. This opens a form from the referenced table which could be used to retrieve the internal field name as previously described.

xxx Den internen Feldnamen in ServiceNow herausfinden

4.2.2. Multiple records in one document

If the templates is aimed for containing multiple records of the base table it is necessary to define a record loop inside the template. Additionally, the corresponding record in the table ‘templates’ must have the type ‘multiple records’ selected.

The loop starts with the placeholder #Records and ends with /Records. Example:

{#Records}¶
Name: {name}¶
E-Mail: {email}¶
{/Records}¶

The resulting document after exporting would show up as follows:

xxx Den internen Feldnamen in ServiceNow herausfinden

The large gap between the records in the output results from the fact that everything inside the loop gets repeated. This also includes the line break after the placeholder {#Records}!

To circumvent this, the line break must be omitted:

{#Records}Name: {name}¶
E-Mail: {email}¶
{/Records}¶

The result would be as follows:

xxx Den internen Feldnamen in ServiceNow herausfinden

As an alternative, records could also be output inside a table. This table should consist of two rows having the column headers in the first row and the field-placeholders in the second one. The loop would then start in the second row just in front of the first placeholder and end in the same row after the last placeholder:

xxx Den internen Feldnamen in ServiceNow herausfinden

If there should be one record per page in the document then it is necessary to insert a manual page break inside the loop just before the end (before {/Records}). As everything inside the loop will be repeated for each record this would also repeat the page break at the last record. That leads to a mostly unwanted empty page at the end of the document. The App provides some special placeholders to circumvent this and other similar problems:

If is first record:

{#IsFirstRecord}{/IsFirstRecord}

If is not first record:

{#IsNotFirstRecord}{/IsNotFirstRecord}

If is last record:

{#IsLastRecord}{/IsLastRecord}

If is not last record:

{#IsNotLastRecord}{/IsNotLastRecord}

 

Everything that should only be (or not be) output on the first or last record should be placed between the corresponding start/end placeholders.

Example for omitting the page break at the last record:

xxx Den internen Feldnamen in ServiceNow herausfinden

It is recommended to activate the display of control characters in Word using the button  xxx Den internen Feldnamen in ServiceNow herausfinden.

4.2.3. Related Lists

Data stored in tables related to the base table could be exported to the generated document provided that a field in the related table could be connected to a field in the base table using the equals operator. For instance the table ‘Incidents’ could be linked to the base table ‘Users’ by connecting its field ‘assigned_to’ to the exported user’s sys id.

As there could be several records matching the condition the output of the data from related lists is realized using a loop. This loop starts with the placeholder {#%Ttablename} and ends with {/%Ttablename} whereby the term tablename must be replaced by the related table’s internal name.

The internal name of a table could be found by opening some record in that table, then clicking on the menu link at the top besides the table’s title and afterwards clicking on ‘Show XML’ in the menu. Another window will open up which shows the internal name enclosed in angle brackets in the line underneath . In the following example the internal name is sys_user:

xxx Den internen Feldnamen in ServiceNow herausfinden

It is necessary to provide information about which field of the base table should be linked to which field in the related table inside the loop. This is done using the placeholder {%MbaseTableField:relatedTableField}. Whereas baseTableField needs to be replaced by the internal name of the base table’s field. After the colon the internal name of the related table’s field replaces relatedTableField. Both fields will be connected using the equals operator.

Example: The id of the user in the base table ‘Users’ should be linked to ‘assigned_to’ in the related table ‘Incidents’:

{%Msys_id:assigned_to}

It doesn’t matter where this placeholder is located inside the loop, the only important part is that it must be inside the loop between the {#%Ttablename} and {/%Ttablename} placeholders.

Optionally an additional query could be provided to filter the records of the related table. This query is set by using an optional placeholder in the form of {%Qquery}. The term query needs to be replaced by the actual query using ServiceNow’s default encoded query format.

Example: Only show active Incidents currently in the state ‘in progress’

{%Qactive=true^state=2}

It doesn’t matter where this placeholder is located inside the loop, the only important part is that it must be inside the loop between the {#%Ttablename} and {/%Ttablename} placeholders. If no additional query is needed this placeholder can be omitted.

The encoded query could easily be generated through ServiceNow’s user interface. Initially the list view of the related list needs to be opened and filtered as needed. After that a right-click on the last entry of the filter opens a menu showing ‘copy query’.

xxx Den internen Feldnamen in ServiceNow herausfinden

A click on ‘copy query’ copies the encoded query string to the clipboard from where it could be pasted into the placeholder inside Word.

As another option a field used for sorting the records of the related table in the document could also be provided. If needed this could be done using a placeholder in the form of {%OAfieldname} for ascending sorting or {%ODfieldname} for descending sorting. The term fieldname needs to be replaced by the internal name of the field that should be used for sorting the result.

Example: Sorting the incidents by priority ascending

{%OApriority}

It doesn’t matter where this placeholder is located inside the loop, the only important part is that it must be inside the loop between the {#%Ttablename} and {/%Ttablename} placeholders. If no sorting is needed this placeholder can be omitted.

Besides the already described placeholders used for controlling the connection to the related table the fields that should be exported are also placed inside the loop between {#%Ttablename} and {/%Ttablename}. The format is the same as already described in the chapter ‘field-placeholders’. The only difference is, that in this case the related table’s field names are used instead of the ones from the base table.

Full example for exporting a user record with a related list of all incidents assigned to the user sorted by priority:

Template

xxx Den internen Feldnamen in ServiceNow herausfinden

Result

xxx Den internen Feldnamen in ServiceNow herausfinden

5. Administration

An administrator (role x_sssgh_docex.admin) is able to manage the general settings for the export. He could also define for which tables in ServiceNow and through which means (forms button, context menu, etc.) an export to a document is available for end users. These settings are described in the following chapters.

5.1. Document Exporter Properties

The properties page for the App could be opened using the module ‘properties’ of the application menu ‘Document Exporter’:

xxx Den internen Feldnamen in ServiceNow herausfinden

Threshold value to generate a warning if exceeded by the number of selected items

If a user selects several records in the list view and exports them using a template designed for containing a single record a separate document will be generated for each record. That is, if a user selects 50 records and exports them using a single record template the App would generate 50 documents and send them to the browser for downloading. With this setting, the admin can define that a warning should be shown to the user if the number of selected records exceeds the value set herein. The user is able to confirm the warning and continue exporting the data or cancel it.

Threshold value to block the document genereation if exceeded by the number of selected items

This applies to the same case as above. However, the user is not given the possibility to continue the export if this number is exceeded.

Start generation automatically if there’s only one template defined for the table

For each table multiple templates could be defined which can be selected from before exporting the data. This setting is only checked if there is only one active template found. ‘Yes’ means, that the export will start immediately without showing the dialog for selecting a template. The export will automatically use the one template that is available. If set to ‘No’ the dialog for selecting the template will always be shown no matter if there is only one or several templates.

Save

By clicking the button ‚Save‘ the settings will get saved and will be applied to the subsequent exports.

5.2. Manage UI Action

The export itself is started by using a UI action which is assigned to the base table of the document template.

This UI action could be assigned to and removed from any table in ServiceNow using the module ‘Manage UI Action’ from the application menu ‘Document Exporter’.

The following permissions in ServiceNow are required to manage the UI action:

  • sys_db_object (Tabellen): read and write record
  • sys_ui_action (UI-Aktionen): read, write, create and delete record

If the user managing the UI actions is not in the sysadmin role, these permissions need to be manually granted to the x_sssgh_docex.admin role.

Description of the settings:

xxx Den internen Feldnamen in ServiceNow herausfinden

Select a table

This is used to define the table for which the UI action should be managed. By clicking on the button with the magnifying glass at the end of the field a dialog for searching and selecting the table could be opened.

The following settings are applied when adding a UI action to the previously selected table. Therefore, these settings could differ for different tables.

Show as form button

By checking this setting, a button for starting the export will be added to the display and edit forms of a record:

xxx Den internen Feldnamen in ServiceNow herausfinden

This button will only be visible if at least one active template of the type ‘single record’ for this table is found.

Show as related link

If this setting is activated a link for starting the export will be shown in the “Related links” section of the display and edit form of a record:

xxx Den internen Feldnamen in ServiceNow herausfinden

This link will only be visible if at least one active template of the type ‘single record’ for this table is found.

Show in list item context menu

By checking this setting, a link for starting the export will be added to the context menu of the records in the table’s list view:

xxx Den internen Feldnamen in ServiceNow herausfinden

This link in the menu will only be visible if at least one active template of the type ‘single record’ for this table is found.

Show ‚Export to single document‘ in list choice menu

If this setting is activated the list choice menu at the bottom of a table’s list view will be extended with a link to export all selected records combined into a single document:

xxx Den internen Feldnamen in ServiceNow herausfinden

The item in the list choice menu will be deactivated (grayed out) if there is now active template of the type ‘Multiple records’ found for the current table.

Show ‚Export to multiple documents‘ in list choice menu

If this setting is activated the list choice menu at the bottom of a table’s list view will be extended with a link to export all selected records into separate documents with each document containing one record:

xxx Den internen Feldnamen in ServiceNow herausfinden

The item in the list choice menu will be deactivated (grayed out) if there is now active template of the type ‘Single record’ found for the current table.

Button Add UI action

Clicking on this button will add the UI action to the selected table at the selected locations.

Button Remove UI action

A click on this button will remove the UI action entirely from the selected table. The selection of the location (button, context menu, etc.) is not used by this function.

5.2.1. Using the table ‚Global‘ for the UI action

If the action is added to the table ‘Global’ it will automatically show up for every table in ServiceNow for which active template records are available.

Due to technical restrictions in ServiceNow it is not possible to add the action to the context menu when using ‘Global’. Therefore, it will never show up in the context menu of a record irrespective of whether the option has been selected or not.

To add the UI action to the table ‘Global’ some additional steps are required:

Before adding or removing the action the cross scope settings of the Global table need to be changed manually. To do this navigate to the Tables table (sys_db_object) and open the record for the table named Global. Inside the form open the tab named ‘Application Access’ and change the value for ‘Accessible from’ to ‘All application scopes’:

xxx Den internen Feldnamen in ServiceNow herausfinden

Please make sure that at least ‘Can read’ and ‘Allow access to this table via web services’ is checked and update the record.

Now navigate to the ‘Manage UI action’ module of the Document Exporter App and add the UI action to ‘Global’.

After that navigate back to the Tables table and open the record of the ‘Global’ table again. Inside the form open the tab named ‘Application Access’ and change the value for ‘Accessible from’ back to its original value ‘This application state only’ and update the record:

xxx Den internen Feldnamen in ServiceNow herausfinden

6. Exporting to documents

The App’s admin descides, for which tables and at which locations in the UI the function for exporting records to documents will be available (see chapter ‚Administration‘). Furthermore, there has to be at least one active template of the correct type for a table to use the export (see chapter ‘Managing templates’).

If activated, the export could be started from the display and edit forms of a record:

xxx Den internen Feldnamen in ServiceNow herausfinden

xxx Den internen Feldnamen in ServiceNow herausfinden

Additionally, the export could be started from a record’s context menu in the list view of a table:

xxx Den internen Feldnamen in ServiceNow herausfinden

If more than one record should be exported, options to start the export from the list choice menu at the bottom of a table’s list view may be provided:

xxx Den internen Feldnamen in ServiceNow herausfinden

After clicking on one of the beforementioned actions and depending on the settings of the App a dialog for choosing the template will show:

xxx Den internen Feldnamen in ServiceNow herausfinden

If there are more than one active templates of a suitable type found for the current table, the template to use for the export could be chosen in this dialog.

Clicking on ‚Generate Document‘ will execute the export and create the document. The newly created document will then be offered for downloading through the browser. The document’s filename will be the title of the selected template complemented by a timestamp.

If several records have been selected and the ‚export to multiple documents‘ was used the chosen template will be applied to all records. After the export is done the browser will offer multiple documents (according to the number of selected records) for download.

7. Sample Templates

To help getting started quickly we provide some complimentary sample templates for downloading from our CDN:

BasicUser.docx

A basic single record template based on the Users (sys_user) table including dot-walking fields.

 

GroupMembers.docx

A multi record / multi page template based on the Users (sys_user) table including data from a related table (group membership of the users). This template also contains a cover page and a table of contents.

 

OpenChanges.docx

A single record template based on the Application (cmdb_ci_application) table including dot-walking fields and data from a related table (change_request) contained in a word table.

 

You are free to use those templates as is or modify them according to your needs.

8. Release Notes

Version Notes Compatibility
1.0.2
  • Added support for Madrid release
  • Fixed some minor issues for german language
  • Enabled the usage of documents containing macros (.docm)
Kingston, London, Madrid
1.0.1 Initial Release Kingston, London

9. Used licenses

 

DocxTemplater / Inspect-Module

Copyright (c) 2013 Edgar HIPP

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

Filesaver.js

The MIT License

Copyright © 2016 Eli Grey.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

JSZip

The MIT License

===============

Copyright (c) 2009-2016 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

JSZipUtils

The MIT License

===============

Copyright (c) 2014 Stuart Knightley, David Duponchel

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

Pako

(The MIT License)

Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

Lodash

Copyright JS Foundation and other contributors <https://js.foundation/>

Based on Underscore.js, copyright Jeremy Ashkenas,

DocumentCloud and Investigative Reporters & Editors <https://underscorejs.org/>

This software consists of voluntary contributions made by many individuals. For exact contribution history, see the revision history available at https://github.com/lodash/lodash The following license applies to all parts of this software except as documented below:

====

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.