From b468657f72b197b9fad3bf254d47fc2e8d2c159f Mon Sep 17 00:00:00 2001
From: Anirudh Singh <anirudh.s.c.96@hotmail.com>
Date: Tue, 28 Aug 2018 06:26:41 +0530
Subject: [PATCH] [GSoC 2018] LIMS Integration into EHR (#1204)

* Lab management system with directory structure, configuration settings, dashboard, manufacturers,suppliers,methods, lab details, clients
---
 interface/orders/types_edit.php               |    4 +-
 library/globals.inc.php                       |   24 +
 modules/LIMS/documentation/ISO_creation.md    |   89 +
 modules/LIMS/documentation/Workflow.pdf       |  Bin 0 -> 24897 bytes
 modules/LIMS/index.php                        |   30 +
 modules/LIMS/libraries/Guzzle/index.php       |    4 +
 .../LIMS/libraries/Guzzle/vendor/autoload.php |    7 +
 .../Guzzle/vendor/composer/ClassLoader.php    |  445 ++
 .../libraries/Guzzle/vendor/composer/LICENSE  |   21 +
 .../vendor/composer/autoload_classmap.php     |    9 +
 .../Guzzle/vendor/composer/autoload_files.php |   12 +
 .../vendor/composer/autoload_namespaces.php   |    9 +
 .../Guzzle/vendor/composer/autoload_psr4.php  |   13 +
 .../Guzzle/vendor/composer/autoload_real.php  |   70 +
 .../vendor/composer/autoload_static.php       |   55 +
 .../Guzzle/vendor/composer/installed.json     |  241 +
 .../vendor/guzzlehttp/guzzle/CHANGELOG.md     | 1264 +++
 .../Guzzle/vendor/guzzlehttp/guzzle/LICENSE   |   19 +
 .../Guzzle/vendor/guzzlehttp/guzzle/README.md |   89 +
 .../vendor/guzzlehttp/guzzle/UPGRADING.md     | 1203 +++
 .../vendor/guzzlehttp/guzzle/composer.json    |   44 +
 .../vendor/guzzlehttp/guzzle/src/Client.php   |  414 +
 .../guzzlehttp/guzzle/src/ClientInterface.php |   84 +
 .../guzzle/src/Cookie/CookieJar.php           |  314 +
 .../guzzle/src/Cookie/CookieJarInterface.php  |   84 +
 .../guzzle/src/Cookie/FileCookieJar.php       |   90 +
 .../guzzle/src/Cookie/SessionCookieJar.php    |   71 +
 .../guzzle/src/Cookie/SetCookie.php           |  404 +
 .../src/Exception/BadResponseException.php    |   27 +
 .../guzzle/src/Exception/ClientException.php  |    7 +
 .../guzzle/src/Exception/ConnectException.php |   37 +
 .../guzzle/src/Exception/GuzzleException.php  |    4 +
 .../guzzle/src/Exception/RequestException.php |  217 +
 .../guzzle/src/Exception/SeekException.php    |   27 +
 .../guzzle/src/Exception/ServerException.php  |    7 +
 .../Exception/TooManyRedirectsException.php   |    4 +
 .../src/Exception/TransferException.php       |    4 +
 .../guzzle/src/Handler/CurlFactory.php        |  559 ++
 .../src/Handler/CurlFactoryInterface.php      |   27 +
 .../guzzle/src/Handler/CurlHandler.php        |   45 +
 .../guzzle/src/Handler/CurlMultiHandler.php   |  197 +
 .../guzzle/src/Handler/EasyHandle.php         |   92 +
 .../guzzle/src/Handler/MockHandler.php        |  189 +
 .../guzzlehttp/guzzle/src/Handler/Proxy.php   |   55 +
 .../guzzle/src/Handler/StreamHandler.php      |  533 ++
 .../guzzlehttp/guzzle/src/HandlerStack.php    |  273 +
 .../guzzle/src/MessageFormatter.php           |  182 +
 .../guzzlehttp/guzzle/src/Middleware.php      |  254 +
 .../vendor/guzzlehttp/guzzle/src/Pool.php     |  123 +
 .../guzzle/src/PrepareBodyMiddleware.php      |  106 +
 .../guzzle/src/RedirectMiddleware.php         |  237 +
 .../guzzlehttp/guzzle/src/RequestOptions.php  |  255 +
 .../guzzlehttp/guzzle/src/RetryMiddleware.php |  112 +
 .../guzzlehttp/guzzle/src/TransferStats.php   |  126 +
 .../guzzlehttp/guzzle/src/UriTemplate.php     |  241 +
 .../guzzlehttp/guzzle/src/functions.php       |  331 +
 .../guzzle/src/functions_include.php          |    6 +
 .../vendor/guzzlehttp/promises/CHANGELOG.md   |   65 +
 .../Guzzle/vendor/guzzlehttp/promises/LICENSE |   19 +
 .../vendor/guzzlehttp/promises/Makefile       |   13 +
 .../vendor/guzzlehttp/promises/README.md      |  504 ++
 .../vendor/guzzlehttp/promises/composer.json  |   34 +
 .../promises/src/AggregateException.php       |   16 +
 .../promises/src/CancellationException.php    |    9 +
 .../guzzlehttp/promises/src/Coroutine.php     |  151 +
 .../guzzlehttp/promises/src/EachPromise.php   |  229 +
 .../promises/src/FulfilledPromise.php         |   82 +
 .../guzzlehttp/promises/src/Promise.php       |  280 +
 .../promises/src/PromiseInterface.php         |   93 +
 .../promises/src/PromisorInterface.php        |   15 +
 .../promises/src/RejectedPromise.php          |   87 +
 .../promises/src/RejectionException.php       |   47 +
 .../guzzlehttp/promises/src/TaskQueue.php     |   66 +
 .../promises/src/TaskQueueInterface.php       |   25 +
 .../guzzlehttp/promises/src/functions.php     |  457 ++
 .../promises/src/functions_include.php        |    6 +
 .../vendor/guzzlehttp/psr7/CHANGELOG.md       |  110 +
 .../Guzzle/vendor/guzzlehttp/psr7/LICENSE     |   19 +
 .../Guzzle/vendor/guzzlehttp/psr7/README.md   |  739 ++
 .../vendor/guzzlehttp/psr7/composer.json      |   39 +
 .../guzzlehttp/psr7/src/AppendStream.php      |  233 +
 .../guzzlehttp/psr7/src/BufferStream.php      |  137 +
 .../guzzlehttp/psr7/src/CachingStream.php     |  138 +
 .../guzzlehttp/psr7/src/DroppingStream.php    |   42 +
 .../vendor/guzzlehttp/psr7/src/FnStream.php   |  149 +
 .../guzzlehttp/psr7/src/InflateStream.php     |   52 +
 .../guzzlehttp/psr7/src/LazyOpenStream.php    |   39 +
 .../guzzlehttp/psr7/src/LimitStream.php       |  155 +
 .../guzzlehttp/psr7/src/MessageTrait.php      |  183 +
 .../guzzlehttp/psr7/src/MultipartStream.php   |  153 +
 .../guzzlehttp/psr7/src/NoSeekStream.php      |   22 +
 .../vendor/guzzlehttp/psr7/src/PumpStream.php |  165 +
 .../vendor/guzzlehttp/psr7/src/Request.php    |  142 +
 .../vendor/guzzlehttp/psr7/src/Response.php   |  132 +
 .../guzzlehttp/psr7/src/ServerRequest.php     |  358 +
 .../vendor/guzzlehttp/psr7/src/Stream.php     |  257 +
 .../psr7/src/StreamDecoratorTrait.php         |  149 +
 .../guzzlehttp/psr7/src/StreamWrapper.php     |  121 +
 .../guzzlehttp/psr7/src/UploadedFile.php      |  316 +
 .../Guzzle/vendor/guzzlehttp/psr7/src/Uri.php |  702 ++
 .../guzzlehttp/psr7/src/UriNormalizer.php     |  216 +
 .../guzzlehttp/psr7/src/UriResolver.php       |  219 +
 .../vendor/guzzlehttp/psr7/src/functions.php  |  828 ++
 .../guzzlehttp/psr7/src/functions_include.php |    6 +
 .../vendor/psr/http-message/CHANGELOG.md      |   36 +
 .../Guzzle/vendor/psr/http-message/LICENSE    |   19 +
 .../Guzzle/vendor/psr/http-message/README.md  |   13 +
 .../vendor/psr/http-message/composer.json     |   26 +
 .../psr/http-message/src/MessageInterface.php |  187 +
 .../psr/http-message/src/RequestInterface.php |  129 +
 .../http-message/src/ResponseInterface.php    |   68 +
 .../src/ServerRequestInterface.php            |  261 +
 .../psr/http-message/src/StreamInterface.php  |  158 +
 .../src/UploadedFileInterface.php             |  123 +
 .../psr/http-message/src/UriInterface.php     |  323 +
 .../LIMS/libraries/dependencies/functions.php |   91 +
 modules/LIMS/login.php                        |   46 +
 modules/LIMS/senaite/README.md                |  180 +
 modules/LIMS/senaite/assets/config.json       |  435 ++
 .../senaite/assets/css/bootstrap-theme.css    |  596 ++
 .../assets/css/bootstrap-theme.min.css        |   14 +
 modules/LIMS/senaite/assets/css/bootstrap.css | 6759 +++++++++++++++++
 .../LIMS/senaite/assets/css/bootstrap.min.css |    7 +
 modules/LIMS/senaite/assets/css/style.css     |   38 +
 .../fonts/glyphicons-halflings-regular.eot    |  Bin 0 -> 20127 bytes
 .../fonts/glyphicons-halflings-regular.svg    |  288 +
 .../fonts/glyphicons-halflings-regular.ttf    |  Bin 0 -> 45404 bytes
 .../fonts/glyphicons-halflings-regular.woff   |  Bin 0 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2  |  Bin 0 -> 18028 bytes
 modules/LIMS/senaite/assets/img/category.jpeg |  Bin 0 -> 14522 bytes
 modules/LIMS/senaite/assets/img/client.png    |  Bin 0 -> 8164 bytes
 modules/LIMS/senaite/assets/img/contact.png   |  Bin 0 -> 21940 bytes
 .../LIMS/senaite/assets/img/department.png    |  Bin 0 -> 7002 bytes
 .../LIMS/senaite/assets/img/identifier.png    |  Bin 0 -> 5823 bytes
 modules/LIMS/senaite/assets/img/info.png      |  Bin 0 -> 28160 bytes
 .../LIMS/senaite/assets/img/instrument.png    |  Bin 0 -> 24475 bytes
 .../LIMS/senaite/assets/img/labproduct.png    |  Bin 0 -> 11816 bytes
 modules/LIMS/senaite/assets/img/logo.png      |  Bin 0 -> 19457 bytes
 .../LIMS/senaite/assets/img/manufacturer.png  |  Bin 0 -> 5874 bytes
 modules/LIMS/senaite/assets/img/method.png    |  Bin 0 -> 24931 bytes
 modules/LIMS/senaite/assets/img/sample.jpg    |  Bin 0 -> 28777 bytes
 modules/LIMS/senaite/assets/img/supplier.png  |  Bin 0 -> 51624 bytes
 modules/LIMS/senaite/assets/img/worksheet.png |  Bin 0 -> 2372 bytes
 .../LIMS/senaite/assets/js/bootstrap.min.js   |    7 +
 modules/LIMS/senaite/classes/autoloader.php   |   37 +
 modules/LIMS/senaite/classes/config.php       |   26 +
 modules/LIMS/senaite/config.php               |    0
 modules/LIMS/senaite/index.php                |   58 +
 modules/LIMS/senaite/pages/analysis.php       |  384 +
 modules/LIMS/senaite/pages/client.php         |  132 +
 modules/LIMS/senaite/pages/dashboard.php      |  105 +
 modules/LIMS/senaite/pages/instrument.php     |  145 +
 modules/LIMS/senaite/pages/laboratory.php     |  126 +
 modules/LIMS/senaite/pages/lims.php           |   46 +
 modules/LIMS/senaite/pages/login.php          |   47 +
 modules/LIMS/senaite/pages/logout.php         |    7 +
 modules/LIMS/senaite/pages/method.php         |  169 +
 modules/LIMS/senaite/pages/procedure.php      |   81 +
 modules/LIMS/senaite/pages/resource.php       |   78 +
 modules/LIMS/senaite/pages/sample.php         |  259 +
 modules/LIMS/senaite/pages/site.php           |    7 +
 modules/LIMS/senaite/pages/worksheet.php      |  183 +
 .../LIMS/senaite/templates/base/footer.php    |   24 +
 .../LIMS/senaite/templates/base/header.php    |   57 +
 .../senaite/templates/pages/dashboard.php     |  163 +
 .../LIMS/senaite/templates/pages/login.php    |   59 +
 .../pages/site/analysis/categories.php        |   48 +
 .../pages/site/analysis/createcategories.php  |   68 +
 .../pages/site/analysis/createprofiles.php    |   66 +
 .../pages/site/analysis/createrequests.php    |  173 +
 .../pages/site/analysis/createservices.php    |  179 +
 .../pages/site/analysis/profiles.php          |   47 +
 .../templates/pages/site/analysis/request.php |   94 +
 .../pages/site/analysis/requests.php          |   93 +
 .../pages/site/analysis/services.php          |   85 +
 .../templates/pages/site/clients/clients.php  |   38 +
 .../pages/site/clients/createclient.php       |  250 +
 .../pages/site/clients/createcontacts.php     |   81 +
 .../site/instruments/createinstrument.php     |  174 +
 .../pages/site/instruments/createlocation.php |   38 +
 .../pages/site/instruments/createtype.php     |   38 +
 .../pages/site/instruments/instruments.php    |   53 +
 .../pages/site/instruments/locations.php      |   37 +
 .../pages/site/instruments/types.php          |   37 +
 .../pages/site/laboratory/contacts.php        |   42 +
 .../pages/site/laboratory/createcontacts.php  |   88 +
 .../site/laboratory/createdepartments.php     |   36 +
 .../pages/site/laboratory/createproducts.php  |   59 +
 .../pages/site/laboratory/departments.php     |   40 +
 .../pages/site/laboratory/information.php     |   57 +
 .../pages/site/laboratory/products.php        |   43 +
 .../templates/pages/site/lims/index.php       |   33 +
 .../pages/site/methods/container.php          |   50 +
 .../pages/site/methods/containertype.php      |   38 +
 .../pages/site/methods/createcontainer.php    |   63 +
 .../site/methods/createcontainertype.php      |   40 +
 .../site/methods/createidentifiertype.php     |   39 +
 .../pages/site/methods/createmethod.php       |   68 +
 .../pages/site/methods/identifiertype.php     |   38 +
 .../templates/pages/site/methods/method.php   |   40 +
 .../templates/pages/site/procedures/list.php  |   48 +
 .../templates/pages/site/procedures/view.php  |   68 +
 .../site/resources/createmanufacturer.php     |   38 +
 .../pages/site/resources/createsupplier.php   |  267 +
 .../pages/site/resources/manufacturer.php     |   43 +
 .../pages/site/resources/supplier.php         |   49 +
 .../pages/site/samples/conditions.php         |   41 +
 .../pages/site/samples/createconditions.php   |   42 +
 .../pages/site/samples/creatematrices.php     |   42 +
 .../pages/site/samples/createpoints.php       |  155 +
 .../pages/site/samples/createtype.php         |  155 +
 .../templates/pages/site/samples/matrices.php |   41 +
 .../templates/pages/site/samples/points.php   |   67 +
 .../templates/pages/site/samples/types.php    |   82 +
 .../senaite/templates/pages/site/setup.php    |  141 +
 .../pages/site/worksheets/createtemplate.php  |  156 +
 .../site/worksheets/createworksheets.php      |  107 +
 .../pages/site/worksheets/templates.php       |   47 +
 .../pages/site/worksheets/worksheet.php       |  108 +
 .../pages/site/worksheets/worksheets.php      |   55 +
 sites/default/roles.json                      | 3665 +++++----
 sql/1_0_1-to-2_0_0_upgrade.sql                |   10 +
 sql/2_0_0-to-2_0_1_upgrade.sql                |   11 +
 sql/database.sql                              |   13 +
 224 files changed, 35594 insertions(+), 1636 deletions(-)
 create mode 100644 modules/LIMS/documentation/ISO_creation.md
 create mode 100644 modules/LIMS/documentation/Workflow.pdf
 create mode 100644 modules/LIMS/index.php
 create mode 100644 modules/LIMS/libraries/Guzzle/index.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/autoload.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/ClassLoader.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/LICENSE
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_classmap.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_files.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_namespaces.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_psr4.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_real.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/autoload_static.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/composer/installed.json
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/CHANGELOG.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/LICENSE
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/README.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/UPGRADING.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/composer.json
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Client.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/ClientInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/HandlerStack.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Middleware.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Pool.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RequestOptions.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/TransferStats.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/UriTemplate.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions_include.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/CHANGELOG.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/LICENSE
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/Makefile
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/README.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/composer.json
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/AggregateException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/CancellationException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Coroutine.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/EachPromise.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/FulfilledPromise.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Promise.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromiseInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromisorInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectedPromise.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectionException.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueue.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions_include.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/CHANGELOG.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/LICENSE
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/README.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/composer.json
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/AppendStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/BufferStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/CachingStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/DroppingStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/FnStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/InflateStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LazyOpenStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LimitStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MessageTrait.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MultipartStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/NoSeekStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/PumpStream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Request.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Response.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/ServerRequest.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Stream.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamWrapper.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UploadedFile.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Uri.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriNormalizer.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriResolver.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions_include.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/CHANGELOG.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/LICENSE
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/README.md
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/composer.json
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/MessageInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/RequestInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ResponseInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ServerRequestInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/StreamInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UploadedFileInterface.php
 create mode 100644 modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UriInterface.php
 create mode 100644 modules/LIMS/libraries/dependencies/functions.php
 create mode 100644 modules/LIMS/login.php
 create mode 100644 modules/LIMS/senaite/README.md
 create mode 100644 modules/LIMS/senaite/assets/config.json
 create mode 100644 modules/LIMS/senaite/assets/css/bootstrap-theme.css
 create mode 100644 modules/LIMS/senaite/assets/css/bootstrap-theme.min.css
 create mode 100644 modules/LIMS/senaite/assets/css/bootstrap.css
 create mode 100644 modules/LIMS/senaite/assets/css/bootstrap.min.css
 create mode 100644 modules/LIMS/senaite/assets/css/style.css
 create mode 100644 modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.eot
 create mode 100644 modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.svg
 create mode 100644 modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.ttf
 create mode 100644 modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff
 create mode 100644 modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff2
 create mode 100644 modules/LIMS/senaite/assets/img/category.jpeg
 create mode 100644 modules/LIMS/senaite/assets/img/client.png
 create mode 100644 modules/LIMS/senaite/assets/img/contact.png
 create mode 100644 modules/LIMS/senaite/assets/img/department.png
 create mode 100644 modules/LIMS/senaite/assets/img/identifier.png
 create mode 100644 modules/LIMS/senaite/assets/img/info.png
 create mode 100644 modules/LIMS/senaite/assets/img/instrument.png
 create mode 100644 modules/LIMS/senaite/assets/img/labproduct.png
 create mode 100644 modules/LIMS/senaite/assets/img/logo.png
 create mode 100644 modules/LIMS/senaite/assets/img/manufacturer.png
 create mode 100644 modules/LIMS/senaite/assets/img/method.png
 create mode 100644 modules/LIMS/senaite/assets/img/sample.jpg
 create mode 100644 modules/LIMS/senaite/assets/img/supplier.png
 create mode 100644 modules/LIMS/senaite/assets/img/worksheet.png
 create mode 100644 modules/LIMS/senaite/assets/js/bootstrap.min.js
 create mode 100644 modules/LIMS/senaite/classes/autoloader.php
 create mode 100644 modules/LIMS/senaite/classes/config.php
 create mode 100644 modules/LIMS/senaite/config.php
 create mode 100644 modules/LIMS/senaite/index.php
 create mode 100644 modules/LIMS/senaite/pages/analysis.php
 create mode 100644 modules/LIMS/senaite/pages/client.php
 create mode 100644 modules/LIMS/senaite/pages/dashboard.php
 create mode 100644 modules/LIMS/senaite/pages/instrument.php
 create mode 100644 modules/LIMS/senaite/pages/laboratory.php
 create mode 100644 modules/LIMS/senaite/pages/lims.php
 create mode 100644 modules/LIMS/senaite/pages/login.php
 create mode 100644 modules/LIMS/senaite/pages/logout.php
 create mode 100644 modules/LIMS/senaite/pages/method.php
 create mode 100644 modules/LIMS/senaite/pages/procedure.php
 create mode 100644 modules/LIMS/senaite/pages/resource.php
 create mode 100644 modules/LIMS/senaite/pages/sample.php
 create mode 100644 modules/LIMS/senaite/pages/site.php
 create mode 100644 modules/LIMS/senaite/pages/worksheet.php
 create mode 100644 modules/LIMS/senaite/templates/base/footer.php
 create mode 100644 modules/LIMS/senaite/templates/base/header.php
 create mode 100644 modules/LIMS/senaite/templates/pages/dashboard.php
 create mode 100644 modules/LIMS/senaite/templates/pages/login.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/categories.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/createcategories.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/createprofiles.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/createrequests.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/createservices.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/profiles.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/request.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/requests.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/analysis/services.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/clients/clients.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/clients/createclient.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/clients/createcontacts.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/createinstrument.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/createlocation.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/createtype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/instruments.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/locations.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/instruments/types.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/contacts.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/createcontacts.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/createdepartments.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/createproducts.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/departments.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/information.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/laboratory/products.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/lims/index.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/container.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/containertype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/createcontainer.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/createcontainertype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/createidentifiertype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/createmethod.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/identifiertype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/methods/method.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/procedures/list.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/procedures/view.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/resources/createmanufacturer.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/resources/createsupplier.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/resources/manufacturer.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/resources/supplier.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/conditions.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/createconditions.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/creatematrices.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/createpoints.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/createtype.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/matrices.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/points.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/samples/types.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/setup.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/worksheets/createtemplate.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/worksheets/createworksheets.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/worksheets/templates.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/worksheets/worksheet.php
 create mode 100644 modules/LIMS/senaite/templates/pages/site/worksheets/worksheets.php

diff --git a/interface/orders/types_edit.php b/interface/orders/types_edit.php
index 6c8f49fe6..777d2fb05 100644
--- a/interface/orders/types_edit.php
+++ b/interface/orders/types_edit.php
@@ -175,10 +175,10 @@ function closeModal() {
   if (($_POST['form_name'] === '') || ($_POST['form_description'] === '') || ($_POST['form_seq'] === '') || ($_POST['form_procedure_type'] === '')) {
     $errors[] = 'Please fill in all the fields';
   }
-
+  var_dump($_POST['form_procedure_type']);
   switch($_POST['form_procedure_type']) {
     case 'ord':
-      if (($_POST['form_lab_id'] === '') || ($_POST['form_procedure_code'] === '') || ($_POST['form_standard_code']) || ($_POST['form_body_site'] )
+      if ( ($_POST['form_lab_id'] === '') || ($_POST['form_procedure_code'] === '') || ($_POST['form_standard_code'] === '') || ($_POST['form_body_site'] === '')
            || ($_POST['form_specimen'] === '') || ($_POST['route_admin'] === '') || ($_POST['form_laterality'] === '')) {
             if(count($errors) <= 0) {
               $errors[] = 'Please fill in all the fields';
diff --git a/library/globals.inc.php b/library/globals.inc.php
index 8c447d012..bef71cbb3 100755
--- a/library/globals.inc.php
+++ b/library/globals.inc.php
@@ -154,6 +154,9 @@
                                'cms_top_margin_default',
                                'cms_left_margin_default');
 
+
+
+
 $GLOBALS_METADATA = array(
 
   // Appearance Tab
@@ -3275,8 +3278,29 @@
     ),
   ),
 
+  'LIMS' => array( 
+    'lims_enabled' => array(
+      xl('LIMS Enabled/Disabled'),
+      'bool',
+      '0',
+      xl('Enable the laboratory information management system')
+    ),
+    'lims_application' => array(
+      xl('LIMS Software to use'),
+      [ 'SENAITE LIMS' => 'senaite' ], // temporary, figuring out how to create an associative array while auto-detecting directories
+      xl('Choose the LIMS software to use')
+    ),
+    'lims_url' => array(
+      xl('LIMS API Address'),
+      'text',
+      'http://localhost:8080',
+      xl('Address where the LIMS backend API is available')
+    ),
+  ),
+
 );
 
+
 if ( function_exists( 'do_action' ) ) {
     do_action( 'globals_init', $args = [
         'global_metadata' => $GLOBALS_METADATA,
diff --git a/modules/LIMS/documentation/ISO_creation.md b/modules/LIMS/documentation/ISO_creation.md
new file mode 100644
index 000000000..6884dcdee
--- /dev/null
+++ b/modules/LIMS/documentation/ISO_creation.md
@@ -0,0 +1,89 @@
+# DevDocs
+
+## ISO Creation
+
+To create an ISO containing the installation of Ubuntu along with Senaite and Senaite's JSON API, you can follow the following steps:
+
+### Windows Users
+
+You will have to create a VM containing a vanilla Ubuntu installation. You can find the ISO of Ubuntu 16.04 LTS [here](https://www.ubuntu.com/download/alternative-downloads). 
+
+Pick the one that suits your OS.
+
+(Instructions for Linux are the same from this point onwards) 
+
+Once you've created a VM containing the OS, you will need to download Cubic using the following commands:
+
+```
+sudo apt-add-repository ppa:cubic-wizard/release
+
+sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6494C6D6997C215E
+
+sudo apt update
+
+sudo apt install cubic 
+
+```
+
+Once cubic is installed, open the application. It requires you to have an ubuntu ISO within the VM to access, so download the same from the link previously given. 
+
+Next, open the Cubic application. Select a folder where you want the ISO to be created in (project directory, can be anything you want). In the ISO selection screen, click "Select" in the "Original ISO" section and navigate to the Ubuntu ISO that you downloaded.
+Click next, and give it some time to load the ISO in.
+
+In the next few steps, you will come across a terminal. In that, follow the steps provided in the README file of senaite (installation steps for Senaite). Once done, proceed with the installation and the ISO file will be generated. Anyone who uses this ISO will have all the features that you put in through the terminal set up for them.
+
+
+## Guzzle
+
+[Guzzle](http://guzzlephp.org) is used as the cURL library in this application. Following are the base configurations that have been applied to the library to make it easy to use.
+
+Base URL: This is retrieved from the database and is kept as a user-configurable URL which is prepended to every request that is sent to the API (eg. http://localhost:8080/senaite/@@API/senaite/v1/).
+
+Sessions: Since multiple users need to be able to log in to the system, we cannot use Basic Authentication headers. So, we're using cookie jars provided by Guzzle. In particular, we're using a Session jar. This jar stores all the cookies that we need for the particular session and is then destroyed after the user logs out. Once the user logs in, the Senaite API sends a __ac cookie which we need to send with every request thereafter to show authentication.
+
+
+## Pages, Routing and Templates
+
+The application follows a fairly simple routing system.
+
+The "action" GET variable decides the main page while the "sact" GET variable decides the sub-page.
+
+For example, if you're looking to create an instrument, the url would be index.php?action=instrument&sact=createinstrument
+
+The main pages are stored in the pages/ directory with the name of the PHP file being the name of the value in the "action" GET variable. The sub-pages are defined inside the PHP code.
+
+The templates for each page can be found in the templates/site/ folder,with the names of the folders also being the same as the name of the page and the sub-actions having a separate PHP file for each of them.
+
+## Senaite API
+
+The Senaite API follows a simple route format. The base URL is: 
+http://hostname/senaite/@@API/senaite/v1/
+
+The default port the API runs on is 8080.
+
+### GET requests
+
+A simple GET request to retrieve data from the LIMS would work like the following:
+
+If you're trying to retrieve the instruments currently saved, a GET request needs to be sent to the URL:
+http://hostname/senaite/@@API/senaite/v1/instrument
+and it'll return a JSON response with the list of instruments.
+
+### POST requests
+
+Creating or updating data requires a POST request. The request can be sent to the same URL as the GET request with data and it will create the relevant entry in the database.
+
+Native documentation can also be found at http://plonejsonapiroutes.readthedocs.io/en/latest/crud.html
+
+### Additional Notes
+
+Some entries such as Instruments and Analysis Requests have prerequisites or dependencies on other data. For example, while creating an Instrument, you need to supply an Instrument Type, Manufacturer and Supplier. While trying to create data like this, instead of using the form_params (which translates to form-data) parameter in Guzzle, data needs to be sent as JSON with the "UID" of the prerequisite sent in the relevant field.
+
+For example, while creating an instrument, the following fields would properly work for the prerequisite data: 
+```
+{
+  'InstrumentType': 'UIDHere',
+  'Supplier': 'UIDHere',
+  'Manufacturer': 'UIDHere'
+}
+```
\ No newline at end of file
diff --git a/modules/LIMS/documentation/Workflow.pdf b/modules/LIMS/documentation/Workflow.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..77ed119636485229008985ae2057ac64ca8efd91
GIT binary patch
literal 24897
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
ZI6Nn3Lr3R--&1xFCkXg~hDKZg@;{n)!leKJ

literal 0
HcmV?d00001

diff --git a/modules/LIMS/index.php b/modules/LIMS/index.php
new file mode 100644
index 000000000..551c45cf8
--- /dev/null
+++ b/modules/LIMS/index.php
@@ -0,0 +1,30 @@
+<?php
+
+// list of LIMS and their respective directories
+
+$lims_available = [
+  'senaite',
+];
+
+// DB library to check whether LIMS is enabled or not
+include_once("../../library/sql.inc");
+
+$checkEnableQuery = sqlStatement("SELECT * from globals WHERE gl_name = 'lims_enabled'");
+$enabled = sqlFetchArray($checkEnableQuery)['gl_value'];
+if ($enabled != 1) {
+  die('LIMS is not enabled. Please enable it through the global configuration menu');
+} else {
+  $lims = isset ($_GET['lims'] ) ? $_GET['lims'] : null;
+
+  if ($lims) {
+    if (in_array($lims, $lims_available)) {
+      $urlPrepend = $lims;
+      $action = isset($_GET['action']) ? $_GET['action'] : 'index';
+      header('location: '. $lims.'/index.php?action='.$action);
+    } else {
+      die('LIMS not found!');
+    }
+  } else {
+    die("LIMS not specified");
+  }
+}
diff --git a/modules/LIMS/libraries/Guzzle/index.php b/modules/LIMS/libraries/Guzzle/index.php
new file mode 100644
index 000000000..8717eee44
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/index.php
@@ -0,0 +1,4 @@
+<?php 
+require_once('vendor/autoload.php'); 
+
+/* Start to develop here. Best regards https://php-download.com/ */
\ No newline at end of file
diff --git a/modules/LIMS/libraries/Guzzle/vendor/autoload.php b/modules/LIMS/libraries/Guzzle/vendor/autoload.php
new file mode 100644
index 000000000..59fc23434
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInit64d0842d541f9ccab0bda8e11b1c8b50::getLoader();
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/ClassLoader.php b/modules/LIMS/libraries/Guzzle/vendor/composer/ClassLoader.php
new file mode 100644
index 000000000..2c72175e7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/ClassLoader.php
@@ -0,0 +1,445 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    http://www.php-fig.org/psr/psr-0/
+ * @see    http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    // PSR-4
+    private $prefixLengthsPsr4 = array();
+    private $prefixDirsPsr4 = array();
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    private $prefixesPsr0 = array();
+    private $fallbackDirsPsr0 = array();
+
+    private $useIncludePath = false;
+    private $classMap = array();
+    private $classMapAuthoritative = false;
+    private $missingClasses = array();
+    private $apcuPrefix;
+
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', $this->prefixesPsr0);
+        }
+
+        return array();
+    }
+
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return bool|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath.'\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        $length = $this->prefixLengthsPsr4[$first][$search];
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+    include $file;
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/LICENSE b/modules/LIMS/libraries/Guzzle/vendor/composer/LICENSE
new file mode 100644
index 000000000..f27399a04
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+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.
+
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_classmap.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_files.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_files.php
new file mode 100644
index 000000000..5a823eee2
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_files.php
@@ -0,0 +1,12 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
+    'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
+    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+);
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_namespaces.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..b7fc0125d
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_psr4.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_psr4.php
new file mode 100644
index 000000000..3c4508cb8
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_psr4.php
@@ -0,0 +1,13 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
+    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
+    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
+);
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_real.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..b0448d635
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_real.php
@@ -0,0 +1,70 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit64d0842d541f9ccab0bda8e11b1c8b50
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInit64d0842d541f9ccab0bda8e11b1c8b50', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInit64d0842d541f9ccab0bda8e11b1c8b50', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require_once __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInit64d0842d541f9ccab0bda8e11b1c8b50::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        if ($useStaticLoader) {
+            $includeFiles = Composer\Autoload\ComposerStaticInit64d0842d541f9ccab0bda8e11b1c8b50::$files;
+        } else {
+            $includeFiles = require __DIR__ . '/autoload_files.php';
+        }
+        foreach ($includeFiles as $fileIdentifier => $file) {
+            composerRequire64d0842d541f9ccab0bda8e11b1c8b50($fileIdentifier, $file);
+        }
+
+        return $loader;
+    }
+}
+
+function composerRequire64d0842d541f9ccab0bda8e11b1c8b50($fileIdentifier, $file)
+{
+    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+        require $file;
+
+        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_static.php b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_static.php
new file mode 100644
index 000000000..ee70a8641
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/autoload_static.php
@@ -0,0 +1,55 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInit64d0842d541f9ccab0bda8e11b1c8b50
+{
+    public static $files = array (
+        'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
+        'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
+        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
+    );
+
+    public static $prefixLengthsPsr4 = array (
+        'P' => 
+        array (
+            'Psr\\Http\\Message\\' => 17,
+        ),
+        'G' => 
+        array (
+            'GuzzleHttp\\Psr7\\' => 16,
+            'GuzzleHttp\\Promise\\' => 19,
+            'GuzzleHttp\\' => 11,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Psr\\Http\\Message\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/http-message/src',
+        ),
+        'GuzzleHttp\\Psr7\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
+        ),
+        'GuzzleHttp\\Promise\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
+        ),
+        'GuzzleHttp\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
+        ),
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInit64d0842d541f9ccab0bda8e11b1c8b50::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit64d0842d541f9ccab0bda8e11b1c8b50::$prefixDirsPsr4;
+
+        }, null, ClassLoader::class);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/composer/installed.json b/modules/LIMS/libraries/Guzzle/vendor/composer/installed.json
new file mode 100644
index 000000000..a1f281506
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/composer/installed.json
@@ -0,0 +1,241 @@
+[
+    {
+        "name": "psr/http-message",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/http-message.git",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-08-06T14:39:51+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Http\\Message\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interface for HTTP messages",
+        "homepage": "https://github.com/php-fig/http-message",
+        "keywords": [
+            "http",
+            "http-message",
+            "psr",
+            "psr-7",
+            "request",
+            "response"
+        ]
+    },
+    {
+        "name": "guzzlehttp/psr7",
+        "version": "1.4.2",
+        "version_normalized": "1.4.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/psr7.git",
+            "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+            "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.4.0",
+            "psr/http-message": "~1.0"
+        },
+        "provide": {
+            "psr/http-message-implementation": "1.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "~4.0"
+        },
+        "time": "2017-03-20T17:10:46+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\Psr7\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            },
+            {
+                "name": "Tobias Schultze",
+                "homepage": "https://github.com/Tobion"
+            }
+        ],
+        "description": "PSR-7 message implementation that also provides common utility methods",
+        "keywords": [
+            "http",
+            "message",
+            "request",
+            "response",
+            "stream",
+            "uri",
+            "url"
+        ]
+    },
+    {
+        "name": "guzzlehttp/promises",
+        "version": "v1.3.1",
+        "version_normalized": "1.3.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/promises.git",
+            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.5.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.0"
+        },
+        "time": "2016-12-20T10:07:11+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\Promise\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle promises library",
+        "keywords": [
+            "promise"
+        ]
+    },
+    {
+        "name": "guzzlehttp/guzzle",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/guzzle.git",
+            "reference": "dfd01d60a38cf7e16b3456d4b1d7c10033b929c0"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/dfd01d60a38cf7e16b3456d4b1d7c10033b929c0",
+            "reference": "dfd01d60a38cf7e16b3456d4b1d7c10033b929c0",
+            "shasum": ""
+        },
+        "require": {
+            "guzzlehttp/promises": "^1.0",
+            "guzzlehttp/psr7": "^1.4",
+            "php": ">=5.5"
+        },
+        "require-dev": {
+            "ext-curl": "*",
+            "phpunit/phpunit": "^4.0 || ^5.0",
+            "psr/log": "^1.0"
+        },
+        "suggest": {
+            "psr/log": "Required for using the Log middleware"
+        },
+        "time": "2017-06-28T21:17:38+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "6.2-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "src/functions_include.php"
+            ],
+            "psr-4": {
+                "GuzzleHttp\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle is a PHP HTTP client library",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "client",
+            "curl",
+            "framework",
+            "http",
+            "http client",
+            "rest",
+            "web service"
+        ]
+    }
+]
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/CHANGELOG.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/CHANGELOG.md
new file mode 100644
index 000000000..b265cbcd1
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/CHANGELOG.md
@@ -0,0 +1,1264 @@
+# CHANGELOG
+
+## 6.3.0 - 2017-06-22
+
+* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659)
+* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621)
+* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580)
+* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609)
+* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641)
+* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611)
+* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811)
+* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642)
+* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569)
+* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711)
+* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745)
+* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721)
+* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318)
+* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)
+* Improvement:  	Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)
+
+
++ Minor code cleanups, documentation fixes and clarifications.
+
+## 6.2.3 - 2017-02-28
+
+* Fix deprecations with guzzle/psr7 version 1.4
+
+## 6.2.2 - 2016-10-08
+
+* Allow to pass nullable Response to delay callable
+* Only add scheme when host is present
+* Fix drain case where content-length is the literal string zero
+* Obfuscate in-URL credentials in exceptions
+
+## 6.2.1 - 2016-07-18
+
+* Address HTTP_PROXY security vulnerability, CVE-2016-5385:
+  https://httpoxy.org/
+* Fixing timeout bug with StreamHandler:
+  https://github.com/guzzle/guzzle/pull/1488
+* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when
+  a server does not honor `Connection: close`.
+* Ignore URI fragment when sending requests.
+
+## 6.2.0 - 2016-03-21
+
+* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`.
+  https://github.com/guzzle/guzzle/pull/1389
+* Bug fix: Fix sleep calculation when waiting for delayed requests.
+  https://github.com/guzzle/guzzle/pull/1324
+* Feature: More flexible history containers.
+  https://github.com/guzzle/guzzle/pull/1373
+* Bug fix: defer sink stream opening in StreamHandler.
+  https://github.com/guzzle/guzzle/pull/1377
+* Bug fix: do not attempt to escape cookie values.
+  https://github.com/guzzle/guzzle/pull/1406
+* Feature: report original content encoding and length on decoded responses.
+  https://github.com/guzzle/guzzle/pull/1409
+* Bug fix: rewind seekable request bodies before dispatching to cURL.
+  https://github.com/guzzle/guzzle/pull/1422
+* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.
+  https://github.com/guzzle/guzzle/pull/1367
+
+## 6.1.1 - 2015-11-22
+
+* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler
+  https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4
+* Feature: HandlerStack is now more generic.
+  https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e
+* Bug fix: setting verify to false in the StreamHandler now disables peer
+  verification. https://github.com/guzzle/guzzle/issues/1256
+* Feature: Middleware now uses an exception factory, including more error
+  context. https://github.com/guzzle/guzzle/pull/1282
+* Feature: better support for disabled functions.
+  https://github.com/guzzle/guzzle/pull/1287
+* Bug fix: fixed regression where MockHandler was not using `sink`.
+  https://github.com/guzzle/guzzle/pull/1292
+
+## 6.1.0 - 2015-09-08
+
+* Feature: Added the `on_stats` request option to provide access to transfer
+  statistics for requests. https://github.com/guzzle/guzzle/pull/1202
+* Feature: Added the ability to persist session cookies in CookieJars.
+  https://github.com/guzzle/guzzle/pull/1195
+* Feature: Some compatibility updates for Google APP Engine
+  https://github.com/guzzle/guzzle/pull/1216
+* Feature: Added support for NO_PROXY to prevent the use of a proxy based on
+  a simple set of rules. https://github.com/guzzle/guzzle/pull/1197
+* Feature: Cookies can now contain square brackets.
+  https://github.com/guzzle/guzzle/pull/1237
+* Bug fix: Now correctly parsing `=` inside of quotes in Cookies.
+  https://github.com/guzzle/guzzle/pull/1232
+* Bug fix: Cusotm cURL options now correctly override curl options of the
+  same name. https://github.com/guzzle/guzzle/pull/1221
+* Bug fix: Content-Type header is now added when using an explicitly provided
+  multipart body. https://github.com/guzzle/guzzle/pull/1218
+* Bug fix: Now ignoring Set-Cookie headers that have no name.
+* Bug fix: Reason phrase is no longer cast to an int in some cases in the
+  cURL handler. https://github.com/guzzle/guzzle/pull/1187
+* Bug fix: Remove the Authorization header when redirecting if the Host
+  header changes. https://github.com/guzzle/guzzle/pull/1207
+* Bug fix: Cookie path matching fixes
+  https://github.com/guzzle/guzzle/issues/1129
+* Bug fix: Fixing the cURL `body_as_string` setting
+  https://github.com/guzzle/guzzle/pull/1201
+* Bug fix: quotes are no longer stripped when parsing cookies.
+  https://github.com/guzzle/guzzle/issues/1172
+* Bug fix: `form_params` and `query` now always uses the `&` separator.
+  https://github.com/guzzle/guzzle/pull/1163
+* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.
+  https://github.com/guzzle/guzzle/pull/1189
+
+## 6.0.2 - 2015-07-04
+
+* Fixed a memory leak in the curl handlers in which references to callbacks
+  were not being removed by `curl_reset`.
+* Cookies are now extracted properly before redirects.
+* Cookies now allow more character ranges.
+* Decoded Content-Encoding responses are now modified to correctly reflect
+  their state if the encoding was automatically removed by a handler. This
+  means that the `Content-Encoding` header may be removed an the
+  `Content-Length` modified to reflect the message size after removing the
+  encoding.
+* Added a more explicit error message when trying to use `form_params` and
+  `multipart` in the same request.
+* Several fixes for HHVM support.
+* Functions are now conditionally required using an additional level of
+  indirection to help with global Composer installations.
+
+## 6.0.1 - 2015-05-27
+
+* Fixed a bug with serializing the `query` request option where the `&`
+  separator was missing.
+* Added a better error message for when `body` is provided as an array. Please
+  use `form_params` or `multipart` instead.
+* Various doc fixes.
+
+## 6.0.0 - 2015-05-26
+
+* See the UPGRADING.md document for more information.
+* Added `multipart` and `form_params` request options.
+* Added `synchronous` request option.
+* Added the `on_headers` request option.
+* Fixed `expect` handling.
+* No longer adding default middlewares in the client ctor. These need to be
+  present on the provided handler in order to work.
+* Requests are no longer initiated when sending async requests with the
+  CurlMultiHandler. This prevents unexpected recursion from requests completing
+  while ticking the cURL loop.
+* Removed the semantics of setting `default` to `true`. This is no longer
+  required now that the cURL loop is not ticked for async requests.
+* Added request and response logging middleware.
+* No longer allowing self signed certificates when using the StreamHandler.
+* Ensuring that `sink` is valid if saving to a file.
+* Request exceptions now include a "handler context" which provides handler
+  specific contextual information.
+* Added `GuzzleHttp\RequestOptions` to allow request options to be applied
+  using constants.
+* `$maxHandles` has been removed from CurlMultiHandler.
+* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.
+
+## 5.3.0 - 2015-05-19
+
+* Mock now supports `save_to`
+* Marked `AbstractRequestEvent::getTransaction()` as public.
+* Fixed a bug in which multiple headers using different casing would overwrite
+  previous headers in the associative array.
+* Added `Utils::getDefaultHandler()`
+* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated.
+* URL scheme is now always lowercased.
+
+## 6.0.0-beta.1
+
+* Requires PHP >= 5.5
+* Updated to use PSR-7
+  * Requires immutable messages, which basically means an event based system
+    owned by a request instance is no longer possible.
+  * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).
+  * Removed the dependency on `guzzlehttp/streams`. These stream abstractions
+    are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7`
+    namespace.
+* Added middleware and handler system
+  * Replaced the Guzzle event and subscriber system with a middleware system.
+  * No longer depends on RingPHP, but rather places the HTTP handlers directly
+    in Guzzle, operating on PSR-7 messages.
+  * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which
+    means the `guzzlehttp/retry-subscriber` is now obsolete.
+  * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`.
+* Asynchronous responses
+  * No longer supports the `future` request option to send an async request.
+    Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,
+    `getAsync`, etc.).
+  * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid
+    recursion required by chaining and forwarding react promises. See
+    https://github.com/guzzle/promises
+  * Added `requestAsync` and `sendAsync` to send request asynchronously.
+  * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests
+    asynchronously.
+* Request options
+  * POST and form updates
+    * Added the `form_fields` and `form_files` request options.
+    * Removed the `GuzzleHttp\Post` namespace.
+    * The `body` request option no longer accepts an array for POST requests.
+  * The `exceptions` request option has been deprecated in favor of the
+    `http_errors` request options.
+  * The `save_to` request option has been deprecated in favor of `sink` request
+    option.
+* Clients no longer accept an array of URI template string and variables for
+  URI variables. You will need to expand URI templates before passing them
+  into a client constructor or request method.
+* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are
+  now magic methods that will send synchronous requests.
+* Replaced `Utils.php` with plain functions in `functions.php`.
+* Removed `GuzzleHttp\Collection`.
+* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as
+  an array.
+* Removed `GuzzleHttp\Query`. Query string handling is now handled using an
+  associative array passed into the `query` request option. The query string
+  is serialized using PHP's `http_build_query`. If you need more control, you
+  can pass the query string in as a string.
+* `GuzzleHttp\QueryParser` has been replaced with the
+  `GuzzleHttp\Psr7\parse_query`.
+
+## 5.2.0 - 2015-01-27
+
+* Added `AppliesHeadersInterface` to make applying headers to a request based
+  on the body more generic and not specific to `PostBodyInterface`.
+* Reduced the number of stack frames needed to send requests.
+* Nested futures are now resolved in the client rather than the RequestFsm
+* Finishing state transitions is now handled in the RequestFsm rather than the
+  RingBridge.
+* Added a guard in the Pool class to not use recursion for request retries.
+
+## 5.1.0 - 2014-12-19
+
+* Pool class no longer uses recursion when a request is intercepted.
+* The size of a Pool can now be dynamically adjusted using a callback.
+  See https://github.com/guzzle/guzzle/pull/943.
+* Setting a request option to `null` when creating a request with a client will
+  ensure that the option is not set. This allows you to overwrite default
+  request options on a per-request basis.
+  See https://github.com/guzzle/guzzle/pull/937.
+* Added the ability to limit which protocols are allowed for redirects by
+  specifying a `protocols` array in the `allow_redirects` request option.
+* Nested futures due to retries are now resolved when waiting for synchronous
+  responses. See https://github.com/guzzle/guzzle/pull/947.
+* `"0"` is now an allowed URI path. See
+  https://github.com/guzzle/guzzle/pull/935.
+* `Query` no longer typehints on the `$query` argument in the constructor,
+  allowing for strings and arrays.
+* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
+  specific exceptions if necessary.
+
+## 5.0.3 - 2014-11-03
+
+This change updates query strings so that they are treated as un-encoded values
+by default where the value represents an un-encoded value to send over the
+wire. A Query object then encodes the value before sending over the wire. This
+means that even value query string values (e.g., ":") are url encoded. This
+makes the Query class match PHP's http_build_query function. However, if you
+want to send requests over the wire using valid query string characters that do
+not need to be encoded, then you can provide a string to Url::setQuery() and
+pass true as the second argument to specify that the query string is a raw
+string that should not be parsed or encoded (unless a call to getQuery() is
+subsequently made, forcing the query-string to be converted into a Query
+object).
+
+## 5.0.2 - 2014-10-30
+
+* Added a trailing `\r\n` to multipart/form-data payloads. See
+  https://github.com/guzzle/guzzle/pull/871
+* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs.
+* Status codes are now returned as integers. See
+  https://github.com/guzzle/guzzle/issues/881
+* No longer overwriting an existing `application/x-www-form-urlencoded` header
+  when sending POST requests, allowing for customized headers. See
+  https://github.com/guzzle/guzzle/issues/877
+* Improved path URL serialization.
+
+  * No longer double percent-encoding characters in the path or query string if
+    they are already encoded.
+  * Now properly encoding the supplied path to a URL object, instead of only
+    encoding ' ' and '?'.
+  * Note: This has been changed in 5.0.3 to now encode query string values by
+    default unless the `rawString` argument is provided when setting the query
+    string on a URL: Now allowing many more characters to be present in the
+    query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A
+
+## 5.0.1 - 2014-10-16
+
+Bugfix release.
+
+* Fixed an issue where connection errors still returned response object in
+  error and end events event though the response is unusable. This has been
+  corrected so that a response is not returned in the `getResponse` method of
+  these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867
+* Fixed an issue where transfer statistics were not being populated in the
+  RingBridge. https://github.com/guzzle/guzzle/issues/866
+
+## 5.0.0 - 2014-10-12
+
+Adding support for non-blocking responses and some minor API cleanup.
+
+### New Features
+
+* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.
+* Added a public API for creating a default HTTP adapter.
+* Updated the redirect plugin to be non-blocking so that redirects are sent
+  concurrently. Other plugins like this can now be updated to be non-blocking.
+* Added a "progress" event so that you can get upload and download progress
+  events.
+* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers
+  requests concurrently using a capped pool size as efficiently as possible.
+* Added `hasListeners()` to EmitterInterface.
+* Removed `GuzzleHttp\ClientInterface::sendAll` and marked
+  `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the
+  recommended way).
+
+### Breaking changes
+
+The breaking changes in this release are relatively minor. The biggest thing to
+look out for is that request and response objects no longer implement fluent
+interfaces.
+
+* Removed the fluent interfaces (i.e., `return $this`) from requests,
+  responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`,
+  `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and
+  `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of
+  why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/.
+  This also makes the Guzzle message interfaces compatible with the current
+  PSR-7 message proposal.
+* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except
+  for the HTTP request functions from function.php, these functions are now
+  implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode`
+  moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to
+  `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to
+  `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be
+  `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php
+  caused problems for many users: they aren't PSR-4 compliant, require an
+  explicit include, and needed an if-guard to ensure that the functions are not
+  declared multiple times.
+* Rewrote adapter layer.
+    * Removing all classes from `GuzzleHttp\Adapter`, these are now
+      implemented as callables that are stored in `GuzzleHttp\Ring\Client`.
+    * Removed the concept of "parallel adapters". Sending requests serially or
+      concurrently is now handled using a single adapter.
+    * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The
+      Transaction object now exposes the request, response, and client as public
+      properties. The getters and setters have been removed.
+* Removed the "headers" event. This event was only useful for changing the
+  body a response once the headers of the response were known. You can implement
+  a similar behavior in a number of ways. One example might be to use a
+  FnStream that has access to the transaction being sent. For example, when the
+  first byte is written, you could check if the response headers match your
+  expectations, and if so, change the actual stream body that is being
+  written to.
+* Removed the `asArray` parameter from
+  `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
+  value as an array, then use the newly added `getHeaderAsArray()` method of
+  `MessageInterface`. This change makes the Guzzle interfaces compatible with
+  the PSR-7 interfaces.
+* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add
+  custom request options using double-dispatch (this was an implementation
+  detail). Instead, you should now provide an associative array to the
+  constructor which is a mapping of the request option name mapping to a
+  function that applies the option value to a request.
+* Removed the concept of "throwImmediately" from exceptions and error events.
+  This control mechanism was used to stop a transfer of concurrent requests
+  from completing. This can now be handled by throwing the exception or by
+  cancelling a pool of requests or each outstanding future request individually.
+* Updated to "GuzzleHttp\Streams" 3.0.
+    * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a
+      `maxLen` parameter. This update makes the Guzzle streams project
+      compatible with the current PSR-7 proposal.
+    * `GuzzleHttp\Stream\Stream::__construct`,
+      `GuzzleHttp\Stream\Stream::factory`, and
+      `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second
+      argument. They now accept an associative array of options, including the
+      "size" key and "metadata" key which can be used to provide custom metadata.
+
+## 4.2.2 - 2014-09-08
+
+* Fixed a memory leak in the CurlAdapter when reusing cURL handles.
+* No longer using `request_fulluri` in stream adapter proxies.
+* Relative redirects are now based on the last response, not the first response.
+
+## 4.2.1 - 2014-08-19
+
+* Ensuring that the StreamAdapter does not always add a Content-Type header
+* Adding automated github releases with a phar and zip
+
+## 4.2.0 - 2014-08-17
+
+* Now merging in default options using a case-insensitive comparison.
+  Closes https://github.com/guzzle/guzzle/issues/767
+* Added the ability to automatically decode `Content-Encoding` response bodies
+  using the `decode_content` request option. This is set to `true` by default
+  to decode the response body if it comes over the wire with a
+  `Content-Encoding`. Set this value to `false` to disable decoding the
+  response content, and pass a string to provide a request `Accept-Encoding`
+  header and turn on automatic response decoding. This feature now allows you
+  to pass an `Accept-Encoding` header in the headers of a request but still
+  disable automatic response decoding.
+  Closes https://github.com/guzzle/guzzle/issues/764
+* Added the ability to throw an exception immediately when transferring
+  requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760
+* Updating guzzlehttp/streams dependency to ~2.1
+* No longer utilizing the now deprecated namespaced methods from the stream
+  package.
+
+## 4.1.8 - 2014-08-14
+
+* Fixed an issue in the CurlFactory that caused setting the `stream=false`
+  request option to throw an exception.
+  See: https://github.com/guzzle/guzzle/issues/769
+* TransactionIterator now calls rewind on the inner iterator.
+  See: https://github.com/guzzle/guzzle/pull/765
+* You can now set the `Content-Type` header to `multipart/form-data`
+  when creating POST requests to force multipart bodies.
+  See https://github.com/guzzle/guzzle/issues/768
+
+## 4.1.7 - 2014-08-07
+
+* Fixed an error in the HistoryPlugin that caused the same request and response
+  to be logged multiple times when an HTTP protocol error occurs.
+* Ensuring that cURL does not add a default Content-Type when no Content-Type
+  has been supplied by the user. This prevents the adapter layer from modifying
+  the request that is sent over the wire after any listeners may have already
+  put the request in a desired state (e.g., signed the request).
+* Throwing an exception when you attempt to send requests that have the
+  "stream" set to true in parallel using the MultiAdapter.
+* Only calling curl_multi_select when there are active cURL handles. This was
+  previously changed and caused performance problems on some systems due to PHP
+  always selecting until the maximum select timeout.
+* Fixed a bug where multipart/form-data POST fields were not correctly
+  aggregated (e.g., values with "&").
+
+## 4.1.6 - 2014-08-03
+
+* Added helper methods to make it easier to represent messages as strings,
+  including getting the start line and getting headers as a string.
+
+## 4.1.5 - 2014-08-02
+
+* Automatically retrying cURL "Connection died, retrying a fresh connect"
+  errors when possible.
+* cURL implementation cleanup
+* Allowing multiple event subscriber listeners to be registered per event by
+  passing an array of arrays of listener configuration.
+
+## 4.1.4 - 2014-07-22
+
+* Fixed a bug that caused multi-part POST requests with more than one field to
+  serialize incorrectly.
+* Paths can now be set to "0"
+* `ResponseInterface::xml` now accepts a `libxml_options` option and added a
+  missing default argument that was required when parsing XML response bodies.
+* A `save_to` stream is now created lazily, which means that files are not
+  created on disk unless a request succeeds.
+
+## 4.1.3 - 2014-07-15
+
+* Various fixes to multipart/form-data POST uploads
+* Wrapping function.php in an if-statement to ensure Guzzle can be used
+  globally and in a Composer install
+* Fixed an issue with generating and merging in events to an event array
+* POST headers are only applied before sending a request to allow you to change
+  the query aggregator used before uploading
+* Added much more robust query string parsing
+* Fixed various parsing and normalization issues with URLs
+* Fixing an issue where multi-valued headers were not being utilized correctly
+  in the StreamAdapter
+
+## 4.1.2 - 2014-06-18
+
+* Added support for sending payloads with GET requests
+
+## 4.1.1 - 2014-06-08
+
+* Fixed an issue related to using custom message factory options in subclasses
+* Fixed an issue with nested form fields in a multi-part POST
+* Fixed an issue with using the `json` request option for POST requests
+* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar`
+
+## 4.1.0 - 2014-05-27
+
+* Added a `json` request option to easily serialize JSON payloads.
+* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON.
+* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`.
+* Added the ability to provide an emitter to a client in the client constructor.
+* Added the ability to persist a cookie session using $_SESSION.
+* Added a trait that can be used to add event listeners to an iterator.
+* Removed request method constants from RequestInterface.
+* Fixed warning when invalid request start-lines are received.
+* Updated MessageFactory to work with custom request option methods.
+* Updated cacert bundle to latest build.
+
+4.0.2 (2014-04-16)
+------------------
+
+* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)
+* Added the ability to set scalars as POST fields (#628)
+
+## 4.0.1 - 2014-04-04
+
+* The HTTP status code of a response is now set as the exception code of
+  RequestException objects.
+* 303 redirects will now correctly switch from POST to GET requests.
+* The default parallel adapter of a client now correctly uses the MultiAdapter.
+* HasDataTrait now initializes the internal data array as an empty array so
+  that the toArray() method always returns an array.
+
+## 4.0.0 - 2014-03-29
+
+* For more information on the 4.0 transition, see:
+  http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/
+* For information on changes and upgrading, see:
+  https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
+* Added `GuzzleHttp\batch()` as a convenience function for sending requests in
+  parallel without needing to write asynchronous code.
+* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`.
+  You can now pass a callable or an array of associative arrays where each
+  associative array contains the "fn", "priority", and "once" keys.
+
+## 4.0.0.rc-2 - 2014-03-25
+
+* Removed `getConfig()` and `setConfig()` from clients to avoid confusion
+  around whether things like base_url, message_factory, etc. should be able to
+  be retrieved or modified.
+* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface
+* functions.php functions were renamed using snake_case to match PHP idioms
+* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and
+  `GUZZLE_CURL_SELECT_TIMEOUT` environment variables
+* Added the ability to specify custom `sendAll()` event priorities
+* Added the ability to specify custom stream context options to the stream
+  adapter.
+* Added a functions.php function for `get_path()` and `set_path()`
+* CurlAdapter and MultiAdapter now use a callable to generate curl resources
+* MockAdapter now properly reads a body and emits a `headers` event
+* Updated Url class to check if a scheme and host are set before adding ":"
+  and "//". This allows empty Url (e.g., "") to be serialized as "".
+* Parsing invalid XML no longer emits warnings
+* Curl classes now properly throw AdapterExceptions
+* Various performance optimizations
+* Streams are created with the faster `Stream\create()` function
+* Marked deprecation_proxy() as internal
+* Test server is now a collection of static methods on a class
+
+## 4.0.0-rc.1 - 2014-03-15
+
+* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
+
+## 3.8.1 - 2014-01-28
+
+* Bug: Always using GET requests when redirecting from a 303 response
+* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in
+  `Guzzle\Http\ClientInterface::setSslVerification()`
+* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL
+* Bug: The body of a request can now be set to `"0"`
+* Sending PHP stream requests no longer forces `HTTP/1.0`
+* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of
+  each sub-exception
+* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than
+  clobbering everything).
+* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)
+* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.
+  For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.
+* Now properly escaping the regular expression delimiter when matching Cookie domains.
+* Network access is now disabled when loading XML documents
+
+## 3.8.0 - 2013-12-05
+
+* Added the ability to define a POST name for a file
+* JSON response parsing now properly walks additionalProperties
+* cURL error code 18 is now retried automatically in the BackoffPlugin
+* Fixed a cURL error when URLs contain fragments
+* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were
+  CurlExceptions
+* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)
+* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`
+* Fixed a bug that was encountered when parsing empty header parameters
+* UriTemplate now has a `setRegex()` method to match the docs
+* The `debug` request parameter now checks if it is truthy rather than if it exists
+* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin
+* Added the ability to combine URLs using strict RFC 3986 compliance
+* Command objects can now return the validation errors encountered by the command
+* Various fixes to cache revalidation (#437 and 29797e5)
+* Various fixes to the AsyncPlugin
+* Cleaned up build scripts
+
+## 3.7.4 - 2013-10-02
+
+* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)
+* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp
+  (see https://github.com/aws/aws-sdk-php/issues/147)
+* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots
+* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)
+* Updated the bundled cacert.pem (#419)
+* OauthPlugin now supports adding authentication to headers or query string (#425)
+
+## 3.7.3 - 2013-09-08
+
+* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and
+  `CommandTransferException`.
+* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description
+* Schemas are only injected into response models when explicitly configured.
+* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of
+  an EntityBody.
+* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator.
+* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`.
+* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()
+* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin
+* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests
+* Bug fix: Properly parsing headers that contain commas contained in quotes
+* Bug fix: mimetype guessing based on a filename is now case-insensitive
+
+## 3.7.2 - 2013-08-02
+
+* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander
+  See https://github.com/guzzle/guzzle/issues/371
+* Bug fix: Cookie domains are now matched correctly according to RFC 6265
+  See https://github.com/guzzle/guzzle/issues/377
+* Bug fix: GET parameters are now used when calculating an OAuth signature
+* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted
+* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched
+* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.
+  See https://github.com/guzzle/guzzle/issues/379
+* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See
+  https://github.com/guzzle/guzzle/pull/380
+* cURL multi cleanup and optimizations
+
+## 3.7.1 - 2013-07-05
+
+* Bug fix: Setting default options on a client now works
+* Bug fix: Setting options on HEAD requests now works. See #352
+* Bug fix: Moving stream factory before send event to before building the stream. See #353
+* Bug fix: Cookies no longer match on IP addresses per RFC 6265
+* Bug fix: Correctly parsing header parameters that are in `<>` and quotes
+* Added `cert` and `ssl_key` as request options
+* `Host` header can now diverge from the host part of a URL if the header is set manually
+* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter
+* OAuth parameters are only added via the plugin if they aren't already set
+* Exceptions are now thrown when a URL cannot be parsed
+* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails
+* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin
+
+## 3.7.0 - 2013-06-10
+
+* See UPGRADING.md for more information on how to upgrade.
+* Requests now support the ability to specify an array of $options when creating a request to more easily modify a
+  request. You can pass a 'request.options' configuration setting to a client to apply default request options to
+  every request created by a client (e.g. default query string variables, headers, curl options, etc.).
+* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`.
+  See `Guzzle\Http\StaticClient::mount`.
+* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests
+      created by a command (e.g. custom headers, query string variables, timeout settings, etc.).
+* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the
+  headers of a response
+* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key
+  (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)
+* ServiceBuilders now support storing and retrieving arbitrary data
+* CachePlugin can now purge all resources for a given URI
+* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource
+* CachePlugin now uses the Vary header to determine if a resource is a cache hit
+* `Guzzle\Http\Message\Response` now implements `\Serializable`
+* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters
+* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable
+* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()`
+* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size
+* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message
+* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older
+  Symfony users can still use the old version of Monolog.
+* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`.
+  Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.
+* Several performance improvements to `Guzzle\Common\Collection`
+* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
+  createRequest, head, delete, put, patch, post, options, prepareRequest
+* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
+* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
+* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
+  `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
+  resource, string, or EntityBody into the $options parameter to specify the download location of the response.
+* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
+  default `array()`
+* Added `Guzzle\Stream\StreamInterface::isRepeatable`
+* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
+  $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
+  $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.
+* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.
+* Removed `Guzzle\Http\ClientInterface::expandTemplate()`
+* Removed `Guzzle\Http\ClientInterface::setRequestFactory()`
+* Removed `Guzzle\Http\ClientInterface::getCurlMulti()`
+* Removed `Guzzle\Http\Message\RequestInterface::canCache`
+* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`
+* Removed `Guzzle\Http\Message\RequestInterface::isRedirect`
+* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
+* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting
+  `Guzzle\Common\Version::$emitWarnings` to true.
+* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use
+      `$request->getResponseBody()->isRepeatable()` instead.
+* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
+  `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
+  `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
+* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
+* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
+* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.
+  These will work through Guzzle 4.0
+* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params].
+* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
+* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.
+* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.
+* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
+* Marked `Guzzle\Common\Collection::inject()` as deprecated.
+* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`
+* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
+  CacheStorageInterface. These two objects and interface will be removed in a future version.
+* Always setting X-cache headers on cached responses
+* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
+* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
+  $request, Response $response);`
+* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
+* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
+* Added `CacheStorageInterface::purge($url)`
+* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
+  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
+  CanCacheStrategyInterface $canCache = null)`
+* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
+
+## 3.6.0 - 2013-05-29
+
+* ServiceDescription now implements ToArrayInterface
+* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters
+* Guzzle can now correctly parse incomplete URLs
+* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
+* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
+* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
+* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
+  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
+  CacheControl header implementation.
+* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
+* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
+* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
+  Guzzle\Http\Curl\RequestMediator
+* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
+* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
+* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
+* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
+* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
+* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
+* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
+  directly via interfaces
+* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
+  but are a no-op until removed.
+* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
+  `Guzzle\Service\Command\ArrayCommandInterface`.
+* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
+  on a request while the request is still being transferred
+* The ability to case-insensitively search for header values
+* Guzzle\Http\Message\Header::hasExactHeader
+* Guzzle\Http\Message\Header::raw. Use getAll()
+* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
+  instead.
+* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
+* Added the ability to cast Model objects to a string to view debug information.
+
+## 3.5.0 - 2013-05-13
+
+* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times
+* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove
+  itself from the EventDispatcher)
+* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values
+* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too
+* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a
+  non-existent key
+* Bug: All __call() method arguments are now required (helps with mocking frameworks)
+* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference
+  to help with refcount based garbage collection of resources created by sending a request
+* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.
+* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the
+  HistoryPlugin for a history.
+* Added a `responseBody` alias for the `response_body` location
+* Refactored internals to no longer rely on Response::getRequest()
+* HistoryPlugin can now be cast to a string
+* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests
+  and responses that are sent over the wire
+* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects
+
+## 3.4.3 - 2013-04-30
+
+* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response
+* Added a check to re-extract the temp cacert bundle from the phar before sending each request
+
+## 3.4.2 - 2013-04-29
+
+* Bug fix: Stream objects now work correctly with "a" and "a+" modes
+* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present
+* Bug fix: AsyncPlugin no longer forces HEAD requests
+* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter
+* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails
+* Setting a response on a request will write to the custom request body from the response body if one is specified
+* LogPlugin now writes to php://output when STDERR is undefined
+* Added the ability to set multiple POST files for the same key in a single call
+* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default
+* Added the ability to queue CurlExceptions to the MockPlugin
+* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send)
+* Configuration loading now allows remote files
+
+## 3.4.1 - 2013-04-16
+
+* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti
+  handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.
+* Exceptions are now properly grouped when sending requests in parallel
+* Redirects are now properly aggregated when a multi transaction fails
+* Redirects now set the response on the original object even in the event of a failure
+* Bug fix: Model names are now properly set even when using $refs
+* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax
+* Added support for oauth_callback in OAuth signatures
+* Added support for oauth_verifier in OAuth signatures
+* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection
+
+## 3.4.0 - 2013-04-11
+
+* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289
+* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
+* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
+* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
+* Bug fix: Added `number` type to service descriptions.
+* Bug fix: empty parameters are removed from an OAuth signature
+* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header
+* Bug fix: Fixed "array to string" error when validating a union of types in a service description
+* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream
+* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.
+* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.
+* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.
+* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if
+  the Content-Type can be determined based on the entity body or the path of the request.
+* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.
+* Added support for a PSR-3 LogAdapter.
+* Added a `command.after_prepare` event
+* Added `oauth_callback` parameter to the OauthPlugin
+* Added the ability to create a custom stream class when using a stream factory
+* Added a CachingEntityBody decorator
+* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.
+* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.
+* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies
+* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This
+  means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use
+  POST fields or files (the latter is only used when emulating a form POST in the browser).
+* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest
+
+## 3.3.1 - 2013-03-10
+
+* Added the ability to create PHP streaming responses from HTTP requests
+* Bug fix: Running any filters when parsing response headers with service descriptions
+* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing
+* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across
+  response location visitors.
+* Bug fix: Removed the possibility of creating configuration files with circular dependencies
+* RequestFactory::create() now uses the key of a POST file when setting the POST file name
+* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set
+
+## 3.3.0 - 2013-03-03
+
+* A large number of performance optimizations have been made
+* Bug fix: Added 'wb' as a valid write mode for streams
+* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned
+* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()`
+* BC: Removed `Guzzle\Http\Utils` class
+* BC: Setting a service description on a client will no longer modify the client's command factories.
+* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using
+  the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
+* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to
+  lowercase
+* Operation parameter objects are now lazy loaded internally
+* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses
+* Added support for instantiating responseType=class responseClass classes. Classes must implement
+  `Guzzle\Service\Command\ResponseClassInterface`
+* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These
+  additional properties also support locations and can be used to parse JSON responses where the outermost part of the
+  JSON is an array
+* Added support for nested renaming of JSON models (rename sentAs to name)
+* CachePlugin
+    * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error
+    * Debug headers can now added to cached response in the CachePlugin
+
+## 3.2.0 - 2013-02-14
+
+* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.
+* URLs with no path no longer contain a "/" by default
+* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url.
+* BadResponseException no longer includes the full request and response message
+* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface
+* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface
+* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription
+* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list
+* xmlEncoding can now be customized for the XML declaration of a XML service description operation
+* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value
+  aggregation and no longer uses callbacks
+* The URL encoding implementation of Guzzle\Http\QueryString can now be customized
+* Bug fix: Filters were not always invoked for array service description parameters
+* Bug fix: Redirects now use a target response body rather than a temporary response body
+* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded
+* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives
+
+## 3.1.2 - 2013-01-27
+
+* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the
+  response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.
+* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent
+* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)
+* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()
+* Setting default headers on a client after setting the user-agent will not erase the user-agent setting
+
+## 3.1.1 - 2013-01-20
+
+* Adding wildcard support to Guzzle\Common\Collection::getPath()
+* Adding alias support to ServiceBuilder configs
+* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface
+
+## 3.1.0 - 2013-01-12
+
+* BC: CurlException now extends from RequestException rather than BadResponseException
+* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()
+* Added getData to ServiceDescriptionInterface
+* Added context array to RequestInterface::setState()
+* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http
+* Bug: Adding required content-type when JSON request visitor adds JSON to a command
+* Bug: Fixing the serialization of a service description with custom data
+* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing
+  an array of successful and failed responses
+* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection
+* Added Guzzle\Http\IoEmittingEntityBody
+* Moved command filtration from validators to location visitors
+* Added `extends` attributes to service description parameters
+* Added getModels to ServiceDescriptionInterface
+
+## 3.0.7 - 2012-12-19
+
+* Fixing phar detection when forcing a cacert to system if null or true
+* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()`
+* Cleaning up `Guzzle\Common\Collection::inject` method
+* Adding a response_body location to service descriptions
+
+## 3.0.6 - 2012-12-09
+
+* CurlMulti performance improvements
+* Adding setErrorResponses() to Operation
+* composer.json tweaks
+
+## 3.0.5 - 2012-11-18
+
+* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin
+* Bug: Response body can now be a string containing "0"
+* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert
+* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs
+* Added support for XML attributes in service description responses
+* DefaultRequestSerializer now supports array URI parameter values for URI template expansion
+* Added better mimetype guessing to requests and post files
+
+## 3.0.4 - 2012-11-11
+
+* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value
+* Bug: Cookies can now be added that have a name, domain, or value set to "0"
+* Bug: Using the system cacert bundle when using the Phar
+* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures
+* Enhanced cookie jar de-duplication
+* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added
+* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies
+* Added the ability to create any sort of hash for a stream rather than just an MD5 hash
+
+## 3.0.3 - 2012-11-04
+
+* Implementing redirects in PHP rather than cURL
+* Added PECL URI template extension and using as default parser if available
+* Bug: Fixed Content-Length parsing of Response factory
+* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.
+* Adding ToArrayInterface throughout library
+* Fixing OauthPlugin to create unique nonce values per request
+
+## 3.0.2 - 2012-10-25
+
+* Magic methods are enabled by default on clients
+* Magic methods return the result of a command
+* Service clients no longer require a base_url option in the factory
+* Bug: Fixed an issue with URI templates where null template variables were being expanded
+
+## 3.0.1 - 2012-10-22
+
+* Models can now be used like regular collection objects by calling filter, map, etc.
+* Models no longer require a Parameter structure or initial data in the constructor
+* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator`
+
+## 3.0.0 - 2012-10-15
+
+* Rewrote service description format to be based on Swagger
+    * Now based on JSON schema
+    * Added nested input structures and nested response models
+    * Support for JSON and XML input and output models
+    * Renamed `commands` to `operations`
+    * Removed dot class notation
+    * Removed custom types
+* Broke the project into smaller top-level namespaces to be more component friendly
+* Removed support for XML configs and descriptions. Use arrays or JSON files.
+* Removed the Validation component and Inspector
+* Moved all cookie code to Guzzle\Plugin\Cookie
+* Magic methods on a Guzzle\Service\Client now return the command un-executed.
+* Calling getResult() or getResponse() on a command will lazily execute the command if needed.
+* Now shipping with cURL's CA certs and using it by default
+* Added previousResponse() method to response objects
+* No longer sending Accept and Accept-Encoding headers on every request
+* Only sending an Expect header by default when a payload is greater than 1MB
+* Added/moved client options:
+    * curl.blacklist to curl.option.blacklist
+    * Added ssl.certificate_authority
+* Added a Guzzle\Iterator component
+* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin
+* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)
+* Added a more robust caching plugin
+* Added setBody to response objects
+* Updating LogPlugin to use a more flexible MessageFormatter
+* Added a completely revamped build process
+* Cleaning up Collection class and removing default values from the get method
+* Fixed ZF2 cache adapters
+
+## 2.8.8 - 2012-10-15
+
+* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did
+
+## 2.8.7 - 2012-09-30
+
+* Bug: Fixed config file aliases for JSON includes
+* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests
+* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload
+* Bug: Hardening request and response parsing to account for missing parts
+* Bug: Fixed PEAR packaging
+* Bug: Fixed Request::getInfo
+* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail
+* Adding the ability for the namespace Iterator factory to look in multiple directories
+* Added more getters/setters/removers from service descriptions
+* Added the ability to remove POST fields from OAuth signatures
+* OAuth plugin now supports 2-legged OAuth
+
+## 2.8.6 - 2012-09-05
+
+* Added the ability to modify and build service descriptions
+* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command
+* Added a `json` parameter location
+* Now allowing dot notation for classes in the CacheAdapterFactory
+* Using the union of two arrays rather than an array_merge when extending service builder services and service params
+* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references
+  in service builder config files.
+* Services defined in two different config files that include one another will by default replace the previously
+  defined service, but you can now create services that extend themselves and merge their settings over the previous
+* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like
+  '_default' with a default JSON configuration file.
+
+## 2.8.5 - 2012-08-29
+
+* Bug: Suppressed empty arrays from URI templates
+* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching
+* Added support for HTTP responses that do not contain a reason phrase in the start-line
+* AbstractCommand commands are now invokable
+* Added a way to get the data used when signing an Oauth request before a request is sent
+
+## 2.8.4 - 2012-08-15
+
+* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin
+* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable.
+* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream
+* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream
+* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())
+* Added additional response status codes
+* Removed SSL information from the default User-Agent header
+* DELETE requests can now send an entity body
+* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries
+* Added the ability of the MockPlugin to consume mocked request bodies
+* LogPlugin now exposes request and response objects in the extras array
+
+## 2.8.3 - 2012-07-30
+
+* Bug: Fixed a case where empty POST requests were sent as GET requests
+* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body
+* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new
+* Added multiple inheritance to service description commands
+* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`
+* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything
+* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles
+
+## 2.8.2 - 2012-07-24
+
+* Bug: Query string values set to 0 are no longer dropped from the query string
+* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()`
+* Bug: `+` is now treated as an encoded space when parsing query strings
+* QueryString and Collection performance improvements
+* Allowing dot notation for class paths in filters attribute of a service descriptions
+
+## 2.8.1 - 2012-07-16
+
+* Loosening Event Dispatcher dependency
+* POST redirects can now be customized using CURLOPT_POSTREDIR
+
+## 2.8.0 - 2012-07-15
+
+* BC: Guzzle\Http\Query
+    * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)
+    * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()
+    * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)
+    * Changed the aggregation functions of QueryString to be static methods
+    * Can now use fromString() with querystrings that have a leading ?
+* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters
+* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body
+* Cookies are no longer URL decoded by default
+* Bug: URI template variables set to null are no longer expanded
+
+## 2.7.2 - 2012-07-02
+
+* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser.
+* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty()
+* CachePlugin now allows for a custom request parameter function to check if a request can be cached
+* Bug fix: CachePlugin now only caches GET and HEAD requests by default
+* Bug fix: Using header glue when transferring headers over the wire
+* Allowing deeply nested arrays for composite variables in URI templates
+* Batch divisors can now return iterators or arrays
+
+## 2.7.1 - 2012-06-26
+
+* Minor patch to update version number in UA string
+* Updating build process
+
+## 2.7.0 - 2012-06-25
+
+* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes.
+* BC: Removed magic setX methods from commands
+* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method
+* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.
+* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)
+* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace
+* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin
+* Added the ability to set POST fields and files in a service description
+* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method
+* Adding a command.before_prepare event to clients
+* Added BatchClosureTransfer and BatchClosureDivisor
+* BatchTransferException now includes references to the batch divisor and transfer strategies
+* Fixed some tests so that they pass more reliably
+* Added Guzzle\Common\Log\ArrayLogAdapter
+
+## 2.6.6 - 2012-06-10
+
+* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin
+* BC: Removing Guzzle\Service\Command\CommandSet
+* Adding generic batching system (replaces the batch queue plugin and command set)
+* Updating ZF cache and log adapters and now using ZF's composer repository
+* Bug: Setting the name of each ApiParam when creating through an ApiCommand
+* Adding result_type, result_doc, deprecated, and doc_url to service descriptions
+* Bug: Changed the default cookie header casing back to 'Cookie'
+
+## 2.6.5 - 2012-06-03
+
+* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource()
+* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from
+* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data
+* BC: Renaming methods in the CookieJarInterface
+* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations
+* Making the default glue for HTTP headers ';' instead of ','
+* Adding a removeValue to Guzzle\Http\Message\Header
+* Adding getCookies() to request interface.
+* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()
+
+## 2.6.4 - 2012-05-30
+
+* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.
+* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand
+* Bug: Fixing magic method command calls on clients
+* Bug: Email constraint only validates strings
+* Bug: Aggregate POST fields when POST files are present in curl handle
+* Bug: Fixing default User-Agent header
+* Bug: Only appending or prepending parameters in commands if they are specified
+* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes
+* Allowing the use of dot notation for class namespaces when using instance_of constraint
+* Added any_match validation constraint
+* Added an AsyncPlugin
+* Passing request object to the calculateWait method of the ExponentialBackoffPlugin
+* Allowing the result of a command object to be changed
+* Parsing location and type sub values when instantiating a service description rather than over and over at runtime
+
+## 2.6.3 - 2012-05-23
+
+* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options.
+* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.
+* You can now use an array of data when creating PUT request bodies in the request factory.
+* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.
+* [Http] Adding support for Content-Type in multipart POST uploads per upload
+* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])
+* Adding more POST data operations for easier manipulation of POST data.
+* You can now set empty POST fields.
+* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.
+* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.
+* CS updates
+
+## 2.6.2 - 2012-05-19
+
+* [Http] Better handling of nested scope requests in CurlMulti.  Requests are now always prepares in the send() method rather than the addRequest() method.
+
+## 2.6.1 - 2012-05-19
+
+* [BC] Removing 'path' support in service descriptions.  Use 'uri'.
+* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.
+* [BC] Removing Guzzle\Common\NullObject.  Use https://github.com/mtdowling/NullObject if you need it.
+* [BC] Removing Guzzle\Common\XmlElement.
+* All commands, both dynamic and concrete, have ApiCommand objects.
+* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.
+* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.
+* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible.
+
+## 2.6.0 - 2012-05-15
+
+* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder
+* [BC] Executing a Command returns the result of the command rather than the command
+* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed.
+* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args.
+* [BC] Moving ResourceIterator* to Guzzle\Service\Resource
+* [BC] Completely refactored ResourceIterators to iterate over a cloned command object
+* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate
+* [BC] Guzzle\Guzzle is now deprecated
+* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject
+* Adding Guzzle\Version class to give version information about Guzzle
+* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate()
+* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data
+* ServiceDescription and ServiceBuilder are now cacheable using similar configs
+* Changing the format of XML and JSON service builder configs.  Backwards compatible.
+* Cleaned up Cookie parsing
+* Trimming the default Guzzle User-Agent header
+* Adding a setOnComplete() method to Commands that is called when a command completes
+* Keeping track of requests that were mocked in the MockPlugin
+* Fixed a caching bug in the CacheAdapterFactory
+* Inspector objects can be injected into a Command object
+* Refactoring a lot of code and tests to be case insensitive when dealing with headers
+* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL
+* Adding the ability to set global option overrides to service builder configs
+* Adding the ability to include other service builder config files from within XML and JSON files
+* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.
+
+## 2.5.0 - 2012-05-08
+
+* Major performance improvements
+* [BC] Simplifying Guzzle\Common\Collection.  Please check to see if you are using features that are now deprecated.
+* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.
+* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates.  Use "{}"
+* Added the ability to passed parameters to all requests created by a client
+* Added callback functionality to the ExponentialBackoffPlugin
+* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.
+* Rewinding request stream bodies when retrying requests
+* Exception is thrown when JSON response body cannot be decoded
+* Added configurable magic method calls to clients and commands.  This is off by default.
+* Fixed a defect that added a hash to every parsed URL part
+* Fixed duplicate none generation for OauthPlugin.
+* Emitting an event each time a client is generated by a ServiceBuilder
+* Using an ApiParams object instead of a Collection for parameters of an ApiCommand
+* cache.* request parameters should be renamed to params.cache.*
+* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.
+* Added the ability to disable type validation of service descriptions
+* ServiceDescriptions and ServiceBuilders are now Serializable
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/LICENSE b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/LICENSE
new file mode 100644
index 000000000..ea7f07c54
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+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.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/README.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/README.md
new file mode 100644
index 000000000..2f614d6f3
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/README.md
@@ -0,0 +1,89 @@
+Guzzle, PHP HTTP client
+=======================
+
+[![Build Status](https://travis-ci.org/guzzle/guzzle.svg?branch=master)](https://travis-ci.org/guzzle/guzzle)
+
+Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
+trivial to integrate with web services.
+
+- Simple interface for building query strings, POST requests, streaming large
+  uploads, streaming large downloads, using HTTP cookies, uploading JSON data,
+  etc...
+- Can send both synchronous and asynchronous requests using the same interface.
+- Uses PSR-7 interfaces for requests, responses, and streams. This allows you
+  to utilize other PSR-7 compatible libraries with Guzzle.
+- Abstracts away the underlying HTTP transport, allowing you to write
+  environment and transport agnostic code; i.e., no hard dependency on cURL,
+  PHP streams, sockets, or non-blocking event loops.
+- Middleware system allows you to augment and compose client behavior.
+
+```php
+$client = new \GuzzleHttp\Client();
+$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
+echo $res->getStatusCode();
+// 200
+echo $res->getHeaderLine('content-type');
+// 'application/json; charset=utf8'
+echo $res->getBody();
+// '{"id": 1420053, "name": "guzzle", ...}'
+
+// Send an asynchronous request.
+$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
+$promise = $client->sendAsync($request)->then(function ($response) {
+    echo 'I completed! ' . $response->getBody();
+});
+$promise->wait();
+```
+
+## Help and docs
+
+- [Documentation](http://guzzlephp.org/)
+- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
+- [Gitter](https://gitter.im/guzzle/guzzle)
+
+
+## Installing Guzzle
+
+The recommended way to install Guzzle is through
+[Composer](http://getcomposer.org).
+
+```bash
+# Install Composer
+curl -sS https://getcomposer.org/installer | php
+```
+
+Next, run the Composer command to install the latest stable version of Guzzle:
+
+```bash
+php composer.phar require guzzlehttp/guzzle
+```
+
+After installing, you need to require Composer's autoloader:
+
+```php
+require 'vendor/autoload.php';
+```
+
+You can then later update Guzzle using composer:
+
+ ```bash
+composer.phar update
+ ```
+
+
+## Version Guidance
+
+| Version | Status     | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version |
+|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|
+| 3.x     | EOL        | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >= 5.3.3    |
+| 4.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >= 5.4      |
+| 5.x     | Maintained | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >= 5.4      |
+| 6.x     | Latest     | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >= 5.5      |
+
+[guzzle-3-repo]: https://github.com/guzzle/guzzle3
+[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
+[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
+[guzzle-6-repo]: https://github.com/guzzle/guzzle
+[guzzle-3-docs]: http://guzzle3.readthedocs.org/en/latest/
+[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/
+[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/UPGRADING.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/UPGRADING.md
new file mode 100644
index 000000000..91d1dcc99
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/UPGRADING.md
@@ -0,0 +1,1203 @@
+Guzzle Upgrade Guide
+====================
+
+5.0 to 6.0
+----------
+
+Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages.
+Due to the fact that these messages are immutable, this prompted a refactoring
+of Guzzle to use a middleware based system rather than an event system. Any
+HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be
+updated to work with the new immutable PSR-7 request and response objects. Any
+event listeners or subscribers need to be updated to become middleware
+functions that wrap handlers (or are injected into a
+`GuzzleHttp\HandlerStack`).
+
+- Removed `GuzzleHttp\BatchResults`
+- Removed `GuzzleHttp\Collection`
+- Removed `GuzzleHttp\HasDataTrait`
+- Removed `GuzzleHttp\ToArrayInterface`
+- The `guzzlehttp/streams` dependency has been removed. Stream functionality
+  is now present in the `GuzzleHttp\Psr7` namespace provided by the
+  `guzzlehttp/psr7` package.
+- Guzzle no longer uses ReactPHP promises and now uses the
+  `guzzlehttp/promises` library. We use a custom promise library for three
+  significant reasons:
+  1. React promises (at the time of writing this) are recursive. Promise
+     chaining and promise resolution will eventually blow the stack. Guzzle
+     promises are not recursive as they use a sort of trampolining technique.
+     Note: there has been movement in the React project to modify promises to
+     no longer utilize recursion.
+  2. Guzzle needs to have the ability to synchronously block on a promise to
+     wait for a result. Guzzle promises allows this functionality (and does
+     not require the use of recursion).
+  3. Because we need to be able to wait on a result, doing so using React
+     promises requires wrapping react promises with RingPHP futures. This
+     overhead is no longer needed, reducing stack sizes, reducing complexity,
+     and improving performance.
+- `GuzzleHttp\Mimetypes` has been moved to a function in
+  `GuzzleHttp\Psr7\mimetype_from_extension` and
+  `GuzzleHttp\Psr7\mimetype_from_filename`.
+- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query
+  strings must now be passed into request objects as strings, or provided to
+  the `query` request option when creating requests with clients. The `query`
+  option uses PHP's `http_build_query` to convert an array to a string. If you
+  need a different serialization technique, you will need to pass the query
+  string in as a string. There are a couple helper functions that will make
+  working with query strings easier: `GuzzleHttp\Psr7\parse_query` and
+  `GuzzleHttp\Psr7\build_query`.
+- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware
+  system based on PSR-7, using RingPHP and it's middleware system as well adds
+  more complexity than the benefits it provides. All HTTP handlers that were
+  present in RingPHP have been modified to work directly with PSR-7 messages
+  and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces
+  complexity in Guzzle, removes a dependency, and improves performance. RingPHP
+  will be maintained for Guzzle 5 support, but will no longer be a part of
+  Guzzle 6.
+- As Guzzle now uses a middleware based systems the event system and RingPHP
+  integration has been removed. Note: while the event system has been removed,
+  it is possible to add your own type of event system that is powered by the
+  middleware system.
+  - Removed the `Event` namespace.
+  - Removed the `Subscriber` namespace.
+  - Removed `Transaction` class
+  - Removed `RequestFsm`
+  - Removed `RingBridge`
+  - `GuzzleHttp\Subscriber\Cookie` is now provided by
+    `GuzzleHttp\Middleware::cookies`
+  - `GuzzleHttp\Subscriber\HttpError` is now provided by
+    `GuzzleHttp\Middleware::httpError`
+  - `GuzzleHttp\Subscriber\History` is now provided by
+    `GuzzleHttp\Middleware::history`
+  - `GuzzleHttp\Subscriber\Mock` is now provided by
+    `GuzzleHttp\Handler\MockHandler`
+  - `GuzzleHttp\Subscriber\Prepare` is now provided by
+    `GuzzleHttp\PrepareBodyMiddleware`
+  - `GuzzleHttp\Subscriber\Redirect` is now provided by
+    `GuzzleHttp\RedirectMiddleware`
+- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in
+  `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone.
+- Static functions in `GuzzleHttp\Utils` have been moved to namespaced
+  functions under the `GuzzleHttp` namespace. This requires either a Composer
+  based autoloader or you to include functions.php.
+- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to
+  `GuzzleHttp\ClientInterface::getConfig`.
+- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed.
+- The `json` and `xml` methods of response objects has been removed. With the
+  migration to strictly adhering to PSR-7 as the interface for Guzzle messages,
+  adding methods to message interfaces would actually require Guzzle messages
+  to extend from PSR-7 messages rather then work with them directly.
+
+## Migrating to middleware
+
+The change to PSR-7 unfortunately required significant refactoring to Guzzle
+due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event
+system from plugins. The event system relied on mutability of HTTP messages and
+side effects in order to work. With immutable messages, you have to change your
+workflow to become more about either returning a value (e.g., functional
+middlewares) or setting a value on an object. Guzzle v6 has chosen the
+functional middleware approach.
+
+Instead of using the event system to listen for things like the `before` event,
+you now create a stack based middleware function that intercepts a request on
+the way in and the promise of the response on the way out. This is a much
+simpler and more predictable approach than the event system and works nicely
+with PSR-7 middleware. Due to the use of promises, the middleware system is
+also asynchronous.
+
+v5:
+
+```php
+use GuzzleHttp\Event\BeforeEvent;
+$client = new GuzzleHttp\Client();
+// Get the emitter and listen to the before event.
+$client->getEmitter()->on('before', function (BeforeEvent $e) {
+    // Guzzle v5 events relied on mutation
+    $e->getRequest()->setHeader('X-Foo', 'Bar');
+});
+```
+
+v6:
+
+In v6, you can modify the request before it is sent using the `mapRequest`
+middleware. The idiomatic way in v6 to modify the request/response lifecycle is
+to setup a handler middleware stack up front and inject the handler into a
+client.
+
+```php
+use GuzzleHttp\Middleware;
+// Create a handler stack that has all of the default middlewares attached
+$handler = GuzzleHttp\HandlerStack::create();
+// Push the handler onto the handler stack
+$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
+    // Notice that we have to return a request object
+    return $request->withHeader('X-Foo', 'Bar');
+}));
+// Inject the handler into the client
+$client = new GuzzleHttp\Client(['handler' => $handler]);
+```
+
+## POST Requests
+
+This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)
+and `multipart` request options. `form_params` is an associative array of
+strings or array of strings and is used to serialize an
+`application/x-www-form-urlencoded` POST request. The
+[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)
+option is now used to send a multipart/form-data POST request.
+
+`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add
+POST files to a multipart/form-data request.
+
+The `body` option no longer accepts an array to send POST requests. Please use
+`multipart` or `form_params` instead.
+
+The `base_url` option has been renamed to `base_uri`.
+
+4.x to 5.0
+----------
+
+## Rewritten Adapter Layer
+
+Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send
+HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
+is still supported, but it has now been renamed to `handler`. Instead of
+passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP
+`callable` that follows the RingPHP specification.
+
+## Removed Fluent Interfaces
+
+[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil)
+from the following classes:
+
+- `GuzzleHttp\Collection`
+- `GuzzleHttp\Url`
+- `GuzzleHttp\Query`
+- `GuzzleHttp\Post\PostBody`
+- `GuzzleHttp\Cookie\SetCookie`
+
+## Removed functions.php
+
+Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following
+functions can be used as replacements.
+
+- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode`
+- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath`
+- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path`
+- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however,
+  deprecated in favor of using `GuzzleHttp\Pool::batch()`.
+
+The "procedural" global client has been removed with no replacement (e.g.,
+`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client`
+object as a replacement.
+
+## `throwImmediately` has been removed
+
+The concept of "throwImmediately" has been removed from exceptions and error
+events. This control mechanism was used to stop a transfer of concurrent
+requests from completing. This can now be handled by throwing the exception or
+by cancelling a pool of requests or each outstanding future request
+individually.
+
+## headers event has been removed
+
+Removed the "headers" event. This event was only useful for changing the
+body a response once the headers of the response were known. You can implement
+a similar behavior in a number of ways. One example might be to use a
+FnStream that has access to the transaction being sent. For example, when the
+first byte is written, you could check if the response headers match your
+expectations, and if so, change the actual stream body that is being
+written to.
+
+## Updates to HTTP Messages
+
+Removed the `asArray` parameter from
+`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
+value as an array, then use the newly added `getHeaderAsArray()` method of
+`MessageInterface`. This change makes the Guzzle interfaces compatible with
+the PSR-7 interfaces.
+
+3.x to 4.0
+----------
+
+## Overarching changes:
+
+- Now requires PHP 5.4 or greater.
+- No longer requires cURL to send requests.
+- Guzzle no longer wraps every exception it throws. Only exceptions that are
+  recoverable are now wrapped by Guzzle.
+- Various namespaces have been removed or renamed.
+- No longer requiring the Symfony EventDispatcher. A custom event dispatcher
+  based on the Symfony EventDispatcher is
+  now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant
+  speed and functionality improvements).
+
+Changes per Guzzle 3.x namespace are described below.
+
+## Batch
+
+The `Guzzle\Batch` namespace has been removed. This is best left to
+third-parties to implement on top of Guzzle's core HTTP library.
+
+## Cache
+
+The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement
+has been implemented yet, but hoping to utilize a PSR cache interface).
+
+## Common
+
+- Removed all of the wrapped exceptions. It's better to use the standard PHP
+  library for unrecoverable exceptions.
+- `FromConfigInterface` has been removed.
+- `Guzzle\Common\Version` has been removed. The VERSION constant can be found
+  at `GuzzleHttp\ClientInterface::VERSION`.
+
+### Collection
+
+- `getAll` has been removed. Use `toArray` to convert a collection to an array.
+- `inject` has been removed.
+- `keySearch` has been removed.
+- `getPath` no longer supports wildcard expressions. Use something better like
+  JMESPath for this.
+- `setPath` now supports appending to an existing array via the `[]` notation.
+
+### Events
+
+Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses
+`GuzzleHttp\Event\Emitter`.
+
+- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by
+  `GuzzleHttp\Event\EmitterInterface`.
+- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by
+  `GuzzleHttp\Event\Emitter`.
+- `Symfony\Component\EventDispatcher\Event` is replaced by
+  `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in
+  `GuzzleHttp\Event\EventInterface`.
+- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and
+  `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the
+  event emitter of a request, client, etc. now uses the `getEmitter` method
+  rather than the `getDispatcher` method.
+
+#### Emitter
+
+- Use the `once()` method to add a listener that automatically removes itself
+  the first time it is invoked.
+- Use the `listeners()` method to retrieve a list of event listeners rather than
+  the `getListeners()` method.
+- Use `emit()` instead of `dispatch()` to emit an event from an emitter.
+- Use `attach()` instead of `addSubscriber()` and `detach()` instead of
+  `removeSubscriber()`.
+
+```php
+$mock = new Mock();
+// 3.x
+$request->getEventDispatcher()->addSubscriber($mock);
+$request->getEventDispatcher()->removeSubscriber($mock);
+// 4.x
+$request->getEmitter()->attach($mock);
+$request->getEmitter()->detach($mock);
+```
+
+Use the `on()` method to add a listener rather than the `addListener()` method.
+
+```php
+// 3.x
+$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );
+// 4.x
+$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );
+```
+
+## Http
+
+### General changes
+
+- The cacert.pem certificate has been moved to `src/cacert.pem`.
+- Added the concept of adapters that are used to transfer requests over the
+  wire.
+- Simplified the event system.
+- Sending requests in parallel is still possible, but batching is no longer a
+  concept of the HTTP layer. Instead, you must use the `complete` and `error`
+  events to asynchronously manage parallel request transfers.
+- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`.
+- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`.
+- QueryAggregators have been rewritten so that they are simply callable
+  functions.
+- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in
+  `functions.php` for an easy to use static client instance.
+- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from
+  `GuzzleHttp\Exception\TransferException`.
+
+### Client
+
+Calling methods like `get()`, `post()`, `head()`, etc. no longer create and
+return a request, but rather creates a request, sends the request, and returns
+the response.
+
+```php
+// 3.0
+$request = $client->get('/');
+$response = $request->send();
+
+// 4.0
+$response = $client->get('/');
+
+// or, to mirror the previous behavior
+$request = $client->createRequest('GET', '/');
+$response = $client->send($request);
+```
+
+`GuzzleHttp\ClientInterface` has changed.
+
+- The `send` method no longer accepts more than one request. Use `sendAll` to
+  send multiple requests in parallel.
+- `setUserAgent()` has been removed. Use a default request option instead. You
+  could, for example, do something like:
+  `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.
+- `setSslVerification()` has been removed. Use default request options instead,
+  like `$client->setConfig('defaults/verify', true)`.
+
+`GuzzleHttp\Client` has changed.
+
+- The constructor now accepts only an associative array. You can include a
+  `base_url` string or array to use a URI template as the base URL of a client.
+  You can also specify a `defaults` key that is an associative array of default
+  request options. You can pass an `adapter` to use a custom adapter,
+  `batch_adapter` to use a custom adapter for sending requests in parallel, or
+  a `message_factory` to change the factory used to create HTTP requests and
+  responses.
+- The client no longer emits a `client.create_request` event.
+- Creating requests with a client no longer automatically utilize a URI
+  template. You must pass an array into a creational method (e.g.,
+  `createRequest`, `get`, `put`, etc.) in order to expand a URI template.
+
+### Messages
+
+Messages no longer have references to their counterparts (i.e., a request no
+longer has a reference to it's response, and a response no loger has a
+reference to its request). This association is now managed through a
+`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to
+these transaction objects using request events that are emitted over the
+lifecycle of a request.
+
+#### Requests with a body
+
+- `GuzzleHttp\Message\EntityEnclosingRequest` and
+  `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The
+  separation between requests that contain a body and requests that do not
+  contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface`
+  handles both use cases.
+- Any method that previously accepts a `GuzzleHttp\Response` object now accept a
+  `GuzzleHttp\Message\ResponseInterface`.
+- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to
+  `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create
+  both requests and responses and is implemented in
+  `GuzzleHttp\Message\MessageFactory`.
+- POST field and file methods have been removed from the request object. You
+  must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface`
+  to control the format of a POST body. Requests that are created using a
+  standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use
+  a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if
+  the method is POST and no body is provided.
+
+```php
+$request = $client->createRequest('POST', '/');
+$request->getBody()->setField('foo', 'bar');
+$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));
+```
+
+#### Headers
+
+- `GuzzleHttp\Message\Header` has been removed. Header values are now simply
+  represented by an array of values or as a string. Header values are returned
+  as a string by default when retrieving a header value from a message. You can
+  pass an optional argument of `true` to retrieve a header value as an array
+  of strings instead of a single concatenated string.
+- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to
+  `GuzzleHttp\Post`. This interface has been simplified and now allows the
+  addition of arbitrary headers.
+- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most
+  of the custom headers are now handled separately in specific
+  subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has
+  been updated to properly handle headers that contain parameters (like the
+  `Link` header).
+
+#### Responses
+
+- `GuzzleHttp\Message\Response::getInfo()` and
+  `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event
+  system to retrieve this type of information.
+- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed.
+- `GuzzleHttp\Message\Response::getMessage()` has been removed.
+- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific
+  methods have moved to the CacheSubscriber.
+- Header specific helper functions like `getContentMd5()` have been removed.
+  Just use `getHeader('Content-MD5')` instead.
+- `GuzzleHttp\Message\Response::setRequest()` and
+  `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event
+  system to work with request and response objects as a transaction.
+- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the
+  Redirect subscriber instead.
+- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have
+  been removed. Use `getStatusCode()` instead.
+
+#### Streaming responses
+
+Streaming requests can now be created by a client directly, returning a
+`GuzzleHttp\Message\ResponseInterface` object that contains a body stream
+referencing an open PHP HTTP stream.
+
+```php
+// 3.0
+use Guzzle\Stream\PhpStreamRequestFactory;
+$request = $client->get('/');
+$factory = new PhpStreamRequestFactory();
+$stream = $factory->fromRequest($request);
+$data = $stream->read(1024);
+
+// 4.0
+$response = $client->get('/', ['stream' => true]);
+// Read some data off of the stream in the response body
+$data = $response->getBody()->read(1024);
+```
+
+#### Redirects
+
+The `configureRedirects()` method has been removed in favor of a
+`allow_redirects` request option.
+
+```php
+// Standard redirects with a default of a max of 5 redirects
+$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);
+
+// Strict redirects with a custom number of redirects
+$request = $client->createRequest('GET', '/', [
+    'allow_redirects' => ['max' => 5, 'strict' => true]
+]);
+```
+
+#### EntityBody
+
+EntityBody interfaces and classes have been removed or moved to
+`GuzzleHttp\Stream`. All classes and interfaces that once required
+`GuzzleHttp\EntityBodyInterface` now require
+`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no
+longer uses `GuzzleHttp\EntityBody::factory` but now uses
+`GuzzleHttp\Stream\Stream::factory` or even better:
+`GuzzleHttp\Stream\create()`.
+
+- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface`
+- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream`
+- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream`
+- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream`
+- `Guzzle\Http\IoEmittyinEntityBody` has been removed.
+
+#### Request lifecycle events
+
+Requests previously submitted a large number of requests. The number of events
+emitted over the lifecycle of a request has been significantly reduced to make
+it easier to understand how to extend the behavior of a request. All events
+emitted during the lifecycle of a request now emit a custom
+`GuzzleHttp\Event\EventInterface` object that contains context providing
+methods and a way in which to modify the transaction at that specific point in
+time (e.g., intercept the request and set a response on the transaction).
+
+- `request.before_send` has been renamed to `before` and now emits a
+  `GuzzleHttp\Event\BeforeEvent`
+- `request.complete` has been renamed to `complete` and now emits a
+  `GuzzleHttp\Event\CompleteEvent`.
+- `request.sent` has been removed. Use `complete`.
+- `request.success` has been removed. Use `complete`.
+- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`.
+- `request.exception` has been removed. Use `error`.
+- `request.receive.status_line` has been removed.
+- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to
+  maintain a status update.
+- `curl.callback.write` has been removed. Use a custom `StreamInterface` to
+  intercept writes.
+- `curl.callback.read` has been removed. Use a custom `StreamInterface` to
+  intercept reads.
+
+`headers` is a new event that is emitted after the response headers of a
+request have been received before the body of the response is downloaded. This
+event emits a `GuzzleHttp\Event\HeadersEvent`.
+
+You can intercept a request and inject a response using the `intercept()` event
+of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
+`GuzzleHttp\Event\ErrorEvent` event.
+
+See: http://docs.guzzlephp.org/en/latest/events.html
+
+## Inflection
+
+The `Guzzle\Inflection` namespace has been removed. This is not a core concern
+of Guzzle.
+
+## Iterator
+
+The `Guzzle\Iterator` namespace has been removed.
+
+- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and
+  `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of
+  Guzzle itself.
+- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent
+  class is shipped with PHP 5.4.
+- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because
+  it's easier to just wrap an iterator in a generator that maps values.
+
+For a replacement of these iterators, see https://github.com/nikic/iter
+
+## Log
+
+The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The
+`Guzzle\Log` namespace has been removed. Guzzle now relies on
+`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been
+moved to `GuzzleHttp\Subscriber\Log\Formatter`.
+
+## Parser
+
+The `Guzzle\Parser` namespace has been removed. This was previously used to
+make it possible to plug in custom parsers for cookies, messages, URI
+templates, and URLs; however, this level of complexity is not needed in Guzzle
+so it has been removed.
+
+- Cookie: Cookie parsing logic has been moved to
+  `GuzzleHttp\Cookie\SetCookie::fromString`.
+- Message: Message parsing logic for both requests and responses has been moved
+  to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only
+  used in debugging or deserializing messages, so it doesn't make sense for
+  Guzzle as a library to add this level of complexity to parsing messages.
+- UriTemplate: URI template parsing has been moved to
+  `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL
+  URI template library if it is installed.
+- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously
+  it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary,
+  then developers are free to subclass `GuzzleHttp\Url`.
+
+## Plugin
+
+The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`.
+Several plugins are shipping with the core Guzzle library under this namespace.
+
+- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar
+  code has moved to `GuzzleHttp\Cookie`.
+- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin.
+- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is
+  received.
+- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin.
+- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before
+  sending. This subscriber is attached to all requests by default.
+- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin.
+
+The following plugins have been removed (third-parties are free to re-implement
+these if needed):
+
+- `GuzzleHttp\Plugin\Async` has been removed.
+- `GuzzleHttp\Plugin\CurlAuth` has been removed.
+- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This
+  functionality should instead be implemented with event listeners that occur
+  after normal response parsing occurs in the guzzle/command package.
+
+The following plugins are not part of the core Guzzle package, but are provided
+in separate repositories:
+
+- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler
+  to build custom retry policies using simple functions rather than various
+  chained classes. See: https://github.com/guzzle/retry-subscriber
+- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to
+  https://github.com/guzzle/cache-subscriber
+- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to
+  https://github.com/guzzle/log-subscriber
+- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to
+  https://github.com/guzzle/message-integrity-subscriber
+- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to
+  `GuzzleHttp\Subscriber\MockSubscriber`.
+- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to
+  https://github.com/guzzle/oauth-subscriber
+
+## Service
+
+The service description layer of Guzzle has moved into two separate packages:
+
+- http://github.com/guzzle/command Provides a high level abstraction over web
+  services by representing web service operations using commands.
+- http://github.com/guzzle/guzzle-services Provides an implementation of
+  guzzle/command that provides request serialization and response parsing using
+  Guzzle service descriptions.
+
+## Stream
+
+Stream have moved to a separate package available at
+https://github.com/guzzle/streams.
+
+`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take
+on the responsibilities of `Guzzle\Http\EntityBody` and
+`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number
+of methods implemented by the `StreamInterface` has been drastically reduced to
+allow developers to more easily extend and decorate stream behavior.
+
+## Removed methods from StreamInterface
+
+- `getStream` and `setStream` have been removed to better encapsulate streams.
+- `getMetadata` and `setMetadata` have been removed in favor of
+  `GuzzleHttp\Stream\MetadataStreamInterface`.
+- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been
+  removed. This data is accessible when
+  using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`.
+- `rewind` has been removed. Use `seek(0)` for a similar behavior.
+
+## Renamed methods
+
+- `detachStream` has been renamed to `detach`.
+- `feof` has been renamed to `eof`.
+- `ftell` has been renamed to `tell`.
+- `readLine` has moved from an instance method to a static class method of
+  `GuzzleHttp\Stream\Stream`.
+
+## Metadata streams
+
+`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams
+that contain additional metadata accessible via `getMetadata()`.
+`GuzzleHttp\Stream\StreamInterface::getMetadata` and
+`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed.
+
+## StreamRequestFactory
+
+The entire concept of the StreamRequestFactory has been removed. The way this
+was used in Guzzle 3 broke the actual interface of sending streaming requests
+(instead of getting back a Response, you got a StreamInterface). Streaming
+PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`.
+
+3.6 to 3.7
+----------
+
+### Deprecations
+
+- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:
+
+```php
+\Guzzle\Common\Version::$emitWarnings = true;
+```
+
+The following APIs and options have been marked as deprecated:
+
+- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.
+- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
+- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
+- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
+- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
+- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
+- Marked `Guzzle\Common\Collection::inject()` as deprecated.
+- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use
+  `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or
+  `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`
+
+3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational
+request methods. When paired with a client's configuration settings, these options allow you to specify default settings
+for various aspects of a request. Because these options make other previous configuration options redundant, several
+configuration options and methods of a client and AbstractCommand have been deprecated.
+
+- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.
+- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.
+- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`
+- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0
+
+        $command = $client->getCommand('foo', array(
+            'command.headers' => array('Test' => '123'),
+            'command.response_body' => '/path/to/file'
+        ));
+
+        // Should be changed to:
+
+        $command = $client->getCommand('foo', array(
+            'command.request_options' => array(
+                'headers' => array('Test' => '123'),
+                'save_as' => '/path/to/file'
+            )
+        ));
+
+### Interface changes
+
+Additions and changes (you will need to update any implementations or subclasses you may have created):
+
+- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
+  createRequest, head, delete, put, patch, post, options, prepareRequest
+- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
+- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
+- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
+  `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
+  resource, string, or EntityBody into the $options parameter to specify the download location of the response.
+- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
+  default `array()`
+- Added `Guzzle\Stream\StreamInterface::isRepeatable`
+- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
+
+The following methods were removed from interfaces. All of these methods are still available in the concrete classes
+that implement them, but you should update your code to use alternative methods:
+
+- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
+  `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
+  `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or
+  `$client->setDefaultOption('headers/{header_name}', 'value')`. or
+  `$client->setDefaultOption('headers', array('header_name' => 'value'))`.
+- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.
+- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail.
+- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail.
+- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.
+- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin.
+- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin.
+- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin.
+
+### Cache plugin breaking changes
+
+- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
+  CacheStorageInterface. These two objects and interface will be removed in a future version.
+- Always setting X-cache headers on cached responses
+- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
+- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
+  $request, Response $response);`
+- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
+- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
+- Added `CacheStorageInterface::purge($url)`
+- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
+  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
+  CanCacheStrategyInterface $canCache = null)`
+- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
+
+3.5 to 3.6
+----------
+
+* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
+* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
+* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
+  For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().
+  Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.
+* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
+  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
+  CacheControl header implementation.
+* Moved getLinks() from Response to just be used on a Link header object.
+
+If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the
+HeaderInterface (e.g. toArray(), getAll(), etc.).
+
+### Interface changes
+
+* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
+* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
+* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
+  Guzzle\Http\Curl\RequestMediator
+* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
+* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
+* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
+
+### Removed deprecated functions
+
+* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
+* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
+
+### Deprecations
+
+* The ability to case-insensitively search for header values
+* Guzzle\Http\Message\Header::hasExactHeader
+* Guzzle\Http\Message\Header::raw. Use getAll()
+* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
+  instead.
+
+### Other changes
+
+* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
+* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
+  directly via interfaces
+* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
+  but are a no-op until removed.
+* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
+  `Guzzle\Service\Command\ArrayCommandInterface`.
+* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
+  on a request while the request is still being transferred
+* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
+
+3.3 to 3.4
+----------
+
+Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.
+
+3.2 to 3.3
+----------
+
+### Response::getEtag() quote stripping removed
+
+`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header
+
+### Removed `Guzzle\Http\Utils`
+
+The `Guzzle\Http\Utils` class was removed. This class was only used for testing.
+
+### Stream wrapper and type
+
+`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase.
+
+### curl.emit_io became emit_io
+
+Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the
+'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
+
+3.1 to 3.2
+----------
+
+### CurlMulti is no longer reused globally
+
+Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added
+to a single client can pollute requests dispatched from other clients.
+
+If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the
+ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is
+created.
+
+```php
+$multi = new Guzzle\Http\Curl\CurlMulti();
+$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json');
+$builder->addListener('service_builder.create_client', function ($event) use ($multi) {
+    $event['client']->setCurlMulti($multi);
+}
+});
+```
+
+### No default path
+
+URLs no longer have a default path value of '/' if no path was specified.
+
+Before:
+
+```php
+$request = $client->get('http://www.foo.com');
+echo $request->getUrl();
+// >> http://www.foo.com/
+```
+
+After:
+
+```php
+$request = $client->get('http://www.foo.com');
+echo $request->getUrl();
+// >> http://www.foo.com
+```
+
+### Less verbose BadResponseException
+
+The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and
+response information. You can, however, get access to the request and response object by calling `getRequest()` or
+`getResponse()` on the exception object.
+
+### Query parameter aggregation
+
+Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a
+setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is
+responsible for handling the aggregation of multi-valued query string variables into a flattened hash.
+
+2.8 to 3.x
+----------
+
+### Guzzle\Service\Inspector
+
+Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig`
+
+**Before**
+
+```php
+use Guzzle\Service\Inspector;
+
+class YourClient extends \Guzzle\Service\Client
+{
+    public static function factory($config = array())
+    {
+        $default = array();
+        $required = array('base_url', 'username', 'api_key');
+        $config = Inspector::fromConfig($config, $default, $required);
+
+        $client = new self(
+            $config->get('base_url'),
+            $config->get('username'),
+            $config->get('api_key')
+        );
+        $client->setConfig($config);
+
+        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
+
+        return $client;
+    }
+```
+
+**After**
+
+```php
+use Guzzle\Common\Collection;
+
+class YourClient extends \Guzzle\Service\Client
+{
+    public static function factory($config = array())
+    {
+        $default = array();
+        $required = array('base_url', 'username', 'api_key');
+        $config = Collection::fromConfig($config, $default, $required);
+
+        $client = new self(
+            $config->get('base_url'),
+            $config->get('username'),
+            $config->get('api_key')
+        );
+        $client->setConfig($config);
+
+        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
+
+        return $client;
+    }
+```
+
+### Convert XML Service Descriptions to JSON
+
+**Before**
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<client>
+    <commands>
+        <!-- Groups -->
+        <command name="list_groups" method="GET" uri="groups.json">
+            <doc>Get a list of groups</doc>
+        </command>
+        <command name="search_groups" method="GET" uri='search.json?query="{{query}} type:group"'>
+            <doc>Uses a search query to get a list of groups</doc>
+            <param name="query" type="string" required="true" />
+        </command>
+        <command name="create_group" method="POST" uri="groups.json">
+            <doc>Create a group</doc>
+            <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
+            <param name="Content-Type" location="header" static="application/json"/>
+        </command>
+        <command name="delete_group" method="DELETE" uri="groups/{{id}}.json">
+            <doc>Delete a group by ID</doc>
+            <param name="id" type="integer" required="true"/>
+        </command>
+        <command name="get_group" method="GET" uri="groups/{{id}}.json">
+            <param name="id" type="integer" required="true"/>
+        </command>
+        <command name="update_group" method="PUT" uri="groups/{{id}}.json">
+            <doc>Update a group</doc>
+            <param name="id" type="integer" required="true"/>
+            <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
+            <param name="Content-Type" location="header" static="application/json"/>
+        </command>
+    </commands>
+</client>
+```
+
+**After**
+
+```json
+{
+    "name":       "Zendesk REST API v2",
+    "apiVersion": "2012-12-31",
+    "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users",
+    "operations": {
+        "list_groups":  {
+            "httpMethod":"GET",
+            "uri":       "groups.json",
+            "summary":   "Get a list of groups"
+        },
+        "search_groups":{
+            "httpMethod":"GET",
+            "uri":       "search.json?query=\"{query} type:group\"",
+            "summary":   "Uses a search query to get a list of groups",
+            "parameters":{
+                "query":{
+                    "location":   "uri",
+                    "description":"Zendesk Search Query",
+                    "type":       "string",
+                    "required":   true
+                }
+            }
+        },
+        "create_group": {
+            "httpMethod":"POST",
+            "uri":       "groups.json",
+            "summary":   "Create a group",
+            "parameters":{
+                "data":        {
+                    "type":       "array",
+                    "location":   "body",
+                    "description":"Group JSON",
+                    "filters":    "json_encode",
+                    "required":   true
+                },
+                "Content-Type":{
+                    "type":    "string",
+                    "location":"header",
+                    "static":  "application/json"
+                }
+            }
+        },
+        "delete_group": {
+            "httpMethod":"DELETE",
+            "uri":       "groups/{id}.json",
+            "summary":   "Delete a group",
+            "parameters":{
+                "id":{
+                    "location":   "uri",
+                    "description":"Group to delete by ID",
+                    "type":       "integer",
+                    "required":   true
+                }
+            }
+        },
+        "get_group":    {
+            "httpMethod":"GET",
+            "uri":       "groups/{id}.json",
+            "summary":   "Get a ticket",
+            "parameters":{
+                "id":{
+                    "location":   "uri",
+                    "description":"Group to get by ID",
+                    "type":       "integer",
+                    "required":   true
+                }
+            }
+        },
+        "update_group": {
+            "httpMethod":"PUT",
+            "uri":       "groups/{id}.json",
+            "summary":   "Update a group",
+            "parameters":{
+                "id":          {
+                    "location":   "uri",
+                    "description":"Group to update by ID",
+                    "type":       "integer",
+                    "required":   true
+                },
+                "data":        {
+                    "type":       "array",
+                    "location":   "body",
+                    "description":"Group JSON",
+                    "filters":    "json_encode",
+                    "required":   true
+                },
+                "Content-Type":{
+                    "type":    "string",
+                    "location":"header",
+                    "static":  "application/json"
+                }
+            }
+        }
+}
+```
+
+### Guzzle\Service\Description\ServiceDescription
+
+Commands are now called Operations
+
+**Before**
+
+```php
+use Guzzle\Service\Description\ServiceDescription;
+
+$sd = new ServiceDescription();
+$sd->getCommands();     // @returns ApiCommandInterface[]
+$sd->hasCommand($name);
+$sd->getCommand($name); // @returns ApiCommandInterface|null
+$sd->addCommand($command); // @param ApiCommandInterface $command
+```
+
+**After**
+
+```php
+use Guzzle\Service\Description\ServiceDescription;
+
+$sd = new ServiceDescription();
+$sd->getOperations();           // @returns OperationInterface[]
+$sd->hasOperation($name);
+$sd->getOperation($name);       // @returns OperationInterface|null
+$sd->addOperation($operation);  // @param OperationInterface $operation
+```
+
+### Guzzle\Common\Inflection\Inflector
+
+Namespace is now `Guzzle\Inflection\Inflector`
+
+### Guzzle\Http\Plugin
+
+Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.
+
+### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log
+
+Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively.
+
+**Before**
+
+```php
+use Guzzle\Common\Log\ClosureLogAdapter;
+use Guzzle\Http\Plugin\LogPlugin;
+
+/** @var \Guzzle\Http\Client */
+$client;
+
+// $verbosity is an integer indicating desired message verbosity level
+$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);
+```
+
+**After**
+
+```php
+use Guzzle\Log\ClosureLogAdapter;
+use Guzzle\Log\MessageFormatter;
+use Guzzle\Plugin\Log\LogPlugin;
+
+/** @var \Guzzle\Http\Client */
+$client;
+
+// $format is a string indicating desired message format -- @see MessageFormatter
+$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);
+```
+
+### Guzzle\Http\Plugin\CurlAuthPlugin
+
+Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`.
+
+### Guzzle\Http\Plugin\ExponentialBackoffPlugin
+
+Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes.
+
+**Before**
+
+```php
+use Guzzle\Http\Plugin\ExponentialBackoffPlugin;
+
+$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(
+        ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)
+    ));
+
+$client->addSubscriber($backoffPlugin);
+```
+
+**After**
+
+```php
+use Guzzle\Plugin\Backoff\BackoffPlugin;
+use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
+
+// Use convenient factory method instead -- see implementation for ideas of what
+// you can do with chaining backoff strategies
+$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(
+        HttpBackoffStrategy::getDefaultFailureCodes(), array(429)
+    ));
+$client->addSubscriber($backoffPlugin);
+```
+
+### Known Issues
+
+#### [BUG] Accept-Encoding header behavior changed unintentionally.
+
+(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)
+
+In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to
+properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.
+See issue #217 for a workaround, or use a version containing the fix.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/composer.json b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/composer.json
new file mode 100644
index 000000000..65687a582
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/composer.json
@@ -0,0 +1,44 @@
+{
+    "name": "guzzlehttp/guzzle",
+    "type": "library",
+    "description": "Guzzle is a PHP HTTP client library",
+    "keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"],
+    "homepage": "http://guzzlephp.org/",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.5",
+        "guzzlehttp/psr7": "^1.4",
+        "guzzlehttp/promises": "^1.0"
+    },
+    "require-dev": {
+        "ext-curl": "*",
+        "phpunit/phpunit": "^4.0 || ^5.0",
+        "psr/log": "^1.0"
+    },
+    "autoload": {
+        "files": ["src/functions_include.php"],
+        "psr-4": {
+            "GuzzleHttp\\": "src/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "GuzzleHttp\\Tests\\": "tests/"
+        }
+    },
+    "suggest": {
+        "psr/log": "Required for using the Log middleware"
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "6.2-dev"
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Client.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Client.php
new file mode 100644
index 000000000..de4df8a5c
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Client.php
@@ -0,0 +1,414 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Cookie\CookieJar;
+use GuzzleHttp\Promise;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\UriInterface;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * @method ResponseInterface get(string|UriInterface $uri, array $options = [])
+ * @method ResponseInterface head(string|UriInterface $uri, array $options = [])
+ * @method ResponseInterface put(string|UriInterface $uri, array $options = [])
+ * @method ResponseInterface post(string|UriInterface $uri, array $options = [])
+ * @method ResponseInterface patch(string|UriInterface $uri, array $options = [])
+ * @method ResponseInterface delete(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface getAsync(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface headAsync(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface putAsync(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface postAsync(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface patchAsync(string|UriInterface $uri, array $options = [])
+ * @method Promise\PromiseInterface deleteAsync(string|UriInterface $uri, array $options = [])
+ */
+class Client implements ClientInterface
+{
+    /** @var array Default request options */
+    private $config;
+
+    /**
+     * Clients accept an array of constructor parameters.
+     *
+     * Here's an example of creating a client using a base_uri and an array of
+     * default request options to apply to each request:
+     *
+     *     $client = new Client([
+     *         'base_uri'        => 'http://www.foo.com/1.0/',
+     *         'timeout'         => 0,
+     *         'allow_redirects' => false,
+     *         'proxy'           => '192.168.16.1:10'
+     *     ]);
+     *
+     * Client configuration settings include the following options:
+     *
+     * - handler: (callable) Function that transfers HTTP requests over the
+     *   wire. The function is called with a Psr7\Http\Message\RequestInterface
+     *   and array of transfer options, and must return a
+     *   GuzzleHttp\Promise\PromiseInterface that is fulfilled with a
+     *   Psr7\Http\Message\ResponseInterface on success. "handler" is a
+     *   constructor only option that cannot be overridden in per/request
+     *   options. If no handler is provided, a default handler will be created
+     *   that enables all of the request options below by attaching all of the
+     *   default middleware to the handler.
+     * - base_uri: (string|UriInterface) Base URI of the client that is merged
+     *   into relative URIs. Can be a string or instance of UriInterface.
+     * - **: any request option
+     *
+     * @param array $config Client configuration settings.
+     *
+     * @see \GuzzleHttp\RequestOptions for a list of available request options.
+     */
+    public function __construct(array $config = [])
+    {
+        if (!isset($config['handler'])) {
+            $config['handler'] = HandlerStack::create();
+        } elseif (!is_callable($config['handler'])) {
+            throw new \InvalidArgumentException('handler must be a callable');
+        }
+
+        // Convert the base_uri to a UriInterface
+        if (isset($config['base_uri'])) {
+            $config['base_uri'] = Psr7\uri_for($config['base_uri']);
+        }
+
+        $this->configureDefaults($config);
+    }
+
+    public function __call($method, $args)
+    {
+        if (count($args) < 1) {
+            throw new \InvalidArgumentException('Magic request methods require a URI and optional options array');
+        }
+
+        $uri = $args[0];
+        $opts = isset($args[1]) ? $args[1] : [];
+
+        return substr($method, -5) === 'Async'
+            ? $this->requestAsync(substr($method, 0, -5), $uri, $opts)
+            : $this->request($method, $uri, $opts);
+    }
+
+    public function sendAsync(RequestInterface $request, array $options = [])
+    {
+        // Merge the base URI into the request URI if needed.
+        $options = $this->prepareDefaults($options);
+
+        return $this->transfer(
+            $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),
+            $options
+        );
+    }
+
+    public function send(RequestInterface $request, array $options = [])
+    {
+        $options[RequestOptions::SYNCHRONOUS] = true;
+        return $this->sendAsync($request, $options)->wait();
+    }
+
+    public function requestAsync($method, $uri = '', array $options = [])
+    {
+        $options = $this->prepareDefaults($options);
+        // Remove request modifying parameter because it can be done up-front.
+        $headers = isset($options['headers']) ? $options['headers'] : [];
+        $body = isset($options['body']) ? $options['body'] : null;
+        $version = isset($options['version']) ? $options['version'] : '1.1';
+        // Merge the URI into the base URI.
+        $uri = $this->buildUri($uri, $options);
+        if (is_array($body)) {
+            $this->invalidBody();
+        }
+        $request = new Psr7\Request($method, $uri, $headers, $body, $version);
+        // Remove the option so that they are not doubly-applied.
+        unset($options['headers'], $options['body'], $options['version']);
+
+        return $this->transfer($request, $options);
+    }
+
+    public function request($method, $uri = '', array $options = [])
+    {
+        $options[RequestOptions::SYNCHRONOUS] = true;
+        return $this->requestAsync($method, $uri, $options)->wait();
+    }
+
+    public function getConfig($option = null)
+    {
+        return $option === null
+            ? $this->config
+            : (isset($this->config[$option]) ? $this->config[$option] : null);
+    }
+
+    private function buildUri($uri, array $config)
+    {
+        // for BC we accept null which would otherwise fail in uri_for
+        $uri = Psr7\uri_for($uri === null ? '' : $uri);
+
+        if (isset($config['base_uri'])) {
+            $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri);
+        }
+
+        return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;
+    }
+
+    /**
+     * Configures the default options for a client.
+     *
+     * @param array $config
+     */
+    private function configureDefaults(array $config)
+    {
+        $defaults = [
+            'allow_redirects' => RedirectMiddleware::$defaultSettings,
+            'http_errors'     => true,
+            'decode_content'  => true,
+            'verify'          => true,
+            'cookies'         => false
+        ];
+
+        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
+
+        // We can only trust the HTTP_PROXY environment variable in a CLI
+        // process due to the fact that PHP has no reliable mechanism to
+        // get environment variables that start with "HTTP_".
+        if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {
+            $defaults['proxy']['http'] = getenv('HTTP_PROXY');
+        }
+
+        if ($proxy = getenv('HTTPS_PROXY')) {
+            $defaults['proxy']['https'] = $proxy;
+        }
+
+        if ($noProxy = getenv('NO_PROXY')) {
+            $cleanedNoProxy = str_replace(' ', '', $noProxy);
+            $defaults['proxy']['no'] = explode(',', $cleanedNoProxy);
+        }
+
+        $this->config = $config + $defaults;
+
+        if (!empty($config['cookies']) && $config['cookies'] === true) {
+            $this->config['cookies'] = new CookieJar();
+        }
+
+        // Add the default user-agent header.
+        if (!isset($this->config['headers'])) {
+            $this->config['headers'] = ['User-Agent' => default_user_agent()];
+        } else {
+            // Add the User-Agent header if one was not already set.
+            foreach (array_keys($this->config['headers']) as $name) {
+                if (strtolower($name) === 'user-agent') {
+                    return;
+                }
+            }
+            $this->config['headers']['User-Agent'] = default_user_agent();
+        }
+    }
+
+    /**
+     * Merges default options into the array.
+     *
+     * @param array $options Options to modify by reference
+     *
+     * @return array
+     */
+    private function prepareDefaults($options)
+    {
+        $defaults = $this->config;
+
+        if (!empty($defaults['headers'])) {
+            // Default headers are only added if they are not present.
+            $defaults['_conditional'] = $defaults['headers'];
+            unset($defaults['headers']);
+        }
+
+        // Special handling for headers is required as they are added as
+        // conditional headers and as headers passed to a request ctor.
+        if (array_key_exists('headers', $options)) {
+            // Allows default headers to be unset.
+            if ($options['headers'] === null) {
+                $defaults['_conditional'] = null;
+                unset($options['headers']);
+            } elseif (!is_array($options['headers'])) {
+                throw new \InvalidArgumentException('headers must be an array');
+            }
+        }
+
+        // Shallow merge defaults underneath options.
+        $result = $options + $defaults;
+
+        // Remove null values.
+        foreach ($result as $k => $v) {
+            if ($v === null) {
+                unset($result[$k]);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Transfers the given request and applies request options.
+     *
+     * The URI of the request is not modified and the request options are used
+     * as-is without merging in default options.
+     *
+     * @param RequestInterface $request
+     * @param array            $options
+     *
+     * @return Promise\PromiseInterface
+     */
+    private function transfer(RequestInterface $request, array $options)
+    {
+        // save_to -> sink
+        if (isset($options['save_to'])) {
+            $options['sink'] = $options['save_to'];
+            unset($options['save_to']);
+        }
+
+        // exceptions -> http_errors
+        if (isset($options['exceptions'])) {
+            $options['http_errors'] = $options['exceptions'];
+            unset($options['exceptions']);
+        }
+
+        $request = $this->applyOptions($request, $options);
+        $handler = $options['handler'];
+
+        try {
+            return Promise\promise_for($handler($request, $options));
+        } catch (\Exception $e) {
+            return Promise\rejection_for($e);
+        }
+    }
+
+    /**
+     * Applies the array of request options to a request.
+     *
+     * @param RequestInterface $request
+     * @param array            $options
+     *
+     * @return RequestInterface
+     */
+    private function applyOptions(RequestInterface $request, array &$options)
+    {
+        $modify = [];
+
+        if (isset($options['form_params'])) {
+            if (isset($options['multipart'])) {
+                throw new \InvalidArgumentException('You cannot use '
+                    . 'form_params and multipart at the same time. Use the '
+                    . 'form_params option if you want to send application/'
+                    . 'x-www-form-urlencoded requests, and the multipart '
+                    . 'option to send multipart/form-data requests.');
+            }
+            $options['body'] = http_build_query($options['form_params'], '', '&');
+            unset($options['form_params']);
+            $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
+        }
+
+        if (isset($options['multipart'])) {
+            $options['body'] = new Psr7\MultipartStream($options['multipart']);
+            unset($options['multipart']);
+        }
+
+        if (isset($options['json'])) {
+            $options['body'] = \GuzzleHttp\json_encode($options['json']);
+            unset($options['json']);
+            $options['_conditional']['Content-Type'] = 'application/json';
+        }
+
+        if (!empty($options['decode_content'])
+            && $options['decode_content'] !== true
+        ) {
+            $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
+        }
+
+        if (isset($options['headers'])) {
+            if (isset($modify['set_headers'])) {
+                $modify['set_headers'] = $options['headers'] + $modify['set_headers'];
+            } else {
+                $modify['set_headers'] = $options['headers'];
+            }
+            unset($options['headers']);
+        }
+
+        if (isset($options['body'])) {
+            if (is_array($options['body'])) {
+                $this->invalidBody();
+            }
+            $modify['body'] = Psr7\stream_for($options['body']);
+            unset($options['body']);
+        }
+
+        if (!empty($options['auth']) && is_array($options['auth'])) {
+            $value = $options['auth'];
+            $type = isset($value[2]) ? strtolower($value[2]) : 'basic';
+            switch ($type) {
+                case 'basic':
+                    $modify['set_headers']['Authorization'] = 'Basic '
+                        . base64_encode("$value[0]:$value[1]");
+                    break;
+                case 'digest':
+                    // @todo: Do not rely on curl
+                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST;
+                    $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
+                    break;
+                case 'ntlm':
+                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM;
+                    $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
+                    break;
+            }
+        }
+
+        if (isset($options['query'])) {
+            $value = $options['query'];
+            if (is_array($value)) {
+                $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);
+            }
+            if (!is_string($value)) {
+                throw new \InvalidArgumentException('query must be a string or array');
+            }
+            $modify['query'] = $value;
+            unset($options['query']);
+        }
+
+        // Ensure that sink is not an invalid value.
+        if (isset($options['sink'])) {
+            // TODO: Add more sink validation?
+            if (is_bool($options['sink'])) {
+                throw new \InvalidArgumentException('sink must not be a boolean');
+            }
+        }
+
+        $request = Psr7\modify_request($request, $modify);
+        if ($request->getBody() instanceof Psr7\MultipartStream) {
+            // Use a multipart/form-data POST if a Content-Type is not set.
+            $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
+                . $request->getBody()->getBoundary();
+        }
+
+        // Merge in conditional headers if they are not present.
+        if (isset($options['_conditional'])) {
+            // Build up the changes so it's in a single clone of the message.
+            $modify = [];
+            foreach ($options['_conditional'] as $k => $v) {
+                if (!$request->hasHeader($k)) {
+                    $modify['set_headers'][$k] = $v;
+                }
+            }
+            $request = Psr7\modify_request($request, $modify);
+            // Don't pass this internal value along to middleware/handlers.
+            unset($options['_conditional']);
+        }
+
+        return $request;
+    }
+
+    private function invalidBody()
+    {
+        throw new \InvalidArgumentException('Passing in the "body" request '
+            . 'option as an array to send a POST request has been deprecated. '
+            . 'Please use the "form_params" request option to send a '
+            . 'application/x-www-form-urlencoded request, or the "multipart" '
+            . 'request option to send a multipart/form-data request.');
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/ClientInterface.php
new file mode 100644
index 000000000..2050309de
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -0,0 +1,84 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Exception\GuzzleException;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Client interface for sending HTTP requests.
+ */
+interface ClientInterface
+{
+    const VERSION = '6.3.0';
+
+    /**
+     * Send an HTTP request.
+     *
+     * @param RequestInterface $request Request to send
+     * @param array            $options Request options to apply to the given
+     *                                  request and to the transfer.
+     *
+     * @return ResponseInterface
+     * @throws GuzzleException
+     */
+    public function send(RequestInterface $request, array $options = []);
+
+    /**
+     * Asynchronously send an HTTP request.
+     *
+     * @param RequestInterface $request Request to send
+     * @param array            $options Request options to apply to the given
+     *                                  request and to the transfer.
+     *
+     * @return PromiseInterface
+     */
+    public function sendAsync(RequestInterface $request, array $options = []);
+
+    /**
+     * Create and send an HTTP request.
+     *
+     * Use an absolute path to override the base path of the client, or a
+     * relative path to append to the base path of the client. The URL can
+     * contain the query string as well.
+     *
+     * @param string              $method  HTTP method.
+     * @param string|UriInterface $uri     URI object or string.
+     * @param array               $options Request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws GuzzleException
+     */
+    public function request($method, $uri, array $options = []);
+
+    /**
+     * Create and send an asynchronous HTTP request.
+     *
+     * Use an absolute path to override the base path of the client, or a
+     * relative path to append to the base path of the client. The URL can
+     * contain the query string as well. Use an array to provide a URL
+     * template and additional variables to use in the URL template expansion.
+     *
+     * @param string              $method  HTTP method
+     * @param string|UriInterface $uri     URI object or string.
+     * @param array               $options Request options to apply.
+     *
+     * @return PromiseInterface
+     */
+    public function requestAsync($method, $uri, array $options = []);
+
+    /**
+     * Get a client configuration option.
+     *
+     * These options include default request options of the client, a "handler"
+     * (if utilized by the concrete client), and a "base_uri" if utilized by
+     * the concrete client.
+     *
+     * @param string|null $option The config option to retrieve.
+     *
+     * @return mixed
+     */
+    public function getConfig($option = null);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
new file mode 100644
index 000000000..1c17b5a43
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
@@ -0,0 +1,314 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Cookie jar that stores cookies as an array
+ */
+class CookieJar implements CookieJarInterface
+{
+    /** @var SetCookie[] Loaded cookie data */
+    private $cookies = [];
+
+    /** @var bool */
+    private $strictMode;
+
+    /**
+     * @param bool $strictMode   Set to true to throw exceptions when invalid
+     *                           cookies are added to the cookie jar.
+     * @param array $cookieArray Array of SetCookie objects or a hash of
+     *                           arrays that can be used with the SetCookie
+     *                           constructor
+     */
+    public function __construct($strictMode = false, $cookieArray = [])
+    {
+        $this->strictMode = $strictMode;
+
+        foreach ($cookieArray as $cookie) {
+            if (!($cookie instanceof SetCookie)) {
+                $cookie = new SetCookie($cookie);
+            }
+            $this->setCookie($cookie);
+        }
+    }
+
+    /**
+     * Create a new Cookie jar from an associative array and domain.
+     *
+     * @param array  $cookies Cookies to create the jar from
+     * @param string $domain  Domain to set the cookies to
+     *
+     * @return self
+     */
+    public static function fromArray(array $cookies, $domain)
+    {
+        $cookieJar = new self();
+        foreach ($cookies as $name => $value) {
+            $cookieJar->setCookie(new SetCookie([
+                'Domain'  => $domain,
+                'Name'    => $name,
+                'Value'   => $value,
+                'Discard' => true
+            ]));
+        }
+
+        return $cookieJar;
+    }
+
+    /**
+     * @deprecated
+     */
+    public static function getCookieValue($value)
+    {
+        return $value;
+    }
+
+    /**
+     * Evaluate if this cookie should be persisted to storage
+     * that survives between requests.
+     *
+     * @param SetCookie $cookie Being evaluated.
+     * @param bool $allowSessionCookies If we should persist session cookies
+     * @return bool
+     */
+    public static function shouldPersist(
+        SetCookie $cookie,
+        $allowSessionCookies = false
+    ) {
+        if ($cookie->getExpires() || $allowSessionCookies) {
+            if (!$cookie->getDiscard()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Finds and returns the cookie based on the name
+     *
+     * @param string $name cookie name to search for
+     * @return SetCookie|null cookie that was found or null if not found
+     */
+    public function getCookieByName($name)
+    {
+        // don't allow a null name
+        if($name === null) {
+            return null;
+        }
+        foreach($this->cookies as $cookie) {
+            if($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
+                return $cookie;
+            }
+        }
+    }
+
+    public function toArray()
+    {
+        return array_map(function (SetCookie $cookie) {
+            return $cookie->toArray();
+        }, $this->getIterator()->getArrayCopy());
+    }
+
+    public function clear($domain = null, $path = null, $name = null)
+    {
+        if (!$domain) {
+            $this->cookies = [];
+            return;
+        } elseif (!$path) {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain) {
+                    return !$cookie->matchesDomain($domain);
+                }
+            );
+        } elseif (!$name) {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain) {
+                    return !($cookie->matchesPath($path) &&
+                        $cookie->matchesDomain($domain));
+                }
+            );
+        } else {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain, $name) {
+                    return !($cookie->getName() == $name &&
+                        $cookie->matchesPath($path) &&
+                        $cookie->matchesDomain($domain));
+                }
+            );
+        }
+    }
+
+    public function clearSessionCookies()
+    {
+        $this->cookies = array_filter(
+            $this->cookies,
+            function (SetCookie $cookie) {
+                return !$cookie->getDiscard() && $cookie->getExpires();
+            }
+        );
+    }
+
+    public function setCookie(SetCookie $cookie)
+    {
+        // If the name string is empty (but not 0), ignore the set-cookie
+        // string entirely.
+        $name = $cookie->getName();
+        if (!$name && $name !== '0') {
+            return false;
+        }
+
+        // Only allow cookies with set and valid domain, name, value
+        $result = $cookie->validate();
+        if ($result !== true) {
+            if ($this->strictMode) {
+                throw new \RuntimeException('Invalid cookie: ' . $result);
+            } else {
+                $this->removeCookieIfEmpty($cookie);
+                return false;
+            }
+        }
+
+        // Resolve conflicts with previously set cookies
+        foreach ($this->cookies as $i => $c) {
+
+            // Two cookies are identical, when their path, and domain are
+            // identical.
+            if ($c->getPath() != $cookie->getPath() ||
+                $c->getDomain() != $cookie->getDomain() ||
+                $c->getName() != $cookie->getName()
+            ) {
+                continue;
+            }
+
+            // The previously set cookie is a discard cookie and this one is
+            // not so allow the new cookie to be set
+            if (!$cookie->getDiscard() && $c->getDiscard()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // If the new cookie's expiration is further into the future, then
+            // replace the old cookie
+            if ($cookie->getExpires() > $c->getExpires()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // If the value has changed, we better change it
+            if ($cookie->getValue() !== $c->getValue()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // The cookie exists, so no need to continue
+            return false;
+        }
+
+        $this->cookies[] = $cookie;
+
+        return true;
+    }
+
+    public function count()
+    {
+        return count($this->cookies);
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator(array_values($this->cookies));
+    }
+
+    public function extractCookies(
+        RequestInterface $request,
+        ResponseInterface $response
+    ) {
+        if ($cookieHeader = $response->getHeader('Set-Cookie')) {
+            foreach ($cookieHeader as $cookie) {
+                $sc = SetCookie::fromString($cookie);
+                if (!$sc->getDomain()) {
+                    $sc->setDomain($request->getUri()->getHost());
+                }
+                if (0 !== strpos($sc->getPath(), '/')) {
+                    $sc->setPath($this->getCookiePathFromRequest($request));
+                }
+                $this->setCookie($sc);
+            }
+        }
+    }
+
+    /**
+     * Computes cookie path following RFC 6265 section 5.1.4
+     *
+     * @link https://tools.ietf.org/html/rfc6265#section-5.1.4
+     *
+     * @param RequestInterface $request
+     * @return string
+     */
+    private function getCookiePathFromRequest(RequestInterface $request)
+    {
+        $uriPath = $request->getUri()->getPath();
+        if (''  === $uriPath) {
+            return '/';
+        }
+        if (0 !== strpos($uriPath, '/')) {
+            return '/';
+        }
+        if ('/' === $uriPath) {
+            return '/';
+        }
+        if (0 === $lastSlashPos = strrpos($uriPath, '/')) {
+            return '/';
+        }
+
+        return substr($uriPath, 0, $lastSlashPos);
+    }
+
+    public function withCookieHeader(RequestInterface $request)
+    {
+        $values = [];
+        $uri = $request->getUri();
+        $scheme = $uri->getScheme();
+        $host = $uri->getHost();
+        $path = $uri->getPath() ?: '/';
+
+        foreach ($this->cookies as $cookie) {
+            if ($cookie->matchesPath($path) &&
+                $cookie->matchesDomain($host) &&
+                !$cookie->isExpired() &&
+                (!$cookie->getSecure() || $scheme === 'https')
+            ) {
+                $values[] = $cookie->getName() . '='
+                    . $cookie->getValue();
+            }
+        }
+
+        return $values
+            ? $request->withHeader('Cookie', implode('; ', $values))
+            : $request;
+    }
+
+    /**
+     * If a cookie already exists and the server asks to set it again with a
+     * null value, the cookie must be deleted.
+     *
+     * @param SetCookie $cookie
+     */
+    private function removeCookieIfEmpty(SetCookie $cookie)
+    {
+        $cookieValue = $cookie->getValue();
+        if ($cookieValue === null || $cookieValue === '') {
+            $this->clear(
+                $cookie->getDomain(),
+                $cookie->getPath(),
+                $cookie->getName()
+            );
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
new file mode 100644
index 000000000..2cf298a86
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
@@ -0,0 +1,84 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Stores HTTP cookies.
+ *
+ * It extracts cookies from HTTP requests, and returns them in HTTP responses.
+ * CookieJarInterface instances automatically expire contained cookies when
+ * necessary. Subclasses are also responsible for storing and retrieving
+ * cookies from a file, database, etc.
+ *
+ * @link http://docs.python.org/2/library/cookielib.html Inspiration
+ */
+interface CookieJarInterface extends \Countable, \IteratorAggregate
+{
+    /**
+     * Create a request with added cookie headers.
+     *
+     * If no matching cookies are found in the cookie jar, then no Cookie
+     * header is added to the request and the same request is returned.
+     *
+     * @param RequestInterface $request Request object to modify.
+     *
+     * @return RequestInterface returns the modified request.
+     */
+    public function withCookieHeader(RequestInterface $request);
+
+    /**
+     * Extract cookies from an HTTP response and store them in the CookieJar.
+     *
+     * @param RequestInterface  $request  Request that was sent
+     * @param ResponseInterface $response Response that was received
+     */
+    public function extractCookies(
+        RequestInterface $request,
+        ResponseInterface $response
+    );
+
+    /**
+     * Sets a cookie in the cookie jar.
+     *
+     * @param SetCookie $cookie Cookie to set.
+     *
+     * @return bool Returns true on success or false on failure
+     */
+    public function setCookie(SetCookie $cookie);
+
+    /**
+     * Remove cookies currently held in the cookie jar.
+     *
+     * Invoking this method without arguments will empty the whole cookie jar.
+     * If given a $domain argument only cookies belonging to that domain will
+     * be removed. If given a $domain and $path argument, cookies belonging to
+     * the specified path within that domain are removed. If given all three
+     * arguments, then the cookie with the specified name, path and domain is
+     * removed.
+     *
+     * @param string $domain Clears cookies matching a domain
+     * @param string $path   Clears cookies matching a domain and path
+     * @param string $name   Clears cookies matching a domain, path, and name
+     *
+     * @return CookieJarInterface
+     */
+    public function clear($domain = null, $path = null, $name = null);
+
+    /**
+     * Discard all sessions cookies.
+     *
+     * Removes cookies that don't have an expire field or a have a discard
+     * field set to true. To be called when the user agent shuts down according
+     * to RFC 2965.
+     */
+    public function clearSessionCookies();
+
+    /**
+     * Converts the cookie jar to an array.
+     *
+     * @return array
+     */
+    public function toArray();
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
new file mode 100644
index 000000000..9887c1d54
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
@@ -0,0 +1,90 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+/**
+ * Persists non-session cookies using a JSON formatted file
+ */
+class FileCookieJar extends CookieJar
+{
+    /** @var string filename */
+    private $filename;
+
+    /** @var bool Control whether to persist session cookies or not. */
+    private $storeSessionCookies;
+
+    /**
+     * Create a new FileCookieJar object
+     *
+     * @param string $cookieFile        File to store the cookie data
+     * @param bool $storeSessionCookies Set to true to store session cookies
+     *                                  in the cookie jar.
+     *
+     * @throws \RuntimeException if the file cannot be found or created
+     */
+    public function __construct($cookieFile, $storeSessionCookies = false)
+    {
+        $this->filename = $cookieFile;
+        $this->storeSessionCookies = $storeSessionCookies;
+
+        if (file_exists($cookieFile)) {
+            $this->load($cookieFile);
+        }
+    }
+
+    /**
+     * Saves the file when shutting down
+     */
+    public function __destruct()
+    {
+        $this->save($this->filename);
+    }
+
+    /**
+     * Saves the cookies to a file.
+     *
+     * @param string $filename File to save
+     * @throws \RuntimeException if the file cannot be found or created
+     */
+    public function save($filename)
+    {
+        $json = [];
+        foreach ($this as $cookie) {
+            /** @var SetCookie $cookie */
+            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
+                $json[] = $cookie->toArray();
+            }
+        }
+
+        $jsonStr = \GuzzleHttp\json_encode($json);
+        if (false === file_put_contents($filename, $jsonStr)) {
+            throw new \RuntimeException("Unable to save file {$filename}");
+        }
+    }
+
+    /**
+     * Load cookies from a JSON formatted file.
+     *
+     * Old cookies are kept unless overwritten by newly loaded ones.
+     *
+     * @param string $filename Cookie file to load.
+     * @throws \RuntimeException if the file cannot be loaded.
+     */
+    public function load($filename)
+    {
+        $json = file_get_contents($filename);
+        if (false === $json) {
+            throw new \RuntimeException("Unable to load file {$filename}");
+        } elseif ($json === '') {
+            return;
+        }
+
+        $data = \GuzzleHttp\json_decode($json, true);
+        if (is_array($data)) {
+            foreach (json_decode($json, true) as $cookie) {
+                $this->setCookie(new SetCookie($cookie));
+            }
+        } elseif (strlen($data)) {
+            throw new \RuntimeException("Invalid cookie file: {$filename}");
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
new file mode 100644
index 000000000..e4bfafd4f
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
@@ -0,0 +1,71 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+/**
+ * Persists cookies in the client session
+ */
+class SessionCookieJar extends CookieJar
+{
+    /** @var string session key */
+    private $sessionKey;
+    
+    /** @var bool Control whether to persist session cookies or not. */
+    private $storeSessionCookies;
+
+    /**
+     * Create a new SessionCookieJar object
+     *
+     * @param string $sessionKey        Session key name to store the cookie 
+     *                                  data in session
+     * @param bool $storeSessionCookies Set to true to store session cookies
+     *                                  in the cookie jar.
+     */
+    public function __construct($sessionKey, $storeSessionCookies = false)
+    {
+        $this->sessionKey = $sessionKey;
+        $this->storeSessionCookies = $storeSessionCookies;
+        $this->load();
+    }
+
+    /**
+     * Saves cookies to session when shutting down
+     */
+    public function __destruct()
+    {
+        $this->save();
+    }
+
+    /**
+     * Save cookies to the client session
+     */
+    public function save()
+    {
+        $json = [];
+        foreach ($this as $cookie) {
+            /** @var SetCookie $cookie */
+            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
+                $json[] = $cookie->toArray();
+            }
+        }
+
+        $_SESSION[$this->sessionKey] = json_encode($json);
+    }
+
+    /**
+     * Load the contents of the client session into the data array
+     */
+    protected function load()
+    {
+        if (!isset($_SESSION[$this->sessionKey])) {
+            return;
+        }
+        $data = json_decode($_SESSION[$this->sessionKey], true);
+        if (is_array($data)) {
+            foreach ($data as $cookie) {
+                $this->setCookie(new SetCookie($cookie));
+            }
+        } elseif (strlen($data)) {
+            throw new \RuntimeException("Invalid cookie data");
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
new file mode 100644
index 000000000..c911e2a3f
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
@@ -0,0 +1,404 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+/**
+ * Set-Cookie object
+ */
+class SetCookie
+{
+    /** @var array */
+    private static $defaults = [
+        'Name'     => null,
+        'Value'    => null,
+        'Domain'   => null,
+        'Path'     => '/',
+        'Max-Age'  => null,
+        'Expires'  => null,
+        'Secure'   => false,
+        'Discard'  => false,
+        'HttpOnly' => false
+    ];
+
+    /** @var array Cookie data */
+    private $data;
+
+    /**
+     * Create a new SetCookie object from a string
+     *
+     * @param string $cookie Set-Cookie header string
+     *
+     * @return self
+     */
+    public static function fromString($cookie)
+    {
+        // Create the default return array
+        $data = self::$defaults;
+        // Explode the cookie string using a series of semicolons
+        $pieces = array_filter(array_map('trim', explode(';', $cookie)));
+        // The name of the cookie (first kvp) must include an equal sign.
+        if (empty($pieces) || !strpos($pieces[0], '=')) {
+            return new self($data);
+        }
+
+        // Add the cookie pieces into the parsed data array
+        foreach ($pieces as $part) {
+
+            $cookieParts = explode('=', $part, 2);
+            $key = trim($cookieParts[0]);
+            $value = isset($cookieParts[1])
+                ? trim($cookieParts[1], " \n\r\t\0\x0B")
+                : true;
+
+            // Only check for non-cookies when cookies have been found
+            if (empty($data['Name'])) {
+                $data['Name'] = $key;
+                $data['Value'] = $value;
+            } else {
+                foreach (array_keys(self::$defaults) as $search) {
+                    if (!strcasecmp($search, $key)) {
+                        $data[$search] = $value;
+                        continue 2;
+                    }
+                }
+                $data[$key] = $value;
+            }
+        }
+
+        return new self($data);
+    }
+
+    /**
+     * @param array $data Array of cookie data provided by a Cookie parser
+     */
+    public function __construct(array $data = [])
+    {
+        $this->data = array_replace(self::$defaults, $data);
+        // Extract the Expires value and turn it into a UNIX timestamp if needed
+        if (!$this->getExpires() && $this->getMaxAge()) {
+            // Calculate the Expires date
+            $this->setExpires(time() + $this->getMaxAge());
+        } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {
+            $this->setExpires($this->getExpires());
+        }
+    }
+
+    public function __toString()
+    {
+        $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';
+        foreach ($this->data as $k => $v) {
+            if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
+                if ($k === 'Expires') {
+                    $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
+                } else {
+                    $str .= ($v === true ? $k : "{$k}={$v}") . '; ';
+                }
+            }
+        }
+
+        return rtrim($str, '; ');
+    }
+
+    public function toArray()
+    {
+        return $this->data;
+    }
+
+    /**
+     * Get the cookie name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->data['Name'];
+    }
+
+    /**
+     * Set the cookie name
+     *
+     * @param string $name Cookie name
+     */
+    public function setName($name)
+    {
+        $this->data['Name'] = $name;
+    }
+
+    /**
+     * Get the cookie value
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->data['Value'];
+    }
+
+    /**
+     * Set the cookie value
+     *
+     * @param string $value Cookie value
+     */
+    public function setValue($value)
+    {
+        $this->data['Value'] = $value;
+    }
+
+    /**
+     * Get the domain
+     *
+     * @return string|null
+     */
+    public function getDomain()
+    {
+        return $this->data['Domain'];
+    }
+
+    /**
+     * Set the domain of the cookie
+     *
+     * @param string $domain
+     */
+    public function setDomain($domain)
+    {
+        $this->data['Domain'] = $domain;
+    }
+
+    /**
+     * Get the path
+     *
+     * @return string
+     */
+    public function getPath()
+    {
+        return $this->data['Path'];
+    }
+
+    /**
+     * Set the path of the cookie
+     *
+     * @param string $path Path of the cookie
+     */
+    public function setPath($path)
+    {
+        $this->data['Path'] = $path;
+    }
+
+    /**
+     * Maximum lifetime of the cookie in seconds
+     *
+     * @return int|null
+     */
+    public function getMaxAge()
+    {
+        return $this->data['Max-Age'];
+    }
+
+    /**
+     * Set the max-age of the cookie
+     *
+     * @param int $maxAge Max age of the cookie in seconds
+     */
+    public function setMaxAge($maxAge)
+    {
+        $this->data['Max-Age'] = $maxAge;
+    }
+
+    /**
+     * The UNIX timestamp when the cookie Expires
+     *
+     * @return mixed
+     */
+    public function getExpires()
+    {
+        return $this->data['Expires'];
+    }
+
+    /**
+     * Set the unix timestamp for which the cookie will expire
+     *
+     * @param int $timestamp Unix timestamp
+     */
+    public function setExpires($timestamp)
+    {
+        $this->data['Expires'] = is_numeric($timestamp)
+            ? (int) $timestamp
+            : strtotime($timestamp);
+    }
+
+    /**
+     * Get whether or not this is a secure cookie
+     *
+     * @return null|bool
+     */
+    public function getSecure()
+    {
+        return $this->data['Secure'];
+    }
+
+    /**
+     * Set whether or not the cookie is secure
+     *
+     * @param bool $secure Set to true or false if secure
+     */
+    public function setSecure($secure)
+    {
+        $this->data['Secure'] = $secure;
+    }
+
+    /**
+     * Get whether or not this is a session cookie
+     *
+     * @return null|bool
+     */
+    public function getDiscard()
+    {
+        return $this->data['Discard'];
+    }
+
+    /**
+     * Set whether or not this is a session cookie
+     *
+     * @param bool $discard Set to true or false if this is a session cookie
+     */
+    public function setDiscard($discard)
+    {
+        $this->data['Discard'] = $discard;
+    }
+
+    /**
+     * Get whether or not this is an HTTP only cookie
+     *
+     * @return bool
+     */
+    public function getHttpOnly()
+    {
+        return $this->data['HttpOnly'];
+    }
+
+    /**
+     * Set whether or not this is an HTTP only cookie
+     *
+     * @param bool $httpOnly Set to true or false if this is HTTP only
+     */
+    public function setHttpOnly($httpOnly)
+    {
+        $this->data['HttpOnly'] = $httpOnly;
+    }
+
+    /**
+     * Check if the cookie matches a path value.
+     *
+     * A request-path path-matches a given cookie-path if at least one of
+     * the following conditions holds:
+     *
+     * - The cookie-path and the request-path are identical.
+     * - The cookie-path is a prefix of the request-path, and the last
+     *   character of the cookie-path is %x2F ("/").
+     * - The cookie-path is a prefix of the request-path, and the first
+     *   character of the request-path that is not included in the cookie-
+     *   path is a %x2F ("/") character.
+     *
+     * @param string $requestPath Path to check against
+     *
+     * @return bool
+     */
+    public function matchesPath($requestPath)
+    {
+        $cookiePath = $this->getPath();
+
+        // Match on exact matches or when path is the default empty "/"
+        if ($cookiePath === '/' || $cookiePath == $requestPath) {
+            return true;
+        }
+
+        // Ensure that the cookie-path is a prefix of the request path.
+        if (0 !== strpos($requestPath, $cookiePath)) {
+            return false;
+        }
+
+        // Match if the last character of the cookie-path is "/"
+        if (substr($cookiePath, -1, 1) === '/') {
+            return true;
+        }
+
+        // Match if the first character not included in cookie path is "/"
+        return substr($requestPath, strlen($cookiePath), 1) === '/';
+    }
+
+    /**
+     * Check if the cookie matches a domain value
+     *
+     * @param string $domain Domain to check against
+     *
+     * @return bool
+     */
+    public function matchesDomain($domain)
+    {
+        // Remove the leading '.' as per spec in RFC 6265.
+        // http://tools.ietf.org/html/rfc6265#section-5.2.3
+        $cookieDomain = ltrim($this->getDomain(), '.');
+
+        // Domain not set or exact match.
+        if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {
+            return true;
+        }
+
+        // Matching the subdomain according to RFC 6265.
+        // http://tools.ietf.org/html/rfc6265#section-5.1.3
+        if (filter_var($domain, FILTER_VALIDATE_IP)) {
+            return false;
+        }
+
+        return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/', $domain);
+    }
+
+    /**
+     * Check if the cookie is expired
+     *
+     * @return bool
+     */
+    public function isExpired()
+    {
+        return $this->getExpires() && time() > $this->getExpires();
+    }
+
+    /**
+     * Check if the cookie is valid according to RFC 6265
+     *
+     * @return bool|string Returns true if valid or an error message if invalid
+     */
+    public function validate()
+    {
+        // Names must not be empty, but can be 0
+        $name = $this->getName();
+        if (empty($name) && !is_numeric($name)) {
+            return 'The cookie name must not be empty';
+        }
+
+        // Check if any of the invalid characters are present in the cookie name
+        if (preg_match(
+            '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/',
+            $name)
+        ) {
+            return 'Cookie name must not contain invalid characters: ASCII '
+                . 'Control characters (0-31;127), space, tab and the '
+                . 'following characters: ()<>@,;:\"/?={}';
+        }
+
+        // Value must not be empty, but can be 0
+        $value = $this->getValue();
+        if (empty($value) && !is_numeric($value)) {
+            return 'The cookie value must not be empty';
+        }
+
+        // Domains must not be empty, but can be 0
+        // A "0" is not a valid internet domain, but may be used as server name
+        // in a private network.
+        $domain = $this->getDomain();
+        if (empty($domain) && !is_numeric($domain)) {
+            return 'The cookie domain must not be empty';
+        }
+
+        return true;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
new file mode 100644
index 000000000..427d896fb
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Exception when an HTTP error occurs (4xx or 5xx error)
+ */
+class BadResponseException extends RequestException
+{
+    public function __construct(
+        $message,
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $previous = null,
+        array $handlerContext = []
+    ) {
+        if (null === $response) {
+            @trigger_error(
+                'Instantiating the ' . __CLASS__ . ' class without a Response is deprecated since version 6.3 and will be removed in 7.0.',
+                E_USER_DEPRECATED
+            );
+        }
+        parent::__construct($message, $request, $response, $previous, $handlerContext);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
new file mode 100644
index 000000000..f95c09f2b
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+/**
+ * Exception when a client error is encountered (4xx codes)
+ */
+class ClientException extends BadResponseException {}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
new file mode 100644
index 000000000..d33b0cc19
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
@@ -0,0 +1,37 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Exception thrown when a connection cannot be established.
+ *
+ * Note that no response is present for a ConnectException
+ */
+class ConnectException extends RequestException
+{
+    public function __construct(
+        $message,
+        RequestInterface $request,
+        \Exception $previous = null,
+        array $handlerContext = []
+    ) {
+        parent::__construct($message, $request, null, $previous, $handlerContext);
+    }
+
+    /**
+     * @return null
+     */
+    public function getResponse()
+    {
+        return null;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasResponse()
+    {
+        return false;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
new file mode 100644
index 000000000..c82998e0d
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+interface GuzzleException {}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
new file mode 100644
index 000000000..39de327e7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
@@ -0,0 +1,217 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use GuzzleHttp\Promise\PromiseInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * HTTP Request exception
+ */
+class RequestException extends TransferException
+{
+    /** @var RequestInterface */
+    private $request;
+
+    /** @var ResponseInterface */
+    private $response;
+
+    /** @var array */
+    private $handlerContext;
+
+    public function __construct(
+        $message,
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $previous = null,
+        array $handlerContext = []
+    ) {
+        // Set the code of the exception if the response is set and not future.
+        $code = $response && !($response instanceof PromiseInterface)
+            ? $response->getStatusCode()
+            : 0;
+        parent::__construct($message, $code, $previous);
+        $this->request = $request;
+        $this->response = $response;
+        $this->handlerContext = $handlerContext;
+    }
+
+    /**
+     * Wrap non-RequestExceptions with a RequestException
+     *
+     * @param RequestInterface $request
+     * @param \Exception       $e
+     *
+     * @return RequestException
+     */
+    public static function wrapException(RequestInterface $request, \Exception $e)
+    {
+        return $e instanceof RequestException
+            ? $e
+            : new RequestException($e->getMessage(), $request, null, $e);
+    }
+
+    /**
+     * Factory method to create a new exception with a normalized error message
+     *
+     * @param RequestInterface  $request  Request
+     * @param ResponseInterface $response Response received
+     * @param \Exception        $previous Previous exception
+     * @param array             $ctx      Optional handler context.
+     *
+     * @return self
+     */
+    public static function create(
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $previous = null,
+        array $ctx = []
+    ) {
+        if (!$response) {
+            return new self(
+                'Error completing request',
+                $request,
+                null,
+                $previous,
+                $ctx
+            );
+        }
+
+        $level = (int) floor($response->getStatusCode() / 100);
+        if ($level === 4) {
+            $label = 'Client error';
+            $className = ClientException::class;
+        } elseif ($level === 5) {
+            $label = 'Server error';
+            $className = ServerException::class;
+        } else {
+            $label = 'Unsuccessful request';
+            $className = __CLASS__;
+        }
+
+        $uri = $request->getUri();
+        $uri = static::obfuscateUri($uri);
+
+        // Client Error: `GET /` resulted in a `404 Not Found` response:
+        // <html> ... (truncated)
+        $message = sprintf(
+            '%s: `%s %s` resulted in a `%s %s` response',
+            $label,
+            $request->getMethod(),
+            $uri,
+            $response->getStatusCode(),
+            $response->getReasonPhrase()
+        );
+
+        $summary = static::getResponseBodySummary($response);
+
+        if ($summary !== null) {
+            $message .= ":\n{$summary}\n";
+        }
+
+        return new $className($message, $request, $response, $previous, $ctx);
+    }
+
+    /**
+     * Get a short summary of the response
+     *
+     * Will return `null` if the response is not printable.
+     *
+     * @param ResponseInterface $response
+     *
+     * @return string|null
+     */
+    public static function getResponseBodySummary(ResponseInterface $response)
+    {
+        $body = $response->getBody();
+
+        if (!$body->isSeekable()) {
+            return null;
+        }
+
+        $size = $body->getSize();
+
+        if ($size === 0) {
+            return null;
+        }
+
+        $summary = $body->read(120);
+        $body->rewind();
+
+        if ($size > 120) {
+            $summary .= ' (truncated...)';
+        }
+
+        // Matches any printable character, including unicode characters:
+        // letters, marks, numbers, punctuation, spacing, and separators.
+        if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) {
+            return null;
+        }
+
+        return $summary;
+    }
+
+    /**
+     * Obfuscates URI if there is an username and a password present
+     *
+     * @param UriInterface $uri
+     *
+     * @return UriInterface
+     */
+    private static function obfuscateUri($uri)
+    {
+        $userInfo = $uri->getUserInfo();
+
+        if (false !== ($pos = strpos($userInfo, ':'))) {
+            return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');
+        }
+
+        return $uri;
+    }
+
+    /**
+     * Get the request that caused the exception
+     *
+     * @return RequestInterface
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Get the associated response
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Check if a response was received
+     *
+     * @return bool
+     */
+    public function hasResponse()
+    {
+        return $this->response !== null;
+    }
+
+    /**
+     * Get contextual information about the error from the underlying handler.
+     *
+     * The contents of this array will vary depending on which handler you are
+     * using. It may also be just an empty array. Relying on this data will
+     * couple you to a specific handler, but can give more debug information
+     * when needed.
+     *
+     * @return array
+     */
+    public function getHandlerContext()
+    {
+        return $this->handlerContext;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php
new file mode 100644
index 000000000..a77c28926
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Exception thrown when a seek fails on a stream.
+ */
+class SeekException extends \RuntimeException implements GuzzleException
+{
+    private $stream;
+
+    public function __construct(StreamInterface $stream, $pos = 0, $msg = '')
+    {
+        $this->stream = $stream;
+        $msg = $msg ?: 'Could not seek the stream to position ' . $pos;
+        parent::__construct($msg);
+    }
+
+    /**
+     * @return StreamInterface
+     */
+    public function getStream()
+    {
+        return $this->stream;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
new file mode 100644
index 000000000..7cdd34086
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+/**
+ * Exception when a server error is encountered (5xx codes)
+ */
+class ServerException extends BadResponseException {}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
new file mode 100644
index 000000000..b60a9678d
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class TooManyRedirectsException extends RequestException {}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
new file mode 100644
index 000000000..b92071ca2
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class TransferException extends \RuntimeException implements GuzzleException {}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
new file mode 100644
index 000000000..49808e5c4
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
@@ -0,0 +1,559 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Exception\ConnectException;
+use GuzzleHttp\Promise\FulfilledPromise;
+use GuzzleHttp\Promise\RejectedPromise;
+use GuzzleHttp\Psr7;
+use GuzzleHttp\Psr7\LazyOpenStream;
+use GuzzleHttp\TransferStats;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Creates curl resources from a request
+ */
+class CurlFactory implements CurlFactoryInterface
+{
+    /** @var array */
+    private $handles = [];
+
+    /** @var int Total number of idle handles to keep in cache */
+    private $maxHandles;
+
+    /**
+     * @param int $maxHandles Maximum number of idle handles.
+     */
+    public function __construct($maxHandles)
+    {
+        $this->maxHandles = $maxHandles;
+    }
+
+    public function create(RequestInterface $request, array $options)
+    {
+        if (isset($options['curl']['body_as_string'])) {
+            $options['_body_as_string'] = $options['curl']['body_as_string'];
+            unset($options['curl']['body_as_string']);
+        }
+
+        $easy = new EasyHandle;
+        $easy->request = $request;
+        $easy->options = $options;
+        $conf = $this->getDefaultConf($easy);
+        $this->applyMethod($easy, $conf);
+        $this->applyHandlerOptions($easy, $conf);
+        $this->applyHeaders($easy, $conf);
+        unset($conf['_headers']);
+
+        // Add handler options from the request configuration options
+        if (isset($options['curl'])) {
+            $conf = array_replace($conf, $options['curl']);
+        }
+
+        $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
+        $easy->handle = $this->handles
+            ? array_pop($this->handles)
+            : curl_init();
+        curl_setopt_array($easy->handle, $conf);
+
+        return $easy;
+    }
+
+    public function release(EasyHandle $easy)
+    {
+        $resource = $easy->handle;
+        unset($easy->handle);
+
+        if (count($this->handles) >= $this->maxHandles) {
+            curl_close($resource);
+        } else {
+            // Remove all callback functions as they can hold onto references
+            // and are not cleaned up by curl_reset. Using curl_setopt_array
+            // does not work for some reason, so removing each one
+            // individually.
+            curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);
+            curl_setopt($resource, CURLOPT_READFUNCTION, null);
+            curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);
+            curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);
+            curl_reset($resource);
+            $this->handles[] = $resource;
+        }
+    }
+
+    /**
+     * Completes a cURL transaction, either returning a response promise or a
+     * rejected promise.
+     *
+     * @param callable             $handler
+     * @param EasyHandle           $easy
+     * @param CurlFactoryInterface $factory Dictates how the handle is released
+     *
+     * @return \GuzzleHttp\Promise\PromiseInterface
+     */
+    public static function finish(
+        callable $handler,
+        EasyHandle $easy,
+        CurlFactoryInterface $factory
+    ) {
+        if (isset($easy->options['on_stats'])) {
+            self::invokeStats($easy);
+        }
+
+        if (!$easy->response || $easy->errno) {
+            return self::finishError($handler, $easy, $factory);
+        }
+
+        // Return the response if it is present and there is no error.
+        $factory->release($easy);
+
+        // Rewind the body of the response if possible.
+        $body = $easy->response->getBody();
+        if ($body->isSeekable()) {
+            $body->rewind();
+        }
+
+        return new FulfilledPromise($easy->response);
+    }
+
+    private static function invokeStats(EasyHandle $easy)
+    {
+        $curlStats = curl_getinfo($easy->handle);
+        $stats = new TransferStats(
+            $easy->request,
+            $easy->response,
+            $curlStats['total_time'],
+            $easy->errno,
+            $curlStats
+        );
+        call_user_func($easy->options['on_stats'], $stats);
+    }
+
+    private static function finishError(
+        callable $handler,
+        EasyHandle $easy,
+        CurlFactoryInterface $factory
+    ) {
+        // Get error information and release the handle to the factory.
+        $ctx = [
+            'errno' => $easy->errno,
+            'error' => curl_error($easy->handle),
+        ] + curl_getinfo($easy->handle);
+        $factory->release($easy);
+
+        // Retry when nothing is present or when curl failed to rewind.
+        if (empty($easy->options['_err_message'])
+            && (!$easy->errno || $easy->errno == 65)
+        ) {
+            return self::retryFailedRewind($handler, $easy, $ctx);
+        }
+
+        return self::createRejection($easy, $ctx);
+    }
+
+    private static function createRejection(EasyHandle $easy, array $ctx)
+    {
+        static $connectionErrors = [
+            CURLE_OPERATION_TIMEOUTED  => true,
+            CURLE_COULDNT_RESOLVE_HOST => true,
+            CURLE_COULDNT_CONNECT      => true,
+            CURLE_SSL_CONNECT_ERROR    => true,
+            CURLE_GOT_NOTHING          => true,
+        ];
+
+        // If an exception was encountered during the onHeaders event, then
+        // return a rejected promise that wraps that exception.
+        if ($easy->onHeadersException) {
+            return \GuzzleHttp\Promise\rejection_for(
+                new RequestException(
+                    'An error was encountered during the on_headers event',
+                    $easy->request,
+                    $easy->response,
+                    $easy->onHeadersException,
+                    $ctx
+                )
+            );
+        }
+
+        $message = sprintf(
+            'cURL error %s: %s (%s)',
+            $ctx['errno'],
+            $ctx['error'],
+            'see http://curl.haxx.se/libcurl/c/libcurl-errors.html'
+        );
+
+        // Create a connection exception if it was a specific error code.
+        $error = isset($connectionErrors[$easy->errno])
+            ? new ConnectException($message, $easy->request, null, $ctx)
+            : new RequestException($message, $easy->request, $easy->response, null, $ctx);
+
+        return \GuzzleHttp\Promise\rejection_for($error);
+    }
+
+    private function getDefaultConf(EasyHandle $easy)
+    {
+        $conf = [
+            '_headers'             => $easy->request->getHeaders(),
+            CURLOPT_CUSTOMREQUEST  => $easy->request->getMethod(),
+            CURLOPT_URL            => (string) $easy->request->getUri()->withFragment(''),
+            CURLOPT_RETURNTRANSFER => false,
+            CURLOPT_HEADER         => false,
+            CURLOPT_CONNECTTIMEOUT => 150,
+        ];
+
+        if (defined('CURLOPT_PROTOCOLS')) {
+            $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
+        }
+
+        $version = $easy->request->getProtocolVersion();
+        if ($version == 1.1) {
+            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;
+        } elseif ($version == 2.0) {
+            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;
+        } else {
+            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
+        }
+
+        return $conf;
+    }
+
+    private function applyMethod(EasyHandle $easy, array &$conf)
+    {
+        $body = $easy->request->getBody();
+        $size = $body->getSize();
+
+        if ($size === null || $size > 0) {
+            $this->applyBody($easy->request, $easy->options, $conf);
+            return;
+        }
+
+        $method = $easy->request->getMethod();
+        if ($method === 'PUT' || $method === 'POST') {
+            // See http://tools.ietf.org/html/rfc7230#section-3.3.2
+            if (!$easy->request->hasHeader('Content-Length')) {
+                $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
+            }
+        } elseif ($method === 'HEAD') {
+            $conf[CURLOPT_NOBODY] = true;
+            unset(
+                $conf[CURLOPT_WRITEFUNCTION],
+                $conf[CURLOPT_READFUNCTION],
+                $conf[CURLOPT_FILE],
+                $conf[CURLOPT_INFILE]
+            );
+        }
+    }
+
+    private function applyBody(RequestInterface $request, array $options, array &$conf)
+    {
+        $size = $request->hasHeader('Content-Length')
+            ? (int) $request->getHeaderLine('Content-Length')
+            : null;
+
+        // Send the body as a string if the size is less than 1MB OR if the
+        // [curl][body_as_string] request value is set.
+        if (($size !== null && $size < 1000000) ||
+            !empty($options['_body_as_string'])
+        ) {
+            $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();
+            // Don't duplicate the Content-Length header
+            $this->removeHeader('Content-Length', $conf);
+            $this->removeHeader('Transfer-Encoding', $conf);
+        } else {
+            $conf[CURLOPT_UPLOAD] = true;
+            if ($size !== null) {
+                $conf[CURLOPT_INFILESIZE] = $size;
+                $this->removeHeader('Content-Length', $conf);
+            }
+            $body = $request->getBody();
+            if ($body->isSeekable()) {
+                $body->rewind();
+            }
+            $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {
+                return $body->read($length);
+            };
+        }
+
+        // If the Expect header is not present, prevent curl from adding it
+        if (!$request->hasHeader('Expect')) {
+            $conf[CURLOPT_HTTPHEADER][] = 'Expect:';
+        }
+
+        // cURL sometimes adds a content-type by default. Prevent this.
+        if (!$request->hasHeader('Content-Type')) {
+            $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';
+        }
+    }
+
+    private function applyHeaders(EasyHandle $easy, array &$conf)
+    {
+        foreach ($conf['_headers'] as $name => $values) {
+            foreach ($values as $value) {
+                $conf[CURLOPT_HTTPHEADER][] = "$name: $value";
+            }
+        }
+
+        // Remove the Accept header if one was not set
+        if (!$easy->request->hasHeader('Accept')) {
+            $conf[CURLOPT_HTTPHEADER][] = 'Accept:';
+        }
+    }
+
+    /**
+     * Remove a header from the options array.
+     *
+     * @param string $name    Case-insensitive header to remove
+     * @param array  $options Array of options to modify
+     */
+    private function removeHeader($name, array &$options)
+    {
+        foreach (array_keys($options['_headers']) as $key) {
+            if (!strcasecmp($key, $name)) {
+                unset($options['_headers'][$key]);
+                return;
+            }
+        }
+    }
+
+    private function applyHandlerOptions(EasyHandle $easy, array &$conf)
+    {
+        $options = $easy->options;
+        if (isset($options['verify'])) {
+            if ($options['verify'] === false) {
+                unset($conf[CURLOPT_CAINFO]);
+                $conf[CURLOPT_SSL_VERIFYHOST] = 0;
+                $conf[CURLOPT_SSL_VERIFYPEER] = false;
+            } else {
+                $conf[CURLOPT_SSL_VERIFYHOST] = 2;
+                $conf[CURLOPT_SSL_VERIFYPEER] = true;
+                if (is_string($options['verify'])) {
+                    // Throw an error if the file/folder/link path is not valid or doesn't exist.
+                    if (!file_exists($options['verify'])) {
+                        throw new \InvalidArgumentException(
+                            "SSL CA bundle not found: {$options['verify']}"
+                        );
+                    }
+                    // If it's a directory or a link to a directory use CURLOPT_CAPATH.
+                    // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
+                    if (is_dir($options['verify']) ||
+                        (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {
+                        $conf[CURLOPT_CAPATH] = $options['verify'];
+                    } else {
+                        $conf[CURLOPT_CAINFO] = $options['verify'];
+                    }
+                }
+            }
+        }
+
+        if (!empty($options['decode_content'])) {
+            $accept = $easy->request->getHeaderLine('Accept-Encoding');
+            if ($accept) {
+                $conf[CURLOPT_ENCODING] = $accept;
+            } else {
+                $conf[CURLOPT_ENCODING] = '';
+                // Don't let curl send the header over the wire
+                $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
+            }
+        }
+
+        if (isset($options['sink'])) {
+            $sink = $options['sink'];
+            if (!is_string($sink)) {
+                $sink = \GuzzleHttp\Psr7\stream_for($sink);
+            } elseif (!is_dir(dirname($sink))) {
+                // Ensure that the directory exists before failing in curl.
+                throw new \RuntimeException(sprintf(
+                    'Directory %s does not exist for sink value of %s',
+                    dirname($sink),
+                    $sink
+                ));
+            } else {
+                $sink = new LazyOpenStream($sink, 'w+');
+            }
+            $easy->sink = $sink;
+            $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {
+                return $sink->write($write);
+            };
+        } else {
+            // Use a default temp stream if no sink was set.
+            $conf[CURLOPT_FILE] = fopen('php://temp', 'w+');
+            $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]);
+        }
+        $timeoutRequiresNoSignal = false;
+        if (isset($options['timeout'])) {
+            $timeoutRequiresNoSignal |= $options['timeout'] < 1;
+            $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
+        }
+
+        // CURL default value is CURL_IPRESOLVE_WHATEVER
+        if (isset($options['force_ip_resolve'])) {
+            if ('v4' === $options['force_ip_resolve']) {
+                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
+            } else if ('v6' === $options['force_ip_resolve']) {
+                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;
+            }
+        }
+
+        if (isset($options['connect_timeout'])) {
+            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
+            $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
+        }
+
+        if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
+            $conf[CURLOPT_NOSIGNAL] = true;
+        }
+
+        if (isset($options['proxy'])) {
+            if (!is_array($options['proxy'])) {
+                $conf[CURLOPT_PROXY] = $options['proxy'];
+            } else {
+                $scheme = $easy->request->getUri()->getScheme();
+                if (isset($options['proxy'][$scheme])) {
+                    $host = $easy->request->getUri()->getHost();
+                    if (!isset($options['proxy']['no']) ||
+                        !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])
+                    ) {
+                        $conf[CURLOPT_PROXY] = $options['proxy'][$scheme];
+                    }
+                }
+            }
+        }
+
+        if (isset($options['cert'])) {
+            $cert = $options['cert'];
+            if (is_array($cert)) {
+                $conf[CURLOPT_SSLCERTPASSWD] = $cert[1];
+                $cert = $cert[0];
+            }
+            if (!file_exists($cert)) {
+                throw new \InvalidArgumentException(
+                    "SSL certificate not found: {$cert}"
+                );
+            }
+            $conf[CURLOPT_SSLCERT] = $cert;
+        }
+
+        if (isset($options['ssl_key'])) {
+            $sslKey = $options['ssl_key'];
+            if (is_array($sslKey)) {
+                $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1];
+                $sslKey = $sslKey[0];
+            }
+            if (!file_exists($sslKey)) {
+                throw new \InvalidArgumentException(
+                    "SSL private key not found: {$sslKey}"
+                );
+            }
+            $conf[CURLOPT_SSLKEY] = $sslKey;
+        }
+
+        if (isset($options['progress'])) {
+            $progress = $options['progress'];
+            if (!is_callable($progress)) {
+                throw new \InvalidArgumentException(
+                    'progress client option must be callable'
+                );
+            }
+            $conf[CURLOPT_NOPROGRESS] = false;
+            $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {
+                $args = func_get_args();
+                // PHP 5.5 pushed the handle onto the start of the args
+                if (is_resource($args[0])) {
+                    array_shift($args);
+                }
+                call_user_func_array($progress, $args);
+            };
+        }
+
+        if (!empty($options['debug'])) {
+            $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']);
+            $conf[CURLOPT_VERBOSE] = true;
+        }
+    }
+
+    /**
+     * This function ensures that a response was set on a transaction. If one
+     * was not set, then the request is retried if possible. This error
+     * typically means you are sending a payload, curl encountered a
+     * "Connection died, retrying a fresh connect" error, tried to rewind the
+     * stream, and then encountered a "necessary data rewind wasn't possible"
+     * error, causing the request to be sent through curl_multi_info_read()
+     * without an error status.
+     */
+    private static function retryFailedRewind(
+        callable $handler,
+        EasyHandle $easy,
+        array $ctx
+    ) {
+        try {
+            // Only rewind if the body has been read from.
+            $body = $easy->request->getBody();
+            if ($body->tell() > 0) {
+                $body->rewind();
+            }
+        } catch (\RuntimeException $e) {
+            $ctx['error'] = 'The connection unexpectedly failed without '
+                . 'providing an error. The request would have been retried, '
+                . 'but attempting to rewind the request body failed. '
+                . 'Exception: ' . $e;
+            return self::createRejection($easy, $ctx);
+        }
+
+        // Retry no more than 3 times before giving up.
+        if (!isset($easy->options['_curl_retries'])) {
+            $easy->options['_curl_retries'] = 1;
+        } elseif ($easy->options['_curl_retries'] == 2) {
+            $ctx['error'] = 'The cURL request was retried 3 times '
+                . 'and did not succeed. The most likely reason for the failure '
+                . 'is that cURL was unable to rewind the body of the request '
+                . 'and subsequent retries resulted in the same error. Turn on '
+                . 'the debug option to see what went wrong. See '
+                . 'https://bugs.php.net/bug.php?id=47204 for more information.';
+            return self::createRejection($easy, $ctx);
+        } else {
+            $easy->options['_curl_retries']++;
+        }
+
+        return $handler($easy->request, $easy->options);
+    }
+
+    private function createHeaderFn(EasyHandle $easy)
+    {
+        if (isset($easy->options['on_headers'])) {
+            $onHeaders = $easy->options['on_headers'];
+
+            if (!is_callable($onHeaders)) {
+                throw new \InvalidArgumentException('on_headers must be callable');
+            }
+        } else {
+            $onHeaders = null;
+        }
+
+        return function ($ch, $h) use (
+            $onHeaders,
+            $easy,
+            &$startingResponse
+        ) {
+            $value = trim($h);
+            if ($value === '') {
+                $startingResponse = true;
+                $easy->createResponse();
+                if ($onHeaders !== null) {
+                    try {
+                        $onHeaders($easy->response);
+                    } catch (\Exception $e) {
+                        // Associate the exception with the handle and trigger
+                        // a curl header write error by returning 0.
+                        $easy->onHeadersException = $e;
+                        return -1;
+                    }
+                }
+            } elseif ($startingResponse) {
+                $startingResponse = false;
+                $easy->headers = [$value];
+            } else {
+                $easy->headers[] = $value;
+            }
+            return strlen($h);
+        };
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
new file mode 100644
index 000000000..b0fc23685
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use Psr\Http\Message\RequestInterface;
+
+interface CurlFactoryInterface
+{
+    /**
+     * Creates a cURL handle resource.
+     *
+     * @param RequestInterface $request Request
+     * @param array            $options Transfer options
+     *
+     * @return EasyHandle
+     * @throws \RuntimeException when an option cannot be applied
+     */
+    public function create(RequestInterface $request, array $options);
+
+    /**
+     * Release an easy handle, allowing it to be reused or closed.
+     *
+     * This function must call unset on the easy handle's "handle" property.
+     *
+     * @param EasyHandle $easy
+     */
+    public function release(EasyHandle $easy);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php
new file mode 100644
index 000000000..43577da66
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php
@@ -0,0 +1,45 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * HTTP handler that uses cURL easy handles as a transport layer.
+ *
+ * When using the CurlHandler, custom curl options can be specified as an
+ * associative array of curl option constants mapping to values in the
+ * **curl** key of the "client" key of the request.
+ */
+class CurlHandler
+{
+    /** @var CurlFactoryInterface */
+    private $factory;
+
+    /**
+     * Accepts an associative array of options:
+     *
+     * - factory: Optional curl factory used to create cURL handles.
+     *
+     * @param array $options Array of options to use with the handler
+     */
+    public function __construct(array $options = [])
+    {
+        $this->factory = isset($options['handle_factory'])
+            ? $options['handle_factory']
+            : new CurlFactory(3);
+    }
+
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        if (isset($options['delay'])) {
+            usleep($options['delay'] * 1000);
+        }
+
+        $easy = $this->factory->create($request, $options);
+        curl_exec($easy->handle);
+        $easy->errno = curl_errno($easy->handle);
+
+        return CurlFactory::finish($this, $easy, $this->factory);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
new file mode 100644
index 000000000..945d06ee4
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
@@ -0,0 +1,197 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Promise as P;
+use GuzzleHttp\Promise\Promise;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Returns an asynchronous response using curl_multi_* functions.
+ *
+ * When using the CurlMultiHandler, custom curl options can be specified as an
+ * associative array of curl option constants mapping to values in the
+ * **curl** key of the provided request options.
+ *
+ * @property resource $_mh Internal use only. Lazy loaded multi-handle.
+ */
+class CurlMultiHandler
+{
+    /** @var CurlFactoryInterface */
+    private $factory;
+    private $selectTimeout;
+    private $active;
+    private $handles = [];
+    private $delays = [];
+
+    /**
+     * This handler accepts the following options:
+     *
+     * - handle_factory: An optional factory  used to create curl handles
+     * - select_timeout: Optional timeout (in seconds) to block before timing
+     *   out while selecting curl handles. Defaults to 1 second.
+     *
+     * @param array $options
+     */
+    public function __construct(array $options = [])
+    {
+        $this->factory = isset($options['handle_factory'])
+            ? $options['handle_factory'] : new CurlFactory(50);
+        $this->selectTimeout = isset($options['select_timeout'])
+            ? $options['select_timeout'] : 1;
+    }
+
+    public function __get($name)
+    {
+        if ($name === '_mh') {
+            return $this->_mh = curl_multi_init();
+        }
+
+        throw new \BadMethodCallException();
+    }
+
+    public function __destruct()
+    {
+        if (isset($this->_mh)) {
+            curl_multi_close($this->_mh);
+            unset($this->_mh);
+        }
+    }
+
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        $easy = $this->factory->create($request, $options);
+        $id = (int) $easy->handle;
+
+        $promise = new Promise(
+            [$this, 'execute'],
+            function () use ($id) { return $this->cancel($id); }
+        );
+
+        $this->addRequest(['easy' => $easy, 'deferred' => $promise]);
+
+        return $promise;
+    }
+
+    /**
+     * Ticks the curl event loop.
+     */
+    public function tick()
+    {
+        // Add any delayed handles if needed.
+        if ($this->delays) {
+            $currentTime = microtime(true);
+            foreach ($this->delays as $id => $delay) {
+                if ($currentTime >= $delay) {
+                    unset($this->delays[$id]);
+                    curl_multi_add_handle(
+                        $this->_mh,
+                        $this->handles[$id]['easy']->handle
+                    );
+                }
+            }
+        }
+
+        // Step through the task queue which may add additional requests.
+        P\queue()->run();
+
+        if ($this->active &&
+            curl_multi_select($this->_mh, $this->selectTimeout) === -1
+        ) {
+            // Perform a usleep if a select returns -1.
+            // See: https://bugs.php.net/bug.php?id=61141
+            usleep(250);
+        }
+
+        while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM);
+
+        $this->processMessages();
+    }
+
+    /**
+     * Runs until all outstanding connections have completed.
+     */
+    public function execute()
+    {
+        $queue = P\queue();
+
+        while ($this->handles || !$queue->isEmpty()) {
+            // If there are no transfers, then sleep for the next delay
+            if (!$this->active && $this->delays) {
+                usleep($this->timeToNext());
+            }
+            $this->tick();
+        }
+    }
+
+    private function addRequest(array $entry)
+    {
+        $easy = $entry['easy'];
+        $id = (int) $easy->handle;
+        $this->handles[$id] = $entry;
+        if (empty($easy->options['delay'])) {
+            curl_multi_add_handle($this->_mh, $easy->handle);
+        } else {
+            $this->delays[$id] = microtime(true) + ($easy->options['delay'] / 1000);
+        }
+    }
+
+    /**
+     * Cancels a handle from sending and removes references to it.
+     *
+     * @param int $id Handle ID to cancel and remove.
+     *
+     * @return bool True on success, false on failure.
+     */
+    private function cancel($id)
+    {
+        // Cannot cancel if it has been processed.
+        if (!isset($this->handles[$id])) {
+            return false;
+        }
+
+        $handle = $this->handles[$id]['easy']->handle;
+        unset($this->delays[$id], $this->handles[$id]);
+        curl_multi_remove_handle($this->_mh, $handle);
+        curl_close($handle);
+
+        return true;
+    }
+
+    private function processMessages()
+    {
+        while ($done = curl_multi_info_read($this->_mh)) {
+            $id = (int) $done['handle'];
+            curl_multi_remove_handle($this->_mh, $done['handle']);
+
+            if (!isset($this->handles[$id])) {
+                // Probably was cancelled.
+                continue;
+            }
+
+            $entry = $this->handles[$id];
+            unset($this->handles[$id], $this->delays[$id]);
+            $entry['easy']->errno = $done['result'];
+            $entry['deferred']->resolve(
+                CurlFactory::finish(
+                    $this,
+                    $entry['easy'],
+                    $this->factory
+                )
+            );
+        }
+    }
+
+    private function timeToNext()
+    {
+        $currentTime = microtime(true);
+        $nextTime = PHP_INT_MAX;
+        foreach ($this->delays as $time) {
+            if ($time < $nextTime) {
+                $nextTime = $time;
+            }
+        }
+
+        return max(0, $nextTime - $currentTime) * 1000000;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
new file mode 100644
index 000000000..7754e9111
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
@@ -0,0 +1,92 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Psr7\Response;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Represents a cURL easy handle and the data it populates.
+ *
+ * @internal
+ */
+final class EasyHandle
+{
+    /** @var resource cURL resource */
+    public $handle;
+
+    /** @var StreamInterface Where data is being written */
+    public $sink;
+
+    /** @var array Received HTTP headers so far */
+    public $headers = [];
+
+    /** @var ResponseInterface Received response (if any) */
+    public $response;
+
+    /** @var RequestInterface Request being sent */
+    public $request;
+
+    /** @var array Request options */
+    public $options = [];
+
+    /** @var int cURL error number (if any) */
+    public $errno = 0;
+
+    /** @var \Exception Exception during on_headers (if any) */
+    public $onHeadersException;
+
+    /**
+     * Attach a response to the easy handle based on the received headers.
+     *
+     * @throws \RuntimeException if no headers have been received.
+     */
+    public function createResponse()
+    {
+        if (empty($this->headers)) {
+            throw new \RuntimeException('No headers have been received');
+        }
+
+        // HTTP-version SP status-code SP reason-phrase
+        $startLine = explode(' ', array_shift($this->headers), 3);
+        $headers = \GuzzleHttp\headers_from_lines($this->headers);
+        $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
+
+        if (!empty($this->options['decode_content'])
+            && isset($normalizedKeys['content-encoding'])
+        ) {
+            $headers['x-encoded-content-encoding']
+                = $headers[$normalizedKeys['content-encoding']];
+            unset($headers[$normalizedKeys['content-encoding']]);
+            if (isset($normalizedKeys['content-length'])) {
+                $headers['x-encoded-content-length']
+                    = $headers[$normalizedKeys['content-length']];
+
+                $bodyLength = (int) $this->sink->getSize();
+                if ($bodyLength) {
+                    $headers[$normalizedKeys['content-length']] = $bodyLength;
+                } else {
+                    unset($headers[$normalizedKeys['content-length']]);
+                }
+            }
+        }
+
+        // Attach a response to the easy handle with the parsed headers.
+        $this->response = new Response(
+            $startLine[1],
+            $headers,
+            $this->sink,
+            substr($startLine[0], 5),
+            isset($startLine[2]) ? (string) $startLine[2] : null
+        );
+    }
+
+    public function __get($name)
+    {
+        $msg = $name === 'handle'
+            ? 'The EasyHandle has been released'
+            : 'Invalid property: ' . $name;
+        throw new \BadMethodCallException($msg);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
new file mode 100644
index 000000000..d892061c7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
@@ -0,0 +1,189 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Promise\RejectedPromise;
+use GuzzleHttp\TransferStats;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Handler that returns responses or throw exceptions from a queue.
+ */
+class MockHandler implements \Countable
+{
+    private $queue = [];
+    private $lastRequest;
+    private $lastOptions;
+    private $onFulfilled;
+    private $onRejected;
+
+    /**
+     * Creates a new MockHandler that uses the default handler stack list of
+     * middlewares.
+     *
+     * @param array $queue Array of responses, callables, or exceptions.
+     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
+     * @param callable $onRejected  Callback to invoke when the return value is rejected.
+     *
+     * @return HandlerStack
+     */
+    public static function createWithMiddleware(
+        array $queue = null,
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
+    }
+
+    /**
+     * The passed in value must be an array of
+     * {@see Psr7\Http\Message\ResponseInterface} objects, Exceptions,
+     * callables, or Promises.
+     *
+     * @param array $queue
+     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
+     * @param callable $onRejected  Callback to invoke when the return value is rejected.
+     */
+    public function __construct(
+        array $queue = null,
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        $this->onFulfilled = $onFulfilled;
+        $this->onRejected = $onRejected;
+
+        if ($queue) {
+            call_user_func_array([$this, 'append'], $queue);
+        }
+    }
+
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        if (!$this->queue) {
+            throw new \OutOfBoundsException('Mock queue is empty');
+        }
+
+        if (isset($options['delay'])) {
+            usleep($options['delay'] * 1000);
+        }
+
+        $this->lastRequest = $request;
+        $this->lastOptions = $options;
+        $response = array_shift($this->queue);
+
+        if (isset($options['on_headers'])) {
+            if (!is_callable($options['on_headers'])) {
+                throw new \InvalidArgumentException('on_headers must be callable');
+            }
+            try {
+                $options['on_headers']($response);
+            } catch (\Exception $e) {
+                $msg = 'An error was encountered during the on_headers event';
+                $response = new RequestException($msg, $request, $response, $e);
+            }
+        }
+
+        if (is_callable($response)) {
+            $response = call_user_func($response, $request, $options);
+        }
+
+        $response = $response instanceof \Exception
+            ? \GuzzleHttp\Promise\rejection_for($response)
+            : \GuzzleHttp\Promise\promise_for($response);
+
+        return $response->then(
+            function ($value) use ($request, $options) {
+                $this->invokeStats($request, $options, $value);
+                if ($this->onFulfilled) {
+                    call_user_func($this->onFulfilled, $value);
+                }
+                if (isset($options['sink'])) {
+                    $contents = (string) $value->getBody();
+                    $sink = $options['sink'];
+
+                    if (is_resource($sink)) {
+                        fwrite($sink, $contents);
+                    } elseif (is_string($sink)) {
+                        file_put_contents($sink, $contents);
+                    } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
+                        $sink->write($contents);
+                    }
+                }
+
+                return $value;
+            },
+            function ($reason) use ($request, $options) {
+                $this->invokeStats($request, $options, null, $reason);
+                if ($this->onRejected) {
+                    call_user_func($this->onRejected, $reason);
+                }
+                return \GuzzleHttp\Promise\rejection_for($reason);
+            }
+        );
+    }
+
+    /**
+     * Adds one or more variadic requests, exceptions, callables, or promises
+     * to the queue.
+     */
+    public function append()
+    {
+        foreach (func_get_args() as $value) {
+            if ($value instanceof ResponseInterface
+                || $value instanceof \Exception
+                || $value instanceof PromiseInterface
+                || is_callable($value)
+            ) {
+                $this->queue[] = $value;
+            } else {
+                throw new \InvalidArgumentException('Expected a response or '
+                    . 'exception. Found ' . \GuzzleHttp\describe_type($value));
+            }
+        }
+    }
+
+    /**
+     * Get the last received request.
+     *
+     * @return RequestInterface
+     */
+    public function getLastRequest()
+    {
+        return $this->lastRequest;
+    }
+
+    /**
+     * Get the last received request options.
+     *
+     * @return array
+     */
+    public function getLastOptions()
+    {
+        return $this->lastOptions;
+    }
+
+    /**
+     * Returns the number of remaining items in the queue.
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->queue);
+    }
+
+    private function invokeStats(
+        RequestInterface $request,
+        array $options,
+        ResponseInterface $response = null,
+        $reason = null
+    ) {
+        if (isset($options['on_stats'])) {
+            $stats = new TransferStats($request, $response, 0, $reason);
+            call_user_func($options['on_stats'], $stats);
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
new file mode 100644
index 000000000..f8b00be0b
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
@@ -0,0 +1,55 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\RequestOptions;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Provides basic proxies for handlers.
+ */
+class Proxy
+{
+    /**
+     * Sends synchronous requests to a specific handler while sending all other
+     * requests to another handler.
+     *
+     * @param callable $default Handler used for normal responses
+     * @param callable $sync    Handler used for synchronous responses.
+     *
+     * @return callable Returns the composed handler.
+     */
+    public static function wrapSync(
+        callable $default,
+        callable $sync
+    ) {
+        return function (RequestInterface $request, array $options) use ($default, $sync) {
+            return empty($options[RequestOptions::SYNCHRONOUS])
+                ? $default($request, $options)
+                : $sync($request, $options);
+        };
+    }
+
+    /**
+     * Sends streaming requests to a streaming compatible handler while sending
+     * all other requests to a default handler.
+     *
+     * This, for example, could be useful for taking advantage of the
+     * performance benefits of curl while still supporting true streaming
+     * through the StreamHandler.
+     *
+     * @param callable $default   Handler used for non-streaming responses
+     * @param callable $streaming Handler used for streaming responses
+     *
+     * @return callable Returns the composed handler.
+     */
+    public static function wrapStreaming(
+        callable $default,
+        callable $streaming
+    ) {
+        return function (RequestInterface $request, array $options) use ($default, $streaming) {
+            return empty($options['stream'])
+                ? $default($request, $options)
+                : $streaming($request, $options);
+        };
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
new file mode 100644
index 000000000..b12bfd942
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
@@ -0,0 +1,533 @@
+<?php
+namespace GuzzleHttp\Handler;
+
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Exception\ConnectException;
+use GuzzleHttp\Promise\FulfilledPromise;
+use GuzzleHttp\Promise\RejectedPromise;
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Psr7;
+use GuzzleHttp\TransferStats;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * HTTP handler that uses PHP's HTTP stream wrapper.
+ */
+class StreamHandler
+{
+    private $lastHeaders = [];
+
+    /**
+     * Sends an HTTP request.
+     *
+     * @param RequestInterface $request Request to send.
+     * @param array            $options Request transfer options.
+     *
+     * @return PromiseInterface
+     */
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        // Sleep if there is a delay specified.
+        if (isset($options['delay'])) {
+            usleep($options['delay'] * 1000);
+        }
+
+        $startTime = isset($options['on_stats']) ? microtime(true) : null;
+
+        try {
+            // Does not support the expect header.
+            $request = $request->withoutHeader('Expect');
+
+            // Append a content-length header if body size is zero to match
+            // cURL's behavior.
+            if (0 === $request->getBody()->getSize()) {
+                $request = $request->withHeader('Content-Length', 0);
+            }
+
+            return $this->createResponse(
+                $request,
+                $options,
+                $this->createStream($request, $options),
+                $startTime
+            );
+        } catch (\InvalidArgumentException $e) {
+            throw $e;
+        } catch (\Exception $e) {
+            // Determine if the error was a networking error.
+            $message = $e->getMessage();
+            // This list can probably get more comprehensive.
+            if (strpos($message, 'getaddrinfo') // DNS lookup failed
+                || strpos($message, 'Connection refused')
+                || strpos($message, "couldn't connect to host") // error on HHVM
+            ) {
+                $e = new ConnectException($e->getMessage(), $request, $e);
+            }
+            $e = RequestException::wrapException($request, $e);
+            $this->invokeStats($options, $request, $startTime, null, $e);
+
+            return \GuzzleHttp\Promise\rejection_for($e);
+        }
+    }
+
+    private function invokeStats(
+        array $options,
+        RequestInterface $request,
+        $startTime,
+        ResponseInterface $response = null,
+        $error = null
+    ) {
+        if (isset($options['on_stats'])) {
+            $stats = new TransferStats(
+                $request,
+                $response,
+                microtime(true) - $startTime,
+                $error,
+                []
+            );
+            call_user_func($options['on_stats'], $stats);
+        }
+    }
+
+    private function createResponse(
+        RequestInterface $request,
+        array $options,
+        $stream,
+        $startTime
+    ) {
+        $hdrs = $this->lastHeaders;
+        $this->lastHeaders = [];
+        $parts = explode(' ', array_shift($hdrs), 3);
+        $ver = explode('/', $parts[0])[1];
+        $status = $parts[1];
+        $reason = isset($parts[2]) ? $parts[2] : null;
+        $headers = \GuzzleHttp\headers_from_lines($hdrs);
+        list ($stream, $headers) = $this->checkDecode($options, $headers, $stream);
+        $stream = Psr7\stream_for($stream);
+        $sink = $stream;
+
+        if (strcasecmp('HEAD', $request->getMethod())) {
+            $sink = $this->createSink($stream, $options);
+        }
+
+        $response = new Psr7\Response($status, $headers, $sink, $ver, $reason);
+
+        if (isset($options['on_headers'])) {
+            try {
+                $options['on_headers']($response);
+            } catch (\Exception $e) {
+                $msg = 'An error was encountered during the on_headers event';
+                $ex = new RequestException($msg, $request, $response, $e);
+                return \GuzzleHttp\Promise\rejection_for($ex);
+            }
+        }
+
+        // Do not drain when the request is a HEAD request because they have
+        // no body.
+        if ($sink !== $stream) {
+            $this->drain(
+                $stream,
+                $sink,
+                $response->getHeaderLine('Content-Length')
+            );
+        }
+
+        $this->invokeStats($options, $request, $startTime, $response, null);
+
+        return new FulfilledPromise($response);
+    }
+
+    private function createSink(StreamInterface $stream, array $options)
+    {
+        if (!empty($options['stream'])) {
+            return $stream;
+        }
+
+        $sink = isset($options['sink'])
+            ? $options['sink']
+            : fopen('php://temp', 'r+');
+
+        return is_string($sink)
+            ? new Psr7\LazyOpenStream($sink, 'w+')
+            : Psr7\stream_for($sink);
+    }
+
+    private function checkDecode(array $options, array $headers, $stream)
+    {
+        // Automatically decode responses when instructed.
+        if (!empty($options['decode_content'])) {
+            $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
+            if (isset($normalizedKeys['content-encoding'])) {
+                $encoding = $headers[$normalizedKeys['content-encoding']];
+                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {
+                    $stream = new Psr7\InflateStream(
+                        Psr7\stream_for($stream)
+                    );
+                    $headers['x-encoded-content-encoding']
+                        = $headers[$normalizedKeys['content-encoding']];
+                    // Remove content-encoding header
+                    unset($headers[$normalizedKeys['content-encoding']]);
+                    // Fix content-length header
+                    if (isset($normalizedKeys['content-length'])) {
+                        $headers['x-encoded-content-length']
+                            = $headers[$normalizedKeys['content-length']];
+
+                        $length = (int) $stream->getSize();
+                        if ($length === 0) {
+                            unset($headers[$normalizedKeys['content-length']]);
+                        } else {
+                            $headers[$normalizedKeys['content-length']] = [$length];
+                        }
+                    }
+                }
+            }
+        }
+
+        return [$stream, $headers];
+    }
+
+    /**
+     * Drains the source stream into the "sink" client option.
+     *
+     * @param StreamInterface $source
+     * @param StreamInterface $sink
+     * @param string          $contentLength Header specifying the amount of
+     *                                       data to read.
+     *
+     * @return StreamInterface
+     * @throws \RuntimeException when the sink option is invalid.
+     */
+    private function drain(
+        StreamInterface $source,
+        StreamInterface $sink,
+        $contentLength
+    ) {
+        // If a content-length header is provided, then stop reading once
+        // that number of bytes has been read. This can prevent infinitely
+        // reading from a stream when dealing with servers that do not honor
+        // Connection: Close headers.
+        Psr7\copy_to_stream(
+            $source,
+            $sink,
+            (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1
+        );
+
+        $sink->seek(0);
+        $source->close();
+
+        return $sink;
+    }
+
+    /**
+     * Create a resource and check to ensure it was created successfully
+     *
+     * @param callable $callback Callable that returns stream resource
+     *
+     * @return resource
+     * @throws \RuntimeException on error
+     */
+    private function createResource(callable $callback)
+    {
+        $errors = null;
+        set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {
+            $errors[] = [
+                'message' => $msg,
+                'file'    => $file,
+                'line'    => $line
+            ];
+            return true;
+        });
+
+        $resource = $callback();
+        restore_error_handler();
+
+        if (!$resource) {
+            $message = 'Error creating resource: ';
+            foreach ($errors as $err) {
+                foreach ($err as $key => $value) {
+                    $message .= "[$key] $value" . PHP_EOL;
+                }
+            }
+            throw new \RuntimeException(trim($message));
+        }
+
+        return $resource;
+    }
+
+    private function createStream(RequestInterface $request, array $options)
+    {
+        static $methods;
+        if (!$methods) {
+            $methods = array_flip(get_class_methods(__CLASS__));
+        }
+
+        // HTTP/1.1 streams using the PHP stream wrapper require a
+        // Connection: close header
+        if ($request->getProtocolVersion() == '1.1'
+            && !$request->hasHeader('Connection')
+        ) {
+            $request = $request->withHeader('Connection', 'close');
+        }
+
+        // Ensure SSL is verified by default
+        if (!isset($options['verify'])) {
+            $options['verify'] = true;
+        }
+
+        $params = [];
+        $context = $this->getDefaultContext($request, $options);
+
+        if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {
+            throw new \InvalidArgumentException('on_headers must be callable');
+        }
+
+        if (!empty($options)) {
+            foreach ($options as $key => $value) {
+                $method = "add_{$key}";
+                if (isset($methods[$method])) {
+                    $this->{$method}($request, $context, $value, $params);
+                }
+            }
+        }
+
+        if (isset($options['stream_context'])) {
+            if (!is_array($options['stream_context'])) {
+                throw new \InvalidArgumentException('stream_context must be an array');
+            }
+            $context = array_replace_recursive(
+                $context,
+                $options['stream_context']
+            );
+        }
+
+        // Microsoft NTLM authentication only supported with curl handler
+        if (isset($options['auth'])
+            && is_array($options['auth'])
+            && isset($options['auth'][2])
+            && 'ntlm' == $options['auth'][2]
+        ) {
+
+            throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
+        }
+
+        $uri = $this->resolveHost($request, $options);
+
+        $context = $this->createResource(
+            function () use ($context, $params) {
+                return stream_context_create($context, $params);
+            }
+        );
+
+        return $this->createResource(
+            function () use ($uri, &$http_response_header, $context, $options) {
+                $resource = fopen((string) $uri, 'r', null, $context);
+                $this->lastHeaders = $http_response_header;
+
+                if (isset($options['read_timeout'])) {
+                    $readTimeout = $options['read_timeout'];
+                    $sec = (int) $readTimeout;
+                    $usec = ($readTimeout - $sec) * 100000;
+                    stream_set_timeout($resource, $sec, $usec);
+                }
+
+                return $resource;
+            }
+        );
+    }
+
+    private function resolveHost(RequestInterface $request, array $options)
+    {
+        $uri = $request->getUri();
+
+        if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {
+            if ('v4' === $options['force_ip_resolve']) {
+                $records = dns_get_record($uri->getHost(), DNS_A);
+                if (!isset($records[0]['ip'])) {
+                    throw new ConnectException(sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
+                }
+                $uri = $uri->withHost($records[0]['ip']);
+            } elseif ('v6' === $options['force_ip_resolve']) {
+                $records = dns_get_record($uri->getHost(), DNS_AAAA);
+                if (!isset($records[0]['ipv6'])) {
+                    throw new ConnectException(sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
+                }
+                $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');
+            }
+        }
+
+        return $uri;
+    }
+
+    private function getDefaultContext(RequestInterface $request)
+    {
+        $headers = '';
+        foreach ($request->getHeaders() as $name => $value) {
+            foreach ($value as $val) {
+                $headers .= "$name: $val\r\n";
+            }
+        }
+
+        $context = [
+            'http' => [
+                'method'           => $request->getMethod(),
+                'header'           => $headers,
+                'protocol_version' => $request->getProtocolVersion(),
+                'ignore_errors'    => true,
+                'follow_location'  => 0,
+            ],
+        ];
+
+        $body = (string) $request->getBody();
+
+        if (!empty($body)) {
+            $context['http']['content'] = $body;
+            // Prevent the HTTP handler from adding a Content-Type header.
+            if (!$request->hasHeader('Content-Type')) {
+                $context['http']['header'] .= "Content-Type:\r\n";
+            }
+        }
+
+        $context['http']['header'] = rtrim($context['http']['header']);
+
+        return $context;
+    }
+
+    private function add_proxy(RequestInterface $request, &$options, $value, &$params)
+    {
+        if (!is_array($value)) {
+            $options['http']['proxy'] = $value;
+        } else {
+            $scheme = $request->getUri()->getScheme();
+            if (isset($value[$scheme])) {
+                if (!isset($value['no'])
+                    || !\GuzzleHttp\is_host_in_noproxy(
+                        $request->getUri()->getHost(),
+                        $value['no']
+                    )
+                ) {
+                    $options['http']['proxy'] = $value[$scheme];
+                }
+            }
+        }
+    }
+
+    private function add_timeout(RequestInterface $request, &$options, $value, &$params)
+    {
+        if ($value > 0) {
+            $options['http']['timeout'] = $value;
+        }
+    }
+
+    private function add_verify(RequestInterface $request, &$options, $value, &$params)
+    {
+        if ($value === true) {
+            // PHP 5.6 or greater will find the system cert by default. When
+            // < 5.6, use the Guzzle bundled cacert.
+            if (PHP_VERSION_ID < 50600) {
+                $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle();
+            }
+        } elseif (is_string($value)) {
+            $options['ssl']['cafile'] = $value;
+            if (!file_exists($value)) {
+                throw new \RuntimeException("SSL CA bundle not found: $value");
+            }
+        } elseif ($value === false) {
+            $options['ssl']['verify_peer'] = false;
+            $options['ssl']['verify_peer_name'] = false;
+            return;
+        } else {
+            throw new \InvalidArgumentException('Invalid verify request option');
+        }
+
+        $options['ssl']['verify_peer'] = true;
+        $options['ssl']['verify_peer_name'] = true;
+        $options['ssl']['allow_self_signed'] = false;
+    }
+
+    private function add_cert(RequestInterface $request, &$options, $value, &$params)
+    {
+        if (is_array($value)) {
+            $options['ssl']['passphrase'] = $value[1];
+            $value = $value[0];
+        }
+
+        if (!file_exists($value)) {
+            throw new \RuntimeException("SSL certificate not found: {$value}");
+        }
+
+        $options['ssl']['local_cert'] = $value;
+    }
+
+    private function add_progress(RequestInterface $request, &$options, $value, &$params)
+    {
+        $this->addNotification(
+            $params,
+            function ($code, $a, $b, $c, $transferred, $total) use ($value) {
+                if ($code == STREAM_NOTIFY_PROGRESS) {
+                    $value($total, $transferred, null, null);
+                }
+            }
+        );
+    }
+
+    private function add_debug(RequestInterface $request, &$options, $value, &$params)
+    {
+        if ($value === false) {
+            return;
+        }
+
+        static $map = [
+            STREAM_NOTIFY_CONNECT       => 'CONNECT',
+            STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
+            STREAM_NOTIFY_AUTH_RESULT   => 'AUTH_RESULT',
+            STREAM_NOTIFY_MIME_TYPE_IS  => 'MIME_TYPE_IS',
+            STREAM_NOTIFY_FILE_SIZE_IS  => 'FILE_SIZE_IS',
+            STREAM_NOTIFY_REDIRECTED    => 'REDIRECTED',
+            STREAM_NOTIFY_PROGRESS      => 'PROGRESS',
+            STREAM_NOTIFY_FAILURE       => 'FAILURE',
+            STREAM_NOTIFY_COMPLETED     => 'COMPLETED',
+            STREAM_NOTIFY_RESOLVE       => 'RESOLVE',
+        ];
+        static $args = ['severity', 'message', 'message_code',
+            'bytes_transferred', 'bytes_max'];
+
+        $value = \GuzzleHttp\debug_resource($value);
+        $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');
+        $this->addNotification(
+            $params,
+            function () use ($ident, $value, $map, $args) {
+                $passed = func_get_args();
+                $code = array_shift($passed);
+                fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
+                foreach (array_filter($passed) as $i => $v) {
+                    fwrite($value, $args[$i] . ': "' . $v . '" ');
+                }
+                fwrite($value, "\n");
+            }
+        );
+    }
+
+    private function addNotification(array &$params, callable $notify)
+    {
+        // Wrap the existing function if needed.
+        if (!isset($params['notification'])) {
+            $params['notification'] = $notify;
+        } else {
+            $params['notification'] = $this->callArray([
+                $params['notification'],
+                $notify
+            ]);
+        }
+    }
+
+    private function callArray(array $functions)
+    {
+        return function () use ($functions) {
+            $args = func_get_args();
+            foreach ($functions as $fn) {
+                call_user_func_array($fn, $args);
+            }
+        };
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/HandlerStack.php
new file mode 100644
index 000000000..a72e38a53
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/HandlerStack.php
@@ -0,0 +1,273 @@
+<?php
+namespace GuzzleHttp;
+
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Creates a composed Guzzle handler function by stacking middlewares on top of
+ * an HTTP handler function.
+ */
+class HandlerStack
+{
+    /** @var callable */
+    private $handler;
+
+    /** @var array */
+    private $stack = [];
+
+    /** @var callable|null */
+    private $cached;
+
+    /**
+     * Creates a default handler stack that can be used by clients.
+     *
+     * The returned handler will wrap the provided handler or use the most
+     * appropriate default handler for you system. The returned HandlerStack has
+     * support for cookies, redirects, HTTP error exceptions, and preparing a body
+     * before sending.
+     *
+     * The returned handler stack can be passed to a client in the "handler"
+     * option.
+     *
+     * @param callable $handler HTTP handler function to use with the stack. If no
+     *                          handler is provided, the best handler for your
+     *                          system will be utilized.
+     *
+     * @return HandlerStack
+     */
+    public static function create(callable $handler = null)
+    {
+        $stack = new self($handler ?: choose_handler());
+        $stack->push(Middleware::httpErrors(), 'http_errors');
+        $stack->push(Middleware::redirect(), 'allow_redirects');
+        $stack->push(Middleware::cookies(), 'cookies');
+        $stack->push(Middleware::prepareBody(), 'prepare_body');
+
+        return $stack;
+    }
+
+    /**
+     * @param callable $handler Underlying HTTP handler.
+     */
+    public function __construct(callable $handler = null)
+    {
+        $this->handler = $handler;
+    }
+
+    /**
+     * Invokes the handler stack as a composed handler
+     *
+     * @param RequestInterface $request
+     * @param array            $options
+     */
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        $handler = $this->resolve();
+
+        return $handler($request, $options);
+    }
+
+    /**
+     * Dumps a string representation of the stack.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $depth = 0;
+        $stack = [];
+        if ($this->handler) {
+            $stack[] = "0) Handler: " . $this->debugCallable($this->handler);
+        }
+
+        $result = '';
+        foreach (array_reverse($this->stack) as $tuple) {
+            $depth++;
+            $str = "{$depth}) Name: '{$tuple[1]}', ";
+            $str .= "Function: " . $this->debugCallable($tuple[0]);
+            $result = "> {$str}\n{$result}";
+            $stack[] = $str;
+        }
+
+        foreach (array_keys($stack) as $k) {
+            $result .= "< {$stack[$k]}\n";
+        }
+
+        return $result;
+    }
+
+    /**
+     * Set the HTTP handler that actually returns a promise.
+     *
+     * @param callable $handler Accepts a request and array of options and
+     *                          returns a Promise.
+     */
+    public function setHandler(callable $handler)
+    {
+        $this->handler = $handler;
+        $this->cached = null;
+    }
+
+    /**
+     * Returns true if the builder has a handler.
+     *
+     * @return bool
+     */
+    public function hasHandler()
+    {
+        return (bool) $this->handler;
+    }
+
+    /**
+     * Unshift a middleware to the bottom of the stack.
+     *
+     * @param callable $middleware Middleware function
+     * @param string   $name       Name to register for this middleware.
+     */
+    public function unshift(callable $middleware, $name = null)
+    {
+        array_unshift($this->stack, [$middleware, $name]);
+        $this->cached = null;
+    }
+
+    /**
+     * Push a middleware to the top of the stack.
+     *
+     * @param callable $middleware Middleware function
+     * @param string   $name       Name to register for this middleware.
+     */
+    public function push(callable $middleware, $name = '')
+    {
+        $this->stack[] = [$middleware, $name];
+        $this->cached = null;
+    }
+
+    /**
+     * Add a middleware before another middleware by name.
+     *
+     * @param string   $findName   Middleware to find
+     * @param callable $middleware Middleware function
+     * @param string   $withName   Name to register for this middleware.
+     */
+    public function before($findName, callable $middleware, $withName = '')
+    {
+        $this->splice($findName, $withName, $middleware, true);
+    }
+
+    /**
+     * Add a middleware after another middleware by name.
+     *
+     * @param string   $findName   Middleware to find
+     * @param callable $middleware Middleware function
+     * @param string   $withName   Name to register for this middleware.
+     */
+    public function after($findName, callable $middleware, $withName = '')
+    {
+        $this->splice($findName, $withName, $middleware, false);
+    }
+
+    /**
+     * Remove a middleware by instance or name from the stack.
+     *
+     * @param callable|string $remove Middleware to remove by instance or name.
+     */
+    public function remove($remove)
+    {
+        $this->cached = null;
+        $idx = is_callable($remove) ? 0 : 1;
+        $this->stack = array_values(array_filter(
+            $this->stack,
+            function ($tuple) use ($idx, $remove) {
+                return $tuple[$idx] !== $remove;
+            }
+        ));
+    }
+
+    /**
+     * Compose the middleware and handler into a single callable function.
+     *
+     * @return callable
+     */
+    public function resolve()
+    {
+        if (!$this->cached) {
+            if (!($prev = $this->handler)) {
+                throw new \LogicException('No handler has been specified');
+            }
+
+            foreach (array_reverse($this->stack) as $fn) {
+                $prev = $fn[0]($prev);
+            }
+
+            $this->cached = $prev;
+        }
+
+        return $this->cached;
+    }
+
+    /**
+     * @param $name
+     * @return int
+     */
+    private function findByName($name)
+    {
+        foreach ($this->stack as $k => $v) {
+            if ($v[1] === $name) {
+                return $k;
+            }
+        }
+
+        throw new \InvalidArgumentException("Middleware not found: $name");
+    }
+
+    /**
+     * Splices a function into the middleware list at a specific position.
+     *
+     * @param          $findName
+     * @param          $withName
+     * @param callable $middleware
+     * @param          $before
+     */
+    private function splice($findName, $withName, callable $middleware, $before)
+    {
+        $this->cached = null;
+        $idx = $this->findByName($findName);
+        $tuple = [$middleware, $withName];
+
+        if ($before) {
+            if ($idx === 0) {
+                array_unshift($this->stack, $tuple);
+            } else {
+                $replacement = [$tuple, $this->stack[$idx]];
+                array_splice($this->stack, $idx, 1, $replacement);
+            }
+        } elseif ($idx === count($this->stack) - 1) {
+            $this->stack[] = $tuple;
+        } else {
+            $replacement = [$this->stack[$idx], $tuple];
+            array_splice($this->stack, $idx, 1, $replacement);
+        }
+    }
+
+    /**
+     * Provides a debug string for a given callable.
+     *
+     * @param array|callable $fn Function to write as a string.
+     *
+     * @return string
+     */
+    private function debugCallable($fn)
+    {
+        if (is_string($fn)) {
+            return "callable({$fn})";
+        }
+
+        if (is_array($fn)) {
+            return is_string($fn[0])
+                ? "callable({$fn[0]}::{$fn[1]})"
+                : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])";
+        }
+
+        return 'callable(' . spl_object_hash($fn) . ')';
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
new file mode 100644
index 000000000..6b090a977
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
@@ -0,0 +1,182 @@
+<?php
+namespace GuzzleHttp;
+
+use Psr\Http\Message\MessageInterface;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Formats log messages using variable substitutions for requests, responses,
+ * and other transactional data.
+ *
+ * The following variable substitutions are supported:
+ *
+ * - {request}:        Full HTTP request message
+ * - {response}:       Full HTTP response message
+ * - {ts}:             ISO 8601 date in GMT
+ * - {date_iso_8601}   ISO 8601 date in GMT
+ * - {date_common_log} Apache common log date using the configured timezone.
+ * - {host}:           Host of the request
+ * - {method}:         Method of the request
+ * - {uri}:            URI of the request
+ * - {host}:           Host of the request
+ * - {version}:        Protocol version
+ * - {target}:         Request target of the request (path + query + fragment)
+ * - {hostname}:       Hostname of the machine that sent the request
+ * - {code}:           Status code of the response (if available)
+ * - {phrase}:         Reason phrase of the response  (if available)
+ * - {error}:          Any error messages (if available)
+ * - {req_header_*}:   Replace `*` with the lowercased name of a request header to add to the message
+ * - {res_header_*}:   Replace `*` with the lowercased name of a response header to add to the message
+ * - {req_headers}:    Request headers
+ * - {res_headers}:    Response headers
+ * - {req_body}:       Request body
+ * - {res_body}:       Response body
+ */
+class MessageFormatter
+{
+    /**
+     * Apache Common Log Format.
+     * @link http://httpd.apache.org/docs/2.4/logs.html#common
+     * @var string
+     */
+    const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}";
+    const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
+    const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
+
+    /** @var string Template used to format log messages */
+    private $template;
+
+    /**
+     * @param string $template Log message template
+     */
+    public function __construct($template = self::CLF)
+    {
+        $this->template = $template ?: self::CLF;
+    }
+
+    /**
+     * Returns a formatted message string.
+     *
+     * @param RequestInterface  $request  Request that was sent
+     * @param ResponseInterface $response Response that was received
+     * @param \Exception        $error    Exception that was received
+     *
+     * @return string
+     */
+    public function format(
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $error = null
+    ) {
+        $cache = [];
+
+        return preg_replace_callback(
+            '/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
+            function (array $matches) use ($request, $response, $error, &$cache) {
+
+                if (isset($cache[$matches[1]])) {
+                    return $cache[$matches[1]];
+                }
+
+                $result = '';
+                switch ($matches[1]) {
+                    case 'request':
+                        $result = Psr7\str($request);
+                        break;
+                    case 'response':
+                        $result = $response ? Psr7\str($response) : '';
+                        break;
+                    case 'req_headers':
+                        $result = trim($request->getMethod()
+                                . ' ' . $request->getRequestTarget())
+                            . ' HTTP/' . $request->getProtocolVersion() . "\r\n"
+                            . $this->headers($request);
+                        break;
+                    case 'res_headers':
+                        $result = $response ?
+                            sprintf(
+                                'HTTP/%s %d %s',
+                                $response->getProtocolVersion(),
+                                $response->getStatusCode(),
+                                $response->getReasonPhrase()
+                            ) . "\r\n" . $this->headers($response)
+                            : 'NULL';
+                        break;
+                    case 'req_body':
+                        $result = $request->getBody();
+                        break;
+                    case 'res_body':
+                        $result = $response ? $response->getBody() : 'NULL';
+                        break;
+                    case 'ts':
+                    case 'date_iso_8601':
+                        $result = gmdate('c');
+                        break;
+                    case 'date_common_log':
+                        $result = date('d/M/Y:H:i:s O');
+                        break;
+                    case 'method':
+                        $result = $request->getMethod();
+                        break;
+                    case 'version':
+                        $result = $request->getProtocolVersion();
+                        break;
+                    case 'uri':
+                    case 'url':
+                        $result = $request->getUri();
+                        break;
+                    case 'target':
+                        $result = $request->getRequestTarget();
+                        break;
+                    case 'req_version':
+                        $result = $request->getProtocolVersion();
+                        break;
+                    case 'res_version':
+                        $result = $response
+                            ? $response->getProtocolVersion()
+                            : 'NULL';
+                        break;
+                    case 'host':
+                        $result = $request->getHeaderLine('Host');
+                        break;
+                    case 'hostname':
+                        $result = gethostname();
+                        break;
+                    case 'code':
+                        $result = $response ? $response->getStatusCode() : 'NULL';
+                        break;
+                    case 'phrase':
+                        $result = $response ? $response->getReasonPhrase() : 'NULL';
+                        break;
+                    case 'error':
+                        $result = $error ? $error->getMessage() : 'NULL';
+                        break;
+                    default:
+                        // handle prefixed dynamic headers
+                        if (strpos($matches[1], 'req_header_') === 0) {
+                            $result = $request->getHeaderLine(substr($matches[1], 11));
+                        } elseif (strpos($matches[1], 'res_header_') === 0) {
+                            $result = $response
+                                ? $response->getHeaderLine(substr($matches[1], 11))
+                                : 'NULL';
+                        }
+                }
+
+                $cache[$matches[1]] = $result;
+                return $result;
+            },
+            $this->template
+        );
+    }
+
+    private function headers(MessageInterface $message)
+    {
+        $result = '';
+        foreach ($message->getHeaders() as $name => $values) {
+            $result .= $name . ': ' . implode(', ', $values) . "\r\n";
+        }
+
+        return trim($result);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Middleware.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Middleware.php
new file mode 100644
index 000000000..9d79bd26e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Middleware.php
@@ -0,0 +1,254 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Cookie\CookieJarInterface;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Promise\RejectedPromise;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+
+/**
+ * Functions used to create and wrap handlers with handler middleware.
+ */
+final class Middleware
+{
+    /**
+     * Middleware that adds cookies to requests.
+     *
+     * The options array must be set to a CookieJarInterface in order to use
+     * cookies. This is typically handled for you by a client.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function cookies()
+    {
+        return function (callable $handler) {
+            return function ($request, array $options) use ($handler) {
+                if (empty($options['cookies'])) {
+                    return $handler($request, $options);
+                } elseif (!($options['cookies'] instanceof CookieJarInterface)) {
+                    throw new \InvalidArgumentException('cookies must be an instance of GuzzleHttp\Cookie\CookieJarInterface');
+                }
+                $cookieJar = $options['cookies'];
+                $request = $cookieJar->withCookieHeader($request);
+                return $handler($request, $options)
+                    ->then(function ($response) use ($cookieJar, $request) {
+                        $cookieJar->extractCookies($request, $response);
+                        return $response;
+                    }
+                );
+            };
+        };
+    }
+
+    /**
+     * Middleware that throws exceptions for 4xx or 5xx responses when the
+     * "http_error" request option is set to true.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function httpErrors()
+    {
+        return function (callable $handler) {
+            return function ($request, array $options) use ($handler) {
+                if (empty($options['http_errors'])) {
+                    return $handler($request, $options);
+                }
+                return $handler($request, $options)->then(
+                    function (ResponseInterface $response) use ($request, $handler) {
+                        $code = $response->getStatusCode();
+                        if ($code < 400) {
+                            return $response;
+                        }
+                        throw RequestException::create($request, $response);
+                    }
+                );
+            };
+        };
+    }
+
+    /**
+     * Middleware that pushes history data to an ArrayAccess container.
+     *
+     * @param array $container Container to hold the history (by reference).
+     *
+     * @return callable Returns a function that accepts the next handler.
+     * @throws \InvalidArgumentException if container is not an array or ArrayAccess.
+     */
+    public static function history(&$container)
+    {
+        if (!is_array($container) && !$container instanceof \ArrayAccess) {
+            throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess');
+        }
+
+        return function (callable $handler) use (&$container) {
+            return function ($request, array $options) use ($handler, &$container) {
+                return $handler($request, $options)->then(
+                    function ($value) use ($request, &$container, $options) {
+                        $container[] = [
+                            'request'  => $request,
+                            'response' => $value,
+                            'error'    => null,
+                            'options'  => $options
+                        ];
+                        return $value;
+                    },
+                    function ($reason) use ($request, &$container, $options) {
+                        $container[] = [
+                            'request'  => $request,
+                            'response' => null,
+                            'error'    => $reason,
+                            'options'  => $options
+                        ];
+                        return \GuzzleHttp\Promise\rejection_for($reason);
+                    }
+                );
+            };
+        };
+    }
+
+    /**
+     * Middleware that invokes a callback before and after sending a request.
+     *
+     * The provided listener cannot modify or alter the response. It simply
+     * "taps" into the chain to be notified before returning the promise. The
+     * before listener accepts a request and options array, and the after
+     * listener accepts a request, options array, and response promise.
+     *
+     * @param callable $before Function to invoke before forwarding the request.
+     * @param callable $after  Function invoked after forwarding.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function tap(callable $before = null, callable $after = null)
+    {
+        return function (callable $handler) use ($before, $after) {
+            return function ($request, array $options) use ($handler, $before, $after) {
+                if ($before) {
+                    $before($request, $options);
+                }
+                $response = $handler($request, $options);
+                if ($after) {
+                    $after($request, $options, $response);
+                }
+                return $response;
+            };
+        };
+    }
+
+    /**
+     * Middleware that handles request redirects.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function redirect()
+    {
+        return function (callable $handler) {
+            return new RedirectMiddleware($handler);
+        };
+    }
+
+    /**
+     * Middleware that retries requests based on the boolean result of
+     * invoking the provided "decider" function.
+     *
+     * If no delay function is provided, a simple implementation of exponential
+     * backoff will be utilized.
+     *
+     * @param callable $decider Function that accepts the number of retries,
+     *                          a request, [response], and [exception] and
+     *                          returns true if the request is to be retried.
+     * @param callable $delay   Function that accepts the number of retries and
+     *                          returns the number of milliseconds to delay.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function retry(callable $decider, callable $delay = null)
+    {
+        return function (callable $handler) use ($decider, $delay) {
+            return new RetryMiddleware($decider, $handler, $delay);
+        };
+    }
+
+    /**
+     * Middleware that logs requests, responses, and errors using a message
+     * formatter.
+     *
+     * @param LoggerInterface  $logger Logs messages.
+     * @param MessageFormatter $formatter Formatter used to create message strings.
+     * @param string           $logLevel Level at which to log requests.
+     *
+     * @return callable Returns a function that accepts the next handler.
+     */
+    public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO)
+    {
+        return function (callable $handler) use ($logger, $formatter, $logLevel) {
+            return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {
+                return $handler($request, $options)->then(
+                    function ($response) use ($logger, $request, $formatter, $logLevel) {
+                        $message = $formatter->format($request, $response);
+                        $logger->log($logLevel, $message);
+                        return $response;
+                    },
+                    function ($reason) use ($logger, $request, $formatter) {
+                        $response = $reason instanceof RequestException
+                            ? $reason->getResponse()
+                            : null;
+                        $message = $formatter->format($request, $response, $reason);
+                        $logger->notice($message);
+                        return \GuzzleHttp\Promise\rejection_for($reason);
+                    }
+                );
+            };
+        };
+    }
+
+    /**
+     * This middleware adds a default content-type if possible, a default
+     * content-length or transfer-encoding header, and the expect header.
+     *
+     * @return callable
+     */
+    public static function prepareBody()
+    {
+        return function (callable $handler) {
+            return new PrepareBodyMiddleware($handler);
+        };
+    }
+
+    /**
+     * Middleware that applies a map function to the request before passing to
+     * the next handler.
+     *
+     * @param callable $fn Function that accepts a RequestInterface and returns
+     *                     a RequestInterface.
+     * @return callable
+     */
+    public static function mapRequest(callable $fn)
+    {
+        return function (callable $handler) use ($fn) {
+            return function ($request, array $options) use ($handler, $fn) {
+                return $handler($fn($request), $options);
+            };
+        };
+    }
+
+    /**
+     * Middleware that applies a map function to the resolved promise's
+     * response.
+     *
+     * @param callable $fn Function that accepts a ResponseInterface and
+     *                     returns a ResponseInterface.
+     * @return callable
+     */
+    public static function mapResponse(callable $fn)
+    {
+        return function (callable $handler) use ($fn) {
+            return function ($request, array $options) use ($handler, $fn) {
+                return $handler($request, $options)->then($fn);
+            };
+        };
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Pool.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Pool.php
new file mode 100644
index 000000000..8f1be33cd
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/Pool.php
@@ -0,0 +1,123 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Promise\PromisorInterface;
+use Psr\Http\Message\RequestInterface;
+use GuzzleHttp\Promise\EachPromise;
+
+/**
+ * Sends and iterator of requests concurrently using a capped pool size.
+ *
+ * The pool will read from an iterator until it is cancelled or until the
+ * iterator is consumed. When a request is yielded, the request is sent after
+ * applying the "request_options" request options (if provided in the ctor).
+ *
+ * When a function is yielded by the iterator, the function is provided the
+ * "request_options" array that should be merged on top of any existing
+ * options, and the function MUST then return a wait-able promise.
+ */
+class Pool implements PromisorInterface
+{
+    /** @var EachPromise */
+    private $each;
+
+    /**
+     * @param ClientInterface $client   Client used to send the requests.
+     * @param array|\Iterator $requests Requests or functions that return
+     *                                  requests to send concurrently.
+     * @param array           $config   Associative array of options
+     *     - concurrency: (int) Maximum number of requests to send concurrently
+     *     - options: Array of request options to apply to each request.
+     *     - fulfilled: (callable) Function to invoke when a request completes.
+     *     - rejected: (callable) Function to invoke when a request is rejected.
+     */
+    public function __construct(
+        ClientInterface $client,
+        $requests,
+        array $config = []
+    ) {
+        // Backwards compatibility.
+        if (isset($config['pool_size'])) {
+            $config['concurrency'] = $config['pool_size'];
+        } elseif (!isset($config['concurrency'])) {
+            $config['concurrency'] = 25;
+        }
+
+        if (isset($config['options'])) {
+            $opts = $config['options'];
+            unset($config['options']);
+        } else {
+            $opts = [];
+        }
+
+        $iterable = \GuzzleHttp\Promise\iter_for($requests);
+        $requests = function () use ($iterable, $client, $opts) {
+            foreach ($iterable as $key => $rfn) {
+                if ($rfn instanceof RequestInterface) {
+                    yield $key => $client->sendAsync($rfn, $opts);
+                } elseif (is_callable($rfn)) {
+                    yield $key => $rfn($opts);
+                } else {
+                    throw new \InvalidArgumentException('Each value yielded by '
+                        . 'the iterator must be a Psr7\Http\Message\RequestInterface '
+                        . 'or a callable that returns a promise that fulfills '
+                        . 'with a Psr7\Message\Http\ResponseInterface object.');
+                }
+            }
+        };
+
+        $this->each = new EachPromise($requests(), $config);
+    }
+
+    public function promise()
+    {
+        return $this->each->promise();
+    }
+
+    /**
+     * Sends multiple requests concurrently and returns an array of responses
+     * and exceptions that uses the same ordering as the provided requests.
+     *
+     * IMPORTANT: This method keeps every request and response in memory, and
+     * as such, is NOT recommended when sending a large number or an
+     * indeterminate number of requests concurrently.
+     *
+     * @param ClientInterface $client   Client used to send the requests
+     * @param array|\Iterator $requests Requests to send concurrently.
+     * @param array           $options  Passes through the options available in
+     *                                  {@see GuzzleHttp\Pool::__construct}
+     *
+     * @return array Returns an array containing the response or an exception
+     *               in the same order that the requests were sent.
+     * @throws \InvalidArgumentException if the event format is incorrect.
+     */
+    public static function batch(
+        ClientInterface $client,
+        $requests,
+        array $options = []
+    ) {
+        $res = [];
+        self::cmpCallback($options, 'fulfilled', $res);
+        self::cmpCallback($options, 'rejected', $res);
+        $pool = new static($client, $requests, $options);
+        $pool->promise()->wait();
+        ksort($res);
+
+        return $res;
+    }
+
+    private static function cmpCallback(array &$options, $name, array &$results)
+    {
+        if (!isset($options[$name])) {
+            $options[$name] = function ($v, $k) use (&$results) {
+                $results[$k] = $v;
+            };
+        } else {
+            $currentFn = $options[$name];
+            $options[$name] = function ($v, $k) use (&$results, $currentFn) {
+                $currentFn($v, $k);
+                $results[$k] = $v;
+            };
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
new file mode 100644
index 000000000..2eb95f9b2
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
@@ -0,0 +1,106 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Prepares requests that contain a body, adding the Content-Length,
+ * Content-Type, and Expect headers.
+ */
+class PrepareBodyMiddleware
+{
+    /** @var callable  */
+    private $nextHandler;
+
+    /**
+     * @param callable $nextHandler Next handler to invoke.
+     */
+    public function __construct(callable $nextHandler)
+    {
+        $this->nextHandler = $nextHandler;
+    }
+
+    /**
+     * @param RequestInterface $request
+     * @param array            $options
+     *
+     * @return PromiseInterface
+     */
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        $fn = $this->nextHandler;
+
+        // Don't do anything if the request has no body.
+        if ($request->getBody()->getSize() === 0) {
+            return $fn($request, $options);
+        }
+
+        $modify = [];
+
+        // Add a default content-type if possible.
+        if (!$request->hasHeader('Content-Type')) {
+            if ($uri = $request->getBody()->getMetadata('uri')) {
+                if ($type = Psr7\mimetype_from_filename($uri)) {
+                    $modify['set_headers']['Content-Type'] = $type;
+                }
+            }
+        }
+
+        // Add a default content-length or transfer-encoding header.
+        if (!$request->hasHeader('Content-Length')
+            && !$request->hasHeader('Transfer-Encoding')
+        ) {
+            $size = $request->getBody()->getSize();
+            if ($size !== null) {
+                $modify['set_headers']['Content-Length'] = $size;
+            } else {
+                $modify['set_headers']['Transfer-Encoding'] = 'chunked';
+            }
+        }
+
+        // Add the expect header if needed.
+        $this->addExpectHeader($request, $options, $modify);
+
+        return $fn(Psr7\modify_request($request, $modify), $options);
+    }
+
+    private function addExpectHeader(
+        RequestInterface $request,
+        array $options,
+        array &$modify
+    ) {
+        // Determine if the Expect header should be used
+        if ($request->hasHeader('Expect')) {
+            return;
+        }
+
+        $expect = isset($options['expect']) ? $options['expect'] : null;
+
+        // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0
+        if ($expect === false || $request->getProtocolVersion() < 1.1) {
+            return;
+        }
+
+        // The expect header is unconditionally enabled
+        if ($expect === true) {
+            $modify['set_headers']['Expect'] = '100-Continue';
+            return;
+        }
+
+        // By default, send the expect header when the payload is > 1mb
+        if ($expect === null) {
+            $expect = 1048576;
+        }
+
+        // Always add if the body cannot be rewound, the size cannot be
+        // determined, or the size is greater than the cutoff threshold
+        $body = $request->getBody();
+        $size = $body->getSize();
+
+        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
+            $modify['set_headers']['Expect'] = '100-Continue';
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
new file mode 100644
index 000000000..131b77179
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
@@ -0,0 +1,237 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Exception\BadResponseException;
+use GuzzleHttp\Exception\TooManyRedirectsException;
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Request redirect middleware.
+ *
+ * Apply this middleware like other middleware using
+ * {@see GuzzleHttp\Middleware::redirect()}.
+ */
+class RedirectMiddleware
+{
+    const HISTORY_HEADER = 'X-Guzzle-Redirect-History';
+
+    const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';
+
+    public static $defaultSettings = [
+        'max'             => 5,
+        'protocols'       => ['http', 'https'],
+        'strict'          => false,
+        'referer'         => false,
+        'track_redirects' => false,
+    ];
+
+    /** @var callable  */
+    private $nextHandler;
+
+    /**
+     * @param callable $nextHandler Next handler to invoke.
+     */
+    public function __construct(callable $nextHandler)
+    {
+        $this->nextHandler = $nextHandler;
+    }
+
+    /**
+     * @param RequestInterface $request
+     * @param array            $options
+     *
+     * @return PromiseInterface
+     */
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        $fn = $this->nextHandler;
+
+        if (empty($options['allow_redirects'])) {
+            return $fn($request, $options);
+        }
+
+        if ($options['allow_redirects'] === true) {
+            $options['allow_redirects'] = self::$defaultSettings;
+        } elseif (!is_array($options['allow_redirects'])) {
+            throw new \InvalidArgumentException('allow_redirects must be true, false, or array');
+        } else {
+            // Merge the default settings with the provided settings
+            $options['allow_redirects'] += self::$defaultSettings;
+        }
+
+        if (empty($options['allow_redirects']['max'])) {
+            return $fn($request, $options);
+        }
+
+        return $fn($request, $options)
+            ->then(function (ResponseInterface $response) use ($request, $options) {
+                return $this->checkRedirect($request, $options, $response);
+            });
+    }
+
+    /**
+     * @param RequestInterface  $request
+     * @param array             $options
+     * @param ResponseInterface|PromiseInterface $response
+     *
+     * @return ResponseInterface|PromiseInterface
+     */
+    public function checkRedirect(
+        RequestInterface $request,
+        array $options,
+        ResponseInterface $response
+    ) {
+        if (substr($response->getStatusCode(), 0, 1) != '3'
+            || !$response->hasHeader('Location')
+        ) {
+            return $response;
+        }
+
+        $this->guardMax($request, $options);
+        $nextRequest = $this->modifyRequest($request, $options, $response);
+
+        if (isset($options['allow_redirects']['on_redirect'])) {
+            call_user_func(
+                $options['allow_redirects']['on_redirect'],
+                $request,
+                $response,
+                $nextRequest->getUri()
+            );
+        }
+
+        /** @var PromiseInterface|ResponseInterface $promise */
+        $promise = $this($nextRequest, $options);
+
+        // Add headers to be able to track history of redirects.
+        if (!empty($options['allow_redirects']['track_redirects'])) {
+            return $this->withTracking(
+                $promise,
+                (string) $nextRequest->getUri(),
+                $response->getStatusCode()
+            );
+        }
+
+        return $promise;
+    }
+
+    private function withTracking(PromiseInterface $promise, $uri, $statusCode)
+    {
+        return $promise->then(
+            function (ResponseInterface $response) use ($uri, $statusCode) {
+                // Note that we are pushing to the front of the list as this
+                // would be an earlier response than what is currently present
+                // in the history header.
+                $historyHeader = $response->getHeader(self::HISTORY_HEADER);
+                $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);
+                array_unshift($historyHeader, $uri);
+                array_unshift($statusHeader, $statusCode);
+                return $response->withHeader(self::HISTORY_HEADER, $historyHeader)
+                                ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);
+            }
+        );
+    }
+
+    private function guardMax(RequestInterface $request, array &$options)
+    {
+        $current = isset($options['__redirect_count'])
+            ? $options['__redirect_count']
+            : 0;
+        $options['__redirect_count'] = $current + 1;
+        $max = $options['allow_redirects']['max'];
+
+        if ($options['__redirect_count'] > $max) {
+            throw new TooManyRedirectsException(
+                "Will not follow more than {$max} redirects",
+                $request
+            );
+        }
+    }
+
+    /**
+     * @param RequestInterface  $request
+     * @param array             $options
+     * @param ResponseInterface $response
+     *
+     * @return RequestInterface
+     */
+    public function modifyRequest(
+        RequestInterface $request,
+        array $options,
+        ResponseInterface $response
+    ) {
+        // Request modifications to apply.
+        $modify = [];
+        $protocols = $options['allow_redirects']['protocols'];
+
+        // Use a GET request if this is an entity enclosing request and we are
+        // not forcing RFC compliance, but rather emulating what all browsers
+        // would do.
+        $statusCode = $response->getStatusCode();
+        if ($statusCode == 303 ||
+            ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict'])
+        ) {
+            $modify['method'] = 'GET';
+            $modify['body'] = '';
+        }
+
+        $modify['uri'] = $this->redirectUri($request, $response, $protocols);
+        Psr7\rewind_body($request);
+
+        // Add the Referer header if it is told to do so and only
+        // add the header if we are not redirecting from https to http.
+        if ($options['allow_redirects']['referer']
+            && $modify['uri']->getScheme() === $request->getUri()->getScheme()
+        ) {
+            $uri = $request->getUri()->withUserInfo('', '');
+            $modify['set_headers']['Referer'] = (string) $uri;
+        } else {
+            $modify['remove_headers'][] = 'Referer';
+        }
+
+        // Remove Authorization header if host is different.
+        if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
+            $modify['remove_headers'][] = 'Authorization';
+        }
+
+        return Psr7\modify_request($request, $modify);
+    }
+
+    /**
+     * Set the appropriate URL on the request based on the location header
+     *
+     * @param RequestInterface  $request
+     * @param ResponseInterface $response
+     * @param array             $protocols
+     *
+     * @return UriInterface
+     */
+    private function redirectUri(
+        RequestInterface $request,
+        ResponseInterface $response,
+        array $protocols
+    ) {
+        $location = Psr7\UriResolver::resolve(
+            $request->getUri(),
+            new Psr7\Uri($response->getHeaderLine('Location'))
+        );
+
+        // Ensure that the redirect URI is allowed based on the protocols.
+        if (!in_array($location->getScheme(), $protocols)) {
+            throw new BadResponseException(
+                sprintf(
+                    'Redirect URI, %s, does not use one of the allowed redirect protocols: %s',
+                    $location,
+                    implode(', ', $protocols)
+                ),
+                $request,
+                $response
+            );
+        }
+
+        return $location;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RequestOptions.php
new file mode 100644
index 000000000..c6aacfb15
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RequestOptions.php
@@ -0,0 +1,255 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * This class contains a list of built-in Guzzle request options.
+ *
+ * More documentation for each option can be found at http://guzzlephp.org/.
+ *
+ * @link http://docs.guzzlephp.org/en/v6/request-options.html
+ */
+final class RequestOptions
+{
+    /**
+     * allow_redirects: (bool|array) Controls redirect behavior. Pass false
+     * to disable redirects, pass true to enable redirects, pass an
+     * associative to provide custom redirect settings. Defaults to "false".
+     * This option only works if your handler has the RedirectMiddleware. When
+     * passing an associative array, you can provide the following key value
+     * pairs:
+     *
+     * - max: (int, default=5) maximum number of allowed redirects.
+     * - strict: (bool, default=false) Set to true to use strict redirects
+     *   meaning redirect POST requests with POST requests vs. doing what most
+     *   browsers do which is redirect POST requests with GET requests
+     * - referer: (bool, default=true) Set to false to disable the Referer
+     *   header.
+     * - protocols: (array, default=['http', 'https']) Allowed redirect
+     *   protocols.
+     * - on_redirect: (callable) PHP callable that is invoked when a redirect
+     *   is encountered. The callable is invoked with the request, the redirect
+     *   response that was received, and the effective URI. Any return value
+     *   from the on_redirect function is ignored.
+     */
+    const ALLOW_REDIRECTS = 'allow_redirects';
+
+    /**
+     * auth: (array) Pass an array of HTTP authentication parameters to use
+     * with the request. The array must contain the username in index [0],
+     * the password in index [1], and you can optionally provide a built-in
+     * authentication type in index [2]. Pass null to disable authentication
+     * for a request.
+     */
+    const AUTH = 'auth';
+
+    /**
+     * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator)
+     * Body to send in the request.
+     */
+    const BODY = 'body';
+
+    /**
+     * cert: (string|array) Set to a string to specify the path to a file
+     * containing a PEM formatted SSL client side certificate. If a password
+     * is required, then set cert to an array containing the path to the PEM
+     * file in the first array element followed by the certificate password
+     * in the second array element.
+     */
+    const CERT = 'cert';
+
+    /**
+     * cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false)
+     * Specifies whether or not cookies are used in a request or what cookie
+     * jar to use or what cookies to send. This option only works if your
+     * handler has the `cookie` middleware. Valid values are `false` and
+     * an instance of {@see GuzzleHttp\Cookie\CookieJarInterface}.
+     */
+    const COOKIES = 'cookies';
+
+    /**
+     * connect_timeout: (float, default=0) Float describing the number of
+     * seconds to wait while trying to connect to a server. Use 0 to wait
+     * indefinitely (the default behavior).
+     */
+    const CONNECT_TIMEOUT = 'connect_timeout';
+
+    /**
+     * debug: (bool|resource) Set to true or set to a PHP stream returned by
+     * fopen()  enable debug output with the HTTP handler used to send a
+     * request.
+     */
+    const DEBUG = 'debug';
+
+    /**
+     * decode_content: (bool, default=true) Specify whether or not
+     * Content-Encoding responses (gzip, deflate, etc.) are automatically
+     * decoded.
+     */
+    const DECODE_CONTENT = 'decode_content';
+
+    /**
+     * delay: (int) The amount of time to delay before sending in milliseconds.
+     */
+    const DELAY = 'delay';
+
+    /**
+     * expect: (bool|integer) Controls the behavior of the
+     * "Expect: 100-Continue" header.
+     *
+     * Set to `true` to enable the "Expect: 100-Continue" header for all
+     * requests that sends a body. Set to `false` to disable the
+     * "Expect: 100-Continue" header for all requests. Set to a number so that
+     * the size of the payload must be greater than the number in order to send
+     * the Expect header. Setting to a number will send the Expect header for
+     * all requests in which the size of the payload cannot be determined or
+     * where the body is not rewindable.
+     *
+     * By default, Guzzle will add the "Expect: 100-Continue" header when the
+     * size of the body of a request is greater than 1 MB and a request is
+     * using HTTP/1.1.
+     */
+    const EXPECT = 'expect';
+
+    /**
+     * form_params: (array) Associative array of form field names to values
+     * where each value is a string or array of strings. Sets the Content-Type
+     * header to application/x-www-form-urlencoded when no Content-Type header
+     * is already present.
+     */
+    const FORM_PARAMS = 'form_params';
+
+    /**
+     * headers: (array) Associative array of HTTP headers. Each value MUST be
+     * a string or array of strings.
+     */
+    const HEADERS = 'headers';
+
+    /**
+     * http_errors: (bool, default=true) Set to false to disable exceptions
+     * when a non- successful HTTP response is received. By default,
+     * exceptions will be thrown for 4xx and 5xx responses. This option only
+     * works if your handler has the `httpErrors` middleware.
+     */
+    const HTTP_ERRORS = 'http_errors';
+
+    /**
+     * json: (mixed) Adds JSON data to a request. The provided value is JSON
+     * encoded and a Content-Type header of application/json will be added to
+     * the request if no Content-Type header is already present.
+     */
+    const JSON = 'json';
+
+    /**
+     * multipart: (array) Array of associative arrays, each containing a
+     * required "name" key mapping to the form field, name, a required
+     * "contents" key mapping to a StreamInterface|resource|string, an
+     * optional "headers" associative array of custom headers, and an
+     * optional "filename" key mapping to a string to send as the filename in
+     * the part. If no "filename" key is present, then no "filename" attribute
+     * will be added to the part.
+     */
+    const MULTIPART = 'multipart';
+
+    /**
+     * on_headers: (callable) A callable that is invoked when the HTTP headers
+     * of the response have been received but the body has not yet begun to
+     * download.
+     */
+    const ON_HEADERS = 'on_headers';
+
+    /**
+     * on_stats: (callable) allows you to get access to transfer statistics of
+     * a request and access the lower level transfer details of the handler
+     * associated with your client. ``on_stats`` is a callable that is invoked
+     * when a handler has finished sending a request. The callback is invoked
+     * with transfer statistics about the request, the response received, or
+     * the error encountered. Included in the data is the total amount of time
+     * taken to send the request.
+     */
+    const ON_STATS = 'on_stats';
+
+    /**
+     * progress: (callable) Defines a function to invoke when transfer
+     * progress is made. The function accepts the following positional
+     * arguments: the total number of bytes expected to be downloaded, the
+     * number of bytes downloaded so far, the number of bytes expected to be
+     * uploaded, the number of bytes uploaded so far.
+     */
+    const PROGRESS = 'progress';
+
+    /**
+     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an
+     * array to specify different proxies for different protocols (where the
+     * key is the protocol and the value is a proxy string).
+     */
+    const PROXY = 'proxy';
+
+    /**
+     * query: (array|string) Associative array of query string values to add
+     * to the request. This option uses PHP's http_build_query() to create
+     * the string representation. Pass a string value if you need more
+     * control than what this method provides
+     */
+    const QUERY = 'query';
+
+    /**
+     * sink: (resource|string|StreamInterface) Where the data of the
+     * response is written to. Defaults to a PHP temp stream. Providing a
+     * string will write data to a file by the given name.
+     */
+    const SINK = 'sink';
+
+    /**
+     * synchronous: (bool) Set to true to inform HTTP handlers that you intend
+     * on waiting on the response. This can be useful for optimizations. Note
+     * that a promise is still returned if you are using one of the async
+     * client methods.
+     */
+    const SYNCHRONOUS = 'synchronous';
+
+    /**
+     * ssl_key: (array|string) Specify the path to a file containing a private
+     * SSL key in PEM format. If a password is required, then set to an array
+     * containing the path to the SSL key in the first array element followed
+     * by the password required for the certificate in the second element.
+     */
+    const SSL_KEY = 'ssl_key';
+
+    /**
+     * stream: Set to true to attempt to stream a response rather than
+     * download it all up-front.
+     */
+    const STREAM = 'stream';
+
+    /**
+     * verify: (bool|string, default=true) Describes the SSL certificate
+     * verification behavior of a request. Set to true to enable SSL
+     * certificate verification using the system CA bundle when available
+     * (the default). Set to false to disable certificate verification (this
+     * is insecure!). Set to a string to provide the path to a CA bundle on
+     * disk to enable verification using a custom certificate.
+     */
+    const VERIFY = 'verify';
+
+    /**
+     * timeout: (float, default=0) Float describing the timeout of the
+     * request in seconds. Use 0 to wait indefinitely (the default behavior).
+     */
+    const TIMEOUT = 'timeout';
+
+    /**
+     * read_timeout: (float, default=default_socket_timeout ini setting) Float describing
+     * the body read timeout, for stream requests.
+     */
+    const READ_TIMEOUT = 'read_timeout';
+
+    /**
+     * version: (float) Specifies the HTTP protocol version to attempt to use.
+     */
+    const VERSION = 'version';
+
+    /**
+     * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol
+     */
+    const FORCE_IP_RESOLVE = 'force_ip_resolve';
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
new file mode 100644
index 000000000..f27090fd1
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
@@ -0,0 +1,112 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Promise\RejectedPromise;
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Middleware that retries requests based on the boolean result of
+ * invoking the provided "decider" function.
+ */
+class RetryMiddleware
+{
+    /** @var callable  */
+    private $nextHandler;
+
+    /** @var callable */
+    private $decider;
+
+    /**
+     * @param callable $decider     Function that accepts the number of retries,
+     *                              a request, [response], and [exception] and
+     *                              returns true if the request is to be
+     *                              retried.
+     * @param callable $nextHandler Next handler to invoke.
+     * @param callable $delay       Function that accepts the number of retries
+     *                              and [response] and returns the number of
+     *                              milliseconds to delay.
+     */
+    public function __construct(
+        callable $decider,
+        callable $nextHandler,
+        callable $delay = null
+    ) {
+        $this->decider = $decider;
+        $this->nextHandler = $nextHandler;
+        $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';
+    }
+
+    /**
+     * Default exponential backoff delay function.
+     *
+     * @param $retries
+     *
+     * @return int
+     */
+    public static function exponentialDelay($retries)
+    {
+        return (int) pow(2, $retries - 1);
+    }
+
+    /**
+     * @param RequestInterface $request
+     * @param array            $options
+     *
+     * @return PromiseInterface
+     */
+    public function __invoke(RequestInterface $request, array $options)
+    {
+        if (!isset($options['retries'])) {
+            $options['retries'] = 0;
+        }
+
+        $fn = $this->nextHandler;
+        return $fn($request, $options)
+            ->then(
+                $this->onFulfilled($request, $options),
+                $this->onRejected($request, $options)
+            );
+    }
+
+    private function onFulfilled(RequestInterface $req, array $options)
+    {
+        return function ($value) use ($req, $options) {
+            if (!call_user_func(
+                $this->decider,
+                $options['retries'],
+                $req,
+                $value,
+                null
+            )) {
+                return $value;
+            }
+            return $this->doRetry($req, $options, $value);
+        };
+    }
+
+    private function onRejected(RequestInterface $req, array $options)
+    {
+        return function ($reason) use ($req, $options) {
+            if (!call_user_func(
+                $this->decider,
+                $options['retries'],
+                $req,
+                null,
+                $reason
+            )) {
+                return \GuzzleHttp\Promise\rejection_for($reason);
+            }
+            return $this->doRetry($req, $options);
+        };
+    }
+
+    private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)
+    {
+        $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);
+
+        return $this($request, $options);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/TransferStats.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/TransferStats.php
new file mode 100644
index 000000000..15f717e1e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/TransferStats.php
@@ -0,0 +1,126 @@
+<?php
+namespace GuzzleHttp;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Represents data at the point after it was transferred either successfully
+ * or after a network error.
+ */
+final class TransferStats
+{
+    private $request;
+    private $response;
+    private $transferTime;
+    private $handlerStats;
+    private $handlerErrorData;
+
+    /**
+     * @param RequestInterface  $request          Request that was sent.
+     * @param ResponseInterface $response         Response received (if any)
+     * @param null              $transferTime     Total handler transfer time.
+     * @param mixed             $handlerErrorData Handler error data.
+     * @param array             $handlerStats     Handler specific stats.
+     */
+    public function __construct(
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        $transferTime = null,
+        $handlerErrorData = null,
+        $handlerStats = []
+    ) {
+        $this->request = $request;
+        $this->response = $response;
+        $this->transferTime = $transferTime;
+        $this->handlerErrorData = $handlerErrorData;
+        $this->handlerStats = $handlerStats;
+    }
+
+    /**
+     * @return RequestInterface
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Returns the response that was received (if any).
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Returns true if a response was received.
+     *
+     * @return bool
+     */
+    public function hasResponse()
+    {
+        return $this->response !== null;
+    }
+
+    /**
+     * Gets handler specific error data.
+     *
+     * This might be an exception, a integer representing an error code, or
+     * anything else. Relying on this value assumes that you know what handler
+     * you are using.
+     *
+     * @return mixed
+     */
+    public function getHandlerErrorData()
+    {
+        return $this->handlerErrorData;
+    }
+
+    /**
+     * Get the effective URI the request was sent to.
+     *
+     * @return UriInterface
+     */
+    public function getEffectiveUri()
+    {
+        return $this->request->getUri();
+    }
+
+    /**
+     * Get the estimated time the request was being transferred by the handler.
+     *
+     * @return float Time in seconds.
+     */
+    public function getTransferTime()
+    {
+        return $this->transferTime;
+    }
+
+    /**
+     * Gets an array of all of the handler specific transfer data.
+     *
+     * @return array
+     */
+    public function getHandlerStats()
+    {
+        return $this->handlerStats;
+    }
+
+    /**
+     * Get a specific handler statistic from the handler by name.
+     *
+     * @param string $stat Handler specific transfer stat to retrieve.
+     *
+     * @return mixed|null
+     */
+    public function getHandlerStat($stat)
+    {
+        return isset($this->handlerStats[$stat])
+            ? $this->handlerStats[$stat]
+            : null;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/UriTemplate.php
new file mode 100644
index 000000000..0b1623eca
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/UriTemplate.php
@@ -0,0 +1,241 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Expands URI templates. Userland implementation of PECL uri_template.
+ *
+ * @link http://tools.ietf.org/html/rfc6570
+ */
+class UriTemplate
+{
+    /** @var string URI template */
+    private $template;
+
+    /** @var array Variables to use in the template expansion */
+    private $variables;
+
+    /** @var array Hash for quick operator lookups */
+    private static $operatorHash = [
+        ''  => ['prefix' => '',  'joiner' => ',', 'query' => false],
+        '+' => ['prefix' => '',  'joiner' => ',', 'query' => false],
+        '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],
+        '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],
+        '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],
+        ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],
+        '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],
+        '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true]
+    ];
+
+    /** @var array Delimiters */
+    private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$',
+        '&', '\'', '(', ')', '*', '+', ',', ';', '='];
+
+    /** @var array Percent encoded delimiters */
+    private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D',
+        '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',
+        '%3B', '%3D'];
+
+    public function expand($template, array $variables)
+    {
+        if (false === strpos($template, '{')) {
+            return $template;
+        }
+
+        $this->template = $template;
+        $this->variables = $variables;
+
+        return preg_replace_callback(
+            '/\{([^\}]+)\}/',
+            [$this, 'expandMatch'],
+            $this->template
+        );
+    }
+
+    /**
+     * Parse an expression into parts
+     *
+     * @param string $expression Expression to parse
+     *
+     * @return array Returns an associative array of parts
+     */
+    private function parseExpression($expression)
+    {
+        $result = [];
+
+        if (isset(self::$operatorHash[$expression[0]])) {
+            $result['operator'] = $expression[0];
+            $expression = substr($expression, 1);
+        } else {
+            $result['operator'] = '';
+        }
+
+        foreach (explode(',', $expression) as $value) {
+            $value = trim($value);
+            $varspec = [];
+            if ($colonPos = strpos($value, ':')) {
+                $varspec['value'] = substr($value, 0, $colonPos);
+                $varspec['modifier'] = ':';
+                $varspec['position'] = (int) substr($value, $colonPos + 1);
+            } elseif (substr($value, -1) === '*') {
+                $varspec['modifier'] = '*';
+                $varspec['value'] = substr($value, 0, -1);
+            } else {
+                $varspec['value'] = (string) $value;
+                $varspec['modifier'] = '';
+            }
+            $result['values'][] = $varspec;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Process an expansion
+     *
+     * @param array $matches Matches met in the preg_replace_callback
+     *
+     * @return string Returns the replacement string
+     */
+    private function expandMatch(array $matches)
+    {
+        static $rfc1738to3986 = ['+' => '%20', '%7e' => '~'];
+
+        $replacements = [];
+        $parsed = self::parseExpression($matches[1]);
+        $prefix = self::$operatorHash[$parsed['operator']]['prefix'];
+        $joiner = self::$operatorHash[$parsed['operator']]['joiner'];
+        $useQuery = self::$operatorHash[$parsed['operator']]['query'];
+
+        foreach ($parsed['values'] as $value) {
+
+            if (!isset($this->variables[$value['value']])) {
+                continue;
+            }
+
+            $variable = $this->variables[$value['value']];
+            $actuallyUseQuery = $useQuery;
+            $expanded = '';
+
+            if (is_array($variable)) {
+
+                $isAssoc = $this->isAssoc($variable);
+                $kvp = [];
+                foreach ($variable as $key => $var) {
+
+                    if ($isAssoc) {
+                        $key = rawurlencode($key);
+                        $isNestedArray = is_array($var);
+                    } else {
+                        $isNestedArray = false;
+                    }
+
+                    if (!$isNestedArray) {
+                        $var = rawurlencode($var);
+                        if ($parsed['operator'] === '+' ||
+                            $parsed['operator'] === '#'
+                        ) {
+                            $var = $this->decodeReserved($var);
+                        }
+                    }
+
+                    if ($value['modifier'] === '*') {
+                        if ($isAssoc) {
+                            if ($isNestedArray) {
+                                // Nested arrays must allow for deeply nested
+                                // structures.
+                                $var = strtr(
+                                    http_build_query([$key => $var]),
+                                    $rfc1738to3986
+                                );
+                            } else {
+                                $var = $key . '=' . $var;
+                            }
+                        } elseif ($key > 0 && $actuallyUseQuery) {
+                            $var = $value['value'] . '=' . $var;
+                        }
+                    }
+
+                    $kvp[$key] = $var;
+                }
+
+                if (empty($variable)) {
+                    $actuallyUseQuery = false;
+                } elseif ($value['modifier'] === '*') {
+                    $expanded = implode($joiner, $kvp);
+                    if ($isAssoc) {
+                        // Don't prepend the value name when using the explode
+                        // modifier with an associative array.
+                        $actuallyUseQuery = false;
+                    }
+                } else {
+                    if ($isAssoc) {
+                        // When an associative array is encountered and the
+                        // explode modifier is not set, then the result must be
+                        // a comma separated list of keys followed by their
+                        // respective values.
+                        foreach ($kvp as $k => &$v) {
+                            $v = $k . ',' . $v;
+                        }
+                    }
+                    $expanded = implode(',', $kvp);
+                }
+
+            } else {
+                if ($value['modifier'] === ':') {
+                    $variable = substr($variable, 0, $value['position']);
+                }
+                $expanded = rawurlencode($variable);
+                if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {
+                    $expanded = $this->decodeReserved($expanded);
+                }
+            }
+
+            if ($actuallyUseQuery) {
+                if (!$expanded && $joiner !== '&') {
+                    $expanded = $value['value'];
+                } else {
+                    $expanded = $value['value'] . '=' . $expanded;
+                }
+            }
+
+            $replacements[] = $expanded;
+        }
+
+        $ret = implode($joiner, $replacements);
+        if ($ret && $prefix) {
+            return $prefix . $ret;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Determines if an array is associative.
+     *
+     * This makes the assumption that input arrays are sequences or hashes.
+     * This assumption is a tradeoff for accuracy in favor of speed, but it
+     * should work in almost every case where input is supplied for a URI
+     * template.
+     *
+     * @param array $array Array to check
+     *
+     * @return bool
+     */
+    private function isAssoc(array $array)
+    {
+        return $array && array_keys($array)[0] !== 0;
+    }
+
+    /**
+     * Removes percent encoding on reserved characters (used with + and #
+     * modifiers).
+     *
+     * @param string $string String to fix
+     *
+     * @return string
+     */
+    private function decodeReserved($string)
+    {
+        return str_replace(self::$delimsPct, self::$delims, $string);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions.php
new file mode 100644
index 000000000..59e212edf
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions.php
@@ -0,0 +1,331 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Handler\CurlHandler;
+use GuzzleHttp\Handler\CurlMultiHandler;
+use GuzzleHttp\Handler\Proxy;
+use GuzzleHttp\Handler\StreamHandler;
+
+/**
+ * Expands a URI template
+ *
+ * @param string $template  URI template
+ * @param array  $variables Template variables
+ *
+ * @return string
+ */
+function uri_template($template, array $variables)
+{
+    if (extension_loaded('uri_template')) {
+        // @codeCoverageIgnoreStart
+        return \uri_template($template, $variables);
+        // @codeCoverageIgnoreEnd
+    }
+
+    static $uriTemplate;
+    if (!$uriTemplate) {
+        $uriTemplate = new UriTemplate();
+    }
+
+    return $uriTemplate->expand($template, $variables);
+}
+
+/**
+ * Debug function used to describe the provided value type and class.
+ *
+ * @param mixed $input
+ *
+ * @return string Returns a string containing the type of the variable and
+ *                if a class is provided, the class name.
+ */
+function describe_type($input)
+{
+    switch (gettype($input)) {
+        case 'object':
+            return 'object(' . get_class($input) . ')';
+        case 'array':
+            return 'array(' . count($input) . ')';
+        default:
+            ob_start();
+            var_dump($input);
+            // normalize float vs double
+            return str_replace('double(', 'float(', rtrim(ob_get_clean()));
+    }
+}
+
+/**
+ * Parses an array of header lines into an associative array of headers.
+ *
+ * @param array $lines Header lines array of strings in the following
+ *                     format: "Name: Value"
+ * @return array
+ */
+function headers_from_lines($lines)
+{
+    $headers = [];
+
+    foreach ($lines as $line) {
+        $parts = explode(':', $line, 2);
+        $headers[trim($parts[0])][] = isset($parts[1])
+            ? trim($parts[1])
+            : null;
+    }
+
+    return $headers;
+}
+
+/**
+ * Returns a debug stream based on the provided variable.
+ *
+ * @param mixed $value Optional value
+ *
+ * @return resource
+ */
+function debug_resource($value = null)
+{
+    if (is_resource($value)) {
+        return $value;
+    } elseif (defined('STDOUT')) {
+        return STDOUT;
+    }
+
+    return fopen('php://output', 'w');
+}
+
+/**
+ * Chooses and creates a default handler to use based on the environment.
+ *
+ * The returned handler is not wrapped by any default middlewares.
+ *
+ * @throws \RuntimeException if no viable Handler is available.
+ * @return callable Returns the best handler for the given system.
+ */
+function choose_handler()
+{
+    $handler = null;
+    if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {
+        $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
+    } elseif (function_exists('curl_exec')) {
+        $handler = new CurlHandler();
+    } elseif (function_exists('curl_multi_exec')) {
+        $handler = new CurlMultiHandler();
+    }
+
+    if (ini_get('allow_url_fopen')) {
+        $handler = $handler
+            ? Proxy::wrapStreaming($handler, new StreamHandler())
+            : new StreamHandler();
+    } elseif (!$handler) {
+        throw new \RuntimeException('GuzzleHttp requires cURL, the '
+            . 'allow_url_fopen ini setting, or a custom HTTP handler.');
+    }
+
+    return $handler;
+}
+
+/**
+ * Get the default User-Agent string to use with Guzzle
+ *
+ * @return string
+ */
+function default_user_agent()
+{
+    static $defaultAgent = '';
+
+    if (!$defaultAgent) {
+        $defaultAgent = 'GuzzleHttp/' . Client::VERSION;
+        if (extension_loaded('curl') && function_exists('curl_version')) {
+            $defaultAgent .= ' curl/' . \curl_version()['version'];
+        }
+        $defaultAgent .= ' PHP/' . PHP_VERSION;
+    }
+
+    return $defaultAgent;
+}
+
+/**
+ * Returns the default cacert bundle for the current system.
+ *
+ * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
+ * If those settings are not configured, then the common locations for
+ * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
+ * and Windows are checked. If any of these file locations are found on
+ * disk, they will be utilized.
+ *
+ * Note: the result of this function is cached for subsequent calls.
+ *
+ * @return string
+ * @throws \RuntimeException if no bundle can be found.
+ */
+function default_ca_bundle()
+{
+    static $cached = null;
+    static $cafiles = [
+        // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
+        '/etc/pki/tls/certs/ca-bundle.crt',
+        // Ubuntu, Debian (provided by the ca-certificates package)
+        '/etc/ssl/certs/ca-certificates.crt',
+        // FreeBSD (provided by the ca_root_nss package)
+        '/usr/local/share/certs/ca-root-nss.crt',
+        // SLES 12 (provided by the ca-certificates package)
+        '/var/lib/ca-certificates/ca-bundle.pem',
+        // OS X provided by homebrew (using the default path)
+        '/usr/local/etc/openssl/cert.pem',
+        // Google app engine
+        '/etc/ca-certificates.crt',
+        // Windows?
+        'C:\\windows\\system32\\curl-ca-bundle.crt',
+        'C:\\windows\\curl-ca-bundle.crt',
+    ];
+
+    if ($cached) {
+        return $cached;
+    }
+
+    if ($ca = ini_get('openssl.cafile')) {
+        return $cached = $ca;
+    }
+
+    if ($ca = ini_get('curl.cainfo')) {
+        return $cached = $ca;
+    }
+
+    foreach ($cafiles as $filename) {
+        if (file_exists($filename)) {
+            return $cached = $filename;
+        }
+    }
+
+    throw new \RuntimeException(<<< EOT
+No system CA bundle could be found in any of the the common system locations.
+PHP versions earlier than 5.6 are not properly configured to use the system's
+CA bundle by default. In order to verify peer certificates, you will need to
+supply the path on disk to a certificate bundle to the 'verify' request
+option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
+need a specific certificate bundle, then Mozilla provides a commonly used CA
+bundle which can be downloaded here (provided by the maintainer of cURL):
+https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
+you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
+ini setting to point to the path to the file, allowing you to omit the 'verify'
+request option. See http://curl.haxx.se/docs/sslcerts.html for more
+information.
+EOT
+    );
+}
+
+/**
+ * Creates an associative array of lowercase header names to the actual
+ * header casing.
+ *
+ * @param array $headers
+ *
+ * @return array
+ */
+function normalize_header_keys(array $headers)
+{
+    $result = [];
+    foreach (array_keys($headers) as $key) {
+        $result[strtolower($key)] = $key;
+    }
+
+    return $result;
+}
+
+/**
+ * Returns true if the provided host matches any of the no proxy areas.
+ *
+ * This method will strip a port from the host if it is present. Each pattern
+ * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
+ * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
+ * "baz.foo.com", but ".foo.com" != "foo.com").
+ *
+ * Areas are matched in the following cases:
+ * 1. "*" (without quotes) always matches any hosts.
+ * 2. An exact match.
+ * 3. The area starts with "." and the area is the last part of the host. e.g.
+ *    '.mit.edu' will match any host that ends with '.mit.edu'.
+ *
+ * @param string $host         Host to check against the patterns.
+ * @param array  $noProxyArray An array of host patterns.
+ *
+ * @return bool
+ */
+function is_host_in_noproxy($host, array $noProxyArray)
+{
+    if (strlen($host) === 0) {
+        throw new \InvalidArgumentException('Empty host provided');
+    }
+
+    // Strip port if present.
+    if (strpos($host, ':')) {
+        $host = explode($host, ':', 2)[0];
+    }
+
+    foreach ($noProxyArray as $area) {
+        // Always match on wildcards.
+        if ($area === '*') {
+            return true;
+        } elseif (empty($area)) {
+            // Don't match on empty values.
+            continue;
+        } elseif ($area === $host) {
+            // Exact matches.
+            return true;
+        } else {
+            // Special match if the area when prefixed with ".". Remove any
+            // existing leading "." and add a new leading ".".
+            $area = '.' . ltrim($area, '.');
+            if (substr($host, -(strlen($area))) === $area) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+/**
+ * Wrapper for json_decode that throws when an error occurs.
+ *
+ * @param string $json    JSON data to parse
+ * @param bool $assoc     When true, returned objects will be converted
+ *                        into associative arrays.
+ * @param int    $depth   User specified recursion depth.
+ * @param int    $options Bitmask of JSON decode options.
+ *
+ * @return mixed
+ * @throws \InvalidArgumentException if the JSON cannot be decoded.
+ * @link http://www.php.net/manual/en/function.json-decode.php
+ */
+function json_decode($json, $assoc = false, $depth = 512, $options = 0)
+{
+    $data = \json_decode($json, $assoc, $depth, $options);
+    if (JSON_ERROR_NONE !== json_last_error()) {
+        throw new \InvalidArgumentException(
+            'json_decode error: ' . json_last_error_msg());
+    }
+
+    return $data;
+}
+
+/**
+ * Wrapper for JSON encoding that throws when an error occurs.
+ *
+ * @param mixed $value   The value being encoded
+ * @param int    $options JSON encode option bitmask
+ * @param int    $depth   Set the maximum depth. Must be greater than zero.
+ *
+ * @return string
+ * @throws \InvalidArgumentException if the JSON cannot be encoded.
+ * @link http://www.php.net/manual/en/function.json-encode.php
+ */
+function json_encode($value, $options = 0, $depth = 512)
+{
+    $json = \json_encode($value, $options, $depth);
+    if (JSON_ERROR_NONE !== json_last_error()) {
+        throw new \InvalidArgumentException(
+            'json_encode error: ' . json_last_error_msg());
+    }
+
+    return $json;
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions_include.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions_include.php
new file mode 100644
index 000000000..a93393acc
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/guzzle/src/functions_include.php
@@ -0,0 +1,6 @@
+<?php
+
+// Don't redefine the functions if included multiple times.
+if (!function_exists('GuzzleHttp\uri_template')) {
+    require __DIR__ . '/functions.php';
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/CHANGELOG.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/CHANGELOG.md
new file mode 100644
index 000000000..551929f6b
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/CHANGELOG.md
@@ -0,0 +1,65 @@
+# CHANGELOG
+
+
+## 1.3.1 - 2016-12-20
+
+### Fixed
+
+- `wait()` foreign promise compatibility
+
+
+## 1.3.0 - 2016-11-18
+
+### Added
+
+- Adds support for custom task queues.
+
+### Fixed
+
+- Fixed coroutine promise memory leak.
+
+
+## 1.2.0 - 2016-05-18
+
+### Changed
+
+- Update to now catch `\Throwable` on PHP 7+
+
+
+## 1.1.0 - 2016-03-07
+
+### Changed
+
+- Update EachPromise to prevent recurring on a iterator when advancing, as this
+  could trigger fatal generator errors.
+- Update Promise to allow recursive waiting without unwrapping exceptions.
+
+
+## 1.0.3 - 2015-10-15
+
+### Changed
+
+- Update EachPromise to immediately resolve when the underlying promise iterator
+  is empty. Previously, such a promise would throw an exception when its `wait`
+  function was called.
+
+
+## 1.0.2 - 2015-05-15
+
+### Changed
+
+- Conditionally require functions.php.
+
+
+## 1.0.1 - 2015-06-24
+
+### Changed
+
+- Updating EachPromise to call next on the underlying promise iterator as late
+  as possible to ensure that generators that generate new requests based on
+  callbacks are not iterated until after callbacks are invoked.
+
+
+## 1.0.0 - 2015-05-12
+
+- Initial release
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/LICENSE b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/LICENSE
new file mode 100644
index 000000000..67f91a14c
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+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.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/Makefile b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/Makefile
new file mode 100644
index 000000000..8d5b3ef95
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/Makefile
@@ -0,0 +1,13 @@
+all: clean test
+
+test:
+	vendor/bin/phpunit
+
+coverage:
+	vendor/bin/phpunit --coverage-html=artifacts/coverage
+
+view-coverage:
+	open artifacts/coverage/index.html
+
+clean:
+	rm -rf artifacts/*
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/README.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/README.md
new file mode 100644
index 000000000..7b607e28b
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/README.md
@@ -0,0 +1,504 @@
+# Guzzle Promises
+
+[Promises/A+](https://promisesaplus.com/) implementation that handles promise
+chaining and resolution iteratively, allowing for "infinite" promise chaining
+while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)
+for a general introduction to promises.
+
+- [Features](#features)
+- [Quick start](#quick-start)
+- [Synchronous wait](#synchronous-wait)
+- [Cancellation](#cancellation)
+- [API](#api)
+  - [Promise](#promise)
+  - [FulfilledPromise](#fulfilledpromise)
+  - [RejectedPromise](#rejectedpromise)
+- [Promise interop](#promise-interop)
+- [Implementation notes](#implementation-notes)
+
+
+# Features
+
+- [Promises/A+](https://promisesaplus.com/) implementation.
+- Promise resolution and chaining is handled iteratively, allowing for
+  "infinite" promise chaining.
+- Promises have a synchronous `wait` method.
+- Promises can be cancelled.
+- Works with any object that has a `then` function.
+- C# style async/await coroutine promises using
+  `GuzzleHttp\Promise\coroutine()`.
+
+
+# Quick start
+
+A *promise* represents the eventual result of an asynchronous operation. The
+primary way of interacting with a promise is through its `then` method, which
+registers callbacks to receive either a promise's eventual value or the reason
+why the promise cannot be fulfilled.
+
+
+## Callbacks
+
+Callbacks are registered with the `then` method by providing an optional 
+`$onFulfilled` followed by an optional `$onRejected` function.
+
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(
+    // $onFulfilled
+    function ($value) {
+        echo 'The promise was fulfilled.';
+    },
+    // $onRejected
+    function ($reason) {
+        echo 'The promise was rejected.';
+    }
+);
+```
+
+*Resolving* a promise means that you either fulfill a promise with a *value* or
+reject a promise with a *reason*. Resolving a promises triggers callbacks
+registered with the promises's `then` method. These callbacks are triggered
+only once and in the order in which they were added.
+
+
+## Resolving a promise
+
+Promises are fulfilled using the `resolve($value)` method. Resolving a promise
+with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger
+all of the onFulfilled callbacks (resolving a promise with a rejected promise
+will reject the promise and trigger the `$onRejected` callbacks).
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise
+    ->then(function ($value) {
+        // Return a value and don't break the chain
+        return "Hello, " . $value;
+    })
+    // This then is executed after the first then and receives the value
+    // returned from the first then.
+    ->then(function ($value) {
+        echo $value;
+    });
+
+// Resolving the promise triggers the $onFulfilled callbacks and outputs
+// "Hello, reader".
+$promise->resolve('reader.');
+```
+
+
+## Promise forwarding
+
+Promises can be chained one after the other. Each then in the chain is a new
+promise. The return value of a promise is what's forwarded to the next
+promise in the chain. Returning a promise in a `then` callback will cause the
+subsequent promises in the chain to only be fulfilled when the returned promise
+has been fulfilled. The next promise in the chain will be invoked with the
+resolved value of the promise.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$nextPromise = new Promise();
+
+$promise
+    ->then(function ($value) use ($nextPromise) {
+        echo $value;
+        return $nextPromise;
+    })
+    ->then(function ($value) {
+        echo $value;
+    });
+
+// Triggers the first callback and outputs "A"
+$promise->resolve('A');
+// Triggers the second callback and outputs "B"
+$nextPromise->resolve('B');
+```
+
+## Promise rejection
+
+When a promise is rejected, the `$onRejected` callbacks are invoked with the
+rejection reason.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+    echo $reason;
+});
+
+$promise->reject('Error!');
+// Outputs "Error!"
+```
+
+## Rejection forwarding
+
+If an exception is thrown in an `$onRejected` callback, subsequent
+`$onRejected` callbacks are invoked with the thrown exception as the reason.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+    throw new \Exception($reason);
+})->then(null, function ($reason) {
+    assert($reason->getMessage() === 'Error!');
+});
+
+$promise->reject('Error!');
+```
+
+You can also forward a rejection down the promise chain by returning a
+`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or
+`$onRejected` callback.
+
+```php
+use GuzzleHttp\Promise\Promise;
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+    return new RejectedPromise($reason);
+})->then(null, function ($reason) {
+    assert($reason === 'Error!');
+});
+
+$promise->reject('Error!');
+```
+
+If an exception is not thrown in a `$onRejected` callback and the callback
+does not return a rejected promise, downstream `$onFulfilled` callbacks are
+invoked using the value returned from the `$onRejected` callback.
+
+```php
+use GuzzleHttp\Promise\Promise;
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new Promise();
+$promise
+    ->then(null, function ($reason) {
+        return "It's ok";
+    })
+    ->then(function ($value) {
+        assert($value === "It's ok");
+    });
+
+$promise->reject('Error!');
+```
+
+# Synchronous wait
+
+You can synchronously force promises to complete using a promise's `wait`
+method. When creating a promise, you can provide a wait function that is used
+to synchronously force a promise to complete. When a wait function is invoked
+it is expected to deliver a value to the promise or reject the promise. If the
+wait function does not deliver a value, then an exception is thrown. The wait
+function provided to a promise constructor is invoked when the `wait` function
+of the promise is called.
+
+```php
+$promise = new Promise(function () use (&$promise) {
+    $promise->resolve('foo');
+});
+
+// Calling wait will return the value of the promise.
+echo $promise->wait(); // outputs "foo"
+```
+
+If an exception is encountered while invoking the wait function of a promise,
+the promise is rejected with the exception and the exception is thrown.
+
+```php
+$promise = new Promise(function () use (&$promise) {
+    throw new \Exception('foo');
+});
+
+$promise->wait(); // throws the exception.
+```
+
+Calling `wait` on a promise that has been fulfilled will not trigger the wait
+function. It will simply return the previously resolved value.
+
+```php
+$promise = new Promise(function () { die('this is not called!'); });
+$promise->resolve('foo');
+echo $promise->wait(); // outputs "foo"
+```
+
+Calling `wait` on a promise that has been rejected will throw an exception. If
+the rejection reason is an instance of `\Exception` the reason is thrown.
+Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason
+can be obtained by calling the `getReason` method of the exception.
+
+```php
+$promise = new Promise();
+$promise->reject('foo');
+$promise->wait();
+```
+
+> PHP Fatal error:  Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo'
+
+
+## Unwrapping a promise
+
+When synchronously waiting on a promise, you are joining the state of the
+promise into the current state of execution (i.e., return the value of the
+promise if it was fulfilled or throw an exception if it was rejected). This is
+called "unwrapping" the promise. Waiting on a promise will by default unwrap
+the promise state.
+
+You can force a promise to resolve and *not* unwrap the state of the promise
+by passing `false` to the first argument of the `wait` function:
+
+```php
+$promise = new Promise();
+$promise->reject('foo');
+// This will not throw an exception. It simply ensures the promise has
+// been resolved.
+$promise->wait(false);
+```
+
+When unwrapping a promise, the resolved value of the promise will be waited
+upon until the unwrapped value is not a promise. This means that if you resolve
+promise A with a promise B and unwrap promise A, the value returned by the
+wait function will be the value delivered to promise B.
+
+**Note**: when you do not unwrap the promise, no value is returned.
+
+
+# Cancellation
+
+You can cancel a promise that has not yet been fulfilled using the `cancel()`
+method of a promise. When creating a promise you can provide an optional
+cancel function that when invoked cancels the action of computing a resolution
+of the promise.
+
+
+# API
+
+
+## Promise
+
+When creating a promise object, you can provide an optional `$waitFn` and
+`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is
+expected to resolve the promise. `$cancelFn` is a function with no arguments
+that is expected to cancel the computation of a promise. It is invoked when the
+`cancel()` method of a promise is called.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise(
+    function () use (&$promise) {
+        $promise->resolve('waited');
+    },
+    function () {
+        // do something that will cancel the promise computation (e.g., close
+        // a socket, cancel a database query, etc...)
+    }
+);
+
+assert('waited' === $promise->wait());
+```
+
+A promise has the following methods:
+
+- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`
+  
+  Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.
+
+- `otherwise(callable $onRejected) : PromiseInterface`
+  
+  Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled.
+
+- `wait($unwrap = true) : mixed`
+
+  Synchronously waits on the promise to complete.
+  
+  `$unwrap` controls whether or not the value of the promise is returned for a
+  fulfilled promise or if an exception is thrown if the promise is rejected.
+  This is set to `true` by default.
+
+- `cancel()`
+
+  Attempts to cancel the promise if possible. The promise being cancelled and
+  the parent most ancestor that has not yet been resolved will also be
+  cancelled. Any promises waiting on the cancelled promise to resolve will also
+  be cancelled.
+
+- `getState() : string`
+
+  Returns the state of the promise. One of `pending`, `fulfilled`, or
+  `rejected`.
+
+- `resolve($value)`
+
+  Fulfills the promise with the given `$value`.
+
+- `reject($reason)`
+
+  Rejects the promise with the given `$reason`.
+
+
+## FulfilledPromise
+
+A fulfilled promise can be created to represent a promise that has been
+fulfilled.
+
+```php
+use GuzzleHttp\Promise\FulfilledPromise;
+
+$promise = new FulfilledPromise('value');
+
+// Fulfilled callbacks are immediately invoked.
+$promise->then(function ($value) {
+    echo $value;
+});
+```
+
+
+## RejectedPromise
+
+A rejected promise can be created to represent a promise that has been
+rejected.
+
+```php
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new RejectedPromise('Error');
+
+// Rejected callbacks are immediately invoked.
+$promise->then(null, function ($reason) {
+    echo $reason;
+});
+```
+
+
+# Promise interop
+
+This library works with foreign promises that have a `then` method. This means
+you can use Guzzle promises with [React promises](https://github.com/reactphp/promise)
+for example. When a foreign promise is returned inside of a then method
+callback, promise resolution will occur recursively.
+
+```php
+// Create a React promise
+$deferred = new React\Promise\Deferred();
+$reactPromise = $deferred->promise();
+
+// Create a Guzzle promise that is fulfilled with a React promise.
+$guzzlePromise = new \GuzzleHttp\Promise\Promise();
+$guzzlePromise->then(function ($value) use ($reactPromise) {
+    // Do something something with the value...
+    // Return the React promise
+    return $reactPromise;
+});
+```
+
+Please note that wait and cancel chaining is no longer possible when forwarding
+a foreign promise. You will need to wrap a third-party promise with a Guzzle
+promise in order to utilize wait and cancel functions with foreign promises.
+
+
+## Event Loop Integration
+
+In order to keep the stack size constant, Guzzle promises are resolved
+asynchronously using a task queue. When waiting on promises synchronously, the
+task queue will be automatically run to ensure that the blocking promise and
+any forwarded promises are resolved. When using promises asynchronously in an
+event loop, you will need to run the task queue on each tick of the loop. If
+you do not run the task queue, then promises will not be resolved.
+
+You can run the task queue using the `run()` method of the global task queue
+instance.
+
+```php
+// Get the global task queue
+$queue = \GuzzleHttp\Promise\queue();
+$queue->run();
+```
+
+For example, you could use Guzzle promises with React using a periodic timer:
+
+```php
+$loop = React\EventLoop\Factory::create();
+$loop->addPeriodicTimer(0, [$queue, 'run']);
+```
+
+*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?
+
+
+# Implementation notes
+
+
+## Promise resolution and chaining is handled iteratively
+
+By shuffling pending handlers from one owner to another, promises are
+resolved iteratively, allowing for "infinite" then chaining.
+
+```php
+<?php
+require 'vendor/autoload.php';
+
+use GuzzleHttp\Promise\Promise;
+
+$parent = new Promise();
+$p = $parent;
+
+for ($i = 0; $i < 1000; $i++) {
+    $p = $p->then(function ($v) {
+        // The stack size remains constant (a good thing)
+        echo xdebug_get_stack_depth() . ', ';
+        return $v + 1;
+    });
+}
+
+$parent->resolve(0);
+var_dump($p->wait()); // int(1000)
+
+```
+
+When a promise is fulfilled or rejected with a non-promise value, the promise
+then takes ownership of the handlers of each child promise and delivers values
+down the chain without using recursion.
+
+When a promise is resolved with another promise, the original promise transfers
+all of its pending handlers to the new promise. When the new promise is
+eventually resolved, all of the pending handlers are delivered the forwarded
+value.
+
+
+## A promise is the deferred.
+
+Some promise libraries implement promises using a deferred object to represent
+a computation and a promise object to represent the delivery of the result of
+the computation. This is a nice separation of computation and delivery because
+consumers of the promise cannot modify the value that will be eventually
+delivered.
+
+One side effect of being able to implement promise resolution and chaining
+iteratively is that you need to be able for one promise to reach into the state
+of another promise to shuffle around ownership of handlers. In order to achieve
+this without making the handlers of a promise publicly mutable, a promise is
+also the deferred value, allowing promises of the same parent class to reach
+into and modify the private properties of promises of the same type. While this
+does allow consumers of the value to modify the resolution or rejection of the
+deferred, it is a small price to pay for keeping the stack size constant.
+
+```php
+$promise = new Promise();
+$promise->then(function ($value) { echo $value; });
+// The promise is the deferred value, so you can deliver a value to it.
+$promise->resolve('foo');
+// prints "foo"
+```
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/composer.json b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/composer.json
new file mode 100644
index 000000000..ec41a61e6
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/composer.json
@@ -0,0 +1,34 @@
+{
+    "name": "guzzlehttp/promises",
+    "description": "Guzzle promises library",
+    "keywords": ["promise"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.5.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^4.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "GuzzleHttp\\Promise\\": "src/"
+        },
+        "files": ["src/functions_include.php"]
+    },
+    "scripts": {
+        "test": "vendor/bin/phpunit",
+        "test-ci": "vendor/bin/phpunit --coverage-text"
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.4-dev"
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/AggregateException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/AggregateException.php
new file mode 100644
index 000000000..6a5690c37
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/AggregateException.php
@@ -0,0 +1,16 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Exception thrown when too many errors occur in the some() or any() methods.
+ */
+class AggregateException extends RejectionException
+{
+    public function __construct($msg, array $reasons)
+    {
+        parent::__construct(
+            $reasons,
+            sprintf('%s; %d rejected promises', $msg, count($reasons))
+        );
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/CancellationException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/CancellationException.php
new file mode 100644
index 000000000..cb360b805
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/CancellationException.php
@@ -0,0 +1,9 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Exception that is set as the reason for a promise that has been cancelled.
+ */
+class CancellationException extends RejectionException
+{
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Coroutine.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Coroutine.php
new file mode 100644
index 000000000..6aa095870
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Coroutine.php
@@ -0,0 +1,151 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+use Exception;
+use Generator;
+use Throwable;
+
+/**
+ * Creates a promise that is resolved using a generator that yields values or
+ * promises (somewhat similar to C#'s async keyword).
+ *
+ * When called, the coroutine function will start an instance of the generator
+ * and returns a promise that is fulfilled with its final yielded value.
+ *
+ * Control is returned back to the generator when the yielded promise settles.
+ * This can lead to less verbose code when doing lots of sequential async calls
+ * with minimal processing in between.
+ *
+ *     use GuzzleHttp\Promise;
+ *
+ *     function createPromise($value) {
+ *         return new Promise\FulfilledPromise($value);
+ *     }
+ *
+ *     $promise = Promise\coroutine(function () {
+ *         $value = (yield createPromise('a'));
+ *         try {
+ *             $value = (yield createPromise($value . 'b'));
+ *         } catch (\Exception $e) {
+ *             // The promise was rejected.
+ *         }
+ *         yield $value . 'c';
+ *     });
+ *
+ *     // Outputs "abc"
+ *     $promise->then(function ($v) { echo $v; });
+ *
+ * @param callable $generatorFn Generator function to wrap into a promise.
+ *
+ * @return Promise
+ * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
+ */
+final class Coroutine implements PromiseInterface
+{
+    /**
+     * @var PromiseInterface|null
+     */
+    private $currentPromise;
+
+    /**
+     * @var Generator
+     */
+    private $generator;
+
+    /**
+     * @var Promise
+     */
+    private $result;
+
+    public function __construct(callable $generatorFn)
+    {
+        $this->generator = $generatorFn();
+        $this->result = new Promise(function () {
+            while (isset($this->currentPromise)) {
+                $this->currentPromise->wait();
+            }
+        });
+        $this->nextCoroutine($this->generator->current());
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        return $this->result->then($onFulfilled, $onRejected);
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->result->otherwise($onRejected);
+    }
+
+    public function wait($unwrap = true)
+    {
+        return $this->result->wait($unwrap);
+    }
+
+    public function getState()
+    {
+        return $this->result->getState();
+    }
+
+    public function resolve($value)
+    {
+        $this->result->resolve($value);
+    }
+
+    public function reject($reason)
+    {
+        $this->result->reject($reason);
+    }
+
+    public function cancel()
+    {
+        $this->currentPromise->cancel();
+        $this->result->cancel();
+    }
+
+    private function nextCoroutine($yielded)
+    {
+        $this->currentPromise = promise_for($yielded)
+            ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
+    }
+
+    /**
+     * @internal
+     */
+    public function _handleSuccess($value)
+    {
+        unset($this->currentPromise);
+        try {
+            $next = $this->generator->send($value);
+            if ($this->generator->valid()) {
+                $this->nextCoroutine($next);
+            } else {
+                $this->result->resolve($value);
+            }
+        } catch (Exception $exception) {
+            $this->result->reject($exception);
+        } catch (Throwable $throwable) {
+            $this->result->reject($throwable);
+        }
+    }
+
+    /**
+     * @internal
+     */
+    public function _handleFailure($reason)
+    {
+        unset($this->currentPromise);
+        try {
+            $nextYield = $this->generator->throw(exception_for($reason));
+            // The throw was caught, so keep iterating on the coroutine
+            $this->nextCoroutine($nextYield);
+        } catch (Exception $exception) {
+            $this->result->reject($exception);
+        } catch (Throwable $throwable) {
+            $this->result->reject($throwable);
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/EachPromise.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/EachPromise.php
new file mode 100644
index 000000000..d0ddf603f
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/EachPromise.php
@@ -0,0 +1,229 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Represents a promise that iterates over many promises and invokes
+ * side-effect functions in the process.
+ */
+class EachPromise implements PromisorInterface
+{
+    private $pending = [];
+
+    /** @var \Iterator */
+    private $iterable;
+
+    /** @var callable|int */
+    private $concurrency;
+
+    /** @var callable */
+    private $onFulfilled;
+
+    /** @var callable */
+    private $onRejected;
+
+    /** @var Promise */
+    private $aggregate;
+
+    /** @var bool */
+    private $mutex;
+
+    /**
+     * Configuration hash can include the following key value pairs:
+     *
+     * - fulfilled: (callable) Invoked when a promise fulfills. The function
+     *   is invoked with three arguments: the fulfillment value, the index
+     *   position from the iterable list of the promise, and the aggregate
+     *   promise that manages all of the promises. The aggregate promise may
+     *   be resolved from within the callback to short-circuit the promise.
+     * - rejected: (callable) Invoked when a promise is rejected. The
+     *   function is invoked with three arguments: the rejection reason, the
+     *   index position from the iterable list of the promise, and the
+     *   aggregate promise that manages all of the promises. The aggregate
+     *   promise may be resolved from within the callback to short-circuit
+     *   the promise.
+     * - concurrency: (integer) Pass this configuration option to limit the
+     *   allowed number of outstanding concurrently executing promises,
+     *   creating a capped pool of promises. There is no limit by default.
+     *
+     * @param mixed    $iterable Promises or values to iterate.
+     * @param array    $config   Configuration options
+     */
+    public function __construct($iterable, array $config = [])
+    {
+        $this->iterable = iter_for($iterable);
+
+        if (isset($config['concurrency'])) {
+            $this->concurrency = $config['concurrency'];
+        }
+
+        if (isset($config['fulfilled'])) {
+            $this->onFulfilled = $config['fulfilled'];
+        }
+
+        if (isset($config['rejected'])) {
+            $this->onRejected = $config['rejected'];
+        }
+    }
+
+    public function promise()
+    {
+        if ($this->aggregate) {
+            return $this->aggregate;
+        }
+
+        try {
+            $this->createPromise();
+            $this->iterable->rewind();
+            $this->refillPending();
+        } catch (\Throwable $e) {
+            $this->aggregate->reject($e);
+        } catch (\Exception $e) {
+            $this->aggregate->reject($e);
+        }
+
+        return $this->aggregate;
+    }
+
+    private function createPromise()
+    {
+        $this->mutex = false;
+        $this->aggregate = new Promise(function () {
+            reset($this->pending);
+            if (empty($this->pending) && !$this->iterable->valid()) {
+                $this->aggregate->resolve(null);
+                return;
+            }
+
+            // Consume a potentially fluctuating list of promises while
+            // ensuring that indexes are maintained (precluding array_shift).
+            while ($promise = current($this->pending)) {
+                next($this->pending);
+                $promise->wait();
+                if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
+                    return;
+                }
+            }
+        });
+
+        // Clear the references when the promise is resolved.
+        $clearFn = function () {
+            $this->iterable = $this->concurrency = $this->pending = null;
+            $this->onFulfilled = $this->onRejected = null;
+        };
+
+        $this->aggregate->then($clearFn, $clearFn);
+    }
+
+    private function refillPending()
+    {
+        if (!$this->concurrency) {
+            // Add all pending promises.
+            while ($this->addPending() && $this->advanceIterator());
+            return;
+        }
+
+        // Add only up to N pending promises.
+        $concurrency = is_callable($this->concurrency)
+            ? call_user_func($this->concurrency, count($this->pending))
+            : $this->concurrency;
+        $concurrency = max($concurrency - count($this->pending), 0);
+        // Concurrency may be set to 0 to disallow new promises.
+        if (!$concurrency) {
+            return;
+        }
+        // Add the first pending promise.
+        $this->addPending();
+        // Note this is special handling for concurrency=1 so that we do
+        // not advance the iterator after adding the first promise. This
+        // helps work around issues with generators that might not have the
+        // next value to yield until promise callbacks are called.
+        while (--$concurrency
+            && $this->advanceIterator()
+            && $this->addPending());
+    }
+
+    private function addPending()
+    {
+        if (!$this->iterable || !$this->iterable->valid()) {
+            return false;
+        }
+
+        $promise = promise_for($this->iterable->current());
+        $idx = $this->iterable->key();
+
+        $this->pending[$idx] = $promise->then(
+            function ($value) use ($idx) {
+                if ($this->onFulfilled) {
+                    call_user_func(
+                        $this->onFulfilled, $value, $idx, $this->aggregate
+                    );
+                }
+                $this->step($idx);
+            },
+            function ($reason) use ($idx) {
+                if ($this->onRejected) {
+                    call_user_func(
+                        $this->onRejected, $reason, $idx, $this->aggregate
+                    );
+                }
+                $this->step($idx);
+            }
+        );
+
+        return true;
+    }
+
+    private function advanceIterator()
+    {
+        // Place a lock on the iterator so that we ensure to not recurse,
+        // preventing fatal generator errors.
+        if ($this->mutex) {
+            return false;
+        }
+
+        $this->mutex = true;
+
+        try {
+            $this->iterable->next();
+            $this->mutex = false;
+            return true;
+        } catch (\Throwable $e) {
+            $this->aggregate->reject($e);
+            $this->mutex = false;
+            return false;
+        } catch (\Exception $e) {
+            $this->aggregate->reject($e);
+            $this->mutex = false;
+            return false;
+        }
+    }
+
+    private function step($idx)
+    {
+        // If the promise was already resolved, then ignore this step.
+        if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
+            return;
+        }
+
+        unset($this->pending[$idx]);
+
+        // Only refill pending promises if we are not locked, preventing the
+        // EachPromise to recursively invoke the provided iterator, which
+        // cause a fatal error: "Cannot resume an already running generator"
+        if ($this->advanceIterator() && !$this->checkIfFinished()) {
+            // Add more pending promises if possible.
+            $this->refillPending();
+        }
+    }
+
+    private function checkIfFinished()
+    {
+        if (!$this->pending && !$this->iterable->valid()) {
+            // Resolve the promise if there's nothing left to do.
+            $this->aggregate->resolve(null);
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/FulfilledPromise.php
new file mode 100644
index 000000000..dbbeeb9f7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/FulfilledPromise.php
@@ -0,0 +1,82 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * A promise that has been fulfilled.
+ *
+ * Thenning off of this promise will invoke the onFulfilled callback
+ * immediately and ignore other callbacks.
+ */
+class FulfilledPromise implements PromiseInterface
+{
+    private $value;
+
+    public function __construct($value)
+    {
+        if (method_exists($value, 'then')) {
+            throw new \InvalidArgumentException(
+                'You cannot create a FulfilledPromise with a promise.');
+        }
+
+        $this->value = $value;
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        // Return itself if there is no onFulfilled function.
+        if (!$onFulfilled) {
+            return $this;
+        }
+
+        $queue = queue();
+        $p = new Promise([$queue, 'run']);
+        $value = $this->value;
+        $queue->add(static function () use ($p, $value, $onFulfilled) {
+            if ($p->getState() === self::PENDING) {
+                try {
+                    $p->resolve($onFulfilled($value));
+                } catch (\Throwable $e) {
+                    $p->reject($e);
+                } catch (\Exception $e) {
+                    $p->reject($e);
+                }
+            }
+        });
+
+        return $p;
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->then(null, $onRejected);
+    }
+
+    public function wait($unwrap = true, $defaultDelivery = null)
+    {
+        return $unwrap ? $this->value : null;
+    }
+
+    public function getState()
+    {
+        return self::FULFILLED;
+    }
+
+    public function resolve($value)
+    {
+        if ($value !== $this->value) {
+            throw new \LogicException("Cannot resolve a fulfilled promise");
+        }
+    }
+
+    public function reject($reason)
+    {
+        throw new \LogicException("Cannot reject a fulfilled promise");
+    }
+
+    public function cancel()
+    {
+        // pass
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Promise.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Promise.php
new file mode 100644
index 000000000..844ada073
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/Promise.php
@@ -0,0 +1,280 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Promises/A+ implementation that avoids recursion when possible.
+ *
+ * @link https://promisesaplus.com/
+ */
+class Promise implements PromiseInterface
+{
+    private $state = self::PENDING;
+    private $result;
+    private $cancelFn;
+    private $waitFn;
+    private $waitList;
+    private $handlers = [];
+
+    /**
+     * @param callable $waitFn   Fn that when invoked resolves the promise.
+     * @param callable $cancelFn Fn that when invoked cancels the promise.
+     */
+    public function __construct(
+        callable $waitFn = null,
+        callable $cancelFn = null
+    ) {
+        $this->waitFn = $waitFn;
+        $this->cancelFn = $cancelFn;
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        if ($this->state === self::PENDING) {
+            $p = new Promise(null, [$this, 'cancel']);
+            $this->handlers[] = [$p, $onFulfilled, $onRejected];
+            $p->waitList = $this->waitList;
+            $p->waitList[] = $this;
+            return $p;
+        }
+
+        // Return a fulfilled promise and immediately invoke any callbacks.
+        if ($this->state === self::FULFILLED) {
+            return $onFulfilled
+                ? promise_for($this->result)->then($onFulfilled)
+                : promise_for($this->result);
+        }
+
+        // It's either cancelled or rejected, so return a rejected promise
+        // and immediately invoke any callbacks.
+        $rejection = rejection_for($this->result);
+        return $onRejected ? $rejection->then(null, $onRejected) : $rejection;
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->then(null, $onRejected);
+    }
+
+    public function wait($unwrap = true)
+    {
+        $this->waitIfPending();
+
+        $inner = $this->result instanceof PromiseInterface
+            ? $this->result->wait($unwrap)
+            : $this->result;
+
+        if ($unwrap) {
+            if ($this->result instanceof PromiseInterface
+                || $this->state === self::FULFILLED
+            ) {
+                return $inner;
+            } else {
+                // It's rejected so "unwrap" and throw an exception.
+                throw exception_for($inner);
+            }
+        }
+    }
+
+    public function getState()
+    {
+        return $this->state;
+    }
+
+    public function cancel()
+    {
+        if ($this->state !== self::PENDING) {
+            return;
+        }
+
+        $this->waitFn = $this->waitList = null;
+
+        if ($this->cancelFn) {
+            $fn = $this->cancelFn;
+            $this->cancelFn = null;
+            try {
+                $fn();
+            } catch (\Throwable $e) {
+                $this->reject($e);
+            } catch (\Exception $e) {
+                $this->reject($e);
+            }
+        }
+
+        // Reject the promise only if it wasn't rejected in a then callback.
+        if ($this->state === self::PENDING) {
+            $this->reject(new CancellationException('Promise has been cancelled'));
+        }
+    }
+
+    public function resolve($value)
+    {
+        $this->settle(self::FULFILLED, $value);
+    }
+
+    public function reject($reason)
+    {
+        $this->settle(self::REJECTED, $reason);
+    }
+
+    private function settle($state, $value)
+    {
+        if ($this->state !== self::PENDING) {
+            // Ignore calls with the same resolution.
+            if ($state === $this->state && $value === $this->result) {
+                return;
+            }
+            throw $this->state === $state
+                ? new \LogicException("The promise is already {$state}.")
+                : new \LogicException("Cannot change a {$this->state} promise to {$state}");
+        }
+
+        if ($value === $this) {
+            throw new \LogicException('Cannot fulfill or reject a promise with itself');
+        }
+
+        // Clear out the state of the promise but stash the handlers.
+        $this->state = $state;
+        $this->result = $value;
+        $handlers = $this->handlers;
+        $this->handlers = null;
+        $this->waitList = $this->waitFn = null;
+        $this->cancelFn = null;
+
+        if (!$handlers) {
+            return;
+        }
+
+        // If the value was not a settled promise or a thenable, then resolve
+        // it in the task queue using the correct ID.
+        if (!method_exists($value, 'then')) {
+            $id = $state === self::FULFILLED ? 1 : 2;
+            // It's a success, so resolve the handlers in the queue.
+            queue()->add(static function () use ($id, $value, $handlers) {
+                foreach ($handlers as $handler) {
+                    self::callHandler($id, $value, $handler);
+                }
+            });
+        } elseif ($value instanceof Promise
+            && $value->getState() === self::PENDING
+        ) {
+            // We can just merge our handlers onto the next promise.
+            $value->handlers = array_merge($value->handlers, $handlers);
+        } else {
+            // Resolve the handlers when the forwarded promise is resolved.
+            $value->then(
+                static function ($value) use ($handlers) {
+                    foreach ($handlers as $handler) {
+                        self::callHandler(1, $value, $handler);
+                    }
+                },
+                static function ($reason) use ($handlers) {
+                    foreach ($handlers as $handler) {
+                        self::callHandler(2, $reason, $handler);
+                    }
+                }
+            );
+        }
+    }
+
+    /**
+     * Call a stack of handlers using a specific callback index and value.
+     *
+     * @param int   $index   1 (resolve) or 2 (reject).
+     * @param mixed $value   Value to pass to the callback.
+     * @param array $handler Array of handler data (promise and callbacks).
+     *
+     * @return array Returns the next group to resolve.
+     */
+    private static function callHandler($index, $value, array $handler)
+    {
+        /** @var PromiseInterface $promise */
+        $promise = $handler[0];
+
+        // The promise may have been cancelled or resolved before placing
+        // this thunk in the queue.
+        if ($promise->getState() !== self::PENDING) {
+            return;
+        }
+
+        try {
+            if (isset($handler[$index])) {
+                $promise->resolve($handler[$index]($value));
+            } elseif ($index === 1) {
+                // Forward resolution values as-is.
+                $promise->resolve($value);
+            } else {
+                // Forward rejections down the chain.
+                $promise->reject($value);
+            }
+        } catch (\Throwable $reason) {
+            $promise->reject($reason);
+        } catch (\Exception $reason) {
+            $promise->reject($reason);
+        }
+    }
+
+    private function waitIfPending()
+    {
+        if ($this->state !== self::PENDING) {
+            return;
+        } elseif ($this->waitFn) {
+            $this->invokeWaitFn();
+        } elseif ($this->waitList) {
+            $this->invokeWaitList();
+        } else {
+            // If there's not wait function, then reject the promise.
+            $this->reject('Cannot wait on a promise that has '
+                . 'no internal wait function. You must provide a wait '
+                . 'function when constructing the promise to be able to '
+                . 'wait on a promise.');
+        }
+
+        queue()->run();
+
+        if ($this->state === self::PENDING) {
+            $this->reject('Invoking the wait callback did not resolve the promise');
+        }
+    }
+
+    private function invokeWaitFn()
+    {
+        try {
+            $wfn = $this->waitFn;
+            $this->waitFn = null;
+            $wfn(true);
+        } catch (\Exception $reason) {
+            if ($this->state === self::PENDING) {
+                // The promise has not been resolved yet, so reject the promise
+                // with the exception.
+                $this->reject($reason);
+            } else {
+                // The promise was already resolved, so there's a problem in
+                // the application.
+                throw $reason;
+            }
+        }
+    }
+
+    private function invokeWaitList()
+    {
+        $waitList = $this->waitList;
+        $this->waitList = null;
+
+        foreach ($waitList as $result) {
+            while (true) {
+                $result->waitIfPending();
+
+                if ($result->result instanceof Promise) {
+                    $result = $result->result;
+                } else {
+                    if ($result->result instanceof PromiseInterface) {
+                        $result->result->wait(false);
+                    }
+                    break;
+                }
+            }
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromiseInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromiseInterface.php
new file mode 100644
index 000000000..8f5f4b99b
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromiseInterface.php
@@ -0,0 +1,93 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * A promise represents the eventual result of an asynchronous operation.
+ *
+ * The primary way of interacting with a promise is through its then method,
+ * which registers callbacks to receive either a promise’s eventual value or
+ * the reason why the promise cannot be fulfilled.
+ *
+ * @link https://promisesaplus.com/
+ */
+interface PromiseInterface
+{
+    const PENDING = 'pending';
+    const FULFILLED = 'fulfilled';
+    const REJECTED = 'rejected';
+
+    /**
+     * Appends fulfillment and rejection handlers to the promise, and returns
+     * a new promise resolving to the return value of the called handler.
+     *
+     * @param callable $onFulfilled Invoked when the promise fulfills.
+     * @param callable $onRejected  Invoked when the promise is rejected.
+     *
+     * @return PromiseInterface
+     */
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    );
+
+    /**
+     * Appends a rejection handler callback to the promise, and returns a new
+     * promise resolving to the return value of the callback if it is called,
+     * or to its original fulfillment value if the promise is instead
+     * fulfilled.
+     *
+     * @param callable $onRejected Invoked when the promise is rejected.
+     *
+     * @return PromiseInterface
+     */
+    public function otherwise(callable $onRejected);
+
+    /**
+     * Get the state of the promise ("pending", "rejected", or "fulfilled").
+     *
+     * The three states can be checked against the constants defined on
+     * PromiseInterface: PENDING, FULFILLED, and REJECTED.
+     *
+     * @return string
+     */
+    public function getState();
+
+    /**
+     * Resolve the promise with the given value.
+     *
+     * @param mixed $value
+     * @throws \RuntimeException if the promise is already resolved.
+     */
+    public function resolve($value);
+
+    /**
+     * Reject the promise with the given reason.
+     *
+     * @param mixed $reason
+     * @throws \RuntimeException if the promise is already resolved.
+     */
+    public function reject($reason);
+
+    /**
+     * Cancels the promise if possible.
+     *
+     * @link https://github.com/promises-aplus/cancellation-spec/issues/7
+     */
+    public function cancel();
+
+    /**
+     * Waits until the promise completes if possible.
+     *
+     * Pass $unwrap as true to unwrap the result of the promise, either
+     * returning the resolved value or throwing the rejected exception.
+     *
+     * If the promise cannot be waited on, then the promise will be rejected.
+     *
+     * @param bool $unwrap
+     *
+     * @return mixed
+     * @throws \LogicException if the promise has no wait function or if the
+     *                         promise does not settle after waiting.
+     */
+    public function wait($unwrap = true);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromisorInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromisorInterface.php
new file mode 100644
index 000000000..b07fe32bc
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/PromisorInterface.php
@@ -0,0 +1,15 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Interface used with classes that return a promise.
+ */
+interface PromisorInterface
+{
+    /**
+     * Returns a promise.
+     *
+     * @return PromiseInterface
+     */
+    public function promise();
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectedPromise.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectedPromise.php
new file mode 100644
index 000000000..2bc6508e7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectedPromise.php
@@ -0,0 +1,87 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * A promise that has been rejected.
+ *
+ * Thenning off of this promise will invoke the onRejected callback
+ * immediately and ignore other callbacks.
+ */
+class RejectedPromise implements PromiseInterface
+{
+    private $reason;
+
+    public function __construct($reason)
+    {
+        if (method_exists($reason, 'then')) {
+            throw new \InvalidArgumentException(
+                'You cannot create a RejectedPromise with a promise.');
+        }
+
+        $this->reason = $reason;
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null
+    ) {
+        // If there's no onRejected callback then just return self.
+        if (!$onRejected) {
+            return $this;
+        }
+
+        $queue = queue();
+        $reason = $this->reason;
+        $p = new Promise([$queue, 'run']);
+        $queue->add(static function () use ($p, $reason, $onRejected) {
+            if ($p->getState() === self::PENDING) {
+                try {
+                    // Return a resolved promise if onRejected does not throw.
+                    $p->resolve($onRejected($reason));
+                } catch (\Throwable $e) {
+                    // onRejected threw, so return a rejected promise.
+                    $p->reject($e);
+                } catch (\Exception $e) {
+                    // onRejected threw, so return a rejected promise.
+                    $p->reject($e);
+                }
+            }
+        });
+
+        return $p;
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->then(null, $onRejected);
+    }
+
+    public function wait($unwrap = true, $defaultDelivery = null)
+    {
+        if ($unwrap) {
+            throw exception_for($this->reason);
+        }
+    }
+
+    public function getState()
+    {
+        return self::REJECTED;
+    }
+
+    public function resolve($value)
+    {
+        throw new \LogicException("Cannot resolve a rejected promise");
+    }
+
+    public function reject($reason)
+    {
+        if ($reason !== $this->reason) {
+            throw new \LogicException("Cannot reject a rejected promise");
+        }
+    }
+
+    public function cancel()
+    {
+        // pass
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectionException.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectionException.php
new file mode 100644
index 000000000..07c1136da
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/RejectionException.php
@@ -0,0 +1,47 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * A special exception that is thrown when waiting on a rejected promise.
+ *
+ * The reason value is available via the getReason() method.
+ */
+class RejectionException extends \RuntimeException
+{
+    /** @var mixed Rejection reason. */
+    private $reason;
+
+    /**
+     * @param mixed $reason       Rejection reason.
+     * @param string $description Optional description
+     */
+    public function __construct($reason, $description = null)
+    {
+        $this->reason = $reason;
+
+        $message = 'The promise was rejected';
+
+        if ($description) {
+            $message .= ' with reason: ' . $description;
+        } elseif (is_string($reason)
+            || (is_object($reason) && method_exists($reason, '__toString'))
+        ) {
+            $message .= ' with reason: ' . $this->reason;
+        } elseif ($reason instanceof \JsonSerializable) {
+            $message .= ' with reason: '
+                . json_encode($this->reason, JSON_PRETTY_PRINT);
+        }
+
+        parent::__construct($message);
+    }
+
+    /**
+     * Returns the rejection reason.
+     *
+     * @return mixed
+     */
+    public function getReason()
+    {
+        return $this->reason;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueue.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueue.php
new file mode 100644
index 000000000..6e8a2a083
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueue.php
@@ -0,0 +1,66 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * A task queue that executes tasks in a FIFO order.
+ *
+ * This task queue class is used to settle promises asynchronously and
+ * maintains a constant stack size. You can use the task queue asynchronously
+ * by calling the `run()` function of the global task queue in an event loop.
+ *
+ *     GuzzleHttp\Promise\queue()->run();
+ */
+class TaskQueue implements TaskQueueInterface
+{
+    private $enableShutdown = true;
+    private $queue = [];
+
+    public function __construct($withShutdown = true)
+    {
+        if ($withShutdown) {
+            register_shutdown_function(function () {
+                if ($this->enableShutdown) {
+                    // Only run the tasks if an E_ERROR didn't occur.
+                    $err = error_get_last();
+                    if (!$err || ($err['type'] ^ E_ERROR)) {
+                        $this->run();
+                    }
+                }
+            });
+        }
+    }
+
+    public function isEmpty()
+    {
+        return !$this->queue;
+    }
+
+    public function add(callable $task)
+    {
+        $this->queue[] = $task;
+    }
+
+    public function run()
+    {
+        /** @var callable $task */
+        while ($task = array_shift($this->queue)) {
+            $task();
+        }
+    }
+
+    /**
+     * The task queue will be run and exhausted by default when the process
+     * exits IFF the exit is not the result of a PHP E_ERROR error.
+     *
+     * You can disable running the automatic shutdown of the queue by calling
+     * this function. If you disable the task queue shutdown process, then you
+     * MUST either run the task queue (as a result of running your event loop
+     * or manually using the run() method) or wait on each outstanding promise.
+     *
+     * Note: This shutdown will occur before any destructors are triggered.
+     */
+    public function disableShutdown()
+    {
+        $this->enableShutdown = false;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
new file mode 100644
index 000000000..ac8306e19
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
@@ -0,0 +1,25 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+interface TaskQueueInterface
+{
+    /**
+     * Returns true if the queue is empty.
+     *
+     * @return bool
+     */
+    public function isEmpty();
+
+    /**
+     * Adds a task to the queue that will be executed the next time run is
+     * called.
+     *
+     * @param callable $task
+     */
+    public function add(callable $task);
+
+    /**
+     * Execute all of the pending task in the queue.
+     */
+    public function run();
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions.php
new file mode 100644
index 000000000..4e27709af
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions.php
@@ -0,0 +1,457 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+/**
+ * Get the global task queue used for promise resolution.
+ *
+ * This task queue MUST be run in an event loop in order for promises to be
+ * settled asynchronously. It will be automatically run when synchronously
+ * waiting on a promise.
+ *
+ * <code>
+ * while ($eventLoop->isRunning()) {
+ *     GuzzleHttp\Promise\queue()->run();
+ * }
+ * </code>
+ *
+ * @param TaskQueueInterface $assign Optionally specify a new queue instance.
+ *
+ * @return TaskQueueInterface
+ */
+function queue(TaskQueueInterface $assign = null)
+{
+    static $queue;
+
+    if ($assign) {
+        $queue = $assign;
+    } elseif (!$queue) {
+        $queue = new TaskQueue();
+    }
+
+    return $queue;
+}
+
+/**
+ * Adds a function to run in the task queue when it is next `run()` and returns
+ * a promise that is fulfilled or rejected with the result.
+ *
+ * @param callable $task Task function to run.
+ *
+ * @return PromiseInterface
+ */
+function task(callable $task)
+{
+    $queue = queue();
+    $promise = new Promise([$queue, 'run']);
+    $queue->add(function () use ($task, $promise) {
+        try {
+            $promise->resolve($task());
+        } catch (\Throwable $e) {
+            $promise->reject($e);
+        } catch (\Exception $e) {
+            $promise->reject($e);
+        }
+    });
+
+    return $promise;
+}
+
+/**
+ * Creates a promise for a value if the value is not a promise.
+ *
+ * @param mixed $value Promise or value.
+ *
+ * @return PromiseInterface
+ */
+function promise_for($value)
+{
+    if ($value instanceof PromiseInterface) {
+        return $value;
+    }
+
+    // Return a Guzzle promise that shadows the given promise.
+    if (method_exists($value, 'then')) {
+        $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;
+        $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;
+        $promise = new Promise($wfn, $cfn);
+        $value->then([$promise, 'resolve'], [$promise, 'reject']);
+        return $promise;
+    }
+
+    return new FulfilledPromise($value);
+}
+
+/**
+ * Creates a rejected promise for a reason if the reason is not a promise. If
+ * the provided reason is a promise, then it is returned as-is.
+ *
+ * @param mixed $reason Promise or reason.
+ *
+ * @return PromiseInterface
+ */
+function rejection_for($reason)
+{
+    if ($reason instanceof PromiseInterface) {
+        return $reason;
+    }
+
+    return new RejectedPromise($reason);
+}
+
+/**
+ * Create an exception for a rejected promise value.
+ *
+ * @param mixed $reason
+ *
+ * @return \Exception|\Throwable
+ */
+function exception_for($reason)
+{
+    return $reason instanceof \Exception || $reason instanceof \Throwable
+        ? $reason
+        : new RejectionException($reason);
+}
+
+/**
+ * Returns an iterator for the given value.
+ *
+ * @param mixed $value
+ *
+ * @return \Iterator
+ */
+function iter_for($value)
+{
+    if ($value instanceof \Iterator) {
+        return $value;
+    } elseif (is_array($value)) {
+        return new \ArrayIterator($value);
+    } else {
+        return new \ArrayIterator([$value]);
+    }
+}
+
+/**
+ * Synchronously waits on a promise to resolve and returns an inspection state
+ * array.
+ *
+ * Returns a state associative array containing a "state" key mapping to a
+ * valid promise state. If the state of the promise is "fulfilled", the array
+ * will contain a "value" key mapping to the fulfilled value of the promise. If
+ * the promise is rejected, the array will contain a "reason" key mapping to
+ * the rejection reason of the promise.
+ *
+ * @param PromiseInterface $promise Promise or value.
+ *
+ * @return array
+ */
+function inspect(PromiseInterface $promise)
+{
+    try {
+        return [
+            'state' => PromiseInterface::FULFILLED,
+            'value' => $promise->wait()
+        ];
+    } catch (RejectionException $e) {
+        return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];
+    } catch (\Throwable $e) {
+        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
+    } catch (\Exception $e) {
+        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
+    }
+}
+
+/**
+ * Waits on all of the provided promises, but does not unwrap rejected promises
+ * as thrown exception.
+ *
+ * Returns an array of inspection state arrays.
+ *
+ * @param PromiseInterface[] $promises Traversable of promises to wait upon.
+ *
+ * @return array
+ * @see GuzzleHttp\Promise\inspect for the inspection state array format.
+ */
+function inspect_all($promises)
+{
+    $results = [];
+    foreach ($promises as $key => $promise) {
+        $results[$key] = inspect($promise);
+    }
+
+    return $results;
+}
+
+/**
+ * Waits on all of the provided promises and returns the fulfilled values.
+ *
+ * Returns an array that contains the value of each promise (in the same order
+ * the promises were provided). An exception is thrown if any of the promises
+ * are rejected.
+ *
+ * @param mixed $promises Iterable of PromiseInterface objects to wait on.
+ *
+ * @return array
+ * @throws \Exception on error
+ * @throws \Throwable on error in PHP >=7
+ */
+function unwrap($promises)
+{
+    $results = [];
+    foreach ($promises as $key => $promise) {
+        $results[$key] = $promise->wait();
+    }
+
+    return $results;
+}
+
+/**
+ * Given an array of promises, return a promise that is fulfilled when all the
+ * items in the array are fulfilled.
+ *
+ * The promise's fulfillment value is an array with fulfillment values at
+ * respective positions to the original array. If any promise in the array
+ * rejects, the returned promise is rejected with the rejection reason.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function all($promises)
+{
+    $results = [];
+    return each(
+        $promises,
+        function ($value, $idx) use (&$results) {
+            $results[$idx] = $value;
+        },
+        function ($reason, $idx, Promise $aggregate) {
+            $aggregate->reject($reason);
+        }
+    )->then(function () use (&$results) {
+        ksort($results);
+        return $results;
+    });
+}
+
+/**
+ * Initiate a competitive race between multiple promises or values (values will
+ * become immediately fulfilled promises).
+ *
+ * When count amount of promises have been fulfilled, the returned promise is
+ * fulfilled with an array that contains the fulfillment values of the winners
+ * in order of resolution.
+ *
+ * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException}
+ * if the number of fulfilled promises is less than the desired $count.
+ *
+ * @param int   $count    Total number of promises.
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function some($count, $promises)
+{
+    $results = [];
+    $rejections = [];
+
+    return each(
+        $promises,
+        function ($value, $idx, PromiseInterface $p) use (&$results, $count) {
+            if ($p->getState() !== PromiseInterface::PENDING) {
+                return;
+            }
+            $results[$idx] = $value;
+            if (count($results) >= $count) {
+                $p->resolve(null);
+            }
+        },
+        function ($reason) use (&$rejections) {
+            $rejections[] = $reason;
+        }
+    )->then(
+        function () use (&$results, &$rejections, $count) {
+            if (count($results) !== $count) {
+                throw new AggregateException(
+                    'Not enough promises to fulfill count',
+                    $rejections
+                );
+            }
+            ksort($results);
+            return array_values($results);
+        }
+    );
+}
+
+/**
+ * Like some(), with 1 as count. However, if the promise fulfills, the
+ * fulfillment value is not an array of 1 but the value directly.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function any($promises)
+{
+    return some(1, $promises)->then(function ($values) { return $values[0]; });
+}
+
+/**
+ * Returns a promise that is fulfilled when all of the provided promises have
+ * been fulfilled or rejected.
+ *
+ * The returned promise is fulfilled with an array of inspection state arrays.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ * @see GuzzleHttp\Promise\inspect for the inspection state array format.
+ */
+function settle($promises)
+{
+    $results = [];
+
+    return each(
+        $promises,
+        function ($value, $idx) use (&$results) {
+            $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];
+        },
+        function ($reason, $idx) use (&$results) {
+            $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];
+        }
+    )->then(function () use (&$results) {
+        ksort($results);
+        return $results;
+    });
+}
+
+/**
+ * Given an iterator that yields promises or values, returns a promise that is
+ * fulfilled with a null value when the iterator has been consumed or the
+ * aggregate promise has been fulfilled or rejected.
+ *
+ * $onFulfilled is a function that accepts the fulfilled value, iterator
+ * index, and the aggregate promise. The callback can invoke any necessary side
+ * effects and choose to resolve or reject the aggregate promise if needed.
+ *
+ * $onRejected is a function that accepts the rejection reason, iterator
+ * index, and the aggregate promise. The callback can invoke any necessary side
+ * effects and choose to resolve or reject the aggregate promise if needed.
+ *
+ * @param mixed    $iterable    Iterator or array to iterate over.
+ * @param callable $onFulfilled
+ * @param callable $onRejected
+ *
+ * @return PromiseInterface
+ */
+function each(
+    $iterable,
+    callable $onFulfilled = null,
+    callable $onRejected = null
+) {
+    return (new EachPromise($iterable, [
+        'fulfilled' => $onFulfilled,
+        'rejected'  => $onRejected
+    ]))->promise();
+}
+
+/**
+ * Like each, but only allows a certain number of outstanding promises at any
+ * given time.
+ *
+ * $concurrency may be an integer or a function that accepts the number of
+ * pending promises and returns a numeric concurrency limit value to allow for
+ * dynamic a concurrency size.
+ *
+ * @param mixed        $iterable
+ * @param int|callable $concurrency
+ * @param callable     $onFulfilled
+ * @param callable     $onRejected
+ *
+ * @return PromiseInterface
+ */
+function each_limit(
+    $iterable,
+    $concurrency,
+    callable $onFulfilled = null,
+    callable $onRejected = null
+) {
+    return (new EachPromise($iterable, [
+        'fulfilled'   => $onFulfilled,
+        'rejected'    => $onRejected,
+        'concurrency' => $concurrency
+    ]))->promise();
+}
+
+/**
+ * Like each_limit, but ensures that no promise in the given $iterable argument
+ * is rejected. If any promise is rejected, then the aggregate promise is
+ * rejected with the encountered rejection.
+ *
+ * @param mixed        $iterable
+ * @param int|callable $concurrency
+ * @param callable     $onFulfilled
+ *
+ * @return PromiseInterface
+ */
+function each_limit_all(
+    $iterable,
+    $concurrency,
+    callable $onFulfilled = null
+) {
+    return each_limit(
+        $iterable,
+        $concurrency,
+        $onFulfilled,
+        function ($reason, $idx, PromiseInterface $aggregate) {
+            $aggregate->reject($reason);
+        }
+    );
+}
+
+/**
+ * Returns true if a promise is fulfilled.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_fulfilled(PromiseInterface $promise)
+{
+    return $promise->getState() === PromiseInterface::FULFILLED;
+}
+
+/**
+ * Returns true if a promise is rejected.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_rejected(PromiseInterface $promise)
+{
+    return $promise->getState() === PromiseInterface::REJECTED;
+}
+
+/**
+ * Returns true if a promise is fulfilled or rejected.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_settled(PromiseInterface $promise)
+{
+    return $promise->getState() !== PromiseInterface::PENDING;
+}
+
+/**
+ * @see Coroutine
+ *
+ * @param callable $generatorFn
+ *
+ * @return PromiseInterface
+ */
+function coroutine(callable $generatorFn)
+{
+    return new Coroutine($generatorFn);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions_include.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions_include.php
new file mode 100644
index 000000000..34cd1710a
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/promises/src/functions_include.php
@@ -0,0 +1,6 @@
+<?php
+
+// Don't redefine the functions if included multiple times.
+if (!function_exists('GuzzleHttp\Promise\promise_for')) {
+    require __DIR__ . '/functions.php';
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/CHANGELOG.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/CHANGELOG.md
new file mode 100644
index 000000000..5c252b3a2
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/CHANGELOG.md
@@ -0,0 +1,110 @@
+# CHANGELOG
+
+## 1.4.2 - 2017-03-20
+
+* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing 
+  calls to `trigger_error` when deprecated methods are invoked.
+
+## 1.4.1 - 2017-02-27
+
+* Reverted BC break by reintroducing behavior to automagically fix a URI with a
+  relative path and an authority by adding a leading slash to the path. It's only
+  deprecated now.
+* Added triggering of silenced deprecation warnings.
+
+## 1.4.0 - 2017-02-21
+
+* Fix `Stream::read` when length parameter <= 0.
+* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
+* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port.
+* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
+* Allow `parse_response` to parse a response without delimiting space and reason.
+* Ensure each URI modification results in a valid URI according to PSR-7 discussions.
+  Invalid modifications will throw an exception instead of returning a wrong URI or
+  doing some magic.
+  - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception
+    because the path of a URI with an authority must start with a slash "/" or be empty
+  - `(new Uri())->withScheme('http')` will return `'http://localhost'`
+* Fix compatibility of URIs with `file` scheme and empty host.
+* Added common URI utility methods based on RFC 3986 (see documentation in the readme):
+  - `Uri::isDefaultPort`
+  - `Uri::isAbsolute`
+  - `Uri::isNetworkPathReference`
+  - `Uri::isAbsolutePathReference`
+  - `Uri::isRelativePathReference`
+  - `Uri::isSameDocumentReference`
+  - `Uri::composeComponents`
+  - `UriNormalizer::normalize`
+  - `UriNormalizer::isEquivalent`
+  - `UriResolver::relativize`
+* Deprecated `Uri::resolve` in favor of `UriResolver::resolve`
+* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
+
+## 1.3.1 - 2016-06-25
+
+* Fix `Uri::__toString` for network path references, e.g. `//example.org`.
+* Fix missing lowercase normalization for host.
+* Fix handling of URI components in case they are `'0'` in a lot of places,
+  e.g. as a user info password.
+* Fix `Uri::withAddedHeader` to correctly merge headers with different case.
+* Fix trimming of header values in `Uri::withAddedHeader`. Header values may
+  be surrounded by whitespace which should be ignored according to RFC 7230
+  Section 3.2.4. This does not apply to header names.
+* Fix `Uri::withAddedHeader` with an array of header values.
+* Fix `Uri::resolve` when base path has no slash and handling of fragment.
+* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the
+  key/value both in encoded as well as decoded form to those methods. This is
+  consistent with withPath, withQuery etc.
+* Fix `ServerRequest::withoutAttribute` when attribute value is null.
+
+## 1.3.0 - 2016-04-13
+
+* Added remaining interfaces needed for full PSR7 compatibility
+  (ServerRequestInterface, UploadedFileInterface, etc.).
+* Added support for stream_for from scalars.
+* Can now extend Uri.
+* Fixed a bug in validating request methods by making it more permissive.
+
+## 1.2.3 - 2016-02-18
+
+* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote
+  streams, which can sometimes return fewer bytes than requested with `fread`.
+* Fixed handling of gzipped responses with FNAME headers.
+
+## 1.2.2 - 2016-01-22
+
+* Added support for URIs without any authority.
+* Added support for HTTP 451 'Unavailable For Legal Reasons.'
+* Added support for using '0' as a filename.
+* Added support for including non-standard ports in Host headers.
+
+## 1.2.1 - 2015-11-02
+
+* Now supporting negative offsets when seeking to SEEK_END.
+
+## 1.2.0 - 2015-08-15
+
+* Body as `"0"` is now properly added to a response.
+* Now allowing forward seeking in CachingStream.
+* Now properly parsing HTTP requests that contain proxy targets in
+  `parse_request`.
+* functions.php is now conditionally required.
+* user-info is no longer dropped when resolving URIs.
+
+## 1.1.0 - 2015-06-24
+
+* URIs can now be relative.
+* `multipart/form-data` headers are now overridden case-insensitively.
+* URI paths no longer encode the following characters because they are allowed
+  in URIs: "(", ")", "*", "!", "'"
+* A port is no longer added to a URI when the scheme is missing and no port is
+  present.
+
+## 1.0.0 - 2015-05-19
+
+Initial release.
+
+Currently unsupported:
+
+- `Psr\Http\Message\ServerRequestInterface`
+- `Psr\Http\Message\UploadedFileInterface`
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/LICENSE b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/LICENSE
new file mode 100644
index 000000000..581d95f92
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+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.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/README.md b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/README.md
new file mode 100644
index 000000000..16499358e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/README.md
@@ -0,0 +1,739 @@
+# PSR-7 Message Implementation
+
+This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)
+message implementation, several stream decorators, and some helpful
+functionality like query string parsing.
+
+
+[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7)
+
+
+# Stream implementation
+
+This package comes with a number of stream implementations and stream
+decorators.
+
+
+## AppendStream
+
+`GuzzleHttp\Psr7\AppendStream`
+
+Reads from multiple streams, one after the other.
+
+```php
+use GuzzleHttp\Psr7;
+
+$a = Psr7\stream_for('abc, ');
+$b = Psr7\stream_for('123.');
+$composed = new Psr7\AppendStream([$a, $b]);
+
+$composed->addStream(Psr7\stream_for(' Above all listen to me'));
+
+echo $composed; // abc, 123. Above all listen to me.
+```
+
+
+## BufferStream
+
+`GuzzleHttp\Psr7\BufferStream`
+
+Provides a buffer stream that can be written to fill a buffer, and read
+from to remove bytes from the buffer.
+
+This stream returns a "hwm" metadata value that tells upstream consumers
+what the configured high water mark of the stream is, or the maximum
+preferred size of the buffer.
+
+```php
+use GuzzleHttp\Psr7;
+
+// When more than 1024 bytes are in the buffer, it will begin returning
+// false to writes. This is an indication that writers should slow down.
+$buffer = new Psr7\BufferStream(1024);
+```
+
+
+## CachingStream
+
+The CachingStream is used to allow seeking over previously read bytes on
+non-seekable streams. This can be useful when transferring a non-seekable
+entity body fails due to needing to rewind the stream (for example, resulting
+from a redirect). Data that is read from the remote stream will be buffered in
+a PHP temp stream so that previously read bytes are cached first in memory,
+then on disk.
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for(fopen('http://www.google.com', 'r'));
+$stream = new Psr7\CachingStream($original);
+
+$stream->read(1024);
+echo $stream->tell();
+// 1024
+
+$stream->seek(0);
+echo $stream->tell();
+// 0
+```
+
+
+## DroppingStream
+
+`GuzzleHttp\Psr7\DroppingStream`
+
+Stream decorator that begins dropping data once the size of the underlying
+stream becomes too full.
+
+```php
+use GuzzleHttp\Psr7;
+
+// Create an empty stream
+$stream = Psr7\stream_for();
+
+// Start dropping data when the stream has more than 10 bytes
+$dropping = new Psr7\DroppingStream($stream, 10);
+
+$dropping->write('01234567890123456789');
+echo $stream; // 0123456789
+```
+
+
+## FnStream
+
+`GuzzleHttp\Psr7\FnStream`
+
+Compose stream implementations based on a hash of functions.
+
+Allows for easy testing and extension of a provided stream without needing
+to create a concrete class for a simple extension point.
+
+```php
+
+use GuzzleHttp\Psr7;
+
+$stream = Psr7\stream_for('hi');
+$fnStream = Psr7\FnStream::decorate($stream, [
+    'rewind' => function () use ($stream) {
+        echo 'About to rewind - ';
+        $stream->rewind();
+        echo 'rewound!';
+    }
+]);
+
+$fnStream->rewind();
+// Outputs: About to rewind - rewound!
+```
+
+
+## InflateStream
+
+`GuzzleHttp\Psr7\InflateStream`
+
+Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.
+
+This stream decorator skips the first 10 bytes of the given stream to remove
+the gzip header, converts the provided stream to a PHP stream resource,
+then appends the zlib.inflate filter. The stream is then converted back
+to a Guzzle stream resource to be used as a Guzzle stream.
+
+
+## LazyOpenStream
+
+`GuzzleHttp\Psr7\LazyOpenStream`
+
+Lazily reads or writes to a file that is opened only after an IO operation
+take place on the stream.
+
+```php
+use GuzzleHttp\Psr7;
+
+$stream = new Psr7\LazyOpenStream('/path/to/file', 'r');
+// The file has not yet been opened...
+
+echo $stream->read(10);
+// The file is opened and read from only when needed.
+```
+
+
+## LimitStream
+
+`GuzzleHttp\Psr7\LimitStream`
+
+LimitStream can be used to read a subset or slice of an existing stream object.
+This can be useful for breaking a large file into smaller pieces to be sent in
+chunks (e.g. Amazon S3's multipart upload API).
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+'));
+echo $original->getSize();
+// >>> 1048576
+
+// Limit the size of the body to 1024 bytes and start reading from byte 2048
+$stream = new Psr7\LimitStream($original, 1024, 2048);
+echo $stream->getSize();
+// >>> 1024
+echo $stream->tell();
+// >>> 0
+```
+
+
+## MultipartStream
+
+`GuzzleHttp\Psr7\MultipartStream`
+
+Stream that when read returns bytes for a streaming multipart or
+multipart/form-data stream.
+
+
+## NoSeekStream
+
+`GuzzleHttp\Psr7\NoSeekStream`
+
+NoSeekStream wraps a stream and does not allow seeking.
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for('foo');
+$noSeek = new Psr7\NoSeekStream($original);
+
+echo $noSeek->read(3);
+// foo
+var_export($noSeek->isSeekable());
+// false
+$noSeek->seek(0);
+var_export($noSeek->read(3));
+// NULL
+```
+
+
+## PumpStream
+
+`GuzzleHttp\Psr7\PumpStream`
+
+Provides a read only stream that pumps data from a PHP callable.
+
+When invoking the provided callable, the PumpStream will pass the amount of
+data requested to read to the callable. The callable can choose to ignore
+this value and return fewer or more bytes than requested. Any extra data
+returned by the provided callable is buffered internally until drained using
+the read() function of the PumpStream. The provided callable MUST return
+false when there is no more data to read.
+
+
+## Implementing stream decorators
+
+Creating a stream decorator is very easy thanks to the
+`GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that
+implement `Psr\Http\Message\StreamInterface` by proxying to an underlying
+stream. Just `use` the `StreamDecoratorTrait` and implement your custom
+methods.
+
+For example, let's say we wanted to call a specific function each time the last
+byte is read from a stream. This could be implemented by overriding the
+`read()` method.
+
+```php
+use Psr\Http\Message\StreamInterface;
+use GuzzleHttp\Psr7\StreamDecoratorTrait;
+
+class EofCallbackStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    private $callback;
+
+    public function __construct(StreamInterface $stream, callable $cb)
+    {
+        $this->stream = $stream;
+        $this->callback = $cb;
+    }
+
+    public function read($length)
+    {
+        $result = $this->stream->read($length);
+
+        // Invoke the callback when EOF is hit.
+        if ($this->eof()) {
+            call_user_func($this->callback);
+        }
+
+        return $result;
+    }
+}
+```
+
+This decorator could be added to any existing stream and used like so:
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for('foo');
+
+$eofStream = new EofCallbackStream($original, function () {
+    echo 'EOF!';
+});
+
+$eofStream->read(2);
+$eofStream->read(1);
+// echoes "EOF!"
+$eofStream->seek(0);
+$eofStream->read(3);
+// echoes "EOF!"
+```
+
+
+## PHP StreamWrapper
+
+You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a
+PSR-7 stream as a PHP stream resource.
+
+Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP
+stream from a PSR-7 stream.
+
+```php
+use GuzzleHttp\Psr7\StreamWrapper;
+
+$stream = GuzzleHttp\Psr7\stream_for('hello!');
+$resource = StreamWrapper::getResource($stream);
+echo fread($resource, 6); // outputs hello!
+```
+
+
+# Function API
+
+There are various functions available under the `GuzzleHttp\Psr7` namespace.
+
+
+## `function str`
+
+`function str(MessageInterface $message)`
+
+Returns the string representation of an HTTP message.
+
+```php
+$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com');
+echo GuzzleHttp\Psr7\str($request);
+```
+
+
+## `function uri_for`
+
+`function uri_for($uri)`
+
+This function accepts a string or `Psr\Http\Message\UriInterface` and returns a
+UriInterface for the given value. If the value is already a `UriInterface`, it
+is returned as-is.
+
+```php
+$uri = GuzzleHttp\Psr7\uri_for('http://example.com');
+assert($uri === GuzzleHttp\Psr7\uri_for($uri));
+```
+
+
+## `function stream_for`
+
+`function stream_for($resource = '', array $options = [])`
+
+Create a new stream based on the input type.
+
+Options is an associative array that can contain the following keys:
+
+* - metadata: Array of custom metadata.
+* - size: Size of the stream.
+
+This method accepts the following `$resource` types:
+
+- `Psr\Http\Message\StreamInterface`: Returns the value as-is.
+- `string`: Creates a stream object that uses the given string as the contents.
+- `resource`: Creates a stream object that wraps the given PHP stream resource.
+- `Iterator`: If the provided value implements `Iterator`, then a read-only
+  stream object will be created that wraps the given iterable. Each time the
+  stream is read from, data from the iterator will fill a buffer and will be
+  continuously called until the buffer is equal to the requested read size.
+  Subsequent read calls will first read from the buffer and then call `next`
+  on the underlying iterator until it is exhausted.
+- `object` with `__toString()`: If the object has the `__toString()` method,
+  the object will be cast to a string and then a stream will be returned that
+  uses the string value.
+- `NULL`: When `null` is passed, an empty stream object is returned.
+- `callable` When a callable is passed, a read-only stream object will be
+  created that invokes the given callable. The callable is invoked with the
+  number of suggested bytes to read. The callable can return any number of
+  bytes, but MUST return `false` when there is no more data to return. The
+  stream object that wraps the callable will invoke the callable until the
+  number of requested bytes are available. Any additional bytes will be
+  buffered and used in subsequent reads.
+
+```php
+$stream = GuzzleHttp\Psr7\stream_for('foo');
+$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r'));
+
+$generator function ($bytes) {
+    for ($i = 0; $i < $bytes; $i++) {
+        yield ' ';
+    }
+}
+
+$stream = GuzzleHttp\Psr7\stream_for($generator(100));
+```
+
+
+## `function parse_header`
+
+`function parse_header($header)`
+
+Parse an array of header values containing ";" separated data into an array of
+associative arrays representing the header key value pair data of the header.
+When a parameter does not contain a value, but just contains a key, this
+function will inject a key with a '' string value.
+
+
+## `function normalize_header`
+
+`function normalize_header($header)`
+
+Converts an array of header values that may contain comma separated headers
+into an array of headers with no comma separated values.
+
+
+## `function modify_request`
+
+`function modify_request(RequestInterface $request, array $changes)`
+
+Clone and modify a request with the given changes. This method is useful for
+reducing the number of clones needed to mutate a message.
+
+The changes can be one of:
+
+- method: (string) Changes the HTTP method.
+- set_headers: (array) Sets the given headers.
+- remove_headers: (array) Remove the given headers.
+- body: (mixed) Sets the given body.
+- uri: (UriInterface) Set the URI.
+- query: (string) Set the query string value of the URI.
+- version: (string) Set the protocol version.
+
+
+## `function rewind_body`
+
+`function rewind_body(MessageInterface $message)`
+
+Attempts to rewind a message body and throws an exception on failure. The body
+of the message will only be rewound if a call to `tell()` returns a value other
+than `0`.
+
+
+## `function try_fopen`
+
+`function try_fopen($filename, $mode)`
+
+Safely opens a PHP stream resource using a filename.
+
+When fopen fails, PHP normally raises a warning. This function adds an error
+handler that checks for errors and throws an exception instead.
+
+
+## `function copy_to_string`
+
+`function copy_to_string(StreamInterface $stream, $maxLen = -1)`
+
+Copy the contents of a stream into a string until the given number of bytes
+have been read.
+
+
+## `function copy_to_stream`
+
+`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)`
+
+Copy the contents of a stream into another stream until the given number of
+bytes have been read.
+
+
+## `function hash`
+
+`function hash(StreamInterface $stream, $algo, $rawOutput = false)`
+
+Calculate a hash of a Stream. This method reads the entire stream to calculate
+a rolling hash (based on PHP's hash_init functions).
+
+
+## `function readline`
+
+`function readline(StreamInterface $stream, $maxLength = null)`
+
+Read a line from the stream up to the maximum allowed buffer length.
+
+
+## `function parse_request`
+
+`function parse_request($message)`
+
+Parses a request message string into a request object.
+
+
+## `function parse_response`
+
+`function parse_response($message)`
+
+Parses a response message string into a response object.
+
+
+## `function parse_query`
+
+`function parse_query($str, $urlEncoding = true)`
+
+Parse a query string into an associative array.
+
+If multiple values are found for the same key, the value of that key value pair
+will become an array. This function does not parse nested PHP style arrays into
+an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into
+`['foo[a]' => '1', 'foo[b]' => '2']`).
+
+
+## `function build_query`
+
+`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)`
+
+Build a query string from an array of key value pairs.
+
+This function can use the return value of parse_query() to build a query string.
+This function does not modify the provided keys when an array is encountered
+(like http_build_query would).
+
+
+## `function mimetype_from_filename`
+
+`function mimetype_from_filename($filename)`
+
+Determines the mimetype of a file by looking at its extension.
+
+
+## `function mimetype_from_extension`
+
+`function mimetype_from_extension($extension)`
+
+Maps a file extensions to a mimetype.
+
+
+# Additional URI Methods
+
+Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class,
+this library also provides additional functionality when working with URIs as static methods.
+
+## URI Types
+
+An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference.
+An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,
+the base URI. Relative references can be divided into several forms according to
+[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2):
+
+- network-path references, e.g. `//example.com/path`
+- absolute-path references, e.g. `/path`
+- relative-path references, e.g. `subpath`
+
+The following methods can be used to identify the type of the URI.
+
+### `GuzzleHttp\Psr7\Uri::isAbsolute`
+
+`public static function isAbsolute(UriInterface $uri): bool`
+
+Whether the URI is absolute, i.e. it has a scheme.
+
+### `GuzzleHttp\Psr7\Uri::isNetworkPathReference`
+
+`public static function isNetworkPathReference(UriInterface $uri): bool`
+
+Whether the URI is a network-path reference. A relative reference that begins with two slash characters is
+termed an network-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference`
+
+`public static function isAbsolutePathReference(UriInterface $uri): bool`
+
+Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is
+termed an absolute-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isRelativePathReference`
+
+`public static function isRelativePathReference(UriInterface $uri): bool`
+
+Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is
+termed a relative-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isSameDocumentReference`
+
+`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`
+
+Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its
+fragment component, identical to the base URI. When no base URI is given, only an empty URI reference
+(apart from its fragment) is considered a same-document reference.
+
+## URI Components
+
+Additional methods to work with URI components.
+
+### `GuzzleHttp\Psr7\Uri::isDefaultPort`
+
+`public static function isDefaultPort(UriInterface $uri): bool`
+
+Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null
+or the standard port. This method can be used independently of the implementation.
+
+### `GuzzleHttp\Psr7\Uri::composeComponents`
+
+`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`
+
+Composes a URI reference string from its various components according to
+[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called
+manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`.
+
+### `GuzzleHttp\Psr7\Uri::fromParts`
+
+`public static function fromParts(array $parts): UriInterface`
+
+Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+
+
+### `GuzzleHttp\Psr7\Uri::withQueryValue`
+
+`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`
+
+Creates a new URI with a specific query string value. Any existing query string values that exactly match the
+provided key are removed and replaced with the given key value pair. A value of null will set the query string
+key without a value, e.g. "key" instead of "key=value".
+
+
+### `GuzzleHttp\Psr7\Uri::withoutQueryValue`
+
+`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`
+
+Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
+provided key are removed.
+
+## Reference Resolution
+
+`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
+to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers
+do when resolving a link in a website based on the current request URI.
+
+### `GuzzleHttp\Psr7\UriResolver::resolve`
+
+`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`
+
+Converts the relative URI into a new URI that is resolved against the base URI.
+
+### `GuzzleHttp\Psr7\UriResolver::removeDotSegments`
+
+`public static function removeDotSegments(string $path): string`
+
+Removes dot segments from a path and returns the new path according to
+[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4).
+
+### `GuzzleHttp\Psr7\UriResolver::relativize`
+
+`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`
+
+Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():
+
+```php
+(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+```
+
+One use-case is to use the current request URI as base URI and then generate relative links in your documents
+to reduce the document size or offer self-contained downloadable document archives.
+
+```php
+$base = new Uri('http://example.com/a/b/');
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.
+```
+
+## Normalization and Comparison
+
+`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to
+[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6).
+
+### `GuzzleHttp\Psr7\UriNormalizer::normalize`
+
+`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`
+
+Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
+This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask
+of normalizations to apply. The following normalizations are available:
+
+- `UriNormalizer::PRESERVING_NORMALIZATIONS`
+
+    Default normalizations which only include the ones that preserve semantics.
+
+- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`
+
+    All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
+
+    Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`
+
+- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`
+
+    Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of
+    ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should
+    not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved
+    characters by URI normalizers.
+
+    Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`
+
+- `UriNormalizer::CONVERT_EMPTY_PATH`
+
+    Converts the empty path to "/" for http and https URIs.
+
+    Example: `http://example.org` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DEFAULT_HOST`
+
+    Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host
+    "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to
+    RFC 3986.
+
+    Example: `file://localhost/myfile` → `file:///myfile`
+
+- `UriNormalizer::REMOVE_DEFAULT_PORT`
+
+    Removes the default port of the given URI scheme from the URI.
+
+    Example: `http://example.org:80/` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DOT_SEGMENTS`
+
+    Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would
+    change the semantics of the URI reference.
+
+    Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`
+
+- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`
+
+    Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes
+    and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization
+    may change the semantics. Encoded slashes (%2F) are not removed.
+
+    Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`
+
+- `UriNormalizer::SORT_QUERY_PARAMETERS`
+
+    Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be
+    significant (this is not defined by the standard). So this normalization is not safe and may change the semantics
+    of the URI.
+
+    Example: `?lang=en&article=fred` → `?article=fred&lang=en`
+
+### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent`
+
+`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`
+
+Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given
+`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.
+This of course assumes they will be resolved against the same base URI. If this is not the case, determination of
+equivalence or difference of relative references does not mean anything.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/composer.json b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/composer.json
new file mode 100644
index 000000000..b1c5a90ba
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/composer.json
@@ -0,0 +1,39 @@
+{
+    "name": "guzzlehttp/psr7",
+    "type": "library",
+    "description": "PSR-7 message implementation that also provides common utility methods",
+    "keywords": ["request", "response", "message", "stream", "http", "uri", "url"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        },
+        {
+            "name": "Tobias Schultze",
+            "homepage": "https://github.com/Tobion"
+        }
+    ],
+    "require": {
+        "php": ">=5.4.0",
+        "psr/http-message": "~1.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "~4.0"
+    },
+    "provide": {
+        "psr/http-message-implementation": "1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "GuzzleHttp\\Psr7\\": "src/"
+        },
+        "files": ["src/functions_include.php"]
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.4-dev"
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/AppendStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/AppendStream.php
new file mode 100644
index 000000000..23039fd79
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/AppendStream.php
@@ -0,0 +1,233 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Reads from multiple streams, one after the other.
+ *
+ * This is a read-only stream decorator.
+ */
+class AppendStream implements StreamInterface
+{
+    /** @var StreamInterface[] Streams being decorated */
+    private $streams = [];
+
+    private $seekable = true;
+    private $current = 0;
+    private $pos = 0;
+    private $detached = false;
+
+    /**
+     * @param StreamInterface[] $streams Streams to decorate. Each stream must
+     *                                   be readable.
+     */
+    public function __construct(array $streams = [])
+    {
+        foreach ($streams as $stream) {
+            $this->addStream($stream);
+        }
+    }
+
+    public function __toString()
+    {
+        try {
+            $this->rewind();
+            return $this->getContents();
+        } catch (\Exception $e) {
+            return '';
+        }
+    }
+
+    /**
+     * Add a stream to the AppendStream
+     *
+     * @param StreamInterface $stream Stream to append. Must be readable.
+     *
+     * @throws \InvalidArgumentException if the stream is not readable
+     */
+    public function addStream(StreamInterface $stream)
+    {
+        if (!$stream->isReadable()) {
+            throw new \InvalidArgumentException('Each stream must be readable');
+        }
+
+        // The stream is only seekable if all streams are seekable
+        if (!$stream->isSeekable()) {
+            $this->seekable = false;
+        }
+
+        $this->streams[] = $stream;
+    }
+
+    public function getContents()
+    {
+        return copy_to_string($this);
+    }
+
+    /**
+     * Closes each attached stream.
+     *
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->pos = $this->current = 0;
+
+        foreach ($this->streams as $stream) {
+            $stream->close();
+        }
+
+        $this->streams = [];
+    }
+
+    /**
+     * Detaches each attached stream
+     *
+     * {@inheritdoc}
+     */
+    public function detach()
+    {
+        $this->close();
+        $this->detached = true;
+    }
+
+    public function tell()
+    {
+        return $this->pos;
+    }
+
+    /**
+     * Tries to calculate the size by adding the size of each stream.
+     *
+     * If any of the streams do not return a valid number, then the size of the
+     * append stream cannot be determined and null is returned.
+     *
+     * {@inheritdoc}
+     */
+    public function getSize()
+    {
+        $size = 0;
+
+        foreach ($this->streams as $stream) {
+            $s = $stream->getSize();
+            if ($s === null) {
+                return null;
+            }
+            $size += $s;
+        }
+
+        return $size;
+    }
+
+    public function eof()
+    {
+        return !$this->streams ||
+            ($this->current >= count($this->streams) - 1 &&
+             $this->streams[$this->current]->eof());
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    /**
+     * Attempts to seek to the given position. Only supports SEEK_SET.
+     *
+     * {@inheritdoc}
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if (!$this->seekable) {
+            throw new \RuntimeException('This AppendStream is not seekable');
+        } elseif ($whence !== SEEK_SET) {
+            throw new \RuntimeException('The AppendStream can only seek with SEEK_SET');
+        }
+
+        $this->pos = $this->current = 0;
+
+        // Rewind each stream
+        foreach ($this->streams as $i => $stream) {
+            try {
+                $stream->rewind();
+            } catch (\Exception $e) {
+                throw new \RuntimeException('Unable to seek stream '
+                    . $i . ' of the AppendStream', 0, $e);
+            }
+        }
+
+        // Seek to the actual position by reading from each stream
+        while ($this->pos < $offset && !$this->eof()) {
+            $result = $this->read(min(8096, $offset - $this->pos));
+            if ($result === '') {
+                break;
+            }
+        }
+    }
+
+    /**
+     * Reads from all of the appended streams until the length is met or EOF.
+     *
+     * {@inheritdoc}
+     */
+    public function read($length)
+    {
+        $buffer = '';
+        $total = count($this->streams) - 1;
+        $remaining = $length;
+        $progressToNext = false;
+
+        while ($remaining > 0) {
+
+            // Progress to the next stream if needed.
+            if ($progressToNext || $this->streams[$this->current]->eof()) {
+                $progressToNext = false;
+                if ($this->current === $total) {
+                    break;
+                }
+                $this->current++;
+            }
+
+            $result = $this->streams[$this->current]->read($remaining);
+
+            // Using a loose comparison here to match on '', false, and null
+            if ($result == null) {
+                $progressToNext = true;
+                continue;
+            }
+
+            $buffer .= $result;
+            $remaining = $length - strlen($buffer);
+        }
+
+        $this->pos += strlen($buffer);
+
+        return $buffer;
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function isSeekable()
+    {
+        return $this->seekable;
+    }
+
+    public function write($string)
+    {
+        throw new \RuntimeException('Cannot write to an AppendStream');
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $key ? null : [];
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/BufferStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/BufferStream.php
new file mode 100644
index 000000000..af4d4c227
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/BufferStream.php
@@ -0,0 +1,137 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Provides a buffer stream that can be written to to fill a buffer, and read
+ * from to remove bytes from the buffer.
+ *
+ * This stream returns a "hwm" metadata value that tells upstream consumers
+ * what the configured high water mark of the stream is, or the maximum
+ * preferred size of the buffer.
+ */
+class BufferStream implements StreamInterface
+{
+    private $hwm;
+    private $buffer = '';
+
+    /**
+     * @param int $hwm High water mark, representing the preferred maximum
+     *                 buffer size. If the size of the buffer exceeds the high
+     *                 water mark, then calls to write will continue to succeed
+     *                 but will return false to inform writers to slow down
+     *                 until the buffer has been drained by reading from it.
+     */
+    public function __construct($hwm = 16384)
+    {
+        $this->hwm = $hwm;
+    }
+
+    public function __toString()
+    {
+        return $this->getContents();
+    }
+
+    public function getContents()
+    {
+        $buffer = $this->buffer;
+        $this->buffer = '';
+
+        return $buffer;
+    }
+
+    public function close()
+    {
+        $this->buffer = '';
+    }
+
+    public function detach()
+    {
+        $this->close();
+    }
+
+    public function getSize()
+    {
+        return strlen($this->buffer);
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return true;
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        throw new \RuntimeException('Cannot seek a BufferStream');
+    }
+
+    public function eof()
+    {
+        return strlen($this->buffer) === 0;
+    }
+
+    public function tell()
+    {
+        throw new \RuntimeException('Cannot determine the position of a BufferStream');
+    }
+
+    /**
+     * Reads data from the buffer.
+     */
+    public function read($length)
+    {
+        $currentLength = strlen($this->buffer);
+
+        if ($length >= $currentLength) {
+            // No need to slice the buffer because we don't have enough data.
+            $result = $this->buffer;
+            $this->buffer = '';
+        } else {
+            // Slice up the result to provide a subset of the buffer.
+            $result = substr($this->buffer, 0, $length);
+            $this->buffer = substr($this->buffer, $length);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Writes data to the buffer.
+     */
+    public function write($string)
+    {
+        $this->buffer .= $string;
+
+        // TODO: What should happen here?
+        if (strlen($this->buffer) >= $this->hwm) {
+            return false;
+        }
+
+        return strlen($string);
+    }
+
+    public function getMetadata($key = null)
+    {
+        if ($key == 'hwm') {
+            return $this->hwm;
+        }
+
+        return $key ? null : [];
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/CachingStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/CachingStream.php
new file mode 100644
index 000000000..ed68f0861
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/CachingStream.php
@@ -0,0 +1,138 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Stream decorator that can cache previously read bytes from a sequentially
+ * read stream.
+ */
+class CachingStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var StreamInterface Stream being wrapped */
+    private $remoteStream;
+
+    /** @var int Number of bytes to skip reading due to a write on the buffer */
+    private $skipReadBytes = 0;
+
+    /**
+     * We will treat the buffer object as the body of the stream
+     *
+     * @param StreamInterface $stream Stream to cache
+     * @param StreamInterface $target Optionally specify where data is cached
+     */
+    public function __construct(
+        StreamInterface $stream,
+        StreamInterface $target = null
+    ) {
+        $this->remoteStream = $stream;
+        $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));
+    }
+
+    public function getSize()
+    {
+        return max($this->stream->getSize(), $this->remoteStream->getSize());
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if ($whence == SEEK_SET) {
+            $byte = $offset;
+        } elseif ($whence == SEEK_CUR) {
+            $byte = $offset + $this->tell();
+        } elseif ($whence == SEEK_END) {
+            $size = $this->remoteStream->getSize();
+            if ($size === null) {
+                $size = $this->cacheEntireStream();
+            }
+            $byte = $size + $offset;
+        } else {
+            throw new \InvalidArgumentException('Invalid whence');
+        }
+
+        $diff = $byte - $this->stream->getSize();
+
+        if ($diff > 0) {
+            // Read the remoteStream until we have read in at least the amount
+            // of bytes requested, or we reach the end of the file.
+            while ($diff > 0 && !$this->remoteStream->eof()) {
+                $this->read($diff);
+                $diff = $byte - $this->stream->getSize();
+            }
+        } else {
+            // We can just do a normal seek since we've already seen this byte.
+            $this->stream->seek($byte);
+        }
+    }
+
+    public function read($length)
+    {
+        // Perform a regular read on any previously read data from the buffer
+        $data = $this->stream->read($length);
+        $remaining = $length - strlen($data);
+
+        // More data was requested so read from the remote stream
+        if ($remaining) {
+            // If data was written to the buffer in a position that would have
+            // been filled from the remote stream, then we must skip bytes on
+            // the remote stream to emulate overwriting bytes from that
+            // position. This mimics the behavior of other PHP stream wrappers.
+            $remoteData = $this->remoteStream->read(
+                $remaining + $this->skipReadBytes
+            );
+
+            if ($this->skipReadBytes) {
+                $len = strlen($remoteData);
+                $remoteData = substr($remoteData, $this->skipReadBytes);
+                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
+            }
+
+            $data .= $remoteData;
+            $this->stream->write($remoteData);
+        }
+
+        return $data;
+    }
+
+    public function write($string)
+    {
+        // When appending to the end of the currently read stream, you'll want
+        // to skip bytes from being read from the remote stream to emulate
+        // other stream wrappers. Basically replacing bytes of data of a fixed
+        // length.
+        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
+        if ($overflow > 0) {
+            $this->skipReadBytes += $overflow;
+        }
+
+        return $this->stream->write($string);
+    }
+
+    public function eof()
+    {
+        return $this->stream->eof() && $this->remoteStream->eof();
+    }
+
+    /**
+     * Close both the remote stream and buffer stream
+     */
+    public function close()
+    {
+        $this->remoteStream->close() && $this->stream->close();
+    }
+
+    private function cacheEntireStream()
+    {
+        $target = new FnStream(['write' => 'strlen']);
+        copy_to_stream($this, $target);
+
+        return $this->tell();
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/DroppingStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/DroppingStream.php
new file mode 100644
index 000000000..8935c80d7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/DroppingStream.php
@@ -0,0 +1,42 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Stream decorator that begins dropping data once the size of the underlying
+ * stream becomes too full.
+ */
+class DroppingStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    private $maxLength;
+
+    /**
+     * @param StreamInterface $stream    Underlying stream to decorate.
+     * @param int             $maxLength Maximum size before dropping data.
+     */
+    public function __construct(StreamInterface $stream, $maxLength)
+    {
+        $this->stream = $stream;
+        $this->maxLength = $maxLength;
+    }
+
+    public function write($string)
+    {
+        $diff = $this->maxLength - $this->stream->getSize();
+
+        // Begin returning 0 when the underlying stream is too large.
+        if ($diff <= 0) {
+            return 0;
+        }
+
+        // Write the stream or a subset of the stream if needed.
+        if (strlen($string) < $diff) {
+            return $this->stream->write($string);
+        }
+
+        return $this->stream->write(substr($string, 0, $diff));
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/FnStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/FnStream.php
new file mode 100644
index 000000000..cc9b4453f
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/FnStream.php
@@ -0,0 +1,149 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Compose stream implementations based on a hash of functions.
+ *
+ * Allows for easy testing and extension of a provided stream without needing
+ * to create a concrete class for a simple extension point.
+ */
+class FnStream implements StreamInterface
+{
+    /** @var array */
+    private $methods;
+
+    /** @var array Methods that must be implemented in the given array */
+    private static $slots = ['__toString', 'close', 'detach', 'rewind',
+        'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',
+        'isReadable', 'read', 'getContents', 'getMetadata'];
+
+    /**
+     * @param array $methods Hash of method name to a callable.
+     */
+    public function __construct(array $methods)
+    {
+        $this->methods = $methods;
+
+        // Create the functions on the class
+        foreach ($methods as $name => $fn) {
+            $this->{'_fn_' . $name} = $fn;
+        }
+    }
+
+    /**
+     * Lazily determine which methods are not implemented.
+     * @throws \BadMethodCallException
+     */
+    public function __get($name)
+    {
+        throw new \BadMethodCallException(str_replace('_fn_', '', $name)
+            . '() is not implemented in the FnStream');
+    }
+
+    /**
+     * The close method is called on the underlying stream only if possible.
+     */
+    public function __destruct()
+    {
+        if (isset($this->_fn_close)) {
+            call_user_func($this->_fn_close);
+        }
+    }
+
+    /**
+     * Adds custom functionality to an underlying stream by intercepting
+     * specific method calls.
+     *
+     * @param StreamInterface $stream  Stream to decorate
+     * @param array           $methods Hash of method name to a closure
+     *
+     * @return FnStream
+     */
+    public static function decorate(StreamInterface $stream, array $methods)
+    {
+        // If any of the required methods were not provided, then simply
+        // proxy to the decorated stream.
+        foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {
+            $methods[$diff] = [$stream, $diff];
+        }
+
+        return new self($methods);
+    }
+
+    public function __toString()
+    {
+        return call_user_func($this->_fn___toString);
+    }
+
+    public function close()
+    {
+        return call_user_func($this->_fn_close);
+    }
+
+    public function detach()
+    {
+        return call_user_func($this->_fn_detach);
+    }
+
+    public function getSize()
+    {
+        return call_user_func($this->_fn_getSize);
+    }
+
+    public function tell()
+    {
+        return call_user_func($this->_fn_tell);
+    }
+
+    public function eof()
+    {
+        return call_user_func($this->_fn_eof);
+    }
+
+    public function isSeekable()
+    {
+        return call_user_func($this->_fn_isSeekable);
+    }
+
+    public function rewind()
+    {
+        call_user_func($this->_fn_rewind);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        call_user_func($this->_fn_seek, $offset, $whence);
+    }
+
+    public function isWritable()
+    {
+        return call_user_func($this->_fn_isWritable);
+    }
+
+    public function write($string)
+    {
+        return call_user_func($this->_fn_write, $string);
+    }
+
+    public function isReadable()
+    {
+        return call_user_func($this->_fn_isReadable);
+    }
+
+    public function read($length)
+    {
+        return call_user_func($this->_fn_read, $length);
+    }
+
+    public function getContents()
+    {
+        return call_user_func($this->_fn_getContents);
+    }
+
+    public function getMetadata($key = null)
+    {
+        return call_user_func($this->_fn_getMetadata, $key);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/InflateStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/InflateStream.php
new file mode 100644
index 000000000..0051d3fec
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/InflateStream.php
@@ -0,0 +1,52 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.
+ *
+ * This stream decorator skips the first 10 bytes of the given stream to remove
+ * the gzip header, converts the provided stream to a PHP stream resource,
+ * then appends the zlib.inflate filter. The stream is then converted back
+ * to a Guzzle stream resource to be used as a Guzzle stream.
+ *
+ * @link http://tools.ietf.org/html/rfc1952
+ * @link http://php.net/manual/en/filters.compression.php
+ */
+class InflateStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    public function __construct(StreamInterface $stream)
+    {
+        // read the first 10 bytes, ie. gzip header
+        $header = $stream->read(10);
+        $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header);
+        // Skip the header, that is 10 + length of filename + 1 (nil) bytes
+        $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);
+        $resource = StreamWrapper::getResource($stream);
+        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);
+        $this->stream = new Stream($resource);
+    }
+
+    /**
+     * @param StreamInterface $stream
+     * @param $header
+     * @return int
+     */
+    private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header)
+    {
+        $filename_header_length = 0;
+
+        if (substr(bin2hex($header), 6, 2) === '08') {
+            // we have a filename, read until nil
+            $filename_header_length = 1;
+            while ($stream->read(1) !== chr(0)) {
+                $filename_header_length++;
+            }
+        }
+
+        return $filename_header_length;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LazyOpenStream.php
new file mode 100644
index 000000000..02cec3af4
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LazyOpenStream.php
@@ -0,0 +1,39 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Lazily reads or writes to a file that is opened only after an IO operation
+ * take place on the stream.
+ */
+class LazyOpenStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var string File to open */
+    private $filename;
+
+    /** @var string $mode */
+    private $mode;
+
+    /**
+     * @param string $filename File to lazily open
+     * @param string $mode     fopen mode to use when opening the stream
+     */
+    public function __construct($filename, $mode)
+    {
+        $this->filename = $filename;
+        $this->mode = $mode;
+    }
+
+    /**
+     * Creates the underlying stream lazily when required.
+     *
+     * @return StreamInterface
+     */
+    protected function createStream()
+    {
+        return stream_for(try_fopen($this->filename, $this->mode));
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LimitStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LimitStream.php
new file mode 100644
index 000000000..3c13d4f41
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/LimitStream.php
@@ -0,0 +1,155 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+
+/**
+ * Decorator used to return only a subset of a stream
+ */
+class LimitStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var int Offset to start reading from */
+    private $offset;
+
+    /** @var int Limit the number of bytes that can be read */
+    private $limit;
+
+    /**
+     * @param StreamInterface $stream Stream to wrap
+     * @param int             $limit  Total number of bytes to allow to be read
+     *                                from the stream. Pass -1 for no limit.
+     * @param int             $offset Position to seek to before reading (only
+     *                                works on seekable streams).
+     */
+    public function __construct(
+        StreamInterface $stream,
+        $limit = -1,
+        $offset = 0
+    ) {
+        $this->stream = $stream;
+        $this->setLimit($limit);
+        $this->setOffset($offset);
+    }
+
+    public function eof()
+    {
+        // Always return true if the underlying stream is EOF
+        if ($this->stream->eof()) {
+            return true;
+        }
+
+        // No limit and the underlying stream is not at EOF
+        if ($this->limit == -1) {
+            return false;
+        }
+
+        return $this->stream->tell() >= $this->offset + $this->limit;
+    }
+
+    /**
+     * Returns the size of the limited subset of data
+     * {@inheritdoc}
+     */
+    public function getSize()
+    {
+        if (null === ($length = $this->stream->getSize())) {
+            return null;
+        } elseif ($this->limit == -1) {
+            return $length - $this->offset;
+        } else {
+            return min($this->limit, $length - $this->offset);
+        }
+    }
+
+    /**
+     * Allow for a bounded seek on the read limited stream
+     * {@inheritdoc}
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if ($whence !== SEEK_SET || $offset < 0) {
+            throw new \RuntimeException(sprintf(
+                'Cannot seek to offset % with whence %s',
+                $offset,
+                $whence
+            ));
+        }
+
+        $offset += $this->offset;
+
+        if ($this->limit !== -1) {
+            if ($offset > $this->offset + $this->limit) {
+                $offset = $this->offset + $this->limit;
+            }
+        }
+
+        $this->stream->seek($offset);
+    }
+
+    /**
+     * Give a relative tell()
+     * {@inheritdoc}
+     */
+    public function tell()
+    {
+        return $this->stream->tell() - $this->offset;
+    }
+
+    /**
+     * Set the offset to start limiting from
+     *
+     * @param int $offset Offset to seek to and begin byte limiting from
+     *
+     * @throws \RuntimeException if the stream cannot be seeked.
+     */
+    public function setOffset($offset)
+    {
+        $current = $this->stream->tell();
+
+        if ($current !== $offset) {
+            // If the stream cannot seek to the offset position, then read to it
+            if ($this->stream->isSeekable()) {
+                $this->stream->seek($offset);
+            } elseif ($current > $offset) {
+                throw new \RuntimeException("Could not seek to stream offset $offset");
+            } else {
+                $this->stream->read($offset - $current);
+            }
+        }
+
+        $this->offset = $offset;
+    }
+
+    /**
+     * Set the limit of bytes that the decorator allows to be read from the
+     * stream.
+     *
+     * @param int $limit Number of bytes to allow to be read from the stream.
+     *                   Use -1 for no limit.
+     */
+    public function setLimit($limit)
+    {
+        $this->limit = $limit;
+    }
+
+    public function read($length)
+    {
+        if ($this->limit == -1) {
+            return $this->stream->read($length);
+        }
+
+        // Check if the current position is less than the total allowed
+        // bytes + original offset
+        $remaining = ($this->offset + $this->limit) - $this->stream->tell();
+        if ($remaining > 0) {
+            // Only return the amount of requested data, ensuring that the byte
+            // limit is not exceeded
+            return $this->stream->read(min($remaining, $length));
+        }
+
+        return '';
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MessageTrait.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MessageTrait.php
new file mode 100644
index 000000000..1e4da649a
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MessageTrait.php
@@ -0,0 +1,183 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Trait implementing functionality common to requests and responses.
+ */
+trait MessageTrait
+{
+    /** @var array Map of all registered headers, as original name => array of values */
+    private $headers = [];
+
+    /** @var array Map of lowercase header name => original name at registration */
+    private $headerNames  = [];
+
+    /** @var string */
+    private $protocol = '1.1';
+
+    /** @var StreamInterface */
+    private $stream;
+
+    public function getProtocolVersion()
+    {
+        return $this->protocol;
+    }
+
+    public function withProtocolVersion($version)
+    {
+        if ($this->protocol === $version) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->protocol = $version;
+        return $new;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+
+    public function hasHeader($header)
+    {
+        return isset($this->headerNames[strtolower($header)]);
+    }
+
+    public function getHeader($header)
+    {
+        $header = strtolower($header);
+
+        if (!isset($this->headerNames[$header])) {
+            return [];
+        }
+
+        $header = $this->headerNames[$header];
+
+        return $this->headers[$header];
+    }
+
+    public function getHeaderLine($header)
+    {
+        return implode(', ', $this->getHeader($header));
+    }
+
+    public function withHeader($header, $value)
+    {
+        if (!is_array($value)) {
+            $value = [$value];
+        }
+
+        $value = $this->trimHeaderValues($value);
+        $normalized = strtolower($header);
+
+        $new = clone $this;
+        if (isset($new->headerNames[$normalized])) {
+            unset($new->headers[$new->headerNames[$normalized]]);
+        }
+        $new->headerNames[$normalized] = $header;
+        $new->headers[$header] = $value;
+
+        return $new;
+    }
+
+    public function withAddedHeader($header, $value)
+    {
+        if (!is_array($value)) {
+            $value = [$value];
+        }
+
+        $value = $this->trimHeaderValues($value);
+        $normalized = strtolower($header);
+
+        $new = clone $this;
+        if (isset($new->headerNames[$normalized])) {
+            $header = $this->headerNames[$normalized];
+            $new->headers[$header] = array_merge($this->headers[$header], $value);
+        } else {
+            $new->headerNames[$normalized] = $header;
+            $new->headers[$header] = $value;
+        }
+
+        return $new;
+    }
+
+    public function withoutHeader($header)
+    {
+        $normalized = strtolower($header);
+
+        if (!isset($this->headerNames[$normalized])) {
+            return $this;
+        }
+
+        $header = $this->headerNames[$normalized];
+
+        $new = clone $this;
+        unset($new->headers[$header], $new->headerNames[$normalized]);
+
+        return $new;
+    }
+
+    public function getBody()
+    {
+        if (!$this->stream) {
+            $this->stream = stream_for('');
+        }
+
+        return $this->stream;
+    }
+
+    public function withBody(StreamInterface $body)
+    {
+        if ($body === $this->stream) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->stream = $body;
+        return $new;
+    }
+
+    private function setHeaders(array $headers)
+    {
+        $this->headerNames = $this->headers = [];
+        foreach ($headers as $header => $value) {
+            if (!is_array($value)) {
+                $value = [$value];
+            }
+
+            $value = $this->trimHeaderValues($value);
+            $normalized = strtolower($header);
+            if (isset($this->headerNames[$normalized])) {
+                $header = $this->headerNames[$normalized];
+                $this->headers[$header] = array_merge($this->headers[$header], $value);
+            } else {
+                $this->headerNames[$normalized] = $header;
+                $this->headers[$header] = $value;
+            }
+        }
+    }
+
+    /**
+     * Trims whitespace from the header values.
+     *
+     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
+     *
+     * header-field = field-name ":" OWS field-value OWS
+     * OWS          = *( SP / HTAB )
+     *
+     * @param string[] $values Header values
+     *
+     * @return string[] Trimmed header values
+     *
+     * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
+     */
+    private function trimHeaderValues(array $values)
+    {
+        return array_map(function ($value) {
+            return trim($value, " \t");
+        }, $values);
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MultipartStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MultipartStream.php
new file mode 100644
index 000000000..c0fd584f7
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/MultipartStream.php
@@ -0,0 +1,153 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Stream that when read returns bytes for a streaming multipart or
+ * multipart/form-data stream.
+ */
+class MultipartStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    private $boundary;
+
+    /**
+     * @param array  $elements Array of associative arrays, each containing a
+     *                         required "name" key mapping to the form field,
+     *                         name, a required "contents" key mapping to a
+     *                         StreamInterface/resource/string, an optional
+     *                         "headers" associative array of custom headers,
+     *                         and an optional "filename" key mapping to a
+     *                         string to send as the filename in the part.
+     * @param string $boundary You can optionally provide a specific boundary
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct(array $elements = [], $boundary = null)
+    {
+        $this->boundary = $boundary ?: sha1(uniqid('', true));
+        $this->stream = $this->createStream($elements);
+    }
+
+    /**
+     * Get the boundary
+     *
+     * @return string
+     */
+    public function getBoundary()
+    {
+        return $this->boundary;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    /**
+     * Get the headers needed before transferring the content of a POST file
+     */
+    private function getHeaders(array $headers)
+    {
+        $str = '';
+        foreach ($headers as $key => $value) {
+            $str .= "{$key}: {$value}\r\n";
+        }
+
+        return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n";
+    }
+
+    /**
+     * Create the aggregate stream that will be used to upload the POST data
+     */
+    protected function createStream(array $elements)
+    {
+        $stream = new AppendStream();
+
+        foreach ($elements as $element) {
+            $this->addElement($stream, $element);
+        }
+
+        // Add the trailing boundary with CRLF
+        $stream->addStream(stream_for("--{$this->boundary}--\r\n"));
+
+        return $stream;
+    }
+
+    private function addElement(AppendStream $stream, array $element)
+    {
+        foreach (['contents', 'name'] as $key) {
+            if (!array_key_exists($key, $element)) {
+                throw new \InvalidArgumentException("A '{$key}' key is required");
+            }
+        }
+
+        $element['contents'] = stream_for($element['contents']);
+
+        if (empty($element['filename'])) {
+            $uri = $element['contents']->getMetadata('uri');
+            if (substr($uri, 0, 6) !== 'php://') {
+                $element['filename'] = $uri;
+            }
+        }
+
+        list($body, $headers) = $this->createElement(
+            $element['name'],
+            $element['contents'],
+            isset($element['filename']) ? $element['filename'] : null,
+            isset($element['headers']) ? $element['headers'] : []
+        );
+
+        $stream->addStream(stream_for($this->getHeaders($headers)));
+        $stream->addStream($body);
+        $stream->addStream(stream_for("\r\n"));
+    }
+
+    /**
+     * @return array
+     */
+    private function createElement($name, StreamInterface $stream, $filename, array $headers)
+    {
+        // Set a default content-disposition header if one was no provided
+        $disposition = $this->getHeader($headers, 'content-disposition');
+        if (!$disposition) {
+            $headers['Content-Disposition'] = ($filename === '0' || $filename)
+                ? sprintf('form-data; name="%s"; filename="%s"',
+                    $name,
+                    basename($filename))
+                : "form-data; name=\"{$name}\"";
+        }
+
+        // Set a default content-length header if one was no provided
+        $length = $this->getHeader($headers, 'content-length');
+        if (!$length) {
+            if ($length = $stream->getSize()) {
+                $headers['Content-Length'] = (string) $length;
+            }
+        }
+
+        // Set a default Content-Type if one was not supplied
+        $type = $this->getHeader($headers, 'content-type');
+        if (!$type && ($filename === '0' || $filename)) {
+            if ($type = mimetype_from_filename($filename)) {
+                $headers['Content-Type'] = $type;
+            }
+        }
+
+        return [$stream, $headers];
+    }
+
+    private function getHeader(array $headers, $key)
+    {
+        $lowercaseHeader = strtolower($key);
+        foreach ($headers as $k => $v) {
+            if (strtolower($k) === $lowercaseHeader) {
+                return $v;
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/NoSeekStream.php
new file mode 100644
index 000000000..233221805
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/NoSeekStream.php
@@ -0,0 +1,22 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Stream decorator that prevents a stream from being seeked
+ */
+class NoSeekStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        throw new \RuntimeException('Cannot seek a NoSeekStream');
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/PumpStream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/PumpStream.php
new file mode 100644
index 000000000..ffb5440da
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/PumpStream.php
@@ -0,0 +1,165 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Provides a read only stream that pumps data from a PHP callable.
+ *
+ * When invoking the provided callable, the PumpStream will pass the amount of
+ * data requested to read to the callable. The callable can choose to ignore
+ * this value and return fewer or more bytes than requested. Any extra data
+ * returned by the provided callable is buffered internally until drained using
+ * the read() function of the PumpStream. The provided callable MUST return
+ * false when there is no more data to read.
+ */
+class PumpStream implements StreamInterface
+{
+    /** @var callable */
+    private $source;
+
+    /** @var int */
+    private $size;
+
+    /** @var int */
+    private $tellPos = 0;
+
+    /** @var array */
+    private $metadata;
+
+    /** @var BufferStream */
+    private $buffer;
+
+    /**
+     * @param callable $source Source of the stream data. The callable MAY
+     *                         accept an integer argument used to control the
+     *                         amount of data to return. The callable MUST
+     *                         return a string when called, or false on error
+     *                         or EOF.
+     * @param array $options   Stream options:
+     *                         - metadata: Hash of metadata to use with stream.
+     *                         - size: Size of the stream, if known.
+     */
+    public function __construct(callable $source, array $options = [])
+    {
+        $this->source = $source;
+        $this->size = isset($options['size']) ? $options['size'] : null;
+        $this->metadata = isset($options['metadata']) ? $options['metadata'] : [];
+        $this->buffer = new BufferStream();
+    }
+
+    public function __toString()
+    {
+        try {
+            return copy_to_string($this);
+        } catch (\Exception $e) {
+            return '';
+        }
+    }
+
+    public function close()
+    {
+        $this->detach();
+    }
+
+    public function detach()
+    {
+        $this->tellPos = false;
+        $this->source = null;
+    }
+
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    public function tell()
+    {
+        return $this->tellPos;
+    }
+
+    public function eof()
+    {
+        return !$this->source;
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        throw new \RuntimeException('Cannot seek a PumpStream');
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function write($string)
+    {
+        throw new \RuntimeException('Cannot write to a PumpStream');
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function read($length)
+    {
+        $data = $this->buffer->read($length);
+        $readLen = strlen($data);
+        $this->tellPos += $readLen;
+        $remaining = $length - $readLen;
+
+        if ($remaining) {
+            $this->pump($remaining);
+            $data .= $this->buffer->read($remaining);
+            $this->tellPos += strlen($data) - $readLen;
+        }
+
+        return $data;
+    }
+
+    public function getContents()
+    {
+        $result = '';
+        while (!$this->eof()) {
+            $result .= $this->read(1000000);
+        }
+
+        return $result;
+    }
+
+    public function getMetadata($key = null)
+    {
+        if (!$key) {
+            return $this->metadata;
+        }
+
+        return isset($this->metadata[$key]) ? $this->metadata[$key] : null;
+    }
+
+    private function pump($length)
+    {
+        if ($this->source) {
+            do {
+                $data = call_user_func($this->source, $length);
+                if ($data === false || $data === null) {
+                    $this->source = null;
+                    return;
+                }
+                $this->buffer->write($data);
+                $length -= strlen($data);
+            } while ($length > 0);
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Request.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Request.php
new file mode 100644
index 000000000..08285484d
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Request.php
@@ -0,0 +1,142 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use InvalidArgumentException;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * PSR-7 request implementation.
+ */
+class Request implements RequestInterface
+{
+    use MessageTrait;
+
+    /** @var string */
+    private $method;
+
+    /** @var null|string */
+    private $requestTarget;
+
+    /** @var UriInterface */
+    private $uri;
+
+    /**
+     * @param string                               $method  HTTP method
+     * @param string|UriInterface                  $uri     URI
+     * @param array                                $headers Request headers
+     * @param string|null|resource|StreamInterface $body    Request body
+     * @param string                               $version Protocol version
+     */
+    public function __construct(
+        $method,
+        $uri,
+        array $headers = [],
+        $body = null,
+        $version = '1.1'
+    ) {
+        if (!($uri instanceof UriInterface)) {
+            $uri = new Uri($uri);
+        }
+
+        $this->method = strtoupper($method);
+        $this->uri = $uri;
+        $this->setHeaders($headers);
+        $this->protocol = $version;
+
+        if (!$this->hasHeader('Host')) {
+            $this->updateHostFromUri();
+        }
+
+        if ($body !== '' && $body !== null) {
+            $this->stream = stream_for($body);
+        }
+    }
+
+    public function getRequestTarget()
+    {
+        if ($this->requestTarget !== null) {
+            return $this->requestTarget;
+        }
+
+        $target = $this->uri->getPath();
+        if ($target == '') {
+            $target = '/';
+        }
+        if ($this->uri->getQuery() != '') {
+            $target .= '?' . $this->uri->getQuery();
+        }
+
+        return $target;
+    }
+
+    public function withRequestTarget($requestTarget)
+    {
+        if (preg_match('#\s#', $requestTarget)) {
+            throw new InvalidArgumentException(
+                'Invalid request target provided; cannot contain whitespace'
+            );
+        }
+
+        $new = clone $this;
+        $new->requestTarget = $requestTarget;
+        return $new;
+    }
+
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    public function withMethod($method)
+    {
+        $new = clone $this;
+        $new->method = strtoupper($method);
+        return $new;
+    }
+
+    public function getUri()
+    {
+        return $this->uri;
+    }
+
+    public function withUri(UriInterface $uri, $preserveHost = false)
+    {
+        if ($uri === $this->uri) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->uri = $uri;
+
+        if (!$preserveHost) {
+            $new->updateHostFromUri();
+        }
+
+        return $new;
+    }
+
+    private function updateHostFromUri()
+    {
+        $host = $this->uri->getHost();
+
+        if ($host == '') {
+            return;
+        }
+
+        if (($port = $this->uri->getPort()) !== null) {
+            $host .= ':' . $port;
+        }
+
+        if (isset($this->headerNames['host'])) {
+            $header = $this->headerNames['host'];
+        } else {
+            $header = 'Host';
+            $this->headerNames['host'] = 'Host';
+        }
+        // Ensure Host is the first header.
+        // See: http://tools.ietf.org/html/rfc7230#section-5.4
+        $this->headers = [$header => [$host]] + $this->headers;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Response.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Response.php
new file mode 100644
index 000000000..2830c6c9e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Response.php
@@ -0,0 +1,132 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * PSR-7 response implementation.
+ */
+class Response implements ResponseInterface
+{
+    use MessageTrait;
+
+    /** @var array Map of standard HTTP status code/reason phrases */
+    private static $phrases = [
+        100 => 'Continue',
+        101 => 'Switching Protocols',
+        102 => 'Processing',
+        200 => 'OK',
+        201 => 'Created',
+        202 => 'Accepted',
+        203 => 'Non-Authoritative Information',
+        204 => 'No Content',
+        205 => 'Reset Content',
+        206 => 'Partial Content',
+        207 => 'Multi-status',
+        208 => 'Already Reported',
+        300 => 'Multiple Choices',
+        301 => 'Moved Permanently',
+        302 => 'Found',
+        303 => 'See Other',
+        304 => 'Not Modified',
+        305 => 'Use Proxy',
+        306 => 'Switch Proxy',
+        307 => 'Temporary Redirect',
+        400 => 'Bad Request',
+        401 => 'Unauthorized',
+        402 => 'Payment Required',
+        403 => 'Forbidden',
+        404 => 'Not Found',
+        405 => 'Method Not Allowed',
+        406 => 'Not Acceptable',
+        407 => 'Proxy Authentication Required',
+        408 => 'Request Time-out',
+        409 => 'Conflict',
+        410 => 'Gone',
+        411 => 'Length Required',
+        412 => 'Precondition Failed',
+        413 => 'Request Entity Too Large',
+        414 => 'Request-URI Too Large',
+        415 => 'Unsupported Media Type',
+        416 => 'Requested range not satisfiable',
+        417 => 'Expectation Failed',
+        418 => 'I\'m a teapot',
+        422 => 'Unprocessable Entity',
+        423 => 'Locked',
+        424 => 'Failed Dependency',
+        425 => 'Unordered Collection',
+        426 => 'Upgrade Required',
+        428 => 'Precondition Required',
+        429 => 'Too Many Requests',
+        431 => 'Request Header Fields Too Large',
+        451 => 'Unavailable For Legal Reasons',
+        500 => 'Internal Server Error',
+        501 => 'Not Implemented',
+        502 => 'Bad Gateway',
+        503 => 'Service Unavailable',
+        504 => 'Gateway Time-out',
+        505 => 'HTTP Version not supported',
+        506 => 'Variant Also Negotiates',
+        507 => 'Insufficient Storage',
+        508 => 'Loop Detected',
+        511 => 'Network Authentication Required',
+    ];
+
+    /** @var string */
+    private $reasonPhrase = '';
+
+    /** @var int */
+    private $statusCode = 200;
+
+    /**
+     * @param int                                  $status  Status code
+     * @param array                                $headers Response headers
+     * @param string|null|resource|StreamInterface $body    Response body
+     * @param string                               $version Protocol version
+     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)
+     */
+    public function __construct(
+        $status = 200,
+        array $headers = [],
+        $body = null,
+        $version = '1.1',
+        $reason = null
+    ) {
+        $this->statusCode = (int) $status;
+
+        if ($body !== '' && $body !== null) {
+            $this->stream = stream_for($body);
+        }
+
+        $this->setHeaders($headers);
+        if ($reason == '' && isset(self::$phrases[$this->statusCode])) {
+            $this->reasonPhrase = self::$phrases[$this->statusCode];
+        } else {
+            $this->reasonPhrase = (string) $reason;
+        }
+
+        $this->protocol = $version;
+    }
+
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    public function getReasonPhrase()
+    {
+        return $this->reasonPhrase;
+    }
+
+    public function withStatus($code, $reasonPhrase = '')
+    {
+        $new = clone $this;
+        $new->statusCode = (int) $code;
+        if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) {
+            $reasonPhrase = self::$phrases[$new->statusCode];
+        }
+        $new->reasonPhrase = $reasonPhrase;
+        return $new;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/ServerRequest.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/ServerRequest.php
new file mode 100644
index 000000000..575aab848
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/ServerRequest.php
@@ -0,0 +1,358 @@
+<?php
+
+namespace GuzzleHttp\Psr7;
+
+use InvalidArgumentException;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\UriInterface;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UploadedFileInterface;
+
+/**
+ * Server-side HTTP request
+ *
+ * Extends the Request definition to add methods for accessing incoming data,
+ * specifically server parameters, cookies, matched path parameters, query
+ * string arguments, body parameters, and upload file information.
+ *
+ * "Attributes" are discovered via decomposing the request (and usually
+ * specifically the URI path), and typically will be injected by the application.
+ *
+ * Requests are considered immutable; all methods that might change state are
+ * implemented such that they retain the internal state of the current
+ * message and return a new instance that contains the changed state.
+ */
+class ServerRequest extends Request implements ServerRequestInterface
+{
+    /**
+     * @var array
+     */
+    private $attributes = [];
+
+    /**
+     * @var array
+     */
+    private $cookieParams = [];
+
+    /**
+     * @var null|array|object
+     */
+    private $parsedBody;
+
+    /**
+     * @var array
+     */
+    private $queryParams = [];
+
+    /**
+     * @var array
+     */
+    private $serverParams;
+
+    /**
+     * @var array
+     */
+    private $uploadedFiles = [];
+
+    /**
+     * @param string                               $method       HTTP method
+     * @param string|UriInterface                  $uri          URI
+     * @param array                                $headers      Request headers
+     * @param string|null|resource|StreamInterface $body         Request body
+     * @param string                               $version      Protocol version
+     * @param array                                $serverParams Typically the $_SERVER superglobal
+     */
+    public function __construct(
+        $method,
+        $uri,
+        array $headers = [],
+        $body = null,
+        $version = '1.1',
+        array $serverParams = []
+    ) {
+        $this->serverParams = $serverParams;
+
+        parent::__construct($method, $uri, $headers, $body, $version);
+    }
+
+    /**
+     * Return an UploadedFile instance array.
+     *
+     * @param array $files A array which respect $_FILES structure
+     * @throws InvalidArgumentException for unrecognized values
+     * @return array
+     */
+    public static function normalizeFiles(array $files)
+    {
+        $normalized = [];
+
+        foreach ($files as $key => $value) {
+            if ($value instanceof UploadedFileInterface) {
+                $normalized[$key] = $value;
+            } elseif (is_array($value) && isset($value['tmp_name'])) {
+                $normalized[$key] = self::createUploadedFileFromSpec($value);
+            } elseif (is_array($value)) {
+                $normalized[$key] = self::normalizeFiles($value);
+                continue;
+            } else {
+                throw new InvalidArgumentException('Invalid value in files specification');
+            }
+        }
+
+        return $normalized;
+    }
+
+    /**
+     * Create and return an UploadedFile instance from a $_FILES specification.
+     *
+     * If the specification represents an array of values, this method will
+     * delegate to normalizeNestedFileSpec() and return that return value.
+     *
+     * @param array $value $_FILES struct
+     * @return array|UploadedFileInterface
+     */
+    private static function createUploadedFileFromSpec(array $value)
+    {
+        if (is_array($value['tmp_name'])) {
+            return self::normalizeNestedFileSpec($value);
+        }
+
+        return new UploadedFile(
+            $value['tmp_name'],
+            (int) $value['size'],
+            (int) $value['error'],
+            $value['name'],
+            $value['type']
+        );
+    }
+
+    /**
+     * Normalize an array of file specifications.
+     *
+     * Loops through all nested files and returns a normalized array of
+     * UploadedFileInterface instances.
+     *
+     * @param array $files
+     * @return UploadedFileInterface[]
+     */
+    private static function normalizeNestedFileSpec(array $files = [])
+    {
+        $normalizedFiles = [];
+
+        foreach (array_keys($files['tmp_name']) as $key) {
+            $spec = [
+                'tmp_name' => $files['tmp_name'][$key],
+                'size'     => $files['size'][$key],
+                'error'    => $files['error'][$key],
+                'name'     => $files['name'][$key],
+                'type'     => $files['type'][$key],
+            ];
+            $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
+        }
+
+        return $normalizedFiles;
+    }
+
+    /**
+     * Return a ServerRequest populated with superglobals:
+     * $_GET
+     * $_POST
+     * $_COOKIE
+     * $_FILES
+     * $_SERVER
+     *
+     * @return ServerRequestInterface
+     */
+    public static function fromGlobals()
+    {
+        $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+        $headers = function_exists('getallheaders') ? getallheaders() : [];
+        $uri = self::getUriFromGlobals();
+        $body = new LazyOpenStream('php://input', 'r+');
+        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
+
+        $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);
+
+        return $serverRequest
+            ->withCookieParams($_COOKIE)
+            ->withQueryParams($_GET)
+            ->withParsedBody($_POST)
+            ->withUploadedFiles(self::normalizeFiles($_FILES));
+    }
+
+    /**
+     * Get a Uri populated with values from $_SERVER.
+     *
+     * @return UriInterface
+     */
+    public static function getUriFromGlobals() {
+        $uri = new Uri('');
+
+        $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
+
+        $hasPort = false;
+        if (isset($_SERVER['HTTP_HOST'])) {
+            $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']);
+            $uri = $uri->withHost($hostHeaderParts[0]);
+            if (isset($hostHeaderParts[1])) {
+                $hasPort = true;
+                $uri = $uri->withPort($hostHeaderParts[1]);
+            }
+        } elseif (isset($_SERVER['SERVER_NAME'])) {
+            $uri = $uri->withHost($_SERVER['SERVER_NAME']);
+        } elseif (isset($_SERVER['SERVER_ADDR'])) {
+            $uri = $uri->withHost($_SERVER['SERVER_ADDR']);
+        }
+
+        if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {
+            $uri = $uri->withPort($_SERVER['SERVER_PORT']);
+        }
+
+        $hasQuery = false;
+        if (isset($_SERVER['REQUEST_URI'])) {
+            $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);
+            $uri = $uri->withPath($requestUriParts[0]);
+            if (isset($requestUriParts[1])) {
+                $hasQuery = true;
+                $uri = $uri->withQuery($requestUriParts[1]);
+            }
+        }
+
+        if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {
+            $uri = $uri->withQuery($_SERVER['QUERY_STRING']);
+        }
+
+        return $uri;
+    }
+
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getServerParams()
+    {
+        return $this->serverParams;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUploadedFiles()
+    {
+        return $this->uploadedFiles;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withUploadedFiles(array $uploadedFiles)
+    {
+        $new = clone $this;
+        $new->uploadedFiles = $uploadedFiles;
+
+        return $new;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCookieParams()
+    {
+        return $this->cookieParams;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withCookieParams(array $cookies)
+    {
+        $new = clone $this;
+        $new->cookieParams = $cookies;
+
+        return $new;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getQueryParams()
+    {
+        return $this->queryParams;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withQueryParams(array $query)
+    {
+        $new = clone $this;
+        $new->queryParams = $query;
+
+        return $new;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParsedBody()
+    {
+        return $this->parsedBody;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withParsedBody($data)
+    {
+        $new = clone $this;
+        $new->parsedBody = $data;
+
+        return $new;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAttributes()
+    {
+        return $this->attributes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAttribute($attribute, $default = null)
+    {
+        if (false === array_key_exists($attribute, $this->attributes)) {
+            return $default;
+        }
+
+        return $this->attributes[$attribute];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withAttribute($attribute, $value)
+    {
+        $new = clone $this;
+        $new->attributes[$attribute] = $value;
+
+        return $new;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function withoutAttribute($attribute)
+    {
+        if (false === array_key_exists($attribute, $this->attributes)) {
+            return $this;
+        }
+
+        $new = clone $this;
+        unset($new->attributes[$attribute]);
+
+        return $new;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Stream.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Stream.php
new file mode 100644
index 000000000..e33662879
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Stream.php
@@ -0,0 +1,257 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * PHP stream implementation.
+ *
+ * @var $stream
+ */
+class Stream implements StreamInterface
+{
+    private $stream;
+    private $size;
+    private $seekable;
+    private $readable;
+    private $writable;
+    private $uri;
+    private $customMetadata;
+
+    /** @var array Hash of readable and writable stream types */
+    private static $readWriteHash = [
+        'read' => [
+            'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
+            'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
+            'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
+            'x+t' => true, 'c+t' => true, 'a+' => true
+        ],
+        'write' => [
+            'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
+            'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+            'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
+            'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
+        ]
+    ];
+
+    /**
+     * This constructor accepts an associative array of options.
+     *
+     * - size: (int) If a read stream would otherwise have an indeterminate
+     *   size, but the size is known due to foreknowledge, then you can
+     *   provide that size, in bytes.
+     * - metadata: (array) Any additional metadata to return when the metadata
+     *   of the stream is accessed.
+     *
+     * @param resource $stream  Stream resource to wrap.
+     * @param array    $options Associative array of options.
+     *
+     * @throws \InvalidArgumentException if the stream is not a stream resource
+     */
+    public function __construct($stream, $options = [])
+    {
+        if (!is_resource($stream)) {
+            throw new \InvalidArgumentException('Stream must be a resource');
+        }
+
+        if (isset($options['size'])) {
+            $this->size = $options['size'];
+        }
+
+        $this->customMetadata = isset($options['metadata'])
+            ? $options['metadata']
+            : [];
+
+        $this->stream = $stream;
+        $meta = stream_get_meta_data($this->stream);
+        $this->seekable = $meta['seekable'];
+        $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]);
+        $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]);
+        $this->uri = $this->getMetadata('uri');
+    }
+
+    public function __get($name)
+    {
+        if ($name == 'stream') {
+            throw new \RuntimeException('The stream is detached');
+        }
+
+        throw new \BadMethodCallException('No value for ' . $name);
+    }
+
+    /**
+     * Closes the stream when the destructed
+     */
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    public function __toString()
+    {
+        try {
+            $this->seek(0);
+            return (string) stream_get_contents($this->stream);
+        } catch (\Exception $e) {
+            return '';
+        }
+    }
+
+    public function getContents()
+    {
+        $contents = stream_get_contents($this->stream);
+
+        if ($contents === false) {
+            throw new \RuntimeException('Unable to read stream contents');
+        }
+
+        return $contents;
+    }
+
+    public function close()
+    {
+        if (isset($this->stream)) {
+            if (is_resource($this->stream)) {
+                fclose($this->stream);
+            }
+            $this->detach();
+        }
+    }
+
+    public function detach()
+    {
+        if (!isset($this->stream)) {
+            return null;
+        }
+
+        $result = $this->stream;
+        unset($this->stream);
+        $this->size = $this->uri = null;
+        $this->readable = $this->writable = $this->seekable = false;
+
+        return $result;
+    }
+
+    public function getSize()
+    {
+        if ($this->size !== null) {
+            return $this->size;
+        }
+
+        if (!isset($this->stream)) {
+            return null;
+        }
+
+        // Clear the stat cache if the stream has a URI
+        if ($this->uri) {
+            clearstatcache(true, $this->uri);
+        }
+
+        $stats = fstat($this->stream);
+        if (isset($stats['size'])) {
+            $this->size = $stats['size'];
+            return $this->size;
+        }
+
+        return null;
+    }
+
+    public function isReadable()
+    {
+        return $this->readable;
+    }
+
+    public function isWritable()
+    {
+        return $this->writable;
+    }
+
+    public function isSeekable()
+    {
+        return $this->seekable;
+    }
+
+    public function eof()
+    {
+        return !$this->stream || feof($this->stream);
+    }
+
+    public function tell()
+    {
+        $result = ftell($this->stream);
+
+        if ($result === false) {
+            throw new \RuntimeException('Unable to determine stream position');
+        }
+
+        return $result;
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if (!$this->seekable) {
+            throw new \RuntimeException('Stream is not seekable');
+        } elseif (fseek($this->stream, $offset, $whence) === -1) {
+            throw new \RuntimeException('Unable to seek to stream position '
+                . $offset . ' with whence ' . var_export($whence, true));
+        }
+    }
+
+    public function read($length)
+    {
+        if (!$this->readable) {
+            throw new \RuntimeException('Cannot read from non-readable stream');
+        }
+        if ($length < 0) {
+            throw new \RuntimeException('Length parameter cannot be negative');
+        }
+
+        if (0 === $length) {
+            return '';
+        }
+
+        $string = fread($this->stream, $length);
+        if (false === $string) {
+            throw new \RuntimeException('Unable to read from stream');
+        }
+
+        return $string;
+    }
+
+    public function write($string)
+    {
+        if (!$this->writable) {
+            throw new \RuntimeException('Cannot write to a non-writable stream');
+        }
+
+        // We can't know the size after writing anything
+        $this->size = null;
+        $result = fwrite($this->stream, $string);
+
+        if ($result === false) {
+            throw new \RuntimeException('Unable to write to stream');
+        }
+
+        return $result;
+    }
+
+    public function getMetadata($key = null)
+    {
+        if (!isset($this->stream)) {
+            return $key ? null : [];
+        } elseif (!$key) {
+            return $this->customMetadata + stream_get_meta_data($this->stream);
+        } elseif (isset($this->customMetadata[$key])) {
+            return $this->customMetadata[$key];
+        }
+
+        $meta = stream_get_meta_data($this->stream);
+
+        return isset($meta[$key]) ? $meta[$key] : null;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
new file mode 100644
index 000000000..daec6f52e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
@@ -0,0 +1,149 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Stream decorator trait
+ * @property StreamInterface stream
+ */
+trait StreamDecoratorTrait
+{
+    /**
+     * @param StreamInterface $stream Stream to decorate
+     */
+    public function __construct(StreamInterface $stream)
+    {
+        $this->stream = $stream;
+    }
+
+    /**
+     * Magic method used to create a new stream if streams are not added in
+     * the constructor of a decorator (e.g., LazyOpenStream).
+     *
+     * @param string $name Name of the property (allows "stream" only).
+     *
+     * @return StreamInterface
+     */
+    public function __get($name)
+    {
+        if ($name == 'stream') {
+            $this->stream = $this->createStream();
+            return $this->stream;
+        }
+
+        throw new \UnexpectedValueException("$name not found on class");
+    }
+
+    public function __toString()
+    {
+        try {
+            if ($this->isSeekable()) {
+                $this->seek(0);
+            }
+            return $this->getContents();
+        } catch (\Exception $e) {
+            // Really, PHP? https://bugs.php.net/bug.php?id=53648
+            trigger_error('StreamDecorator::__toString exception: '
+                . (string) $e, E_USER_ERROR);
+            return '';
+        }
+    }
+
+    public function getContents()
+    {
+        return copy_to_string($this);
+    }
+
+    /**
+     * Allow decorators to implement custom methods
+     *
+     * @param string $method Missing method name
+     * @param array  $args   Method arguments
+     *
+     * @return mixed
+     */
+    public function __call($method, array $args)
+    {
+        $result = call_user_func_array([$this->stream, $method], $args);
+
+        // Always return the wrapped object if the result is a return $this
+        return $result === $this->stream ? $this : $result;
+    }
+
+    public function close()
+    {
+        $this->stream->close();
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $this->stream->getMetadata($key);
+    }
+
+    public function detach()
+    {
+        return $this->stream->detach();
+    }
+
+    public function getSize()
+    {
+        return $this->stream->getSize();
+    }
+
+    public function eof()
+    {
+        return $this->stream->eof();
+    }
+
+    public function tell()
+    {
+        return $this->stream->tell();
+    }
+
+    public function isReadable()
+    {
+        return $this->stream->isReadable();
+    }
+
+    public function isWritable()
+    {
+        return $this->stream->isWritable();
+    }
+
+    public function isSeekable()
+    {
+        return $this->stream->isSeekable();
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        $this->stream->seek($offset, $whence);
+    }
+
+    public function read($length)
+    {
+        return $this->stream->read($length);
+    }
+
+    public function write($string)
+    {
+        return $this->stream->write($string);
+    }
+
+    /**
+     * Implement in subclasses to dynamically create streams when requested.
+     *
+     * @return StreamInterface
+     * @throws \BadMethodCallException
+     */
+    protected function createStream()
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamWrapper.php
new file mode 100644
index 000000000..cf7b2232e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/StreamWrapper.php
@@ -0,0 +1,121 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Converts Guzzle streams into PHP stream resources.
+ */
+class StreamWrapper
+{
+    /** @var resource */
+    public $context;
+
+    /** @var StreamInterface */
+    private $stream;
+
+    /** @var string r, r+, or w */
+    private $mode;
+
+    /**
+     * Returns a resource representing the stream.
+     *
+     * @param StreamInterface $stream The stream to get a resource for
+     *
+     * @return resource
+     * @throws \InvalidArgumentException if stream is not readable or writable
+     */
+    public static function getResource(StreamInterface $stream)
+    {
+        self::register();
+
+        if ($stream->isReadable()) {
+            $mode = $stream->isWritable() ? 'r+' : 'r';
+        } elseif ($stream->isWritable()) {
+            $mode = 'w';
+        } else {
+            throw new \InvalidArgumentException('The stream must be readable, '
+                . 'writable, or both.');
+        }
+
+        return fopen('guzzle://stream', $mode, null, stream_context_create([
+            'guzzle' => ['stream' => $stream]
+        ]));
+    }
+
+    /**
+     * Registers the stream wrapper if needed
+     */
+    public static function register()
+    {
+        if (!in_array('guzzle', stream_get_wrappers())) {
+            stream_wrapper_register('guzzle', __CLASS__);
+        }
+    }
+
+    public function stream_open($path, $mode, $options, &$opened_path)
+    {
+        $options = stream_context_get_options($this->context);
+
+        if (!isset($options['guzzle']['stream'])) {
+            return false;
+        }
+
+        $this->mode = $mode;
+        $this->stream = $options['guzzle']['stream'];
+
+        return true;
+    }
+
+    public function stream_read($count)
+    {
+        return $this->stream->read($count);
+    }
+
+    public function stream_write($data)
+    {
+        return (int) $this->stream->write($data);
+    }
+
+    public function stream_tell()
+    {
+        return $this->stream->tell();
+    }
+
+    public function stream_eof()
+    {
+        return $this->stream->eof();
+    }
+
+    public function stream_seek($offset, $whence)
+    {
+        $this->stream->seek($offset, $whence);
+
+        return true;
+    }
+
+    public function stream_stat()
+    {
+        static $modeMap = [
+            'r'  => 33060,
+            'r+' => 33206,
+            'w'  => 33188
+        ];
+
+        return [
+            'dev'     => 0,
+            'ino'     => 0,
+            'mode'    => $modeMap[$this->mode],
+            'nlink'   => 0,
+            'uid'     => 0,
+            'gid'     => 0,
+            'rdev'    => 0,
+            'size'    => $this->stream->getSize() ?: 0,
+            'atime'   => 0,
+            'mtime'   => 0,
+            'ctime'   => 0,
+            'blksize' => 0,
+            'blocks'  => 0
+        ];
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UploadedFile.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UploadedFile.php
new file mode 100644
index 000000000..e62bd5c80
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UploadedFile.php
@@ -0,0 +1,316 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use InvalidArgumentException;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UploadedFileInterface;
+use RuntimeException;
+
+class UploadedFile implements UploadedFileInterface
+{
+    /**
+     * @var int[]
+     */
+    private static $errors = [
+        UPLOAD_ERR_OK,
+        UPLOAD_ERR_INI_SIZE,
+        UPLOAD_ERR_FORM_SIZE,
+        UPLOAD_ERR_PARTIAL,
+        UPLOAD_ERR_NO_FILE,
+        UPLOAD_ERR_NO_TMP_DIR,
+        UPLOAD_ERR_CANT_WRITE,
+        UPLOAD_ERR_EXTENSION,
+    ];
+
+    /**
+     * @var string
+     */
+    private $clientFilename;
+
+    /**
+     * @var string
+     */
+    private $clientMediaType;
+
+    /**
+     * @var int
+     */
+    private $error;
+
+    /**
+     * @var null|string
+     */
+    private $file;
+
+    /**
+     * @var bool
+     */
+    private $moved = false;
+
+    /**
+     * @var int
+     */
+    private $size;
+
+    /**
+     * @var StreamInterface|null
+     */
+    private $stream;
+
+    /**
+     * @param StreamInterface|string|resource $streamOrFile
+     * @param int $size
+     * @param int $errorStatus
+     * @param string|null $clientFilename
+     * @param string|null $clientMediaType
+     */
+    public function __construct(
+        $streamOrFile,
+        $size,
+        $errorStatus,
+        $clientFilename = null,
+        $clientMediaType = null
+    ) {
+        $this->setError($errorStatus);
+        $this->setSize($size);
+        $this->setClientFilename($clientFilename);
+        $this->setClientMediaType($clientMediaType);
+
+        if ($this->isOk()) {
+            $this->setStreamOrFile($streamOrFile);
+        }
+    }
+
+    /**
+     * Depending on the value set file or stream variable
+     *
+     * @param mixed $streamOrFile
+     * @throws InvalidArgumentException
+     */
+    private function setStreamOrFile($streamOrFile)
+    {
+        if (is_string($streamOrFile)) {
+            $this->file = $streamOrFile;
+        } elseif (is_resource($streamOrFile)) {
+            $this->stream = new Stream($streamOrFile);
+        } elseif ($streamOrFile instanceof StreamInterface) {
+            $this->stream = $streamOrFile;
+        } else {
+            throw new InvalidArgumentException(
+                'Invalid stream or file provided for UploadedFile'
+            );
+        }
+    }
+
+    /**
+     * @param int $error
+     * @throws InvalidArgumentException
+     */
+    private function setError($error)
+    {
+        if (false === is_int($error)) {
+            throw new InvalidArgumentException(
+                'Upload file error status must be an integer'
+            );
+        }
+
+        if (false === in_array($error, UploadedFile::$errors)) {
+            throw new InvalidArgumentException(
+                'Invalid error status for UploadedFile'
+            );
+        }
+
+        $this->error = $error;
+    }
+
+    /**
+     * @param int $size
+     * @throws InvalidArgumentException
+     */
+    private function setSize($size)
+    {
+        if (false === is_int($size)) {
+            throw new InvalidArgumentException(
+                'Upload file size must be an integer'
+            );
+        }
+
+        $this->size = $size;
+    }
+
+    /**
+     * @param mixed $param
+     * @return boolean
+     */
+    private function isStringOrNull($param)
+    {
+        return in_array(gettype($param), ['string', 'NULL']);
+    }
+
+    /**
+     * @param mixed $param
+     * @return boolean
+     */
+    private function isStringNotEmpty($param)
+    {
+        return is_string($param) && false === empty($param);
+    }
+
+    /**
+     * @param string|null $clientFilename
+     * @throws InvalidArgumentException
+     */
+    private function setClientFilename($clientFilename)
+    {
+        if (false === $this->isStringOrNull($clientFilename)) {
+            throw new InvalidArgumentException(
+                'Upload file client filename must be a string or null'
+            );
+        }
+
+        $this->clientFilename = $clientFilename;
+    }
+
+    /**
+     * @param string|null $clientMediaType
+     * @throws InvalidArgumentException
+     */
+    private function setClientMediaType($clientMediaType)
+    {
+        if (false === $this->isStringOrNull($clientMediaType)) {
+            throw new InvalidArgumentException(
+                'Upload file client media type must be a string or null'
+            );
+        }
+
+        $this->clientMediaType = $clientMediaType;
+    }
+
+    /**
+     * Return true if there is no upload error
+     *
+     * @return boolean
+     */
+    private function isOk()
+    {
+        return $this->error === UPLOAD_ERR_OK;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isMoved()
+    {
+        return $this->moved;
+    }
+
+    /**
+     * @throws RuntimeException if is moved or not ok
+     */
+    private function validateActive()
+    {
+        if (false === $this->isOk()) {
+            throw new RuntimeException('Cannot retrieve stream due to upload error');
+        }
+
+        if ($this->isMoved()) {
+            throw new RuntimeException('Cannot retrieve stream after it has already been moved');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws RuntimeException if the upload was not successful.
+     */
+    public function getStream()
+    {
+        $this->validateActive();
+
+        if ($this->stream instanceof StreamInterface) {
+            return $this->stream;
+        }
+
+        return new LazyOpenStream($this->file, 'r+');
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @see http://php.net/is_uploaded_file
+     * @see http://php.net/move_uploaded_file
+     * @param string $targetPath Path to which to move the uploaded file.
+     * @throws RuntimeException if the upload was not successful.
+     * @throws InvalidArgumentException if the $path specified is invalid.
+     * @throws RuntimeException on any error during the move operation, or on
+     *     the second or subsequent call to the method.
+     */
+    public function moveTo($targetPath)
+    {
+        $this->validateActive();
+
+        if (false === $this->isStringNotEmpty($targetPath)) {
+            throw new InvalidArgumentException(
+                'Invalid path provided for move operation; must be a non-empty string'
+            );
+        }
+
+        if ($this->file) {
+            $this->moved = php_sapi_name() == 'cli'
+                ? rename($this->file, $targetPath)
+                : move_uploaded_file($this->file, $targetPath);
+        } else {
+            copy_to_stream(
+                $this->getStream(),
+                new LazyOpenStream($targetPath, 'w')
+            );
+
+            $this->moved = true;
+        }
+
+        if (false === $this->moved) {
+            throw new RuntimeException(
+                sprintf('Uploaded file could not be moved to %s', $targetPath)
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return int|null The file size in bytes or null if unknown.
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @see http://php.net/manual/en/features.file-upload.errors.php
+     * @return int One of PHP's UPLOAD_ERR_XXX constants.
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return string|null The filename sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientFilename()
+    {
+        return $this->clientFilename;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getClientMediaType()
+    {
+        return $this->clientMediaType;
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Uri.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Uri.php
new file mode 100644
index 000000000..f46c1db9e
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/Uri.php
@@ -0,0 +1,702 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\UriInterface;
+
+/**
+ * PSR-7 URI implementation.
+ *
+ * @author Michael Dowling
+ * @author Tobias Schultze
+ * @author Matthew Weier O'Phinney
+ */
+class Uri implements UriInterface
+{
+    /**
+     * Absolute http and https URIs require a host per RFC 7230 Section 2.7
+     * but in generic URIs the host can be empty. So for http(s) URIs
+     * we apply this default host when no host is given yet to form a
+     * valid URI.
+     */
+    const HTTP_DEFAULT_HOST = 'localhost';
+
+    private static $defaultPorts = [
+        'http'  => 80,
+        'https' => 443,
+        'ftp' => 21,
+        'gopher' => 70,
+        'nntp' => 119,
+        'news' => 119,
+        'telnet' => 23,
+        'tn3270' => 23,
+        'imap' => 143,
+        'pop' => 110,
+        'ldap' => 389,
+    ];
+
+    private static $charUnreserved = 'a-zA-Z0-9_\-\.~';
+    private static $charSubDelims = '!\$&\'\(\)\*\+,;=';
+    private static $replaceQuery = ['=' => '%3D', '&' => '%26'];
+
+    /** @var string Uri scheme. */
+    private $scheme = '';
+
+    /** @var string Uri user info. */
+    private $userInfo = '';
+
+    /** @var string Uri host. */
+    private $host = '';
+
+    /** @var int|null Uri port. */
+    private $port;
+
+    /** @var string Uri path. */
+    private $path = '';
+
+    /** @var string Uri query string. */
+    private $query = '';
+
+    /** @var string Uri fragment. */
+    private $fragment = '';
+
+    /**
+     * @param string $uri URI to parse
+     */
+    public function __construct($uri = '')
+    {
+        // weak type check to also accept null until we can add scalar type hints
+        if ($uri != '') {
+            $parts = parse_url($uri);
+            if ($parts === false) {
+                throw new \InvalidArgumentException("Unable to parse URI: $uri");
+            }
+            $this->applyParts($parts);
+        }
+    }
+
+    public function __toString()
+    {
+        return self::composeComponents(
+            $this->scheme,
+            $this->getAuthority(),
+            $this->path,
+            $this->query,
+            $this->fragment
+        );
+    }
+
+    /**
+     * Composes a URI reference string from its various components.
+     *
+     * Usually this method does not need to be called manually but instead is used indirectly via
+     * `Psr\Http\Message\UriInterface::__toString`.
+     *
+     * PSR-7 UriInterface treats an empty component the same as a missing component as
+     * getQuery(), getFragment() etc. always return a string. This explains the slight
+     * difference to RFC 3986 Section 5.3.
+     *
+     * Another adjustment is that the authority separator is added even when the authority is missing/empty
+     * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
+     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
+     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
+     * that format).
+     *
+     * @param string $scheme
+     * @param string $authority
+     * @param string $path
+     * @param string $query
+     * @param string $fragment
+     *
+     * @return string
+     *
+     * @link https://tools.ietf.org/html/rfc3986#section-5.3
+     */
+    public static function composeComponents($scheme, $authority, $path, $query, $fragment)
+    {
+        $uri = '';
+
+        // weak type checks to also accept null until we can add scalar type hints
+        if ($scheme != '') {
+            $uri .= $scheme . ':';
+        }
+
+        if ($authority != ''|| $scheme === 'file') {
+            $uri .= '//' . $authority;
+        }
+
+        $uri .= $path;
+
+        if ($query != '') {
+            $uri .= '?' . $query;
+        }
+
+        if ($fragment != '') {
+            $uri .= '#' . $fragment;
+        }
+
+        return $uri;
+    }
+
+    /**
+     * Whether the URI has the default port of the current scheme.
+     *
+     * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
+     * independently of the implementation.
+     *
+     * @param UriInterface $uri
+     *
+     * @return bool
+     */
+    public static function isDefaultPort(UriInterface $uri)
+    {
+        return $uri->getPort() === null
+            || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]);
+    }
+
+    /**
+     * Whether the URI is absolute, i.e. it has a scheme.
+     *
+     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
+     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
+     * to another URI, the base URI. Relative references can be divided into several forms:
+     * - network-path references, e.g. '//example.com/path'
+     * - absolute-path references, e.g. '/path'
+     * - relative-path references, e.g. 'subpath'
+     *
+     * @param UriInterface $uri
+     *
+     * @return bool
+     * @see Uri::isNetworkPathReference
+     * @see Uri::isAbsolutePathReference
+     * @see Uri::isRelativePathReference
+     * @link https://tools.ietf.org/html/rfc3986#section-4
+     */
+    public static function isAbsolute(UriInterface $uri)
+    {
+        return $uri->getScheme() !== '';
+    }
+
+    /**
+     * Whether the URI is a network-path reference.
+     *
+     * A relative reference that begins with two slash characters is termed an network-path reference.
+     *
+     * @param UriInterface $uri
+     *
+     * @return bool
+     * @link https://tools.ietf.org/html/rfc3986#section-4.2
+     */
+    public static function isNetworkPathReference(UriInterface $uri)
+    {
+        return $uri->getScheme() === '' && $uri->getAuthority() !== '';
+    }
+
+    /**
+     * Whether the URI is a absolute-path reference.
+     *
+     * A relative reference that begins with a single slash character is termed an absolute-path reference.
+     *
+     * @param UriInterface $uri
+     *
+     * @return bool
+     * @link https://tools.ietf.org/html/rfc3986#section-4.2
+     */
+    public static function isAbsolutePathReference(UriInterface $uri)
+    {
+        return $uri->getScheme() === ''
+            && $uri->getAuthority() === ''
+            && isset($uri->getPath()[0])
+            && $uri->getPath()[0] === '/';
+    }
+
+    /**
+     * Whether the URI is a relative-path reference.
+     *
+     * A relative reference that does not begin with a slash character is termed a relative-path reference.
+     *
+     * @param UriInterface $uri
+     *
+     * @return bool
+     * @link https://tools.ietf.org/html/rfc3986#section-4.2
+     */
+    public static function isRelativePathReference(UriInterface $uri)
+    {
+        return $uri->getScheme() === ''
+            && $uri->getAuthority() === ''
+            && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
+    }
+
+    /**
+     * Whether the URI is a same-document reference.
+     *
+     * A same-document reference refers to a URI that is, aside from its fragment
+     * component, identical to the base URI. When no base URI is given, only an empty
+     * URI reference (apart from its fragment) is considered a same-document reference.
+     *
+     * @param UriInterface      $uri  The URI to check
+     * @param UriInterface|null $base An optional base URI to compare against
+     *
+     * @return bool
+     * @link https://tools.ietf.org/html/rfc3986#section-4.4
+     */
+    public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null)
+    {
+        if ($base !== null) {
+            $uri = UriResolver::resolve($base, $uri);
+
+            return ($uri->getScheme() === $base->getScheme())
+                && ($uri->getAuthority() === $base->getAuthority())
+                && ($uri->getPath() === $base->getPath())
+                && ($uri->getQuery() === $base->getQuery());
+        }
+
+        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
+    }
+
+    /**
+     * Removes dot segments from a path and returns the new path.
+     *
+     * @param string $path
+     *
+     * @return string
+     *
+     * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead.
+     * @see UriResolver::removeDotSegments
+     */
+    public static function removeDotSegments($path)
+    {
+        return UriResolver::removeDotSegments($path);
+    }
+
+    /**
+     * Converts the relative URI into a new URI that is resolved against the base URI.
+     *
+     * @param UriInterface        $base Base URI
+     * @param string|UriInterface $rel  Relative URI
+     *
+     * @return UriInterface
+     *
+     * @deprecated since version 1.4. Use UriResolver::resolve instead.
+     * @see UriResolver::resolve
+     */
+    public static function resolve(UriInterface $base, $rel)
+    {
+        if (!($rel instanceof UriInterface)) {
+            $rel = new self($rel);
+        }
+
+        return UriResolver::resolve($base, $rel);
+    }
+
+    /**
+     * Creates a new URI with a specific query string value removed.
+     *
+     * Any existing query string values that exactly match the provided key are
+     * removed.
+     *
+     * @param UriInterface $uri URI to use as a base.
+     * @param string       $key Query string key to remove.
+     *
+     * @return UriInterface
+     */
+    public static function withoutQueryValue(UriInterface $uri, $key)
+    {
+        $current = $uri->getQuery();
+        if ($current === '') {
+            return $uri;
+        }
+
+        $decodedKey = rawurldecode($key);
+        $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
+            return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
+        });
+
+        return $uri->withQuery(implode('&', $result));
+    }
+
+    /**
+     * Creates a new URI with a specific query string value.
+     *
+     * Any existing query string values that exactly match the provided key are
+     * removed and replaced with the given key value pair.
+     *
+     * A value of null will set the query string key without a value, e.g. "key"
+     * instead of "key=value".
+     *
+     * @param UriInterface $uri   URI to use as a base.
+     * @param string       $key   Key to set.
+     * @param string|null  $value Value to set
+     *
+     * @return UriInterface
+     */
+    public static function withQueryValue(UriInterface $uri, $key, $value)
+    {
+        $current = $uri->getQuery();
+
+        if ($current === '') {
+            $result = [];
+        } else {
+            $decodedKey = rawurldecode($key);
+            $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
+                return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
+            });
+        }
+
+        // Query string separators ("=", "&") within the key or value need to be encoded
+        // (while preventing double-encoding) before setting the query string. All other
+        // chars that need percent-encoding will be encoded by withQuery().
+        $key = strtr($key, self::$replaceQuery);
+
+        if ($value !== null) {
+            $result[] = $key . '=' . strtr($value, self::$replaceQuery);
+        } else {
+            $result[] = $key;
+        }
+
+        return $uri->withQuery(implode('&', $result));
+    }
+
+    /**
+     * Creates a URI from a hash of `parse_url` components.
+     *
+     * @param array $parts
+     *
+     * @return UriInterface
+     * @link http://php.net/manual/en/function.parse-url.php
+     *
+     * @throws \InvalidArgumentException If the components do not form a valid URI.
+     */
+    public static function fromParts(array $parts)
+    {
+        $uri = new self();
+        $uri->applyParts($parts);
+        $uri->validateState();
+
+        return $uri;
+    }
+
+    public function getScheme()
+    {
+        return $this->scheme;
+    }
+
+    public function getAuthority()
+    {
+        $authority = $this->host;
+        if ($this->userInfo !== '') {
+            $authority = $this->userInfo . '@' . $authority;
+        }
+
+        if ($this->port !== null) {
+            $authority .= ':' . $this->port;
+        }
+
+        return $authority;
+    }
+
+    public function getUserInfo()
+    {
+        return $this->userInfo;
+    }
+
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    public function getPort()
+    {
+        return $this->port;
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    public function getQuery()
+    {
+        return $this->query;
+    }
+
+    public function getFragment()
+    {
+        return $this->fragment;
+    }
+
+    public function withScheme($scheme)
+    {
+        $scheme = $this->filterScheme($scheme);
+
+        if ($this->scheme === $scheme) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->scheme = $scheme;
+        $new->removeDefaultPort();
+        $new->validateState();
+
+        return $new;
+    }
+
+    public function withUserInfo($user, $password = null)
+    {
+        $info = $user;
+        if ($password != '') {
+            $info .= ':' . $password;
+        }
+
+        if ($this->userInfo === $info) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->userInfo = $info;
+        $new->validateState();
+
+        return $new;
+    }
+
+    public function withHost($host)
+    {
+        $host = $this->filterHost($host);
+
+        if ($this->host === $host) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->host = $host;
+        $new->validateState();
+
+        return $new;
+    }
+
+    public function withPort($port)
+    {
+        $port = $this->filterPort($port);
+
+        if ($this->port === $port) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->port = $port;
+        $new->removeDefaultPort();
+        $new->validateState();
+
+        return $new;
+    }
+
+    public function withPath($path)
+    {
+        $path = $this->filterPath($path);
+
+        if ($this->path === $path) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->path = $path;
+        $new->validateState();
+
+        return $new;
+    }
+
+    public function withQuery($query)
+    {
+        $query = $this->filterQueryAndFragment($query);
+
+        if ($this->query === $query) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->query = $query;
+
+        return $new;
+    }
+
+    public function withFragment($fragment)
+    {
+        $fragment = $this->filterQueryAndFragment($fragment);
+
+        if ($this->fragment === $fragment) {
+            return $this;
+        }
+
+        $new = clone $this;
+        $new->fragment = $fragment;
+
+        return $new;
+    }
+
+    /**
+     * Apply parse_url parts to a URI.
+     *
+     * @param array $parts Array of parse_url parts to apply.
+     */
+    private function applyParts(array $parts)
+    {
+        $this->scheme = isset($parts['scheme'])
+            ? $this->filterScheme($parts['scheme'])
+            : '';
+        $this->userInfo = isset($parts['user']) ? $parts['user'] : '';
+        $this->host = isset($parts['host'])
+            ? $this->filterHost($parts['host'])
+            : '';
+        $this->port = isset($parts['port'])
+            ? $this->filterPort($parts['port'])
+            : null;
+        $this->path = isset($parts['path'])
+            ? $this->filterPath($parts['path'])
+            : '';
+        $this->query = isset($parts['query'])
+            ? $this->filterQueryAndFragment($parts['query'])
+            : '';
+        $this->fragment = isset($parts['fragment'])
+            ? $this->filterQueryAndFragment($parts['fragment'])
+            : '';
+        if (isset($parts['pass'])) {
+            $this->userInfo .= ':' . $parts['pass'];
+        }
+
+        $this->removeDefaultPort();
+    }
+
+    /**
+     * @param string $scheme
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException If the scheme is invalid.
+     */
+    private function filterScheme($scheme)
+    {
+        if (!is_string($scheme)) {
+            throw new \InvalidArgumentException('Scheme must be a string');
+        }
+
+        return strtolower($scheme);
+    }
+
+    /**
+     * @param string $host
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException If the host is invalid.
+     */
+    private function filterHost($host)
+    {
+        if (!is_string($host)) {
+            throw new \InvalidArgumentException('Host must be a string');
+        }
+
+        return strtolower($host);
+    }
+
+    /**
+     * @param int|null $port
+     *
+     * @return int|null
+     *
+     * @throws \InvalidArgumentException If the port is invalid.
+     */
+    private function filterPort($port)
+    {
+        if ($port === null) {
+            return null;
+        }
+
+        $port = (int) $port;
+        if (1 > $port || 0xffff < $port) {
+            throw new \InvalidArgumentException(
+                sprintf('Invalid port: %d. Must be between 1 and 65535', $port)
+            );
+        }
+
+        return $port;
+    }
+
+    private function removeDefaultPort()
+    {
+        if ($this->port !== null && self::isDefaultPort($this)) {
+            $this->port = null;
+        }
+    }
+
+    /**
+     * Filters the path of a URI
+     *
+     * @param string $path
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException If the path is invalid.
+     */
+    private function filterPath($path)
+    {
+        if (!is_string($path)) {
+            throw new \InvalidArgumentException('Path must be a string');
+        }
+
+        return preg_replace_callback(
+            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
+            [$this, 'rawurlencodeMatchZero'],
+            $path
+        );
+    }
+
+    /**
+     * Filters the query string or fragment of a URI.
+     *
+     * @param string $str
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException If the query or fragment is invalid.
+     */
+    private function filterQueryAndFragment($str)
+    {
+        if (!is_string($str)) {
+            throw new \InvalidArgumentException('Query and fragment must be a string');
+        }
+
+        return preg_replace_callback(
+            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
+            [$this, 'rawurlencodeMatchZero'],
+            $str
+        );
+    }
+
+    private function rawurlencodeMatchZero(array $match)
+    {
+        return rawurlencode($match[0]);
+    }
+
+    private function validateState()
+    {
+        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
+            $this->host = self::HTTP_DEFAULT_HOST;
+        }
+
+        if ($this->getAuthority() === '') {
+            if (0 === strpos($this->path, '//')) {
+                throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"');
+            }
+            if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
+                throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon');
+            }
+        } elseif (isset($this->path[0]) && $this->path[0] !== '/') {
+            @trigger_error(
+                'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' .
+                'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.',
+                E_USER_DEPRECATED
+            );
+            $this->path = '/'. $this->path;
+            //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty');
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriNormalizer.php
new file mode 100644
index 000000000..384c29e50
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriNormalizer.php
@@ -0,0 +1,216 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Provides methods to normalize and compare URIs.
+ *
+ * @author Tobias Schultze
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-6
+ */
+final class UriNormalizer
+{
+    /**
+     * Default normalizations which only include the ones that preserve semantics.
+     *
+     * self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH |
+     * self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS
+     */
+    const PRESERVING_NORMALIZATIONS = 63;
+
+    /**
+     * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
+     *
+     * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b
+     */
+    const CAPITALIZE_PERCENT_ENCODING = 1;
+
+    /**
+     * Decodes percent-encoded octets of unreserved characters.
+     *
+     * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),
+     * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,
+     * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.
+     *
+     * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/
+     */
+    const DECODE_UNRESERVED_CHARACTERS = 2;
+
+    /**
+     * Converts the empty path to "/" for http and https URIs.
+     *
+     * Example: http://example.org → http://example.org/
+     */
+    const CONVERT_EMPTY_PATH = 4;
+
+    /**
+     * Removes the default host of the given URI scheme from the URI.
+     *
+     * Only the "file" scheme defines the default host "localhost".
+     * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`
+     * are equivalent according to RFC 3986. The first format is not accepted
+     * by PHPs stream functions and thus already normalized implicitly to the
+     * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`.
+     *
+     * Example: file://localhost/myfile → file:///myfile
+     */
+    const REMOVE_DEFAULT_HOST = 8;
+
+    /**
+     * Removes the default port of the given URI scheme from the URI.
+     *
+     * Example: http://example.org:80/ → http://example.org/
+     */
+    const REMOVE_DEFAULT_PORT = 16;
+
+    /**
+     * Removes unnecessary dot-segments.
+     *
+     * Dot-segments in relative-path references are not removed as it would
+     * change the semantics of the URI reference.
+     *
+     * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html
+     */
+    const REMOVE_DOT_SEGMENTS = 32;
+
+    /**
+     * Paths which include two or more adjacent slashes are converted to one.
+     *
+     * Webservers usually ignore duplicate slashes and treat those URIs equivalent.
+     * But in theory those URIs do not need to be equivalent. So this normalization
+     * may change the semantics. Encoded slashes (%2F) are not removed.
+     *
+     * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html
+     */
+    const REMOVE_DUPLICATE_SLASHES = 64;
+
+    /**
+     * Sort query parameters with their values in alphabetical order.
+     *
+     * However, the order of parameters in a URI may be significant (this is not defined by the standard).
+     * So this normalization is not safe and may change the semantics of the URI.
+     *
+     * Example: ?lang=en&article=fred → ?article=fred&lang=en
+     *
+     * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the
+     * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.
+     */
+    const SORT_QUERY_PARAMETERS = 128;
+
+    /**
+     * Returns a normalized URI.
+     *
+     * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
+     * This methods adds additional normalizations that can be configured with the $flags parameter.
+     *
+     * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as
+     * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are
+     * treated equivalent which is not necessarily true according to RFC 3986. But that difference
+     * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.
+     *
+     * @param UriInterface $uri   The URI to normalize
+     * @param int          $flags A bitmask of normalizations to apply, see constants
+     *
+     * @return UriInterface The normalized URI
+     * @link https://tools.ietf.org/html/rfc3986#section-6.2
+     */
+    public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS)
+    {
+        if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {
+            $uri = self::capitalizePercentEncoding($uri);
+        }
+
+        if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {
+            $uri = self::decodeUnreservedCharacters($uri);
+        }
+
+        if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' &&
+            ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')
+        ) {
+            $uri = $uri->withPath('/');
+        }
+
+        if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
+            $uri = $uri->withHost('');
+        }
+
+        if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {
+            $uri = $uri->withPort(null);
+        }
+
+        if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {
+            $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));
+        }
+
+        if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
+            $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));
+        }
+
+        if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {
+            $queryKeyValues = explode('&', $uri->getQuery());
+            sort($queryKeyValues);
+            $uri = $uri->withQuery(implode('&', $queryKeyValues));
+        }
+
+        return $uri;
+    }
+
+    /**
+     * Whether two URIs can be considered equivalent.
+     *
+     * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also
+     * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be
+     * resolved against the same base URI. If this is not the case, determination of equivalence or difference of
+     * relative references does not mean anything.
+     *
+     * @param UriInterface $uri1           An URI to compare
+     * @param UriInterface $uri2           An URI to compare
+     * @param int          $normalizations A bitmask of normalizations to apply, see constants
+     *
+     * @return bool
+     * @link https://tools.ietf.org/html/rfc3986#section-6.1
+     */
+    public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS)
+    {
+        return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);
+    }
+
+    private static function capitalizePercentEncoding(UriInterface $uri)
+    {
+        $regex = '/(?:%[A-Fa-f0-9]{2})++/';
+
+        $callback = function (array $match) {
+            return strtoupper($match[0]);
+        };
+
+        return
+            $uri->withPath(
+                preg_replace_callback($regex, $callback, $uri->getPath())
+            )->withQuery(
+                preg_replace_callback($regex, $callback, $uri->getQuery())
+            );
+    }
+
+    private static function decodeUnreservedCharacters(UriInterface $uri)
+    {
+        $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';
+
+        $callback = function (array $match) {
+            return rawurldecode($match[0]);
+        };
+
+        return
+            $uri->withPath(
+                preg_replace_callback($regex, $callback, $uri->getPath())
+            )->withQuery(
+                preg_replace_callback($regex, $callback, $uri->getQuery())
+            );
+    }
+
+    private function __construct()
+    {
+        // cannot be instantiated
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriResolver.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriResolver.php
new file mode 100644
index 000000000..c1cb8a275
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/UriResolver.php
@@ -0,0 +1,219 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Resolves a URI reference in the context of a base URI and the opposite way.
+ *
+ * @author Tobias Schultze
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5
+ */
+final class UriResolver
+{
+    /**
+     * Removes dot segments from a path and returns the new path.
+     *
+     * @param string $path
+     *
+     * @return string
+     * @link http://tools.ietf.org/html/rfc3986#section-5.2.4
+     */
+    public static function removeDotSegments($path)
+    {
+        if ($path === '' || $path === '/') {
+            return $path;
+        }
+
+        $results = [];
+        $segments = explode('/', $path);
+        foreach ($segments as $segment) {
+            if ($segment === '..') {
+                array_pop($results);
+            } elseif ($segment !== '.') {
+                $results[] = $segment;
+            }
+        }
+
+        $newPath = implode('/', $results);
+
+        if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {
+            // Re-add the leading slash if necessary for cases like "/.."
+            $newPath = '/' . $newPath;
+        } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {
+            // Add the trailing slash if necessary
+            // If newPath is not empty, then $segment must be set and is the last segment from the foreach
+            $newPath .= '/';
+        }
+
+        return $newPath;
+    }
+
+    /**
+     * Converts the relative URI into a new URI that is resolved against the base URI.
+     *
+     * @param UriInterface $base Base URI
+     * @param UriInterface $rel  Relative URI
+     *
+     * @return UriInterface
+     * @link http://tools.ietf.org/html/rfc3986#section-5.2
+     */
+    public static function resolve(UriInterface $base, UriInterface $rel)
+    {
+        if ((string) $rel === '') {
+            // we can simply return the same base URI instance for this same-document reference
+            return $base;
+        }
+
+        if ($rel->getScheme() != '') {
+            return $rel->withPath(self::removeDotSegments($rel->getPath()));
+        }
+
+        if ($rel->getAuthority() != '') {
+            $targetAuthority = $rel->getAuthority();
+            $targetPath = self::removeDotSegments($rel->getPath());
+            $targetQuery = $rel->getQuery();
+        } else {
+            $targetAuthority = $base->getAuthority();
+            if ($rel->getPath() === '') {
+                $targetPath = $base->getPath();
+                $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
+            } else {
+                if ($rel->getPath()[0] === '/') {
+                    $targetPath = $rel->getPath();
+                } else {
+                    if ($targetAuthority != '' && $base->getPath() === '') {
+                        $targetPath = '/' . $rel->getPath();
+                    } else {
+                        $lastSlashPos = strrpos($base->getPath(), '/');
+                        if ($lastSlashPos === false) {
+                            $targetPath = $rel->getPath();
+                        } else {
+                            $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
+                        }
+                    }
+                }
+                $targetPath = self::removeDotSegments($targetPath);
+                $targetQuery = $rel->getQuery();
+            }
+        }
+
+        return new Uri(Uri::composeComponents(
+            $base->getScheme(),
+            $targetAuthority,
+            $targetPath,
+            $targetQuery,
+            $rel->getFragment()
+        ));
+    }
+
+    /**
+     * Returns the target URI as a relative reference from the base URI.
+     *
+     * This method is the counterpart to resolve():
+     *
+     *    (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+     *
+     * One use-case is to use the current request URI as base URI and then generate relative links in your documents
+     * to reduce the document size or offer self-contained downloadable document archives.
+     *
+     *    $base = new Uri('http://example.com/a/b/');
+     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.
+     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.
+     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+     *    echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.
+     *
+     * This method also accepts a target that is already relative and will try to relativize it further. Only a
+     * relative-path reference will be returned as-is.
+     *
+     *    echo UriResolver::relativize($base, new Uri('/a/b/c'));  // prints 'c' as well
+     *
+     * @param UriInterface $base   Base URI
+     * @param UriInterface $target Target URI
+     *
+     * @return UriInterface The relative URI reference
+     */
+    public static function relativize(UriInterface $base, UriInterface $target)
+    {
+        if ($target->getScheme() !== '' &&
+            ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')
+        ) {
+            return $target;
+        }
+
+        if (Uri::isRelativePathReference($target)) {
+            // As the target is already highly relative we return it as-is. It would be possible to resolve
+            // the target with `$target = self::resolve($base, $target);` and then try make it more relative
+            // by removing a duplicate query. But let's not do that automatically.
+            return $target;
+        }
+
+        if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {
+            return $target->withScheme('');
+        }
+
+        // We must remove the path before removing the authority because if the path starts with two slashes, the URI
+        // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also
+        // invalid.
+        $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');
+
+        if ($base->getPath() !== $target->getPath()) {
+            return $emptyPathUri->withPath(self::getRelativePath($base, $target));
+        }
+
+        if ($base->getQuery() === $target->getQuery()) {
+            // Only the target fragment is left. And it must be returned even if base and target fragment are the same.
+            return $emptyPathUri->withQuery('');
+        }
+
+        // If the base URI has a query but the target has none, we cannot return an empty path reference as it would
+        // inherit the base query component when resolving.
+        if ($target->getQuery() === '') {
+            $segments = explode('/', $target->getPath());
+            $lastSegment = end($segments);
+
+            return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);
+        }
+
+        return $emptyPathUri;
+    }
+
+    private static function getRelativePath(UriInterface $base, UriInterface $target)
+    {
+        $sourceSegments = explode('/', $base->getPath());
+        $targetSegments = explode('/', $target->getPath());
+        array_pop($sourceSegments);
+        $targetLastSegment = array_pop($targetSegments);
+        foreach ($sourceSegments as $i => $segment) {
+            if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {
+                unset($sourceSegments[$i], $targetSegments[$i]);
+            } else {
+                break;
+            }
+        }
+        $targetSegments[] = $targetLastSegment;
+        $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);
+
+        // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./".
+        // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
+        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.
+        if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {
+            $relativePath = "./$relativePath";
+        } elseif ('/' === $relativePath[0]) {
+            if ($base->getAuthority() != '' && $base->getPath() === '') {
+                // In this case an extra slash is added by resolve() automatically. So we must not add one here.
+                $relativePath = ".$relativePath";
+            } else {
+                $relativePath = "./$relativePath";
+            }
+        }
+
+        return $relativePath;
+    }
+
+    private function __construct()
+    {
+        // cannot be instantiated
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions.php
new file mode 100644
index 000000000..e40348d6a
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions.php
@@ -0,0 +1,828 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\MessageInterface;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Returns the string representation of an HTTP message.
+ *
+ * @param MessageInterface $message Message to convert to a string.
+ *
+ * @return string
+ */
+function str(MessageInterface $message)
+{
+    if ($message instanceof RequestInterface) {
+        $msg = trim($message->getMethod() . ' '
+                . $message->getRequestTarget())
+            . ' HTTP/' . $message->getProtocolVersion();
+        if (!$message->hasHeader('host')) {
+            $msg .= "\r\nHost: " . $message->getUri()->getHost();
+        }
+    } elseif ($message instanceof ResponseInterface) {
+        $msg = 'HTTP/' . $message->getProtocolVersion() . ' '
+            . $message->getStatusCode() . ' '
+            . $message->getReasonPhrase();
+    } else {
+        throw new \InvalidArgumentException('Unknown message type');
+    }
+
+    foreach ($message->getHeaders() as $name => $values) {
+        $msg .= "\r\n{$name}: " . implode(', ', $values);
+    }
+
+    return "{$msg}\r\n\r\n" . $message->getBody();
+}
+
+/**
+ * Returns a UriInterface for the given value.
+ *
+ * This function accepts a string or {@see Psr\Http\Message\UriInterface} and
+ * returns a UriInterface for the given value. If the value is already a
+ * `UriInterface`, it is returned as-is.
+ *
+ * @param string|UriInterface $uri
+ *
+ * @return UriInterface
+ * @throws \InvalidArgumentException
+ */
+function uri_for($uri)
+{
+    if ($uri instanceof UriInterface) {
+        return $uri;
+    } elseif (is_string($uri)) {
+        return new Uri($uri);
+    }
+
+    throw new \InvalidArgumentException('URI must be a string or UriInterface');
+}
+
+/**
+ * Create a new stream based on the input type.
+ *
+ * Options is an associative array that can contain the following keys:
+ * - metadata: Array of custom metadata.
+ * - size: Size of the stream.
+ *
+ * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data
+ * @param array                                                        $options  Additional options
+ *
+ * @return Stream
+ * @throws \InvalidArgumentException if the $resource arg is not valid.
+ */
+function stream_for($resource = '', array $options = [])
+{
+    if (is_scalar($resource)) {
+        $stream = fopen('php://temp', 'r+');
+        if ($resource !== '') {
+            fwrite($stream, $resource);
+            fseek($stream, 0);
+        }
+        return new Stream($stream, $options);
+    }
+
+    switch (gettype($resource)) {
+        case 'resource':
+            return new Stream($resource, $options);
+        case 'object':
+            if ($resource instanceof StreamInterface) {
+                return $resource;
+            } elseif ($resource instanceof \Iterator) {
+                return new PumpStream(function () use ($resource) {
+                    if (!$resource->valid()) {
+                        return false;
+                    }
+                    $result = $resource->current();
+                    $resource->next();
+                    return $result;
+                }, $options);
+            } elseif (method_exists($resource, '__toString')) {
+                return stream_for((string) $resource, $options);
+            }
+            break;
+        case 'NULL':
+            return new Stream(fopen('php://temp', 'r+'), $options);
+    }
+
+    if (is_callable($resource)) {
+        return new PumpStream($resource, $options);
+    }
+
+    throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource));
+}
+
+/**
+ * Parse an array of header values containing ";" separated data into an
+ * array of associative arrays representing the header key value pair
+ * data of the header. When a parameter does not contain a value, but just
+ * contains a key, this function will inject a key with a '' string value.
+ *
+ * @param string|array $header Header to parse into components.
+ *
+ * @return array Returns the parsed header values.
+ */
+function parse_header($header)
+{
+    static $trimmed = "\"'  \n\t\r";
+    $params = $matches = [];
+
+    foreach (normalize_header($header) as $val) {
+        $part = [];
+        foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
+            if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
+                $m = $matches[0];
+                if (isset($m[1])) {
+                    $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
+                } else {
+                    $part[] = trim($m[0], $trimmed);
+                }
+            }
+        }
+        if ($part) {
+            $params[] = $part;
+        }
+    }
+
+    return $params;
+}
+
+/**
+ * Converts an array of header values that may contain comma separated
+ * headers into an array of headers with no comma separated values.
+ *
+ * @param string|array $header Header to normalize.
+ *
+ * @return array Returns the normalized header field values.
+ */
+function normalize_header($header)
+{
+    if (!is_array($header)) {
+        return array_map('trim', explode(',', $header));
+    }
+
+    $result = [];
+    foreach ($header as $value) {
+        foreach ((array) $value as $v) {
+            if (strpos($v, ',') === false) {
+                $result[] = $v;
+                continue;
+            }
+            foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) {
+                $result[] = trim($vv);
+            }
+        }
+    }
+
+    return $result;
+}
+
+/**
+ * Clone and modify a request with the given changes.
+ *
+ * The changes can be one of:
+ * - method: (string) Changes the HTTP method.
+ * - set_headers: (array) Sets the given headers.
+ * - remove_headers: (array) Remove the given headers.
+ * - body: (mixed) Sets the given body.
+ * - uri: (UriInterface) Set the URI.
+ * - query: (string) Set the query string value of the URI.
+ * - version: (string) Set the protocol version.
+ *
+ * @param RequestInterface $request Request to clone and modify.
+ * @param array            $changes Changes to apply.
+ *
+ * @return RequestInterface
+ */
+function modify_request(RequestInterface $request, array $changes)
+{
+    if (!$changes) {
+        return $request;
+    }
+
+    $headers = $request->getHeaders();
+
+    if (!isset($changes['uri'])) {
+        $uri = $request->getUri();
+    } else {
+        // Remove the host header if one is on the URI
+        if ($host = $changes['uri']->getHost()) {
+            $changes['set_headers']['Host'] = $host;
+
+            if ($port = $changes['uri']->getPort()) {
+                $standardPorts = ['http' => 80, 'https' => 443];
+                $scheme = $changes['uri']->getScheme();
+                if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {
+                    $changes['set_headers']['Host'] .= ':'.$port;
+                }
+            }
+        }
+        $uri = $changes['uri'];
+    }
+
+    if (!empty($changes['remove_headers'])) {
+        $headers = _caseless_remove($changes['remove_headers'], $headers);
+    }
+
+    if (!empty($changes['set_headers'])) {
+        $headers = _caseless_remove(array_keys($changes['set_headers']), $headers);
+        $headers = $changes['set_headers'] + $headers;
+    }
+
+    if (isset($changes['query'])) {
+        $uri = $uri->withQuery($changes['query']);
+    }
+
+    if ($request instanceof ServerRequestInterface) {
+        return new ServerRequest(
+            isset($changes['method']) ? $changes['method'] : $request->getMethod(),
+            $uri,
+            $headers,
+            isset($changes['body']) ? $changes['body'] : $request->getBody(),
+            isset($changes['version'])
+                ? $changes['version']
+                : $request->getProtocolVersion(),
+            $request->getServerParams()
+        );
+    }
+
+    return new Request(
+        isset($changes['method']) ? $changes['method'] : $request->getMethod(),
+        $uri,
+        $headers,
+        isset($changes['body']) ? $changes['body'] : $request->getBody(),
+        isset($changes['version'])
+            ? $changes['version']
+            : $request->getProtocolVersion()
+    );
+}
+
+/**
+ * Attempts to rewind a message body and throws an exception on failure.
+ *
+ * The body of the message will only be rewound if a call to `tell()` returns a
+ * value other than `0`.
+ *
+ * @param MessageInterface $message Message to rewind
+ *
+ * @throws \RuntimeException
+ */
+function rewind_body(MessageInterface $message)
+{
+    $body = $message->getBody();
+
+    if ($body->tell()) {
+        $body->rewind();
+    }
+}
+
+/**
+ * Safely opens a PHP stream resource using a filename.
+ *
+ * When fopen fails, PHP normally raises a warning. This function adds an
+ * error handler that checks for errors and throws an exception instead.
+ *
+ * @param string $filename File to open
+ * @param string $mode     Mode used to open the file
+ *
+ * @return resource
+ * @throws \RuntimeException if the file cannot be opened
+ */
+function try_fopen($filename, $mode)
+{
+    $ex = null;
+    set_error_handler(function () use ($filename, $mode, &$ex) {
+        $ex = new \RuntimeException(sprintf(
+            'Unable to open %s using mode %s: %s',
+            $filename,
+            $mode,
+            func_get_args()[1]
+        ));
+    });
+
+    $handle = fopen($filename, $mode);
+    restore_error_handler();
+
+    if ($ex) {
+        /** @var $ex \RuntimeException */
+        throw $ex;
+    }
+
+    return $handle;
+}
+
+/**
+ * Copy the contents of a stream into a string until the given number of
+ * bytes have been read.
+ *
+ * @param StreamInterface $stream Stream to read
+ * @param int             $maxLen Maximum number of bytes to read. Pass -1
+ *                                to read the entire stream.
+ * @return string
+ * @throws \RuntimeException on error.
+ */
+function copy_to_string(StreamInterface $stream, $maxLen = -1)
+{
+    $buffer = '';
+
+    if ($maxLen === -1) {
+        while (!$stream->eof()) {
+            $buf = $stream->read(1048576);
+            // Using a loose equality here to match on '' and false.
+            if ($buf == null) {
+                break;
+            }
+            $buffer .= $buf;
+        }
+        return $buffer;
+    }
+
+    $len = 0;
+    while (!$stream->eof() && $len < $maxLen) {
+        $buf = $stream->read($maxLen - $len);
+        // Using a loose equality here to match on '' and false.
+        if ($buf == null) {
+            break;
+        }
+        $buffer .= $buf;
+        $len = strlen($buffer);
+    }
+
+    return $buffer;
+}
+
+/**
+ * Copy the contents of a stream into another stream until the given number
+ * of bytes have been read.
+ *
+ * @param StreamInterface $source Stream to read from
+ * @param StreamInterface $dest   Stream to write to
+ * @param int             $maxLen Maximum number of bytes to read. Pass -1
+ *                                to read the entire stream.
+ *
+ * @throws \RuntimeException on error.
+ */
+function copy_to_stream(
+    StreamInterface $source,
+    StreamInterface $dest,
+    $maxLen = -1
+) {
+    $bufferSize = 8192;
+
+    if ($maxLen === -1) {
+        while (!$source->eof()) {
+            if (!$dest->write($source->read($bufferSize))) {
+                break;
+            }
+        }
+    } else {
+        $remaining = $maxLen;
+        while ($remaining > 0 && !$source->eof()) {
+            $buf = $source->read(min($bufferSize, $remaining));
+            $len = strlen($buf);
+            if (!$len) {
+                break;
+            }
+            $remaining -= $len;
+            $dest->write($buf);
+        }
+    }
+}
+
+/**
+ * Calculate a hash of a Stream
+ *
+ * @param StreamInterface $stream    Stream to calculate the hash for
+ * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)
+ * @param bool            $rawOutput Whether or not to use raw output
+ *
+ * @return string Returns the hash of the stream
+ * @throws \RuntimeException on error.
+ */
+function hash(
+    StreamInterface $stream,
+    $algo,
+    $rawOutput = false
+) {
+    $pos = $stream->tell();
+
+    if ($pos > 0) {
+        $stream->rewind();
+    }
+
+    $ctx = hash_init($algo);
+    while (!$stream->eof()) {
+        hash_update($ctx, $stream->read(1048576));
+    }
+
+    $out = hash_final($ctx, (bool) $rawOutput);
+    $stream->seek($pos);
+
+    return $out;
+}
+
+/**
+ * Read a line from the stream up to the maximum allowed buffer length
+ *
+ * @param StreamInterface $stream    Stream to read from
+ * @param int             $maxLength Maximum buffer length
+ *
+ * @return string|bool
+ */
+function readline(StreamInterface $stream, $maxLength = null)
+{
+    $buffer = '';
+    $size = 0;
+
+    while (!$stream->eof()) {
+        // Using a loose equality here to match on '' and false.
+        if (null == ($byte = $stream->read(1))) {
+            return $buffer;
+        }
+        $buffer .= $byte;
+        // Break when a new line is found or the max length - 1 is reached
+        if ($byte === "\n" || ++$size === $maxLength - 1) {
+            break;
+        }
+    }
+
+    return $buffer;
+}
+
+/**
+ * Parses a request message string into a request object.
+ *
+ * @param string $message Request message string.
+ *
+ * @return Request
+ */
+function parse_request($message)
+{
+    $data = _parse_message($message);
+    $matches = [];
+    if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) {
+        throw new \InvalidArgumentException('Invalid request string');
+    }
+    $parts = explode(' ', $data['start-line'], 3);
+    $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1';
+
+    $request = new Request(
+        $parts[0],
+        $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1],
+        $data['headers'],
+        $data['body'],
+        $version
+    );
+
+    return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);
+}
+
+/**
+ * Parses a response message string into a response object.
+ *
+ * @param string $message Response message string.
+ *
+ * @return Response
+ */
+function parse_response($message)
+{
+    $data = _parse_message($message);
+    // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space
+    // between status-code and reason-phrase is required. But browsers accept
+    // responses without space and reason as well.
+    if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
+        throw new \InvalidArgumentException('Invalid response string');
+    }
+    $parts = explode(' ', $data['start-line'], 3);
+
+    return new Response(
+        $parts[1],
+        $data['headers'],
+        $data['body'],
+        explode('/', $parts[0])[1],
+        isset($parts[2]) ? $parts[2] : null
+    );
+}
+
+/**
+ * Parse a query string into an associative array.
+ *
+ * If multiple values are found for the same key, the value of that key
+ * value pair will become an array. This function does not parse nested
+ * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
+ * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
+ *
+ * @param string      $str         Query string to parse
+ * @param bool|string $urlEncoding How the query string is encoded
+ *
+ * @return array
+ */
+function parse_query($str, $urlEncoding = true)
+{
+    $result = [];
+
+    if ($str === '') {
+        return $result;
+    }
+
+    if ($urlEncoding === true) {
+        $decoder = function ($value) {
+            return rawurldecode(str_replace('+', ' ', $value));
+        };
+    } elseif ($urlEncoding == PHP_QUERY_RFC3986) {
+        $decoder = 'rawurldecode';
+    } elseif ($urlEncoding == PHP_QUERY_RFC1738) {
+        $decoder = 'urldecode';
+    } else {
+        $decoder = function ($str) { return $str; };
+    }
+
+    foreach (explode('&', $str) as $kvp) {
+        $parts = explode('=', $kvp, 2);
+        $key = $decoder($parts[0]);
+        $value = isset($parts[1]) ? $decoder($parts[1]) : null;
+        if (!isset($result[$key])) {
+            $result[$key] = $value;
+        } else {
+            if (!is_array($result[$key])) {
+                $result[$key] = [$result[$key]];
+            }
+            $result[$key][] = $value;
+        }
+    }
+
+    return $result;
+}
+
+/**
+ * Build a query string from an array of key value pairs.
+ *
+ * This function can use the return value of parse_query() to build a query
+ * string. This function does not modify the provided keys when an array is
+ * encountered (like http_build_query would).
+ *
+ * @param array     $params   Query string parameters.
+ * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986
+ *                            to encode using RFC3986, or PHP_QUERY_RFC1738
+ *                            to encode using RFC1738.
+ * @return string
+ */
+function build_query(array $params, $encoding = PHP_QUERY_RFC3986)
+{
+    if (!$params) {
+        return '';
+    }
+
+    if ($encoding === false) {
+        $encoder = function ($str) { return $str; };
+    } elseif ($encoding === PHP_QUERY_RFC3986) {
+        $encoder = 'rawurlencode';
+    } elseif ($encoding === PHP_QUERY_RFC1738) {
+        $encoder = 'urlencode';
+    } else {
+        throw new \InvalidArgumentException('Invalid type');
+    }
+
+    $qs = '';
+    foreach ($params as $k => $v) {
+        $k = $encoder($k);
+        if (!is_array($v)) {
+            $qs .= $k;
+            if ($v !== null) {
+                $qs .= '=' . $encoder($v);
+            }
+            $qs .= '&';
+        } else {
+            foreach ($v as $vv) {
+                $qs .= $k;
+                if ($vv !== null) {
+                    $qs .= '=' . $encoder($vv);
+                }
+                $qs .= '&';
+            }
+        }
+    }
+
+    return $qs ? (string) substr($qs, 0, -1) : '';
+}
+
+/**
+ * Determines the mimetype of a file by looking at its extension.
+ *
+ * @param $filename
+ *
+ * @return null|string
+ */
+function mimetype_from_filename($filename)
+{
+    return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION));
+}
+
+/**
+ * Maps a file extensions to a mimetype.
+ *
+ * @param $extension string The file extension.
+ *
+ * @return string|null
+ * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types
+ */
+function mimetype_from_extension($extension)
+{
+    static $mimetypes = [
+        '7z' => 'application/x-7z-compressed',
+        'aac' => 'audio/x-aac',
+        'ai' => 'application/postscript',
+        'aif' => 'audio/x-aiff',
+        'asc' => 'text/plain',
+        'asf' => 'video/x-ms-asf',
+        'atom' => 'application/atom+xml',
+        'avi' => 'video/x-msvideo',
+        'bmp' => 'image/bmp',
+        'bz2' => 'application/x-bzip2',
+        'cer' => 'application/pkix-cert',
+        'crl' => 'application/pkix-crl',
+        'crt' => 'application/x-x509-ca-cert',
+        'css' => 'text/css',
+        'csv' => 'text/csv',
+        'cu' => 'application/cu-seeme',
+        'deb' => 'application/x-debian-package',
+        'doc' => 'application/msword',
+        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+        'dvi' => 'application/x-dvi',
+        'eot' => 'application/vnd.ms-fontobject',
+        'eps' => 'application/postscript',
+        'epub' => 'application/epub+zip',
+        'etx' => 'text/x-setext',
+        'flac' => 'audio/flac',
+        'flv' => 'video/x-flv',
+        'gif' => 'image/gif',
+        'gz' => 'application/gzip',
+        'htm' => 'text/html',
+        'html' => 'text/html',
+        'ico' => 'image/x-icon',
+        'ics' => 'text/calendar',
+        'ini' => 'text/plain',
+        'iso' => 'application/x-iso9660-image',
+        'jar' => 'application/java-archive',
+        'jpe' => 'image/jpeg',
+        'jpeg' => 'image/jpeg',
+        'jpg' => 'image/jpeg',
+        'js' => 'text/javascript',
+        'json' => 'application/json',
+        'latex' => 'application/x-latex',
+        'log' => 'text/plain',
+        'm4a' => 'audio/mp4',
+        'm4v' => 'video/mp4',
+        'mid' => 'audio/midi',
+        'midi' => 'audio/midi',
+        'mov' => 'video/quicktime',
+        'mp3' => 'audio/mpeg',
+        'mp4' => 'video/mp4',
+        'mp4a' => 'audio/mp4',
+        'mp4v' => 'video/mp4',
+        'mpe' => 'video/mpeg',
+        'mpeg' => 'video/mpeg',
+        'mpg' => 'video/mpeg',
+        'mpg4' => 'video/mp4',
+        'oga' => 'audio/ogg',
+        'ogg' => 'audio/ogg',
+        'ogv' => 'video/ogg',
+        'ogx' => 'application/ogg',
+        'pbm' => 'image/x-portable-bitmap',
+        'pdf' => 'application/pdf',
+        'pgm' => 'image/x-portable-graymap',
+        'png' => 'image/png',
+        'pnm' => 'image/x-portable-anymap',
+        'ppm' => 'image/x-portable-pixmap',
+        'ppt' => 'application/vnd.ms-powerpoint',
+        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+        'ps' => 'application/postscript',
+        'qt' => 'video/quicktime',
+        'rar' => 'application/x-rar-compressed',
+        'ras' => 'image/x-cmu-raster',
+        'rss' => 'application/rss+xml',
+        'rtf' => 'application/rtf',
+        'sgm' => 'text/sgml',
+        'sgml' => 'text/sgml',
+        'svg' => 'image/svg+xml',
+        'swf' => 'application/x-shockwave-flash',
+        'tar' => 'application/x-tar',
+        'tif' => 'image/tiff',
+        'tiff' => 'image/tiff',
+        'torrent' => 'application/x-bittorrent',
+        'ttf' => 'application/x-font-ttf',
+        'txt' => 'text/plain',
+        'wav' => 'audio/x-wav',
+        'webm' => 'video/webm',
+        'wma' => 'audio/x-ms-wma',
+        'wmv' => 'video/x-ms-wmv',
+        'woff' => 'application/x-font-woff',
+        'wsdl' => 'application/wsdl+xml',
+        'xbm' => 'image/x-xbitmap',
+        'xls' => 'application/vnd.ms-excel',
+        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+        'xml' => 'application/xml',
+        'xpm' => 'image/x-xpixmap',
+        'xwd' => 'image/x-xwindowdump',
+        'yaml' => 'text/yaml',
+        'yml' => 'text/yaml',
+        'zip' => 'application/zip',
+    ];
+
+    $extension = strtolower($extension);
+
+    return isset($mimetypes[$extension])
+        ? $mimetypes[$extension]
+        : null;
+}
+
+/**
+ * Parses an HTTP message into an associative array.
+ *
+ * The array contains the "start-line" key containing the start line of
+ * the message, "headers" key containing an associative array of header
+ * array values, and a "body" key containing the body of the message.
+ *
+ * @param string $message HTTP request or response to parse.
+ *
+ * @return array
+ * @internal
+ */
+function _parse_message($message)
+{
+    if (!$message) {
+        throw new \InvalidArgumentException('Invalid message');
+    }
+
+    // Iterate over each line in the message, accounting for line endings
+    $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);
+    $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => ''];
+    array_shift($lines);
+
+    for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {
+        $line = $lines[$i];
+        // If two line breaks were encountered, then this is the end of body
+        if (empty($line)) {
+            if ($i < $totalLines - 1) {
+                $result['body'] = implode('', array_slice($lines, $i + 2));
+            }
+            break;
+        }
+        if (strpos($line, ':')) {
+            $parts = explode(':', $line, 2);
+            $key = trim($parts[0]);
+            $value = isset($parts[1]) ? trim($parts[1]) : '';
+            $result['headers'][$key][] = $value;
+        }
+    }
+
+    return $result;
+}
+
+/**
+ * Constructs a URI for an HTTP request message.
+ *
+ * @param string $path    Path from the start-line
+ * @param array  $headers Array of headers (each value an array).
+ *
+ * @return string
+ * @internal
+ */
+function _parse_request_uri($path, array $headers)
+{
+    $hostKey = array_filter(array_keys($headers), function ($k) {
+        return strtolower($k) === 'host';
+    });
+
+    // If no host is found, then a full URI cannot be constructed.
+    if (!$hostKey) {
+        return $path;
+    }
+
+    $host = $headers[reset($hostKey)][0];
+    $scheme = substr($host, -4) === ':443' ? 'https' : 'http';
+
+    return $scheme . '://' . $host . '/' . ltrim($path, '/');
+}
+
+/** @internal */
+function _caseless_remove($keys, array $data)
+{
+    $result = [];
+
+    foreach ($keys as &$key) {
+        $key = strtolower($key);
+    }
+
+    foreach ($data as $k => $v) {
+        if (!in_array(strtolower($k), $keys)) {
+            $result[$k] = $v;
+        }
+    }
+
+    return $result;
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions_include.php b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions_include.php
new file mode 100644
index 000000000..96a4a83a0
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/guzzlehttp/psr7/src/functions_include.php
@@ -0,0 +1,6 @@
+<?php
+
+// Don't redefine the functions if included multiple times.
+if (!function_exists('GuzzleHttp\Psr7\str')) {
+    require __DIR__ . '/functions.php';
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/CHANGELOG.md b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/CHANGELOG.md
new file mode 100644
index 000000000..74b1ef923
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1 - 2016-08-06
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Updated all `@return self` annotation references in interfaces to use
+  `@return static`, which more closelly follows the semantics of the
+  specification.
+- Updated the `MessageInterface::getHeaders()` return annotation to use the
+  value `string[][]`, indicating the format is a nested array of strings.
+- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`
+  to point to the correct section of RFC 7230.
+- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation
+  to add the parameter name (`$uploadedFiles`).
+- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`
+  method to correctly reference the method parameter (it was referencing an
+  incorrect parameter name previously).
+
+## 1.0.0 - 2016-05-18
+
+Initial stable release; reflects accepted PSR-7 specification.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/LICENSE b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/LICENSE
new file mode 100644
index 000000000..c2d8e452d
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 PHP Framework Interoperability Group
+
+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.
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/README.md b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/README.md
new file mode 100644
index 000000000..28185338f
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/README.md
@@ -0,0 +1,13 @@
+PSR Http Message
+================
+
+This repository holds all interfaces/classes/traits related to
+[PSR-7](http://www.php-fig.org/psr/psr-7/).
+
+Note that this is not a HTTP message implementation of its own. It is merely an
+interface that describes a HTTP message. See the specification for more details.
+
+Usage
+-----
+
+We'll certainly need some stuff in here.
\ No newline at end of file
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/composer.json b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/composer.json
new file mode 100644
index 000000000..b0d2937a0
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/composer.json
@@ -0,0 +1,26 @@
+{
+    "name": "psr/http-message",
+    "description": "Common interface for HTTP messages",
+    "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"],
+    "homepage": "https://github.com/php-fig/http-message",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\Http\\Message\\": "src/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/MessageInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/MessageInterface.php
new file mode 100644
index 000000000..dd46e5ec8
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/MessageInterface.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * HTTP messages consist of requests from a client to a server and responses
+ * from a server to a client. This interface defines the methods common to
+ * each.
+ *
+ * Messages are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ *
+ * @link http://www.ietf.org/rfc/rfc7230.txt
+ * @link http://www.ietf.org/rfc/rfc7231.txt
+ */
+interface MessageInterface
+{
+    /**
+     * Retrieves the HTTP protocol version as a string.
+     *
+     * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0").
+     *
+     * @return string HTTP protocol version.
+     */
+    public function getProtocolVersion();
+
+    /**
+     * Return an instance with the specified HTTP protocol version.
+     *
+     * The version string MUST contain only the HTTP version number (e.g.,
+     * "1.1", "1.0").
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new protocol version.
+     *
+     * @param string $version HTTP protocol version
+     * @return static
+     */
+    public function withProtocolVersion($version);
+
+    /**
+     * Retrieves all message header values.
+     *
+     * The keys represent the header name as it will be sent over the wire, and
+     * each value is an array of strings associated with the header.
+     *
+     *     // Represent the headers as a string
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         echo $name . ": " . implode(", ", $values);
+     *     }
+     *
+     *     // Emit headers iteratively:
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         foreach ($values as $value) {
+     *             header(sprintf('%s: %s', $name, $value), false);
+     *         }
+     *     }
+     *
+     * While header names are not case-sensitive, getHeaders() will preserve the
+     * exact case in which headers were originally specified.
+     *
+     * @return string[][] Returns an associative array of the message's headers. Each
+     *     key MUST be a header name, and each value MUST be an array of strings
+     *     for that header.
+     */
+    public function getHeaders();
+
+    /**
+     * Checks if a header exists by the given case-insensitive name.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return bool Returns true if any header names match the given header
+     *     name using a case-insensitive string comparison. Returns false if
+     *     no matching header name is found in the message.
+     */
+    public function hasHeader($name);
+
+    /**
+     * Retrieves a message header value by the given case-insensitive name.
+     *
+     * This method returns an array of all the header values of the given
+     * case-insensitive header name.
+     *
+     * If the header does not appear in the message, this method MUST return an
+     * empty array.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string[] An array of string values as provided for the given
+     *    header. If the header does not appear in the message, this method MUST
+     *    return an empty array.
+     */
+    public function getHeader($name);
+
+    /**
+     * Retrieves a comma-separated string of the values for a single header.
+     *
+     * This method returns all of the header values of the given
+     * case-insensitive header name as a string concatenated together using
+     * a comma.
+     *
+     * NOTE: Not all header values may be appropriately represented using
+     * comma concatenation. For such headers, use getHeader() instead
+     * and supply your own delimiter when concatenating.
+     *
+     * If the header does not appear in the message, this method MUST return
+     * an empty string.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string A string of values as provided for the given header
+     *    concatenated together using a comma. If the header does not appear in
+     *    the message, this method MUST return an empty string.
+     */
+    public function getHeaderLine($name);
+
+    /**
+     * Return an instance with the provided value replacing the specified header.
+     *
+     * While header names are case-insensitive, the casing of the header will
+     * be preserved by this function, and returned from getHeaders().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new and/or updated header and value.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withHeader($name, $value);
+
+    /**
+     * Return an instance with the specified header appended with the given value.
+     *
+     * Existing values for the specified header will be maintained. The new
+     * value(s) will be appended to the existing list. If the header did not
+     * exist previously, it will be added.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new header and/or value.
+     *
+     * @param string $name Case-insensitive header field name to add.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withAddedHeader($name, $value);
+
+    /**
+     * Return an instance without the specified header.
+     *
+     * Header resolution MUST be done without case-sensitivity.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the named header.
+     *
+     * @param string $name Case-insensitive header field name to remove.
+     * @return static
+     */
+    public function withoutHeader($name);
+
+    /**
+     * Gets the body of the message.
+     *
+     * @return StreamInterface Returns the body as a stream.
+     */
+    public function getBody();
+
+    /**
+     * Return an instance with the specified message body.
+     *
+     * The body MUST be a StreamInterface object.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return a new instance that has the
+     * new body stream.
+     *
+     * @param StreamInterface $body Body.
+     * @return static
+     * @throws \InvalidArgumentException When the body is not valid.
+     */
+    public function withBody(StreamInterface $body);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/RequestInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/RequestInterface.php
new file mode 100644
index 000000000..a96d4fd63
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/RequestInterface.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, client-side request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * During construction, implementations MUST attempt to set the Host header from
+ * a provided URI if no Host header is provided.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface RequestInterface extends MessageInterface
+{
+    /**
+     * Retrieves the message's request target.
+     *
+     * Retrieves the message's request-target either as it will appear (for
+     * clients), as it appeared at request (for servers), or as it was
+     * specified for the instance (see withRequestTarget()).
+     *
+     * In most cases, this will be the origin-form of the composed URI,
+     * unless a value was provided to the concrete implementation (see
+     * withRequestTarget() below).
+     *
+     * If no URI is available, and no request-target has been specifically
+     * provided, this method MUST return the string "/".
+     *
+     * @return string
+     */
+    public function getRequestTarget();
+
+    /**
+     * Return an instance with the specific request-target.
+     *
+     * If the request needs a non-origin-form request-target — e.g., for
+     * specifying an absolute-form, authority-form, or asterisk-form —
+     * this method may be used to create an instance with the specified
+     * request-target, verbatim.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request target.
+     *
+     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various
+     *     request-target forms allowed in request messages)
+     * @param mixed $requestTarget
+     * @return static
+     */
+    public function withRequestTarget($requestTarget);
+
+    /**
+     * Retrieves the HTTP method of the request.
+     *
+     * @return string Returns the request method.
+     */
+    public function getMethod();
+
+    /**
+     * Return an instance with the provided HTTP method.
+     *
+     * While HTTP method names are typically all uppercase characters, HTTP
+     * method names are case-sensitive and thus implementations SHOULD NOT
+     * modify the given string.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request method.
+     *
+     * @param string $method Case-sensitive method.
+     * @return static
+     * @throws \InvalidArgumentException for invalid HTTP methods.
+     */
+    public function withMethod($method);
+
+    /**
+     * Retrieves the URI instance.
+     *
+     * This method MUST return a UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @return UriInterface Returns a UriInterface instance
+     *     representing the URI of the request.
+     */
+    public function getUri();
+
+    /**
+     * Returns an instance with the provided URI.
+     *
+     * This method MUST update the Host header of the returned request by
+     * default if the URI contains a host component. If the URI does not
+     * contain a host component, any pre-existing Host header MUST be carried
+     * over to the returned request.
+     *
+     * You can opt-in to preserving the original state of the Host header by
+     * setting `$preserveHost` to `true`. When `$preserveHost` is set to
+     * `true`, this method interacts with the Host header in the following ways:
+     *
+     * - If the Host header is missing or empty, and the new URI contains
+     *   a host component, this method MUST update the Host header in the returned
+     *   request.
+     * - If the Host header is missing or empty, and the new URI does not contain a
+     *   host component, this method MUST NOT update the Host header in the returned
+     *   request.
+     * - If a Host header is present and non-empty, this method MUST NOT update
+     *   the Host header in the returned request.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @param UriInterface $uri New request URI to use.
+     * @param bool $preserveHost Preserve the original state of the Host header.
+     * @return static
+     */
+    public function withUri(UriInterface $uri, $preserveHost = false);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ResponseInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ResponseInterface.php
new file mode 100644
index 000000000..c306514e6
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ResponseInterface.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, server-side response.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - Status code and reason phrase
+ * - Headers
+ * - Message body
+ *
+ * Responses are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ResponseInterface extends MessageInterface
+{
+    /**
+     * Gets the response status code.
+     *
+     * The status code is a 3-digit integer result code of the server's attempt
+     * to understand and satisfy the request.
+     *
+     * @return int Status code.
+     */
+    public function getStatusCode();
+
+    /**
+     * Return an instance with the specified status code and, optionally, reason phrase.
+     *
+     * If no reason phrase is specified, implementations MAY choose to default
+     * to the RFC 7231 or IANA recommended reason phrase for the response's
+     * status code.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated status and reason phrase.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @param int $code The 3-digit integer result code to set.
+     * @param string $reasonPhrase The reason phrase to use with the
+     *     provided status code; if none is provided, implementations MAY
+     *     use the defaults as suggested in the HTTP specification.
+     * @return static
+     * @throws \InvalidArgumentException For invalid status code arguments.
+     */
+    public function withStatus($code, $reasonPhrase = '');
+
+    /**
+     * Gets the response reason phrase associated with the status code.
+     *
+     * Because a reason phrase is not a required element in a response
+     * status line, the reason phrase value MAY be null. Implementations MAY
+     * choose to return the default RFC 7231 recommended reason phrase (or those
+     * listed in the IANA HTTP Status Code Registry) for the response's
+     * status code.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @return string Reason phrase; must return an empty string if none present.
+     */
+    public function getReasonPhrase();
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ServerRequestInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ServerRequestInterface.php
new file mode 100644
index 000000000..02512340a
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/ServerRequestInterface.php
@@ -0,0 +1,261 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an incoming, server-side HTTP request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * Additionally, it encapsulates all data as it has arrived to the
+ * application from the CGI and/or PHP environment, including:
+ *
+ * - The values represented in $_SERVER.
+ * - Any cookies provided (generally via $_COOKIE)
+ * - Query string arguments (generally via $_GET, or as parsed via parse_str())
+ * - Upload files, if any (as represented by $_FILES)
+ * - Deserialized body parameters (generally from $_POST)
+ *
+ * $_SERVER values MUST be treated as immutable, as they represent application
+ * state at the time of request; as such, no methods are provided to allow
+ * modification of those values. The other values provide such methods, as they
+ * can be restored from $_SERVER or the request body, and may need treatment
+ * during the application (e.g., body parameters may be deserialized based on
+ * content type).
+ *
+ * Additionally, this interface recognizes the utility of introspecting a
+ * request to derive and match additional parameters (e.g., via URI path
+ * matching, decrypting cookie values, deserializing non-form-encoded body
+ * content, matching authorization headers to users, etc). These parameters
+ * are stored in an "attributes" property.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ServerRequestInterface extends RequestInterface
+{
+    /**
+     * Retrieve server parameters.
+     *
+     * Retrieves data related to the incoming request environment,
+     * typically derived from PHP's $_SERVER superglobal. The data IS NOT
+     * REQUIRED to originate from $_SERVER.
+     *
+     * @return array
+     */
+    public function getServerParams();
+
+    /**
+     * Retrieve cookies.
+     *
+     * Retrieves cookies sent by the client to the server.
+     *
+     * The data MUST be compatible with the structure of the $_COOKIE
+     * superglobal.
+     *
+     * @return array
+     */
+    public function getCookieParams();
+
+    /**
+     * Return an instance with the specified cookies.
+     *
+     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
+     * be compatible with the structure of $_COOKIE. Typically, this data will
+     * be injected at instantiation.
+     *
+     * This method MUST NOT update the related Cookie header of the request
+     * instance, nor related values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated cookie values.
+     *
+     * @param array $cookies Array of key/value pairs representing cookies.
+     * @return static
+     */
+    public function withCookieParams(array $cookies);
+
+    /**
+     * Retrieve query string arguments.
+     *
+     * Retrieves the deserialized query string arguments, if any.
+     *
+     * Note: the query params might not be in sync with the URI or server
+     * params. If you need to ensure you are only getting the original
+     * values, you may need to parse the query string from `getUri()->getQuery()`
+     * or from the `QUERY_STRING` server param.
+     *
+     * @return array
+     */
+    public function getQueryParams();
+
+    /**
+     * Return an instance with the specified query string arguments.
+     *
+     * These values SHOULD remain immutable over the course of the incoming
+     * request. They MAY be injected during instantiation, such as from PHP's
+     * $_GET superglobal, or MAY be derived from some other value such as the
+     * URI. In cases where the arguments are parsed from the URI, the data
+     * MUST be compatible with what PHP's parse_str() would return for
+     * purposes of how duplicate query parameters are handled, and how nested
+     * sets are handled.
+     *
+     * Setting query string arguments MUST NOT change the URI stored by the
+     * request, nor the values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated query string arguments.
+     *
+     * @param array $query Array of query string arguments, typically from
+     *     $_GET.
+     * @return static
+     */
+    public function withQueryParams(array $query);
+
+    /**
+     * Retrieve normalized file upload data.
+     *
+     * This method returns upload metadata in a normalized tree, with each leaf
+     * an instance of Psr\Http\Message\UploadedFileInterface.
+     *
+     * These values MAY be prepared from $_FILES or the message body during
+     * instantiation, or MAY be injected via withUploadedFiles().
+     *
+     * @return array An array tree of UploadedFileInterface instances; an empty
+     *     array MUST be returned if no data is present.
+     */
+    public function getUploadedFiles();
+
+    /**
+     * Create a new instance with the specified uploaded files.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+     * @return static
+     * @throws \InvalidArgumentException if an invalid structure is provided.
+     */
+    public function withUploadedFiles(array $uploadedFiles);
+
+    /**
+     * Retrieve any parameters provided in the request body.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, this method MUST
+     * return the contents of $_POST.
+     *
+     * Otherwise, this method may return any results of deserializing
+     * the request body content; as parsing returns structured content, the
+     * potential types MUST be arrays or objects only. A null value indicates
+     * the absence of body content.
+     *
+     * @return null|array|object The deserialized body parameters, if any.
+     *     These will typically be an array or object.
+     */
+    public function getParsedBody();
+
+    /**
+     * Return an instance with the specified body parameters.
+     *
+     * These MAY be injected during instantiation.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, use this method
+     * ONLY to inject the contents of $_POST.
+     *
+     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+     * deserializing the request body content. Deserialization/parsing returns
+     * structured data, and, as such, this method ONLY accepts arrays or objects,
+     * or a null value if nothing was available to parse.
+     *
+     * As an example, if content negotiation determines that the request data
+     * is a JSON payload, this method could be used to create a request
+     * instance with the deserialized parameters.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param null|array|object $data The deserialized body data. This will
+     *     typically be in an array or object.
+     * @return static
+     * @throws \InvalidArgumentException if an unsupported argument type is
+     *     provided.
+     */
+    public function withParsedBody($data);
+
+    /**
+     * Retrieve attributes derived from the request.
+     *
+     * The request "attributes" may be used to allow injection of any
+     * parameters derived from the request: e.g., the results of path
+     * match operations; the results of decrypting cookies; the results of
+     * deserializing non-form-encoded message bodies; etc. Attributes
+     * will be application and request specific, and CAN be mutable.
+     *
+     * @return array Attributes derived from the request.
+     */
+    public function getAttributes();
+
+    /**
+     * Retrieve a single derived request attribute.
+     *
+     * Retrieves a single derived request attribute as described in
+     * getAttributes(). If the attribute has not been previously set, returns
+     * the default value as provided.
+     *
+     * This method obviates the need for a hasAttribute() method, as it allows
+     * specifying a default value to return if the attribute is not found.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $default Default value to return if the attribute does not exist.
+     * @return mixed
+     */
+    public function getAttribute($name, $default = null);
+
+    /**
+     * Return an instance with the specified derived request attribute.
+     *
+     * This method allows setting a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $value The value of the attribute.
+     * @return static
+     */
+    public function withAttribute($name, $value);
+
+    /**
+     * Return an instance that removes the specified derived request attribute.
+     *
+     * This method allows removing a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @return static
+     */
+    public function withoutAttribute($name);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/StreamInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/StreamInterface.php
new file mode 100644
index 000000000..f68f39126
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/StreamInterface.php
@@ -0,0 +1,158 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Describes a data stream.
+ *
+ * Typically, an instance will wrap a PHP stream; this interface provides
+ * a wrapper around the most common operations, including serialization of
+ * the entire stream to a string.
+ */
+interface StreamInterface
+{
+    /**
+     * Reads all data from the stream into a string, from the beginning to end.
+     *
+     * This method MUST attempt to seek to the beginning of the stream before
+     * reading data and read the stream until the end is reached.
+     *
+     * Warning: This could attempt to load a large amount of data into memory.
+     *
+     * This method MUST NOT raise an exception in order to conform with PHP's
+     * string casting operations.
+     *
+     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * Closes the stream and any underlying resources.
+     *
+     * @return void
+     */
+    public function close();
+
+    /**
+     * Separates any underlying resources from the stream.
+     *
+     * After the stream has been detached, the stream is in an unusable state.
+     *
+     * @return resource|null Underlying PHP stream, if any
+     */
+    public function detach();
+
+    /**
+     * Get the size of the stream if known.
+     *
+     * @return int|null Returns the size in bytes if known, or null if unknown.
+     */
+    public function getSize();
+
+    /**
+     * Returns the current position of the file read/write pointer
+     *
+     * @return int Position of the file pointer
+     * @throws \RuntimeException on error.
+     */
+    public function tell();
+
+    /**
+     * Returns true if the stream is at the end of the stream.
+     *
+     * @return bool
+     */
+    public function eof();
+
+    /**
+     * Returns whether or not the stream is seekable.
+     *
+     * @return bool
+     */
+    public function isSeekable();
+
+    /**
+     * Seek to a position in the stream.
+     *
+     * @link http://www.php.net/manual/en/function.fseek.php
+     * @param int $offset Stream offset
+     * @param int $whence Specifies how the cursor position will be calculated
+     *     based on the seek offset. Valid values are identical to the built-in
+     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to
+     *     offset bytes SEEK_CUR: Set position to current location plus offset
+     *     SEEK_END: Set position to end-of-stream plus offset.
+     * @throws \RuntimeException on failure.
+     */
+    public function seek($offset, $whence = SEEK_SET);
+
+    /**
+     * Seek to the beginning of the stream.
+     *
+     * If the stream is not seekable, this method will raise an exception;
+     * otherwise, it will perform a seek(0).
+     *
+     * @see seek()
+     * @link http://www.php.net/manual/en/function.fseek.php
+     * @throws \RuntimeException on failure.
+     */
+    public function rewind();
+
+    /**
+     * Returns whether or not the stream is writable.
+     *
+     * @return bool
+     */
+    public function isWritable();
+
+    /**
+     * Write data to the stream.
+     *
+     * @param string $string The string that is to be written.
+     * @return int Returns the number of bytes written to the stream.
+     * @throws \RuntimeException on failure.
+     */
+    public function write($string);
+
+    /**
+     * Returns whether or not the stream is readable.
+     *
+     * @return bool
+     */
+    public function isReadable();
+
+    /**
+     * Read data from the stream.
+     *
+     * @param int $length Read up to $length bytes from the object and return
+     *     them. Fewer than $length bytes may be returned if underlying stream
+     *     call returns fewer bytes.
+     * @return string Returns the data read from the stream, or an empty string
+     *     if no bytes are available.
+     * @throws \RuntimeException if an error occurs.
+     */
+    public function read($length);
+
+    /**
+     * Returns the remaining contents in a string
+     *
+     * @return string
+     * @throws \RuntimeException if unable to read or an error occurs while
+     *     reading.
+     */
+    public function getContents();
+
+    /**
+     * Get stream metadata as an associative array or retrieve a specific key.
+     *
+     * The keys returned are identical to the keys returned from PHP's
+     * stream_get_meta_data() function.
+     *
+     * @link http://php.net/manual/en/function.stream-get-meta-data.php
+     * @param string $key Specific metadata to retrieve.
+     * @return array|mixed|null Returns an associative array if no key is
+     *     provided. Returns a specific key value if a key is provided and the
+     *     value is found, or null if the key is not found.
+     */
+    public function getMetadata($key = null);
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UploadedFileInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UploadedFileInterface.php
new file mode 100644
index 000000000..f8a6901e0
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UploadedFileInterface.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a file uploaded through an HTTP request.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ */
+interface UploadedFileInterface
+{
+    /**
+     * Retrieve a stream representing the uploaded file.
+     *
+     * This method MUST return a StreamInterface instance, representing the
+     * uploaded file. The purpose of this method is to allow utilizing native PHP
+     * stream functionality to manipulate the file upload, such as
+     * stream_copy_to_stream() (though the result will need to be decorated in a
+     * native PHP stream wrapper to work with such functions).
+     *
+     * If the moveTo() method has been called previously, this method MUST raise
+     * an exception.
+     *
+     * @return StreamInterface Stream representation of the uploaded file.
+     * @throws \RuntimeException in cases when no stream is available or can be
+     *     created.
+     */
+    public function getStream();
+
+    /**
+     * Move the uploaded file to a new location.
+     *
+     * Use this method as an alternative to move_uploaded_file(). This method is
+     * guaranteed to work in both SAPI and non-SAPI environments.
+     * Implementations must determine which environment they are in, and use the
+     * appropriate method (move_uploaded_file(), rename(), or a stream
+     * operation) to perform the operation.
+     *
+     * $targetPath may be an absolute path, or a relative path. If it is a
+     * relative path, resolution should be the same as used by PHP's rename()
+     * function.
+     *
+     * The original file or stream MUST be removed on completion.
+     *
+     * If this method is called more than once, any subsequent calls MUST raise
+     * an exception.
+     *
+     * When used in an SAPI environment where $_FILES is populated, when writing
+     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
+     * used to ensure permissions and upload status are verified correctly.
+     *
+     * If you wish to move to a stream, use getStream(), as SAPI operations
+     * cannot guarantee writing to stream destinations.
+     *
+     * @see http://php.net/is_uploaded_file
+     * @see http://php.net/move_uploaded_file
+     * @param string $targetPath Path to which to move the uploaded file.
+     * @throws \InvalidArgumentException if the $targetPath specified is invalid.
+     * @throws \RuntimeException on any error during the move operation, or on
+     *     the second or subsequent call to the method.
+     */
+    public function moveTo($targetPath);
+    
+    /**
+     * Retrieve the file size.
+     *
+     * Implementations SHOULD return the value stored in the "size" key of
+     * the file in the $_FILES array if available, as PHP calculates this based
+     * on the actual size transmitted.
+     *
+     * @return int|null The file size in bytes or null if unknown.
+     */
+    public function getSize();
+    
+    /**
+     * Retrieve the error associated with the uploaded file.
+     *
+     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.
+     *
+     * If the file was uploaded successfully, this method MUST return
+     * UPLOAD_ERR_OK.
+     *
+     * Implementations SHOULD return the value stored in the "error" key of
+     * the file in the $_FILES array.
+     *
+     * @see http://php.net/manual/en/features.file-upload.errors.php
+     * @return int One of PHP's UPLOAD_ERR_XXX constants.
+     */
+    public function getError();
+    
+    /**
+     * Retrieve the filename sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious filename with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "name" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The filename sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientFilename();
+    
+    /**
+     * Retrieve the media type sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious media type with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "type" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The media type sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientMediaType();
+}
diff --git a/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UriInterface.php b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UriInterface.php
new file mode 100644
index 000000000..9d7ab9eae
--- /dev/null
+++ b/modules/LIMS/libraries/Guzzle/vendor/psr/http-message/src/UriInterface.php
@@ -0,0 +1,323 @@
+<?php
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a URI.
+ *
+ * This interface is meant to represent URIs according to RFC 3986 and to
+ * provide methods for most common operations. Additional functionality for
+ * working with URIs can be provided on top of the interface or externally.
+ * Its primary use is for HTTP requests, but may also be used in other
+ * contexts.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ *
+ * Typically the Host header will be also be present in the request message.
+ * For server-side requests, the scheme will typically be discoverable in the
+ * server parameters.
+ *
+ * @link http://tools.ietf.org/html/rfc3986 (the URI specification)
+ */
+interface UriInterface
+{
+    /**
+     * Retrieve the scheme component of the URI.
+     *
+     * If no scheme is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.1.
+     *
+     * The trailing ":" character is not part of the scheme and MUST NOT be
+     * added.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.1
+     * @return string The URI scheme.
+     */
+    public function getScheme();
+
+    /**
+     * Retrieve the authority component of the URI.
+     *
+     * If no authority information is present, this method MUST return an empty
+     * string.
+     *
+     * The authority syntax of the URI is:
+     *
+     * <pre>
+     * [user-info@]host[:port]
+     * </pre>
+     *
+     * If the port component is not set or is the standard port for the current
+     * scheme, it SHOULD NOT be included.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.2
+     * @return string The URI authority, in "[user-info@]host[:port]" format.
+     */
+    public function getAuthority();
+
+    /**
+     * Retrieve the user information component of the URI.
+     *
+     * If no user information is present, this method MUST return an empty
+     * string.
+     *
+     * If a user is present in the URI, this will return that value;
+     * additionally, if the password is also present, it will be appended to the
+     * user value, with a colon (":") separating the values.
+     *
+     * The trailing "@" character is not part of the user information and MUST
+     * NOT be added.
+     *
+     * @return string The URI user information, in "username[:password]" format.
+     */
+    public function getUserInfo();
+
+    /**
+     * Retrieve the host component of the URI.
+     *
+     * If no host is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.2.2.
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+     * @return string The URI host.
+     */
+    public function getHost();
+
+    /**
+     * Retrieve the port component of the URI.
+     *
+     * If a port is present, and it is non-standard for the current scheme,
+     * this method MUST return it as an integer. If the port is the standard port
+     * used with the current scheme, this method SHOULD return null.
+     *
+     * If no port is present, and no scheme is present, this method MUST return
+     * a null value.
+     *
+     * If no port is present, but a scheme is present, this method MAY return
+     * the standard port for that scheme, but SHOULD return null.
+     *
+     * @return null|int The URI port.
+     */
+    public function getPort();
+
+    /**
+     * Retrieve the path component of the URI.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * Normally, the empty path "" and absolute path "/" are considered equal as
+     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+     * do this normalization because in contexts with a trimmed base path, e.g.
+     * the front controller, this difference becomes significant. It's the task
+     * of the user to handle both "" and "/".
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.3.
+     *
+     * As an example, if the value should include a slash ("/") not intended as
+     * delimiter between path segments, that value MUST be passed in encoded
+     * form (e.g., "%2F") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.3
+     * @return string The URI path.
+     */
+    public function getPath();
+
+    /**
+     * Retrieve the query string of the URI.
+     *
+     * If no query string is present, this method MUST return an empty string.
+     *
+     * The leading "?" character is not part of the query and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.4.
+     *
+     * As an example, if a value in a key/value pair of the query string should
+     * include an ampersand ("&") not intended as a delimiter between values,
+     * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.4
+     * @return string The URI query string.
+     */
+    public function getQuery();
+
+    /**
+     * Retrieve the fragment component of the URI.
+     *
+     * If no fragment is present, this method MUST return an empty string.
+     *
+     * The leading "#" character is not part of the fragment and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.5.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.5
+     * @return string The URI fragment.
+     */
+    public function getFragment();
+
+    /**
+     * Return an instance with the specified scheme.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified scheme.
+     *
+     * Implementations MUST support the schemes "http" and "https" case
+     * insensitively, and MAY accommodate other schemes if required.
+     *
+     * An empty scheme is equivalent to removing the scheme.
+     *
+     * @param string $scheme The scheme to use with the new instance.
+     * @return static A new instance with the specified scheme.
+     * @throws \InvalidArgumentException for invalid or unsupported schemes.
+     */
+    public function withScheme($scheme);
+
+    /**
+     * Return an instance with the specified user information.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified user information.
+     *
+     * Password is optional, but the user information MUST include the
+     * user; an empty string for the user is equivalent to removing user
+     * information.
+     *
+     * @param string $user The user name to use for authority.
+     * @param null|string $password The password associated with $user.
+     * @return static A new instance with the specified user information.
+     */
+    public function withUserInfo($user, $password = null);
+
+    /**
+     * Return an instance with the specified host.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified host.
+     *
+     * An empty host value is equivalent to removing the host.
+     *
+     * @param string $host The hostname to use with the new instance.
+     * @return static A new instance with the specified host.
+     * @throws \InvalidArgumentException for invalid hostnames.
+     */
+    public function withHost($host);
+
+    /**
+     * Return an instance with the specified port.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified port.
+     *
+     * Implementations MUST raise an exception for ports outside the
+     * established TCP and UDP port ranges.
+     *
+     * A null value provided for the port is equivalent to removing the port
+     * information.
+     *
+     * @param null|int $port The port to use with the new instance; a null value
+     *     removes the port information.
+     * @return static A new instance with the specified port.
+     * @throws \InvalidArgumentException for invalid ports.
+     */
+    public function withPort($port);
+
+    /**
+     * Return an instance with the specified path.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified path.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * If the path is intended to be domain-relative rather than path relative then
+     * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+     * are assumed to be relative to some base path known to the application or
+     * consumer.
+     *
+     * Users can provide both encoded and decoded path characters.
+     * Implementations ensure the correct encoding as outlined in getPath().
+     *
+     * @param string $path The path to use with the new instance.
+     * @return static A new instance with the specified path.
+     * @throws \InvalidArgumentException for invalid paths.
+     */
+    public function withPath($path);
+
+    /**
+     * Return an instance with the specified query string.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified query string.
+     *
+     * Users can provide both encoded and decoded query characters.
+     * Implementations ensure the correct encoding as outlined in getQuery().
+     *
+     * An empty query string value is equivalent to removing the query string.
+     *
+     * @param string $query The query string to use with the new instance.
+     * @return static A new instance with the specified query string.
+     * @throws \InvalidArgumentException for invalid query strings.
+     */
+    public function withQuery($query);
+
+    /**
+     * Return an instance with the specified URI fragment.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified URI fragment.
+     *
+     * Users can provide both encoded and decoded fragment characters.
+     * Implementations ensure the correct encoding as outlined in getFragment().
+     *
+     * An empty fragment value is equivalent to removing the fragment.
+     *
+     * @param string $fragment The fragment to use with the new instance.
+     * @return static A new instance with the specified fragment.
+     */
+    public function withFragment($fragment);
+
+    /**
+     * Return the string representation as a URI reference.
+     *
+     * Depending on which components of the URI are present, the resulting
+     * string is either a full URI or relative reference according to RFC 3986,
+     * Section 4.1. The method concatenates the various components of the URI,
+     * using the appropriate delimiters:
+     *
+     * - If a scheme is present, it MUST be suffixed by ":".
+     * - If an authority is present, it MUST be prefixed by "//".
+     * - The path can be concatenated without delimiters. But there are two
+     *   cases where the path has to be adjusted to make the URI reference
+     *   valid as PHP does not allow to throw an exception in __toString():
+     *     - If the path is rootless and an authority is present, the path MUST
+     *       be prefixed by "/".
+     *     - If the path is starting with more than one "/" and no authority is
+     *       present, the starting slashes MUST be reduced to one.
+     * - If a query is present, it MUST be prefixed by "?".
+     * - If a fragment is present, it MUST be prefixed by "#".
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-4.1
+     * @return string
+     */
+    public function __toString();
+}
diff --git a/modules/LIMS/libraries/dependencies/functions.php b/modules/LIMS/libraries/dependencies/functions.php
new file mode 100644
index 000000000..5afa49837
--- /dev/null
+++ b/modules/LIMS/libraries/dependencies/functions.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Escape a PHP string for use as (part of) an HTML / XML text node.
+ *
+ * It only escapes a few special chars: the ampersand (&) and both the left-
+ * pointing angle bracket (<) and the right-pointing angle bracket (>), since
+ * these are the only characters that are special in a text node.  Minimal
+ * quoting is preferred because it produces smaller and more easily human-
+ * readable output.
+ *
+ * Some characters simply cannot appear in valid XML documents, even
+ * as entities but, this function does not attempt to handle them.
+ *
+ * NOTE: Attribute values are NOT text nodes, and require additional escaping.
+ *
+ * @param string $text The string to escape, possibly including "&", "<",
+ *                     or ">".
+ * @return string The string, with "&", "<", and ">" escaped.
+ */
+function text($text) {
+	return htmlspecialchars($text, ENT_NOQUOTES);
+}
+
+/**
+ * valueOrNull
+ * Checks whether a particular value exists and returns it.
+ * If the value doesn't exist, returns null.
+ *
+ * @param string $value
+ * @return string 
+ */
+function valueOrNull($value) {
+	if (is_array($value)) {
+		if (count($value) > 0) {
+			return $value;
+		}
+	} else {
+		if (isset($value) && strlen($value) > 0) {
+			return $value;
+		}
+	}
+	return null;
+}
+
+/**
+ * valueOrZero
+ * checks whether given value is a non-zero integer. if not, returns 1 to avoid by zero division
+ * @param integer $value
+ * @return void
+ */
+function valueOrZero($value) {
+	if (is_integer($value) && $value !== 0) {
+		return $value;
+	} else {
+		return 1;
+	}
+}
+
+/**
+ * getDataFromUrl
+ * sends a GET request to the given URL and returns the data received
+ * @param GuzzleHttp $handler
+ * @param string $url
+ * @return object
+ */
+function getDataFromUrl($handler, $url, $remove_dormant = false) {
+	if ($remove_dormant) {
+		$url .= '?inactive_state=active';
+	}
+	return json_decode($handler->get($url)->getBody()->getContents())->items;
+}
+
+/**
+ * checkRequiredFields
+ * checks whether the data contains the fields provided
+ *
+ * @param array $fields
+ * @param array $data
+ * @return bool
+ */
+function checkRequiredFields($fields, $data) {
+	foreach ($fields as $field) {
+		if (!isset($data[$field]) || (valueOrNull($data[$field]) === null)) {
+			return false;
+		}
+	}
+
+	return true;
+}
+?>
\ No newline at end of file
diff --git a/modules/LIMS/login.php b/modules/LIMS/login.php
new file mode 100644
index 000000000..f3004fdbd
--- /dev/null
+++ b/modules/LIMS/login.php
@@ -0,0 +1,46 @@
+<?php
+
+// set the username as there can be only one
+// should allow to enter the username instead for validation?
+$limsUserQuery = sqlStatement("SELECT * FROM globals WHERE gl_name = 'lims_username'");
+$username = sqlFetchArray($limsUserQuery)['gl_value'];
+
+
+// basic validations
+if (isset($_POST['submit'])) {
+  $errors = [];
+  if (!isset($_POST['username'])) {
+    $errors[] = 'Please set a username in the global configuration';
+  }
+  if (!isset($_POST['password']) || strlen($_POST['password']) <= 0) {
+    echo $_POST['password'];
+    $errors[] = 'Please enter a password';
+  }
+
+  if (count($errors) <= 0) {
+
+
+    // temporarily from database, plan to remove password from db and have it natively validate against the LIMS
+    $validateQuery = sqlStatement("SELECT * from globals WHERE gl_name = 'lims_password'");
+    $password = sqlFetchArray($validateQuery)['gl_value'];
+
+    if ($password === $_POST['password']) {
+      session_start();
+      $_SESSION['lims_login'] = 'senaite';
+      $_SESSION['lims_user'] = $_POST['username'];
+      header('location: index.php');
+    } else {
+      $errors[] = 'Please enter valid credentials';
+    }
+    
+  }
+}
+
+
+
+
+
+
+
+
+require_once('./templates/pages/login.php');
diff --git a/modules/LIMS/senaite/README.md b/modules/LIMS/senaite/README.md
new file mode 100644
index 000000000..8b7aacb2a
--- /dev/null
+++ b/modules/LIMS/senaite/README.md
@@ -0,0 +1,180 @@
+# SENAITE LIMS Installation Guide
+
+### Supported Operating Systems
+
+* Microsoft Windows
+* LINUX distributions
+* OS X (Instructions will be added soon)
+
+
+## Microsoft Windows
+
+To install SENAITE on Windows, you will need the following resources:
+
+* [VirtualBox](https://www.virtualbox.org/)
+* Ubuntu Image File ([64-bit](http://releases.ubuntu.com/16.04/ubuntu-16.04.4-desktop-amd64.iso.torrent) , [32-bit](http://releases.ubuntu.com/16.04/ubuntu-16.04.4-desktop-i386.iso.torrent))
+
+Start by opening VirtualBox and select "New" to create a new Virtual Machine. Choose Linux and Ubuntu in the OS selection step of the wizard.
+
+![Step 1](https://i.imgur.com/mHt3RGN.png)
+
+Everything else can be left as default as you progress through the wizard. Around 512mb-1GB of RAM should be allocated to the system along with 5-8GB+ of hard disk space.
+
+Once the VM has been created, double click on the name in the left column to start the VM. You will get a prompt to browse for the ISO file. Select the Ubuntu ISO file that you had downloaded previously.
+
+![Step 2](https://i.imgur.com/HfUkCBX.png)
+
+Click on the "Install Ubuntu" option.
+
+![Step 3](https://i.imgur.com/6FYa1wH.png)
+
+Check the "Download updates while installing Ubuntu" option.
+
+In the next step, check "Erase and install Ubuntu" and proceed.
+
+Pick your time zone and keyboard layouts in the next step.
+
+Then, enter the username and password you want for your OS account.
+
+The installation takes some time.
+
+Once the OS has finished installation, open the terminal ( Ctrl + Alt + T ).
+
+( From this point onwards, the instructions are similar for the Linux distributions )
+
+In the terminal, run the following scripts:
+
+```
+sudo apt install -y python-setuptools libxml2-dev libxslt1-dev libbz2-dev libjpeg62-dev libz-dev
+sudo apt install -y libreadline-dev wv poppler-utils git
+sudo apt install -y build-essential gcc python-dev git-core libffi-dev
+sudo apt install -y libpcre3 libpcre3-dev autoconf libtool pkg-config
+sudo apt install -y zlib1g-dev libssl-dev libexpat1-dev libxslt1.1
+sudo apt install -y gnuplot libcairo2 libpango1.0-0 libgdk-pixbuf2.0-0
+```
+
+Once the above libraries are installed, go to the following website using Firefox in the VM https://launchpad.net/plone/4.3/4.3.17/+download/Plone-4.3.17-UnifiedInstaller.tgz
+
+This will download the Plone CMS Installer. Open the ZIP file and extract it to your desktop.
+
+Now, go back to the terminal and run this command
+
+`cd ~/Desktop/Plone-4.3.1-UnifiedInstaller`
+
+Install Plone using this command:
+`./install.sh standalone`
+
+Wait till the installation finishes.
+Once the download finishes, it will show you your administrator username and password in the terminal. Note those down.
+
+Now we need to install Senaite's JSON API onto Plone.
+
+Navigate to the directory where plone is installed using
+`cd ~/Plone/zinstance` in the terminal.
+
+Open the buildout.cfg file for editing using
+`gedit buildout.cfg`
+
+Scroll down to the "eggs" section and add "senaite.jsonapi" at the end.
+
+![Step 4](https://i.imgur.com/eWhIpnq.png)
+
+Now, in the terminal, run:
+
+`bin/buildout`
+
+This will install the Senaite JSON API.
+You might see some warnings in the terminal, you can ignore those.
+
+Now, to start the Plone server, execute the following command:
+
+`bin/plonectl start`
+
+In the VM, using the browser, visit http://localhost:8080 and click "Install SENAITE core". It will ask for the username and password that you noted down earlier. Input those, click Install in the next step and let the setup run.
+
+Once the setup finishes, it will open your LIMS dashboard. The installation is finished.
+
+At this point, your Senaite API is only available for usage from within inside the VM. To let LibreEHR use the Senaite API you will need to forward the port 8080 ( or something else of your choosing ) in the Virtual Machine configuration. To do that, close the machine ( you can save the state ).
+
+Right click on the machine in the left column in VirtualBox and click Settings. Open the "Network" section and click on "Advanced". Open the "Port Forwarding" popup and click the small "+" on the right side to create a new Port Forwarding rule. When the rule is created, enter "8080" in both the Host Port and the Guest Port. Once that is done, click OK and you can start the VM again.
+
+Next, you need to configure LibreEHR to make sure it can communicate with the LIMS. Log into an administrator account in LibreEHR, go to Administrator->Globals->LIMS. Enable the LIMS, pick senaite as the LIMS software to use, add the URL where the VM is residing ( if it is on your system, add http://localhost:8080), and enter the authentication username and password you noted down earlier.
+
+Everything should work as intended from this point onwards, you can access the LIMS in LibreEHR.
+
+## Linux Distributions
+
+To install Plone and SENAITE in Linux distributions, you can follow the steps in the Windows tutorial after the installation of the VM.
+
+
+## Pre-configured ISO
+
+You will find a pre-configured ISO [here](https://drive.google.com/file/d/1X8r9Zc5zW4p6-8BHQMDrQVG0ELDh3VEK/view?usp=sharing). You just need to take this and install it using VirtualBox (or natively onto your system if you wish) and it has Senaite and Plone already installed onto it. 
+
+### Instructions
+
+Proceed using the instructions in the Microsoft Windows section above till the OS has finished installation. 
+There is one user able to access the system with-
+
+Username: senaite
+
+Password: senaitelims
+
+You can change the password or create a new user after you've logged into the OS using the above authentication details. The user that you create in the OS installation setup will not function.
+
+Once you've logged into the system, you need to set some permissions for the current user to be able to access the LIMS.
+
+You can run the following very simple command to set those permissions:
+
+```
+sudo chown -R $USER /usr/local/Plone
+```
+It might take a while.
+
+
+Once the permissions are set, to start the LIMS, run the following command:
+
+```
+/usr/local/Plone/zinstance/bin/plonectl start
+
+```
+
+This will start Senaite in the background.
+
+If you want to start Senaite in the foreground ( to see which requests are being made to the API/ check its status), run the following command:
+
+```
+/usr/local/Plone/zinstance/bin/plonectl fg
+```
+
+When starting the application for the first time, it might take some time for it to fully boot up.
+
+
+After the instance has started, go to http://localhost:8080 in the browser and click "Install Senaite Core". In the next page, let all the defaults stay the same and click Install. Once that is finished, you can access the LIMS through LibreEHR.
+
+
+
+
+## Updating Senaite
+
+To update senaite.core, go to the "src" folder in the main Plone directory. (/usr/local/Plone/zinstance/src). 
+There, input the following command: 
+```
+git clone https://github.com/senaite/senaite.core
+```
+Once that is done, open buildout.cfg in the zinstance folder, find the "Development Eggs" section and write the following line below it:
+``` 
+develop = src/senaite.core
+```
+
+Then, run bin/buildout. 
+ 
+This will set up the latest version of senaite in your application.
+Whenever a new version comes out, all that needs to be done is -
+
+Step 1. Go into the /src/senaite.core directory and run 
+``` git pull ```
+
+Step 2. Run bin/buildout
+
+This will update your installation to the latest version of senaite.
\ No newline at end of file
diff --git a/modules/LIMS/senaite/assets/config.json b/modules/LIMS/senaite/assets/config.json
new file mode 100644
index 000000000..790ab5f2e
--- /dev/null
+++ b/modules/LIMS/senaite/assets/config.json
@@ -0,0 +1,435 @@
+{
+  "vars": {
+    "@gray-base": "#000",
+    "@gray-darker": "lighten(@gray-base, 13.5%)",
+    "@gray-dark": "lighten(@gray-base, 20%)",
+    "@gray": "lighten(@gray-base, 33.5%)",
+    "@gray-light": "lighten(@gray-base, 46.7%)",
+    "@gray-lighter": "lighten(@gray-base, 93.5%)",
+    "@brand-primary": "darken(#f59031, 6.5%)",
+    "@brand-success": "#5cb85c",
+    "@brand-info": "#5bc0de",
+    "@brand-warning": "#f0ad4e",
+    "@brand-danger": "#d9534f",
+    "@body-bg": "#fff",
+    "@text-color": "@gray-dark",
+    "@link-color": "@brand-primary",
+    "@link-hover-color": "darken(@link-color, 15%)",
+    "@link-hover-decoration": "underline",
+    "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
+    "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
+    "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
+    "@font-family-base": "@font-family-sans-serif",
+    "@font-size-base": "14px",
+    "@font-size-large": "ceil((@font-size-base * 1.25))",
+    "@font-size-small": "ceil((@font-size-base * 0.85))",
+    "@font-size-h1": "floor((@font-size-base * 2.6))",
+    "@font-size-h2": "floor((@font-size-base * 2.15))",
+    "@font-size-h3": "ceil((@font-size-base * 1.7))",
+    "@font-size-h4": "ceil((@font-size-base * 1.25))",
+    "@font-size-h5": "@font-size-base",
+    "@font-size-h6": "ceil((@font-size-base * 0.85))",
+    "@line-height-base": "1.428571429",
+    "@line-height-computed": "floor((@font-size-base * @line-height-base))",
+    "@headings-font-family": "inherit",
+    "@headings-font-weight": "500",
+    "@headings-line-height": "1.1",
+    "@headings-color": "inherit",
+    "@icon-font-path": "\"../fonts/\"",
+    "@icon-font-name": "\"glyphicons-halflings-regular\"",
+    "@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
+    "@padding-base-vertical": "6px",
+    "@padding-base-horizontal": "12px",
+    "@padding-large-vertical": "10px",
+    "@padding-large-horizontal": "16px",
+    "@padding-small-vertical": "5px",
+    "@padding-small-horizontal": "10px",
+    "@padding-xs-vertical": "1px",
+    "@padding-xs-horizontal": "5px",
+    "@line-height-large": "1.3333333",
+    "@line-height-small": "1.5",
+    "@border-radius-base": "4px",
+    "@border-radius-large": "6px",
+    "@border-radius-small": "3px",
+    "@component-active-color": "#fff",
+    "@component-active-bg": "@brand-primary",
+    "@caret-width-base": "4px",
+    "@caret-width-large": "5px",
+    "@table-cell-padding": "8px",
+    "@table-condensed-cell-padding": "5px",
+    "@table-bg": "transparent",
+    "@table-bg-accent": "#f9f9f9",
+    "@table-bg-hover": "#f5f5f5",
+    "@table-bg-active": "@table-bg-hover",
+    "@table-border-color": "#ddd",
+    "@btn-font-weight": "normal",
+    "@btn-default-color": "#333",
+    "@btn-default-bg": "#fff",
+    "@btn-default-border": "#ccc",
+    "@btn-primary-color": "#fff",
+    "@btn-primary-bg": "@brand-primary",
+    "@btn-primary-border": "darken(@btn-primary-bg, 5%)",
+    "@btn-success-color": "#fff",
+    "@btn-success-bg": "@brand-success",
+    "@btn-success-border": "darken(@btn-success-bg, 5%)",
+    "@btn-info-color": "#fff",
+    "@btn-info-bg": "@brand-info",
+    "@btn-info-border": "darken(@btn-info-bg, 5%)",
+    "@btn-warning-color": "#fff",
+    "@btn-warning-bg": "@brand-warning",
+    "@btn-warning-border": "darken(@btn-warning-bg, 5%)",
+    "@btn-danger-color": "#fff",
+    "@btn-danger-bg": "@brand-danger",
+    "@btn-danger-border": "darken(@btn-danger-bg, 5%)",
+    "@btn-link-disabled-color": "@gray-light",
+    "@btn-border-radius-base": "@border-radius-base",
+    "@btn-border-radius-large": "@border-radius-large",
+    "@btn-border-radius-small": "@border-radius-small",
+    "@input-bg": "#fff",
+    "@input-bg-disabled": "@gray-lighter",
+    "@input-color": "@gray",
+    "@input-border": "#ccc",
+    "@input-border-radius": "@border-radius-base",
+    "@input-border-radius-large": "@border-radius-large",
+    "@input-border-radius-small": "@border-radius-small",
+    "@input-border-focus": "#66afe9",
+    "@input-color-placeholder": "#999",
+    "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
+    "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
+    "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
+    "@form-group-margin-bottom": "15px",
+    "@legend-color": "@gray-dark",
+    "@legend-border-color": "#e5e5e5",
+    "@input-group-addon-bg": "@gray-lighter",
+    "@input-group-addon-border-color": "@input-border",
+    "@cursor-disabled": "not-allowed",
+    "@dropdown-bg": "#fff",
+    "@dropdown-border": "rgba(0,0,0,.15)",
+    "@dropdown-fallback-border": "#ccc",
+    "@dropdown-divider-bg": "#e5e5e5",
+    "@dropdown-link-color": "@gray-dark",
+    "@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
+    "@dropdown-link-hover-bg": "#f5f5f5",
+    "@dropdown-link-active-color": "@component-active-color",
+    "@dropdown-link-active-bg": "@component-active-bg",
+    "@dropdown-link-disabled-color": "@gray-light",
+    "@dropdown-header-color": "@gray-light",
+    "@dropdown-caret-color": "#000",
+    "@screen-xs": "480px",
+    "@screen-xs-min": "@screen-xs",
+    "@screen-phone": "@screen-xs-min",
+    "@screen-sm": "768px",
+    "@screen-sm-min": "@screen-sm",
+    "@screen-tablet": "@screen-sm-min",
+    "@screen-md": "992px",
+    "@screen-md-min": "@screen-md",
+    "@screen-desktop": "@screen-md-min",
+    "@screen-lg": "1200px",
+    "@screen-lg-min": "@screen-lg",
+    "@screen-lg-desktop": "@screen-lg-min",
+    "@screen-xs-max": "(@screen-sm-min - 1)",
+    "@screen-sm-max": "(@screen-md-min - 1)",
+    "@screen-md-max": "(@screen-lg-min - 1)",
+    "@grid-columns": "12",
+    "@grid-gutter-width": "30px",
+    "@grid-float-breakpoint": "@screen-sm-min",
+    "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
+    "@container-tablet": "(720px + @grid-gutter-width)",
+    "@container-sm": "@container-tablet",
+    "@container-desktop": "(940px + @grid-gutter-width)",
+    "@container-md": "@container-desktop",
+    "@container-large-desktop": "(1140px + @grid-gutter-width)",
+    "@container-lg": "@container-large-desktop",
+    "@navbar-height": "50px",
+    "@navbar-margin-bottom": "@line-height-computed",
+    "@navbar-border-radius": "@border-radius-base",
+    "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
+    "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
+    "@navbar-collapse-max-height": "340px",
+    "@navbar-default-color": "#777",
+    "@navbar-default-bg": "#f8f8f8",
+    "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
+    "@navbar-default-link-color": "#777",
+    "@navbar-default-link-hover-color": "#333",
+    "@navbar-default-link-hover-bg": "transparent",
+    "@navbar-default-link-active-color": "#555",
+    "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
+    "@navbar-default-link-disabled-color": "#ccc",
+    "@navbar-default-link-disabled-bg": "transparent",
+    "@navbar-default-brand-color": "@navbar-default-link-color",
+    "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
+    "@navbar-default-brand-hover-bg": "transparent",
+    "@navbar-default-toggle-hover-bg": "#ddd",
+    "@navbar-default-toggle-icon-bar-bg": "#888",
+    "@navbar-default-toggle-border-color": "#ddd",
+    "@navbar-inverse-color": "lighten(@gray-light, 15%)",
+    "@navbar-inverse-bg": "#222",
+    "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
+    "@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
+    "@navbar-inverse-link-hover-color": "#fff",
+    "@navbar-inverse-link-hover-bg": "transparent",
+    "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
+    "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
+    "@navbar-inverse-link-disabled-color": "#444",
+    "@navbar-inverse-link-disabled-bg": "transparent",
+    "@navbar-inverse-brand-color": "@navbar-inverse-link-color",
+    "@navbar-inverse-brand-hover-color": "#fff",
+    "@navbar-inverse-brand-hover-bg": "transparent",
+    "@navbar-inverse-toggle-hover-bg": "#333",
+    "@navbar-inverse-toggle-icon-bar-bg": "#fff",
+    "@navbar-inverse-toggle-border-color": "#333",
+    "@nav-link-padding": "10px 15px",
+    "@nav-link-hover-bg": "@gray-lighter",
+    "@nav-disabled-link-color": "@gray-light",
+    "@nav-disabled-link-hover-color": "@gray-light",
+    "@nav-tabs-border-color": "#ddd",
+    "@nav-tabs-link-hover-border-color": "@gray-lighter",
+    "@nav-tabs-active-link-hover-bg": "@body-bg",
+    "@nav-tabs-active-link-hover-color": "@gray",
+    "@nav-tabs-active-link-hover-border-color": "#ddd",
+    "@nav-tabs-justified-link-border-color": "#ddd",
+    "@nav-tabs-justified-active-link-border-color": "@body-bg",
+    "@nav-pills-border-radius": "@border-radius-base",
+    "@nav-pills-active-link-hover-bg": "@component-active-bg",
+    "@nav-pills-active-link-hover-color": "@component-active-color",
+    "@pagination-color": "@link-color",
+    "@pagination-bg": "#fff",
+    "@pagination-border": "#ddd",
+    "@pagination-hover-color": "@link-hover-color",
+    "@pagination-hover-bg": "@gray-lighter",
+    "@pagination-hover-border": "#ddd",
+    "@pagination-active-color": "#fff",
+    "@pagination-active-bg": "@brand-primary",
+    "@pagination-active-border": "@brand-primary",
+    "@pagination-disabled-color": "@gray-light",
+    "@pagination-disabled-bg": "#fff",
+    "@pagination-disabled-border": "#ddd",
+    "@pager-bg": "@pagination-bg",
+    "@pager-border": "@pagination-border",
+    "@pager-border-radius": "15px",
+    "@pager-hover-bg": "@pagination-hover-bg",
+    "@pager-active-bg": "@pagination-active-bg",
+    "@pager-active-color": "@pagination-active-color",
+    "@pager-disabled-color": "@pagination-disabled-color",
+    "@jumbotron-padding": "30px",
+    "@jumbotron-color": "inherit",
+    "@jumbotron-bg": "@gray-lighter",
+    "@jumbotron-heading-color": "inherit",
+    "@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
+    "@jumbotron-heading-font-size": "ceil((@font-size-base * 4.5))",
+    "@state-success-text": "#3c763d",
+    "@state-success-bg": "#dff0d8",
+    "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
+    "@state-info-text": "#31708f",
+    "@state-info-bg": "#d9edf7",
+    "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
+    "@state-warning-text": "#8a6d3b",
+    "@state-warning-bg": "#fcf8e3",
+    "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
+    "@state-danger-text": "#a94442",
+    "@state-danger-bg": "#f2dede",
+    "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
+    "@tooltip-max-width": "200px",
+    "@tooltip-color": "#fff",
+    "@tooltip-bg": "#000",
+    "@tooltip-opacity": ".9",
+    "@tooltip-arrow-width": "5px",
+    "@tooltip-arrow-color": "@tooltip-bg",
+    "@popover-bg": "#fff",
+    "@popover-max-width": "276px",
+    "@popover-border-color": "rgba(0,0,0,.2)",
+    "@popover-fallback-border-color": "#ccc",
+    "@popover-title-bg": "darken(@popover-bg, 3%)",
+    "@popover-arrow-width": "10px",
+    "@popover-arrow-color": "@popover-bg",
+    "@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
+    "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
+    "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
+    "@label-default-bg": "@gray-light",
+    "@label-primary-bg": "@brand-primary",
+    "@label-success-bg": "@brand-success",
+    "@label-info-bg": "@brand-info",
+    "@label-warning-bg": "@brand-warning",
+    "@label-danger-bg": "@brand-danger",
+    "@label-color": "#fff",
+    "@label-link-hover-color": "#fff",
+    "@modal-inner-padding": "15px",
+    "@modal-title-padding": "15px",
+    "@modal-title-line-height": "@line-height-base",
+    "@modal-content-bg": "#fff",
+    "@modal-content-border-color": "rgba(0,0,0,.2)",
+    "@modal-content-fallback-border-color": "#999",
+    "@modal-backdrop-bg": "#000",
+    "@modal-backdrop-opacity": ".5",
+    "@modal-header-border-color": "#e5e5e5",
+    "@modal-footer-border-color": "@modal-header-border-color",
+    "@modal-lg": "900px",
+    "@modal-md": "600px",
+    "@modal-sm": "300px",
+    "@alert-padding": "15px",
+    "@alert-border-radius": "@border-radius-base",
+    "@alert-link-font-weight": "bold",
+    "@alert-success-bg": "@state-success-bg",
+    "@alert-success-text": "@state-success-text",
+    "@alert-success-border": "@state-success-border",
+    "@alert-info-bg": "@state-info-bg",
+    "@alert-info-text": "@state-info-text",
+    "@alert-info-border": "@state-info-border",
+    "@alert-warning-bg": "@state-warning-bg",
+    "@alert-warning-text": "@state-warning-text",
+    "@alert-warning-border": "@state-warning-border",
+    "@alert-danger-bg": "@state-danger-bg",
+    "@alert-danger-text": "@state-danger-text",
+    "@alert-danger-border": "@state-danger-border",
+    "@progress-bg": "#f5f5f5",
+    "@progress-bar-color": "#fff",
+    "@progress-border-radius": "@border-radius-base",
+    "@progress-bar-bg": "@brand-primary",
+    "@progress-bar-success-bg": "@brand-success",
+    "@progress-bar-warning-bg": "@brand-warning",
+    "@progress-bar-danger-bg": "@brand-danger",
+    "@progress-bar-info-bg": "@brand-info",
+    "@list-group-bg": "#fff",
+    "@list-group-border": "#ddd",
+    "@list-group-border-radius": "@border-radius-base",
+    "@list-group-hover-bg": "#f5f5f5",
+    "@list-group-active-color": "@component-active-color",
+    "@list-group-active-bg": "@component-active-bg",
+    "@list-group-active-border": "@list-group-active-bg",
+    "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
+    "@list-group-disabled-color": "@gray-light",
+    "@list-group-disabled-bg": "@gray-lighter",
+    "@list-group-disabled-text-color": "@list-group-disabled-color",
+    "@list-group-link-color": "#555",
+    "@list-group-link-hover-color": "@list-group-link-color",
+    "@list-group-link-heading-color": "#333",
+    "@panel-bg": "#fff",
+    "@panel-body-padding": "15px",
+    "@panel-heading-padding": "10px 15px",
+    "@panel-footer-padding": "@panel-heading-padding",
+    "@panel-border-radius": "@border-radius-base",
+    "@panel-inner-border": "#ddd",
+    "@panel-footer-bg": "#f5f5f5",
+    "@panel-default-text": "@gray-dark",
+    "@panel-default-border": "#ddd",
+    "@panel-default-heading-bg": "#f5f5f5",
+    "@panel-primary-text": "#fff",
+    "@panel-primary-border": "@brand-primary",
+    "@panel-primary-heading-bg": "@brand-primary",
+    "@panel-success-text": "@state-success-text",
+    "@panel-success-border": "@state-success-border",
+    "@panel-success-heading-bg": "@state-success-bg",
+    "@panel-info-text": "@state-info-text",
+    "@panel-info-border": "@state-info-border",
+    "@panel-info-heading-bg": "@state-info-bg",
+    "@panel-warning-text": "@state-warning-text",
+    "@panel-warning-border": "@state-warning-border",
+    "@panel-warning-heading-bg": "@state-warning-bg",
+    "@panel-danger-text": "@state-danger-text",
+    "@panel-danger-border": "@state-danger-border",
+    "@panel-danger-heading-bg": "@state-danger-bg",
+    "@thumbnail-padding": "4px",
+    "@thumbnail-bg": "@body-bg",
+    "@thumbnail-border": "#ddd",
+    "@thumbnail-border-radius": "@border-radius-base",
+    "@thumbnail-caption-color": "@text-color",
+    "@thumbnail-caption-padding": "9px",
+    "@well-bg": "#f5f5f5",
+    "@well-border": "darken(@well-bg, 7%)",
+    "@badge-color": "#fff",
+    "@badge-link-hover-color": "#fff",
+    "@badge-bg": "@gray-light",
+    "@badge-active-color": "@link-color",
+    "@badge-active-bg": "#fff",
+    "@badge-font-weight": "bold",
+    "@badge-line-height": "1",
+    "@badge-border-radius": "10px",
+    "@breadcrumb-padding-vertical": "8px",
+    "@breadcrumb-padding-horizontal": "15px",
+    "@breadcrumb-bg": "#f5f5f5",
+    "@breadcrumb-color": "#ccc",
+    "@breadcrumb-active-color": "@gray-light",
+    "@breadcrumb-separator": "\"/\"",
+    "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
+    "@carousel-control-color": "#fff",
+    "@carousel-control-width": "15%",
+    "@carousel-control-opacity": ".5",
+    "@carousel-control-font-size": "20px",
+    "@carousel-indicator-active-bg": "#fff",
+    "@carousel-indicator-border-color": "#fff",
+    "@carousel-caption-color": "#fff",
+    "@close-font-weight": "bold",
+    "@close-color": "#000",
+    "@close-text-shadow": "0 1px 0 #fff",
+    "@code-color": "#c7254e",
+    "@code-bg": "#f9f2f4",
+    "@kbd-color": "#fff",
+    "@kbd-bg": "#333",
+    "@pre-bg": "#f5f5f5",
+    "@pre-color": "@gray-dark",
+    "@pre-border-color": "#ccc",
+    "@pre-scrollable-max-height": "340px",
+    "@component-offset-horizontal": "180px",
+    "@text-muted": "@gray-light",
+    "@abbr-border-color": "@gray-light",
+    "@headings-small-color": "@gray-light",
+    "@blockquote-small-color": "@gray-light",
+    "@blockquote-font-size": "(@font-size-base * 1.25)",
+    "@blockquote-border-color": "@gray-lighter",
+    "@page-header-border-color": "@gray-lighter",
+    "@dl-horizontal-offset": "@component-offset-horizontal",
+    "@dl-horizontal-breakpoint": "@grid-float-breakpoint",
+    "@hr-border": "@gray-lighter"
+  },
+  "css": [
+    "print.less",
+    "type.less",
+    "code.less",
+    "grid.less",
+    "tables.less",
+    "forms.less",
+    "buttons.less",
+    "responsive-utilities.less",
+    "glyphicons.less",
+    "button-groups.less",
+    "input-groups.less",
+    "navs.less",
+    "navbar.less",
+    "breadcrumbs.less",
+    "pagination.less",
+    "pager.less",
+    "labels.less",
+    "badges.less",
+    "jumbotron.less",
+    "thumbnails.less",
+    "alerts.less",
+    "progress-bars.less",
+    "media.less",
+    "list-group.less",
+    "panels.less",
+    "responsive-embed.less",
+    "wells.less",
+    "close.less",
+    "component-animations.less",
+    "dropdowns.less",
+    "tooltip.less",
+    "popovers.less",
+    "modals.less",
+    "carousel.less"
+  ],
+  "js": [
+    "alert.js",
+    "button.js",
+    "carousel.js",
+    "dropdown.js",
+    "modal.js",
+    "tooltip.js",
+    "popover.js",
+    "tab.js",
+    "affix.js",
+    "collapse.js",
+    "scrollspy.js",
+    "transition.js"
+  ],
+  "customizerUrl": "<none>"
+}
\ No newline at end of file
diff --git a/modules/LIMS/senaite/assets/css/bootstrap-theme.css b/modules/LIMS/senaite/assets/css/bootstrap-theme.css
new file mode 100644
index 000000000..391de70a9
--- /dev/null
+++ b/modules/LIMS/senaite/assets/css/bootstrap-theme.css
@@ -0,0 +1,596 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (<none>)
+ * Config saved to config.json and <none>
+ */
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
+  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  text-shadow: 0 1px 0 #fff;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #f37f11 0%, #be6109 100%);
+  background-image: -o-linear-gradient(top, #f37f11 0%, #be6109 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#be6109));
+  background-image: linear-gradient(to bottom, #f37f11 0%, #be6109 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffbe6109', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b55c09;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #be6109;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #be6109;
+  border-color: #b55c09;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #be6109;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-color: #e8e8e8;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-image: -webkit-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+  background-image: -o-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#e0720b));
+  background-image: linear-gradient(to bottom, #f37f11 0%, #e0720b 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0);
+  background-color: #e0720b;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));
+  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222));
+  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+@media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+    background-image: -o-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#e0720b));
+    background-image: linear-gradient(to bottom, #f37f11 0%, #e0720b 100%);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0);
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #f37f11 0%, #c8660a 100%);
+  background-image: -o-linear-gradient(top, #f37f11 0%, #c8660a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#c8660a));
+  background-image: linear-gradient(to bottom, #f37f11 0%, #c8660a 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffc8660a', GradientType=0);
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #c8660a;
+  background-image: -webkit-linear-gradient(top, #f37f11 0%, #d46c0a 100%);
+  background-image: -o-linear-gradient(top, #f37f11 0%, #d46c0a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#d46c0a));
+  background-image: linear-gradient(to bottom, #f37f11 0%, #d46c0a 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffd46c0a', GradientType=0);
+  border-color: #d46c0a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+  background-image: -o-linear-gradient(top, #f37f11 0%, #e0720b 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f37f11), to(#e0720b));
+  background-image: linear-gradient(to bottom, #f37f11 0%, #e0720b 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0);
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+}
diff --git a/modules/LIMS/senaite/assets/css/bootstrap-theme.min.css b/modules/LIMS/senaite/assets/css/bootstrap-theme.min.css
new file mode 100644
index 000000000..31839ffda
--- /dev/null
+++ b/modules/LIMS/senaite/assets/css/bootstrap-theme.min.css
@@ -0,0 +1,14 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (<none>)
+ * Config saved to config.json and <none>
+ *//*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default.disabled,.btn-primary.disabled,.btn-success.disabled,.btn-info.disabled,.btn-warning.disabled,.btn-danger.disabled,.btn-default[disabled],.btn-primary[disabled],.btn-success[disabled],.btn-info[disabled],.btn-warning[disabled],.btn-danger[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-info,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-danger{-webkit-box-shadow:none;box-shadow:none}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #f37f11 0, #be6109 100%);background-image:-o-linear-gradient(top, #f37f11 0, #be6109 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#be6109));background-image:linear-gradient(to bottom, #f37f11 0, #be6109 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffbe6109', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b55c09}.btn-primary:hover,.btn-primary:focus{background-color:#be6109;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#be6109;border-color:#b55c09}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#be6109;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-o-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#e0720b));background-image:linear-gradient(to bottom, #f37f11 0, #e0720b 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0);background-color:#e0720b}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-o-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#e0720b));background-image:linear-gradient(to bottom, #f37f11 0, #e0720b 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #f37f11 0, #c8660a 100%);background-image:-o-linear-gradient(top, #f37f11 0, #c8660a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#c8660a));background-image:linear-gradient(to bottom, #f37f11 0, #c8660a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffc8660a', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #c8660a;background-image:-webkit-linear-gradient(top, #f37f11 0, #d46c0a 100%);background-image:-o-linear-gradient(top, #f37f11 0, #d46c0a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#d46c0a));background-image:linear-gradient(to bottom, #f37f11 0, #d46c0a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffd46c0a', GradientType=0);border-color:#d46c0a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-o-linear-gradient(top, #f37f11 0, #e0720b 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f37f11), to(#e0720b));background-image:linear-gradient(to bottom, #f37f11 0, #e0720b 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff37f11', endColorstr='#ffe0720b', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}
\ No newline at end of file
diff --git a/modules/LIMS/senaite/assets/css/bootstrap.css b/modules/LIMS/senaite/assets/css/bootstrap.css
new file mode 100644
index 000000000..3d6f8452d
--- /dev/null
+++ b/modules/LIMS/senaite/assets/css/bootstrap.css
@@ -0,0 +1,6759 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (<none>)
+ * Config saved to config.json and <none>
+ */
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background-color: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+mark {
+  background: #ff0;
+  color: #000;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  height: 0;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit;
+  font: inherit;
+  margin: 0;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+legend {
+  border: 0;
+  padding: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+td,
+th {
+  padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *,
+  *:before,
+  *:after {
+    background: transparent !important;
+    color: #000 !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+    text-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+  src: url('../fonts/glyphicons-halflings-regular.eot');
+  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\002a";
+}
+.glyphicon-plus:before {
+  content: "\002b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+.glyphicon-cd:before {
+  content: "\e201";
+}
+.glyphicon-save-file:before {
+  content: "\e202";
+}
+.glyphicon-open-file:before {
+  content: "\e203";
+}
+.glyphicon-level-up:before {
+  content: "\e204";
+}
+.glyphicon-copy:before {
+  content: "\e205";
+}
+.glyphicon-paste:before {
+  content: "\e206";
+}
+.glyphicon-alert:before {
+  content: "\e209";
+}
+.glyphicon-equalizer:before {
+  content: "\e210";
+}
+.glyphicon-king:before {
+  content: "\e211";
+}
+.glyphicon-queen:before {
+  content: "\e212";
+}
+.glyphicon-pawn:before {
+  content: "\e213";
+}
+.glyphicon-bishop:before {
+  content: "\e214";
+}
+.glyphicon-knight:before {
+  content: "\e215";
+}
+.glyphicon-baby-formula:before {
+  content: "\e216";
+}
+.glyphicon-tent:before {
+  content: "\26fa";
+}
+.glyphicon-blackboard:before {
+  content: "\e218";
+}
+.glyphicon-bed:before {
+  content: "\e219";
+}
+.glyphicon-apple:before {
+  content: "\f8ff";
+}
+.glyphicon-erase:before {
+  content: "\e221";
+}
+.glyphicon-hourglass:before {
+  content: "\231b";
+}
+.glyphicon-lamp:before {
+  content: "\e223";
+}
+.glyphicon-duplicate:before {
+  content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+  content: "\e225";
+}
+.glyphicon-scissors:before {
+  content: "\e226";
+}
+.glyphicon-bitcoin:before {
+  content: "\e227";
+}
+.glyphicon-btc:before {
+  content: "\e227";
+}
+.glyphicon-xbt:before {
+  content: "\e227";
+}
+.glyphicon-yen:before {
+  content: "\00a5";
+}
+.glyphicon-jpy:before {
+  content: "\00a5";
+}
+.glyphicon-ruble:before {
+  content: "\20bd";
+}
+.glyphicon-rub:before {
+  content: "\20bd";
+}
+.glyphicon-scale:before {
+  content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+  content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
+}
+.glyphicon-education:before {
+  content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+  content: "\e234";
+}
+.glyphicon-option-vertical:before {
+  content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
+}
+.glyphicon-modal-window:before {
+  content: "\e237";
+}
+.glyphicon-oil:before {
+  content: "\e238";
+}
+.glyphicon-grain:before {
+  content: "\e239";
+}
+.glyphicon-sunglasses:before {
+  content: "\e240";
+}
+.glyphicon-text-size:before {
+  content: "\e241";
+}
+.glyphicon-text-color:before {
+  content: "\e242";
+}
+.glyphicon-text-background:before {
+  content: "\e243";
+}
+.glyphicon-object-align-top:before {
+  content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
+}
+.glyphicon-object-align-left:before {
+  content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
+}
+.glyphicon-object-align-right:before {
+  content: "\e249";
+}
+.glyphicon-triangle-right:before {
+  content: "\e250";
+}
+.glyphicon-triangle-left:before {
+  content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
+}
+.glyphicon-triangle-top:before {
+  content: "\e253";
+}
+.glyphicon-console:before {
+  content: "\e254";
+}
+.glyphicon-superscript:before {
+  content: "\e255";
+}
+.glyphicon-subscript:before {
+  content: "\e256";
+}
+.glyphicon-menu-left:before {
+  content: "\e257";
+}
+.glyphicon-menu-right:before {
+  content: "\e258";
+}
+.glyphicon-menu-down:before {
+  content: "\e259";
+}
+.glyphicon-menu-up:before {
+  content: "\e260";
+}
+* {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333333;
+  background-color: #ffffff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #f37f11;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #b05a09;
+  text-decoration: underline;
+}
+a:focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 4px;
+  line-height: 1.42857143;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+[role="button"] {
+  cursor: pointer;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 30px;
+}
+h3,
+.h3 {
+  font-size: 24px;
+}
+h4,
+.h4 {
+  font-size: 18px;
+}
+h5,
+.h5 {
+  font-size: 14px;
+}
+h6,
+.h6 {
+  font-size: 12px;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+@media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
+}
+small,
+.small {
+  font-size: 85%;
+}
+mark,
+.mark {
+  background-color: #fcf8e3;
+  padding: .2em;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #777777;
+}
+.text-primary {
+  color: #f37f11;
+}
+a.text-primary:hover,
+a.text-primary:focus {
+  color: #c8660a;
+}
+.text-success {
+  color: #3c763d;
+}
+a.text-success:hover,
+a.text-success:focus {
+  color: #2b542c;
+}
+.text-info {
+  color: #31708f;
+}
+a.text-info:hover,
+a.text-info:focus {
+  color: #245269;
+}
+.text-warning {
+  color: #8a6d3b;
+}
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #66512c;
+}
+.text-danger {
+  color: #a94442;
+}
+a.text-danger:hover,
+a.text-danger:focus {
+  color: #843534;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #f37f11;
+}
+a.bg-primary:hover,
+a.bg-primary:focus {
+  background-color: #c8660a;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover,
+a.bg-success:focus {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #d9edf7;
+}
+a.bg-info:hover,
+a.bg-info:focus {
+  background-color: #afd9ee;
+}
+.bg-warning {
+  background-color: #fcf8e3;
+}
+a.bg-warning:hover,
+a.bg-warning:focus {
+  background-color: #f7ecb5;
+}
+.bg-danger {
+  background-color: #f2dede;
+}
+a.bg-danger:hover,
+a.bg-danger:focus {
+  background-color: #e4b9b9;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eeeeee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  list-style: none;
+  margin-left: -5px;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 1.42857143;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    clear: left;
+    text-align: right;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777777;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+  text-align: right;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #ffffff;
+  background-color: #333333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.42857143;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: #333333;
+  background-color: #f5f5f5;
+  border: 1px solid #cccccc;
+  border-radius: 4px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.row {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0%;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0%;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0%;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0%;
+  }
+}
+table {
+  background-color: transparent;
+}
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777777;
+  text-align: left;
+}
+th {
+  text-align: left;
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #dddddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+.table .table {
+  background-color: #ffffff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #dddddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #dddddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-column;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-cell;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+.table-responsive {
+  overflow-x: auto;
+  min-height: 0.01%;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #dddddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+  min-width: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555555;
+  background-color: #ffffff;
+  background-image: none;
+  border: 1px solid #cccccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.form-control::-moz-placeholder {
+  color: #999999;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #999999;
+}
+.form-control::-webkit-input-placeholder {
+  color: #999999;
+}
+.form-control::-ms-expand {
+  border: 0;
+  background-color: transparent;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  background-color: #eeeeee;
+  opacity: 1;
+}
+.form-control[disabled],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 34px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 46px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-left: -20px;
+  margin-top: 4px \9;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+  min-height: 34px;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-left: 0;
+  padding-right: 0;
+}
+.input-sm {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.form-group-lg select.form-control {
+  height: 46px;
+  line-height: 46px;
+}
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 46px;
+  min-height: 38px;
+  padding: 11px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  border-color: #3c763d;
+  background-color: #dff0d8;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  border-color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+.has-warning .form-control-feedback {
+  color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  border-color: #a94442;
+  background-color: #f2dede;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+  top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
+}
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 7px;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    text-align: right;
+    margin-bottom: 0;
+    padding-top: 7px;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 11px;
+    font-size: 18px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
+}
+.btn {
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: normal;
+  text-align: center;
+  vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  border-radius: 4px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none;
+}
+.btn-default {
+  color: #333333;
+  background-color: #ffffff;
+  border-color: #cccccc;
+}
+.btn-default:focus,
+.btn-default.focus {
+  color: #333333;
+  background-color: #e6e6e6;
+  border-color: #8c8c8c;
+}
+.btn-default:hover {
+  color: #333333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #333333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+  color: #333333;
+  background-color: #d4d4d4;
+  border-color: #8c8c8c;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus {
+  background-color: #ffffff;
+  border-color: #cccccc;
+}
+.btn-default .badge {
+  color: #ffffff;
+  background-color: #333333;
+}
+.btn-primary {
+  color: #ffffff;
+  background-color: #f37f11;
+  border-color: #e0720b;
+}
+.btn-primary:focus,
+.btn-primary.focus {
+  color: #ffffff;
+  background-color: #c8660a;
+  border-color: #673405;
+}
+.btn-primary:hover {
+  color: #ffffff;
+  background-color: #c8660a;
+  border-color: #a65508;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #ffffff;
+  background-color: #c8660a;
+  border-color: #a65508;
+}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+  color: #ffffff;
+  background-color: #a65508;
+  border-color: #673405;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus {
+  background-color: #f37f11;
+  border-color: #e0720b;
+}
+.btn-primary .badge {
+  color: #f37f11;
+  background-color: #ffffff;
+}
+.btn-success {
+  color: #ffffff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success:focus,
+.btn-success.focus {
+  color: #ffffff;
+  background-color: #449d44;
+  border-color: #255625;
+}
+.btn-success:hover {
+  color: #ffffff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #ffffff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active:hover,
+.btn-success.active:hover,
+.open > .dropdown-toggle.btn-success:hover,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.open > .dropdown-toggle.btn-success:focus,
+.btn-success:active.focus,
+.btn-success.active.focus,
+.open > .dropdown-toggle.btn-success.focus {
+  color: #ffffff;
+  background-color: #398439;
+  border-color: #255625;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #ffffff;
+}
+.btn-info {
+  color: #ffffff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info:focus,
+.btn-info.focus {
+  color: #ffffff;
+  background-color: #31b0d5;
+  border-color: #1b6d85;
+}
+.btn-info:hover {
+  color: #ffffff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #ffffff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active:hover,
+.btn-info.active:hover,
+.open > .dropdown-toggle.btn-info:hover,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.open > .dropdown-toggle.btn-info:focus,
+.btn-info:active.focus,
+.btn-info.active.focus,
+.open > .dropdown-toggle.btn-info.focus {
+  color: #ffffff;
+  background-color: #269abc;
+  border-color: #1b6d85;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #ffffff;
+}
+.btn-warning {
+  color: #ffffff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning:focus,
+.btn-warning.focus {
+  color: #ffffff;
+  background-color: #ec971f;
+  border-color: #985f0d;
+}
+.btn-warning:hover {
+  color: #ffffff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #ffffff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.open > .dropdown-toggle.btn-warning:hover,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.open > .dropdown-toggle.btn-warning:focus,
+.btn-warning:active.focus,
+.btn-warning.active.focus,
+.open > .dropdown-toggle.btn-warning.focus {
+  color: #ffffff;
+  background-color: #d58512;
+  border-color: #985f0d;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #ffffff;
+}
+.btn-danger {
+  color: #ffffff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger:focus,
+.btn-danger.focus {
+  color: #ffffff;
+  background-color: #c9302c;
+  border-color: #761c19;
+}
+.btn-danger:hover {
+  color: #ffffff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #ffffff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.open > .dropdown-toggle.btn-danger:hover,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.open > .dropdown-toggle.btn-danger:focus,
+.btn-danger:active.focus,
+.btn-danger.active.focus,
+.open > .dropdown-toggle.btn-danger.focus {
+  color: #ffffff;
+  background-color: #ac2925;
+  border-color: #761c19;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #ffffff;
+}
+.btn-link {
+  color: #f37f11;
+  font-weight: normal;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #b05a09;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-property: height, visibility;
+  -o-transition-property: height, visibility;
+     transition-property: height, visibility;
+  -webkit-transition-duration: 0.35s;
+  -o-transition-duration: 0.35s;
+     transition-duration: 0.35s;
+  -webkit-transition-timing-function: ease;
+  -o-transition-timing-function: ease;
+     transition-timing-function: ease;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-top: 4px solid \9;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  text-decoration: none;
+  color: #262626;
+  background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  outline: 0;
+  background-color: #f37f11;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  cursor: not-allowed;
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  left: auto;
+  right: 0;
+}
+.dropdown-menu-left {
+  left: 0;
+  right: auto;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #777777;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px dashed;
+  border-bottom: 4px solid \9;
+  content: "";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    left: auto;
+    right: 0;
+  }
+  .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-left: 0;
+  padding-right: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group .form-control:focus {
+  z-index: 3;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555555;
+  text-align: center;
+  background-color: #eeeeee;
+  border: 1px solid #cccccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
+}
+.nav {
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav > li.disabled > a {
+  color: #777777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777777;
+  text-decoration: none;
+  background-color: transparent;
+  cursor: not-allowed;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eeeeee;
+  border-color: #f37f11;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid #dddddd;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555555;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  text-align: center;
+  margin-bottom: 5px;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #dddddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #dddddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #ffffff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #ffffff;
+  background-color: #f37f11;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  text-align: center;
+  margin-bottom: 5px;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #dddddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid #dddddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #ffffff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  overflow-x: visible;
+  padding-right: 15px;
+  padding-left: 15px;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  -webkit-overflow-scrolling: touch;
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+  height: 50px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  margin-right: 15px;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+}
+.navbar-form {
+  margin-left: -15px;
+  margin-right: -15px;
+  padding: 10px 15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+@media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    border: 0;
+    margin-left: 0;
+    margin-right: 0;
+    padding-top: 0;
+    padding-bottom: 0;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-left: 15px;
+    margin-right: 15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #f8f8f8;
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+  color: #777777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #cccccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #dddddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #dddddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  background-color: #e7e7e7;
+  color: #555555;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #777777;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #333333;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #555555;
+    background-color: #e7e7e7;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #cccccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #777777;
+}
+.navbar-default .navbar-link:hover {
+  color: #333333;
+}
+.navbar-default .btn-link {
+  color: #777777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #cccccc;
+}
+.navbar-inverse {
+  background-color: #222222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #ffffff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #ffffff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  background-color: #080808;
+  color: #ffffff;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #9d9d9d;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #ffffff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #ffffff;
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+.navbar-inverse .btn-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #ffffff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  content: "/\00a0";
+  padding: 0 5px;
+  color: #cccccc;
+}
+.breadcrumb > .active {
+  color: #777777;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 20px 0;
+  border-radius: 4px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 12px;
+  line-height: 1.42857143;
+  text-decoration: none;
+  color: #f37f11;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  margin-left: -1px;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-bottom-right-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  z-index: 2;
+  color: #b05a09;
+  background-color: #eeeeee;
+  border-color: #dddddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 3;
+  color: #ffffff;
+  background-color: #f37f11;
+  border-color: #f37f11;
+  cursor: default;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #777777;
+  background-color: #ffffff;
+  border-color: #dddddd;
+  cursor: not-allowed;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-bottom-left-radius: 6px;
+  border-top-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-bottom-right-radius: 6px;
+  border-top-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-bottom-right-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  list-style: none;
+  text-align: center;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777777;
+  background-color: #ffffff;
+  cursor: not-allowed;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #ffffff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #777777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+.label-primary {
+  background-color: #f37f11;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #c8660a;
+}
+.label-success {
+  background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
+}
+.label-info {
+  background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
+}
+.label-warning {
+  background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
+}
+.label-danger {
+  background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  color: #ffffff;
+  line-height: 1;
+  vertical-align: middle;
+  white-space: nowrap;
+  text-align: center;
+  background-color: #777777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #f37f11;
+  background-color: #ffffff;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding-top: 30px;
+  padding-bottom: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+  border-radius: 6px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container .jumbotron,
+  .container-fluid .jumbotron {
+    padding-left: 60px;
+    padding-right: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+  -webkit-transition: border 0.2s ease-in-out;
+  -o-transition: border 0.2s ease-in-out;
+  transition: border 0.2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-left: auto;
+  margin-right: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #f37f11;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333333;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #3c763d;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #2b542c;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+  color: #31708f;
+}
+.alert-info hr {
+  border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+  color: #245269;
+}
+.alert-warning {
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+  color: #8a6d3b;
+}
+.alert-warning hr {
+  border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+  color: #66512c;
+}
+.alert-danger {
+  background-color: #f2dede;
+  border-color: #ebccd1;
+  color: #a94442;
+}
+.alert-danger hr {
+  border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+  color: #843534;
+}
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  overflow: hidden;
+  height: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #ffffff;
+  text-align: center;
+  background-color: #f37f11;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media,
+.media-body {
+  zoom: 1;
+  overflow: hidden;
+}
+.media-body {
+  width: 10000px;
+}
+.media-object {
+  display: block;
+}
+.media-object.img-thumbnail {
+  max-width: none;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
+}
+.media-bottom {
+  vertical-align: bottom;
+}
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  margin-bottom: 20px;
+  padding-left: 0;
+}
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+}
+.list-group-item:first-child {
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+a.list-group-item,
+button.list-group-item {
+  color: #555555;
+}
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+  color: #333333;
+}
+a.list-group-item:hover,
+button.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:focus {
+  text-decoration: none;
+  color: #555555;
+  background-color: #f5f5f5;
+}
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  background-color: #eeeeee;
+  color: #777777;
+  cursor: not-allowed;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #ffffff;
+  background-color: #f37f11;
+  border-color: #f37f11;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #fde8d4;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+button.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+button.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+button.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+button.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+button.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+button.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+button.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+button.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+button.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+button.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #ffffff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #dddddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-left-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #dddddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  border: 0;
+  margin-bottom: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #dddddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #dddddd;
+}
+.panel-default {
+  border-color: #dddddd;
+}
+.panel-default > .panel-heading {
+  color: #333333;
+  background-color: #f5f5f5;
+  border-color: #dddddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #dddddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #dddddd;
+}
+.panel-primary {
+  border-color: #f37f11;
+}
+.panel-primary > .panel-heading {
+  color: #ffffff;
+  background-color: #f37f11;
+  border-color: #f37f11;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #f37f11;
+}
+.panel-primary > .panel-heading .badge {
+  color: #f37f11;
+  background-color: #ffffff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #f37f11;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
+}
+.panel-warning {
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
+}
+.panel-danger {
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  height: 100%;
+  width: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  display: none;
+  overflow: hidden;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transform: translate(0, -25%);
+  -ms-transform: translate(0, -25%);
+  -o-transform: translate(0, -25%);
+  transform: translate(0, -25%);
+  -webkit-transition: -webkit-transform 0.3s ease-out;
+  -o-transition: -o-transform 0.3s ease-out;
+  transition: transform 0.3s ease-out;
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+  -ms-transform: translate(0, 0);
+  -o-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #ffffff;
+  border: 1px solid #999999;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  outline: 0;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.modal-backdrop.in {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  font-size: 12px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.tooltip.top {
+  margin-top: -3px;
+  padding: 5px 0;
+}
+.tooltip.right {
+  margin-left: 3px;
+  padding: 0 5px;
+}
+.tooltip.bottom {
+  margin-top: 3px;
+  padding: 5px 0;
+}
+.tooltip.left {
+  margin-left: -3px;
+  padding: 0 5px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  background-color: #000000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000000;
+}
+.tooltip.top-left .tooltip-arrow {
+  bottom: 0;
+  right: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000000;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  font-size: 14px;
+  background-color: #ffffff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+.popover.top > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-width: 0;
+  border-top-color: #999999;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  bottom: -11px;
+}
+.popover.top > .arrow:after {
+  content: " ";
+  bottom: 1px;
+  margin-left: -10px;
+  border-bottom-width: 0;
+  border-top-color: #ffffff;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-left-width: 0;
+  border-right-color: #999999;
+  border-right-color: rgba(0, 0, 0, 0.25);
+}
+.popover.right > .arrow:after {
+  content: " ";
+  left: 1px;
+  bottom: -10px;
+  border-left-width: 0;
+  border-right-color: #ffffff;
+}
+.popover.bottom > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999999;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  top: -11px;
+}
+.popover.bottom > .arrow:after {
+  content: " ";
+  top: 1px;
+  margin-left: -10px;
+  border-top-width: 0;
+  border-bottom-color: #ffffff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+}
+.popover.left > .arrow:after {
+  content: " ";
+  right: 1px;
+  border-right-width: 0;
+  border-left-color: #ffffff;
+  bottom: -10px;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+}
+.carousel-inner > .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform 0.6s ease-in-out;
+    -o-transition: -o-transform 0.6s ease-in-out;
+    transition: transform 0.6s ease-in-out;
+    -webkit-backface-visibility: hidden;
+    backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+    perspective: 1000px;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+    left: 0;
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+    left: 0;
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+    left: 0;
+  }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  width: 15%;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+  font-size: 20px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+  background-color: rgba(0, 0, 0, 0);
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+}
+.carousel-control.right {
+  left: auto;
+  right: 0;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  outline: 0;
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  margin-top: -10px;
+  z-index: 5;
+  display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  line-height: 1;
+  font-family: serif;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  margin-left: -30%;
+  padding-left: 0;
+  list-style: none;
+  text-align: center;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  border: 1px solid #ffffff;
+  border-radius: 10px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+}
+.carousel-indicators .active {
+  margin: 0;
+  width: 12px;
+  height: 12px;
+  background-color: #ffffff;
+}
+.carousel-caption {
+  position: absolute;
+  left: 15%;
+  right: 15%;
+  bottom: 20px;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -10px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -10px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -10px;
+  }
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-header:before,
+.modal-header:after,
+.modal-footer:before,
+.modal-footer:after {
+  content: " ";
+  display: table;
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-header:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table !important;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table !important;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table !important;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table !important;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table !important;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
diff --git a/modules/LIMS/senaite/assets/css/bootstrap.min.css b/modules/LIMS/senaite/assets/css/bootstrap.min.css
new file mode 100644
index 000000000..7aebd0ffa
--- /dev/null
+++ b/modules/LIMS/senaite/assets/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v4.1.1 (https://getbootstrap.com/)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/modules/LIMS/senaite/assets/css/style.css b/modules/LIMS/senaite/assets/css/style.css
new file mode 100644
index 000000000..a0e11e6dd
--- /dev/null
+++ b/modules/LIMS/senaite/assets/css/style.css
@@ -0,0 +1,38 @@
+.navbar {
+  border-bottom: #f59031 3px solid;
+}
+
+body,html {
+  height: 100%;
+}
+
+
+.img-logo {
+  background: #f59031;
+}
+
+
+
+.login-bg {
+  background:rgba(0,0,0, 0.7);
+}
+
+.login-title {
+  font-size: 44px;
+  margin-bottom: 20px;
+}
+
+
+.badge-libre {
+  color:  #fff;
+  background-color: #f59031;
+}
+
+.container {
+  padding-top: 50px
+}
+
+.setup-icon {
+  height: 50px;
+  width: 50px;
+}
diff --git a/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.eot b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
GIT binary patch
literal 20127
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.svg b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 000000000..94fb5490a
--- /dev/null
+++ b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.ttf b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
GIT binary patch
literal 45404
zcmd?Sd0-pWwLh*qi$?oCk~i6sWlOeWJC3|4juU5JNSu9hSVACzERcmjLV&P^utNzg
zIE4Kr1=5g!SxTX#Ern9_%4<u(w1q<J@CsjEOL>&01rlrW`<y$HCCf?Z+y45=o|!u{
zcjlhEoqP5%FoVJ1G+bj44I8ITTQqxJ-LCg=WdK{*^eI!Pu_*@0U|>Z!56xXTGQR4C
z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!C<oCzO?F`i#HxWjyD@jE}WZI
zU3l5~SDy9q1|;#myS}~pymONB?2*4U816rW`)#Xn!7@d1<NOHDt5&bOWb2!+g;p30
z4<NsI$%PwMp0nZD-M=sx9=^?B5SrGVvvng|Yryk+==sq4bJm^rO#Q?6;T&}k_iWs7
z@g?8i`(dlW@aQ!LgXLG3o_Fr~uM{nsXD~dq2>FfJsP=|`8@K0|bbMpWwVU<h#k=?&
z2hLD3ege)J^J9<Jz!_dI-O6?vWP>Eygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi!
zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyB<gVy2N^Mz8Y_p4K;?4
zVT9pf!y_R}Xk_T@(1FkoDm{_X>VYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX#
zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w
z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkgu<LN>aMR%lhi4p~cX-9&
zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq!<s)V`@Q^L
z`rY8W#qWgQ@xJ2-1w&;af5?RzOBGthmla=B{I%lG6(3e?tJqSpv0`mSvSMY$Srtnw
z=2y(Bm|8KV{P*SWmH)c@?ebrg|GfOw@*kDIQ2vZb)ms;}`oI6t>@Wxz!~BQwiI&ti
z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${
z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!!
zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&>
z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB
zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8#
z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9<u78GO6Sj7w|BmAX
zYy>A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^?
z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1
zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52
z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_
zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uov<cnLsMTt5KB)Lj
zYZXCxu;1bqjH18<x269<Tv%)JD-Sv?wUz&5KB?<}@bC!>p}yerhPMaiI8|SDhvWVr
z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm<RofF(aiZ;^6Sh1kbq&8p87Q}2
z)<!HT6VUck^|BOZR8X4U*lI4NmphK3T)k;q2UF1)TE2tD(Oq%0w%C5uBAc|kj54!X
zjK;0TBFmM`n@u^bcUhg<U$UozsV%ZmyUQe7juv~qZStAE?UA}H^b(uR^svd6<ohSA
zPN(&WybCrXyU=981ISP9mNdxHZPF8l4xGdT{y?OqQH)eNL?x_*jVgBKQggghY;ER4
z2ZJLPNi?@5u<K+P9v^?cajfyXk(LSV0q=;>@g^s`BB}KmSr7K+ruIoKs=s|gOXP|2
zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX}
z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg
zZHY$M0k(Yd+DT1*8)G(q)1<YNpB7js)5y12Eq7a-+TSy$n{z4WbFWWmXqX`NmQ;<8
z&#kMnTCG)e^Wqb#OY{bR(&}(pp3G}-_B)F+rS(l(vS<RecZ%(lx`adE6b#<MA*v6|
zqhg4L;6Ok2!XZ8=`3{3lFr+}jevG<T8z$m4n8_pfbf#&K;T~jROxF%RXK8L@N{?d!
z)#u0D$E0^47cxZAeVEjp$RK_kRO2h>&tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH
zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXR<v?#Pfy-SGCMD6($H@d06+dYtCwDuCKCO`
zfTh}KuF@>U1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O
zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So
z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T?
z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)X<wQw
z7V$PDEtth$n$E;Ll`Y4%BO_9n-ugy!JpHdGlaMf3-bFSa<&`Z$)FNx2;bGa5ewQ9G
znS9p(JK$Y-8V}<ibr6q#cKkEx`_lIfW`o_}!WDwa=VY;jm&MFX_KN*c$8NiQ<*(1K
zOz-}+aK2WdJ+of=zJ0eN>NxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN
z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w
z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo
zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ
zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@
z&*24U=y{Nl<J@lPNofl42dq;77(U?JMya(0Crr4x>58qJyW1vTwqsvs=VRAzojm&V
zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn#<ZJY+2YKgUZIdddsj}x<a~(_z&i7iw6j~
zD6-dYj8)6VXu?|^ZEI$`u2WRyTK0%)bZh&!D^9oe9c{ncschFCaT|SNh@Ip0Y7e<>
zUuheBR@*<muvvX<=P{exAmqKj@)RY=k${p2#1fI%*ObNn_Svg5fBeeKm;N;8<i#ex
z@xiUPeR$hjC=hitVD9x2{{y_iS9U^gG9f@6f6&^Vs3zp5qf?=KTW@F7W@hJ`ZBCj<
zPCXs%#Cv+T9c^4a%MvhtBnK>KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH<N
z8S{R+VU}U8VWDBEjsa+<a|A}qi`v{;%PNhy=5G#TrE#}Jn{iFX7S1~=;h}j7?-Paq
zPz1GeaZ=ceNsUv?a;Nj+<UmnU3}yC*^X?4%XYRVxg{MEFholmVGnq^}E!rMBWy|R_
zg)925;70bcj_+u_rTSN(=HrLgwiaEHUwf>{L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D
zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@
z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@<WJYami@2Z&u=;5
z5Vc}@3ijIdgOz2E{1ewt+&m|4loMa2;l_ZQ>ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP
z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of|
zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD<C#<5
zr)TgUn*z=?aQx5GtI}?)S=9!TmC))*YbR(2eeE2+a>{&O4Nfjjvl43N#A$|FWxId!
z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz
zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx
zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^(
zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2<ov
zdi9d6DbT*4=K1<NxE2(`@^$C>XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU
zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4
zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC
zB5_{R=o{qvxEvi(k<Br-9y#p7E~9amU@sQujU02m+%O6`wmyB;RZm|f_25ZIu`sWx
z9Z!xjMn{xa)<lh?>hbRS`FOXmOO|&Dj$&~><!ER!M(aXh<Y=PO>*oo)bZz%lPhEA@
zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y}
zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<>
zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN%
zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+&
z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG
z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH&<YttXG
zCx4~x@x7rvSlVC8c4`|@!#-B8ZKS<EH?nhD1$CFfEvQA7q3vKKC(B@*EPV@^RffeA
zqF7{q<g?nf7wl2mS$#hW3X3?XI^l_=xWmcuOlQEQZFITVPFH}vOiW=uH41qNTB4w>
zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa
zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8`
zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+<q(5YAazG9MX#mAntl?z6uydZjo
zUFklHM_4M@0HYVoyB8BtKlWH`xbBg99hUSZMa9}uddMW%i`jRIi-g-Oj+Dcyby^(`
z%RQFN&dOf4Ittp8bTTLHYY;pny(Y2BDO&N?wA-C_6&0Pd?aun4t;+U8o0V7xD{xVE
zT_xFkLYF;IV~uA~NIx^oe`|Ag_zBH%@tGSHD~4^4RZ^~BcP(EUF`avIGk5b#Qq_%$
zWYy4>R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq}
zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2<p!Ww
zwwmq`!~oDTY^~4nP7mqhE1&11QI*f_7OwLIc0Sdl0He@3A$?sO|G#_xO5%4jys!Au
zz!P*LF2Fu*;<$-+ZxX4HAsc@9KfXGYIspZeD-?_4;Ohrd$nih9sE;A+xh%Yxa|I;O
zMn43xybbA$h%OeU78ZAGUa0jg*n))`>+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B
z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq74<ru+<wkuK7q*HuJ
zl3ikW@`O=kCFAR2we{1>7tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB
z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11b<LZFLt
z=a@d3MJ-E4hYQZxA3y&6-j%$UZvUfp^pCgm<jTEuP^)mszD-y$n3Q&{-23}Wv_2Y8
ztp4g>ZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u
zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W<UwWy2E;b%8
zDnv;u#sg4V5Tml=Bw6)GO(a6bm@pXL5;t*}iEhY9Zim8L-OM$RpsE=-)J6=6)|MD4
z8{19*DSK107+0Kbw2EdWh!twa9HVGLVmN$BX1?}c?!DT~m@%MuO{=cju@-!?UnaO{
z9Q;H&SNsH&+9*iqK+))0P{pW#u+IR2<&dC||BFzIuVKjDIAwxj0gQDf!MLF#VHC`D
zN_zXShCf+#K4Io(-dXedBI4SOK2y)rryrPZ_8G(S4~O-`iR!5u^?GLIlD&{}so=+h
zoX&5625-D!az-|Zx~ma2tVY~n7Eznkush<8w1#D9lj%>6v^LYmNWI)lN92yQ;tDpN
zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2<Tp(F_Ylx9mIONs=GDOR7J
z!s@{!h&%A8Er}aMdD0mk#s%bH^(p8HL6l-6iKJ%JY$!?VLmDqZL7D4xf%;gN>yaFo
zbm>I@5}#8FjsmigM8w_f#m4fEP<w>~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To(
zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct
znkHy(_LExh=N%o3I-q#f$F4<wlfSnZ{aNtlaHgD*%*;+!if9}xbu`<To}#^Vl2QkO
z7|r$zhjK8GE;uJ+566KrGlUndEl83;o70s<D1jcM$y_hC&+<$#S-_D`DMkXCs6&Ja
zX$kb)3d(TSz&8E5_#CeAoC7l{hxp54WI)}a6Fq*MuVt{GA?j6in~9$1>QJpy>jZBW
zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmX<?O%M-wa0Dx5a@<^0#9_>LC
zF_+ZSTQU`Gqx@o<HpS{<a}-BAGy@<S0>(~<vXHshk{*j+nj`s1+omT#^krl>B$dbr
zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b
zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8
zf;rZF7Q>YM<qvPX@rO5R|G8xB*d=47F5FbX>F1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1
z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9|
zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x
zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD=
zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u
zW<lfR&2thZ%arCCv7^XWW_6jB>8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{
zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1<sg)|!DAM%5V4
zImfj?oZv3;y3AIvb^=HU^uh7(X5<6aoUeyP2Mi=23DNrjwj6G-I5MpbGBBkQgLzRx
z_Qg%sVsEslI2A80hOod<S>jI>7e&3rR#RO3_}G23W?gwDHgSg<QXM9d4Lsp5W&)6?
zY*roO0w$UqxC4|r(Er$DV(2l9h4At3N_U`+Ukis<fpRRCK>ekzQ^PU&G5z&}V5GO?
zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq
z;yNi9veH<s@9We549w!!z+8C$Xr3bE8Io{iV0-^0*Z((QCVLd1<H5EqJokRheRd?M
z=9-#Ba=FG%;bgG2sZn!v5}(U9c2N6|uSx2-^nZJN<Y38%>!j)ba$9pke8`y2^63BP
zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4
z&?*<A2U+2yvz#~5iMlAv#&#x?J%g>IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7
zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF
z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c
zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU
zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_
z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p>
zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i<<vQD<>c
zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c`
z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG<uj&`TKbvJwt*s;^z;4Ys<BrXj
zUcC9nsnf4nJ}oNAV^;23Huc6W7jNCNGp&VZZ68xTF&1%{6q~EkQlv<(iM7j~voh3C
z@5k4r3!z`C;}lPV?5N1<S*Q-j1No*l<5(hps4yh~OUMfaqfZSw{1(}GVOnN8<B1ow
zokS3`Befl=7x!u#A9>*gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh|
zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%`
zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA=<qv3s0%`78x7-
z!YG+vXM)||6z({8VoMOb>zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB
zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP&
zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ
zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc
zF;I7)eL?RN23FmGh0s<krvL@Zi`9X>;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR
z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i
zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@
zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4N<n#
zKe-3R=W^+cuK>KjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK
zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~<f);nGGD>|@
z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8=
zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl*<nInof4ph4hK=1pB+w>_7IY-|R%H
zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM%<x2
zq&@Ugp@y3#qmCWN2c()zUb2i%NHytqe#*|FOc9=9=lm37FJ~XnjPaYV#gu{Rxk3h%
z6(mfsR@KE$kTrlhgn%DPo5HpDO0=1-df|X)k_Bt?_o11|zfG(qa-#Sl@L(<sfroJg
zk#3es02GuhOy#7gPL>vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1
z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ
zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T&
z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2
z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>az<ULIsNY$DJI@Av_2K^yD6wo0kqHs
zV#M>oo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o
zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e
zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@
zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0<
zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af<
z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dB<cfvg5VibV&
zDqvU$KKCo4v0yI;auEcF&ZcvUE7}qhEUthMrKK<ZZorlPhfA2o9*2RG_C6<ZwD)23
zgbU<ugZCNmzTNu!GMX!>aiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s`
z$<vvU|F(3Nv^%2-!)gt%bV2|xrF9!>t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe
z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF<AGx+lu0P|(*RBdki}PPC
zR884Dd(Bf1Tr>@Epw>AYqf%r6qDzQ~AEJ<N!$QjqcKBS<-KzqABShp7@2HODUtuI-
zM1Hm0Vba1HggryAaeKKwP<qS1QZN90CS+8P%>!jtUvLp^CcqZ^G-;Kz3T;O4WG45Z
zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl*
zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W<
z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS
zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC
zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ
zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C
zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN
zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E<ESfbH6cV^f<TVZZ6$j;;%C;F7k#%v)~#tDz@O9
zGjF`&rD{{KBD!Z>=jbypS+*ch<nT0vi*LE;jA`dwa7L|Pk{%Vkrl+;{Q+Icda+|DH
zxbX_5rMru~l@p?-nW}qiMdIwMuOHt$v$Z->I&zA+C_3_@aJal}!Q54?qsL0In({Ly
zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j
zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F<R}h5tU~DoQW2-
zb@mx6M$TIWS(5Azchs1S!C1Vg!dX-qRh*Tlox4o><>YJ5J9A2Vl}#BP7+u~L8C6~D
zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP
zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg
zqe*c8##t;X(<vs5F6*OK5RBh`;EMHg+sn$v%w2!Q1AFLXOj%hwP6VgZXe#dgvNr%C
zbK2>4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p
z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A
zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv
zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_
zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob
z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l
z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h`
zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h
zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb
z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%s<cic@|#d
zk`VYkAA1)5&zzBlUXwX>aRm&LGQWXs*;FzwN#p<?>H&j~SLhDZ+QzhplV_ij(NyMl
z;v|}a<m1KirP40Q9;?ZUGeiBO`6EQCP%m`AbDrv}WVxc|a9*xhB0zVg4PQB(Updr=
z()&PI0+wG1-G5cn-?{zrU(p$hh$VW4zkc`j%O6su+dqN;>mvxRddO81LJFa~2QFUs
z+<rMf(`FCeM}FJ^oJ6DQ^2{Nc9R`a9PEsYsk4d<kKA^opcC1pDZk0kh9^Gygk8>Lk
zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceD<ex)Co(^yo~b^iS?
z-G6>pO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<)<fz%B
zj)+x<OZ_gB*%c@YSI6p9w+Ydpc!Zcf$QEBFDuqEL6=PD@Pe~N@st{xMy+-n;*Mt~v
zmrteH;(NO63jTi5?DV@CF_fsL-w|T3X%De;sQHBB^9@P)Y{)Bp<max_sHiv=Y2ujB
z*Y0pN2vXRDgae#VLF1APpWP+=i6luTbXun4wCl7o-h=Gg-_V%L+$3>n`W@AwcQ?E9
zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c
zOp1!v6qU<Kxjvk}u}KI}1IL4P)HQX%3Qy1||7)ACyj<$_yY^HUY1Qh86mASo5oGq6
zE#i-HjkgKyfR`wC1AzxilV;sCL6u<;DfJ$k2lHogcuG&96Y=9Dx08l3i%#>)@8MY+
zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L
zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE
zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z
zlei}<<dHMjP`dMgT;)rz@KwnNqz2u#jL%!`ao{S@tM3IGYSeTv3Fk3tBkVZxLRlho
z@Yxs}5wdFIYX}Vx7;lNy5jfXGDv1)02|!y=K!RAWW@=@lh*MCQ(we#;x;&XaD>_ni
ztFo}j7nBl$)s_<W4is^tCJZEK$$)&HpdlqLPzQFWv`<{7GL_AD92F#&(|%OzJIbuy
z+Ol{_jn76nNgzuA>3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d
zm-{?M&%(={<F~lIWhEX{d2;PTbK5UDb8+WLo7GcN=5=ow@4S4W$LOt!x3rG3C8mvr
z0>xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR
zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw
za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsr<Zy{+LyD`h4YS(ghy#BfWzW^5Uo
zQ8PC9sjEJ4RGC&$F|HxuyK{woR4L3OZu<36tuvn9l2snS_;Y@J&z1A*lMO*_Ur`v=
zX;m?{v#RtbKP{_C_Pwp$oMe|?dH6}PAjk=@Y1ry|VVd(HV4<-(-0+OjB`EyB0T=kn
z(gB<B0#L(B#0`VW)>ybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm
z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u
zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@
z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U
zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W<Jk_Ub)RM4SgV&OId4;
zn2zn6!@5a6q<V@&t`j1NlR++Q;e@+-SbcuS)(a+|%YH!7_B%_B*R5T=?m|>;v6b1^
z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H
zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS
znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P
z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ
z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=;<J1?+^3A&j
zK3cnIJ@xJ)8})7lyFf5`owi5yu4lj04lY55Grhwxe6`Vjk5_%2h6Srm0%!Z7OTJgS
z7xk*fSj^YWvFa#^cCzaibaRR7wifomC%U_?eh_XL=5Hz83qQMDCary#^CqnoCok6y
z#aKY5h8k>R(gF@GmsRI`pF+0tmq0<eALkrdNz?_uQPl5L<ziG;l8G^BKV7-hN+!<*
z<qETgy|$oSZ328w$u~CVg?j38Ne8Nec!$^z3O9)SK=%x<?=HO#`R=(x+xbP_2n9~L
zA~@Y5=^p7G^ly*h(SjbX22XE{f_H~{EwlIe71&(CF%AC-KZ!PkfDiovb({chpQJjK
zFbjvUr>zy~wnoJD(<MLjh**JGO%zg$#8^?N-Q#VEMllAeBN{8Gkcp5385M+IP?10`
zKNJCQBzyb5Gta#5ZT-NK&Jkr}EY5LG-*{2<GI5k_E;Cjl{9Li(svK!m$F~O+U$JQS
zMZAi<dUJWWO0+lGoKxMN#+rIpvr}TmT8W9)5>LSEwHjT<no^?z{l8Hbtg<ND1Cr6K
z6#0!VQ^*}KTk66St&+e*u_9r$$-(;3c2C&lF^#Wti6x@NV{uFO48lerx@~U7EQm%~
zi8-wSrE-(Ma!Z+cdXdE^nH(<3+*mF-qjhezv`kVwaQ)pBtm+Jzn4-9>Ot4xb0XB-+
z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8
zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2
z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj
zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46<z}8DjmoX!f<;!=?S0X
zNm_qEi&;s|L9ptUk0h&55Ob{uhVekW1KY3{I#Svm7#;P3BE~;lg8EY6Q79rf(MCE=
zN8VGwjyg@p(Rvv6Qeo&vGBF~WTM7Tu+BS~CYXlw<;F93zrP+w<0f)nm=oOTD0XeL>
zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QA<GQZo
zHC=)78Wbo&u{ERGcuiNo;G#(z2^9z>vMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC<
zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y
zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu
zH_vFUt+<?-wHx^jA;=HXzQKp_j)#`&591BSP(wIOS;Ce(17%gs%~hdM@>Ouf4SXA~
z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7
z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pe<qclDY+ja_*(_95xs;%%
zq{v>PJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2
zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH#<v%tu={Y=OlW2%;gK%O0*}OtgP0-W>-eS
z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~
zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt
zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd>
z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj(
z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T>
z8WW!QK0SgwFHTA%M!L`bl3h<zOXT*J6fe~c%_xb0$mxr#<2VD=$rO0L8nX7*#{Ksu
z$LONOvFCTfJN5XIapRVZlX}Y=<Lbb4!eHVHYIDPW9?-^*TjQ2+nH<TKdTCuE{W6Ky
z7>HjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5<xG4RL_K~wL=!|H8*ZSVn
ze*QWuVl90vQ035NRw9cT+>%-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4<MOn
zEoNk8R4!uRxI3kmMnO0fow{Ibz3`A^4>rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS)
z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ}
znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ
zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8<m2C(MCx~x+Mo`}Jf7gdL>
z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn
z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY
zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4
zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7
z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2
zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1<Pr@Tu%2mF`vob
zdsw;fW5J;CqD*)A#3k~8m#E~>!a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb
z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`*
zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ
z(j6<v3j>;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2
z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i)
z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?e<VR4r!cUQcNa*
zLw&@@0{2I&$oQBHjs;Rdk`@6y1!<-(7NgjbFuEcwrG9}&Hy03(S??>Nz}d^xRaz&~
zKVnlLnK<O~>#8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y
zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh
z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs
z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7
z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&=
zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a
zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKG<MLirH
z+DX^Dk(~hl-o)R17Ke7NBWBmGx0}_Yh*L{$3or|S`y{XU9=}stg7(?(^wZZS2Da%+
zWvCP|MzT2WK(<`aoEV!R1WAp-r%3{)SA=78<qFf;<rwNmD*Y*6(NUk(!LD}1(qHA3
z`=B=489M4KM^RxXd(tHgT%9X5Tjnh2mdXv4MCT5VYa7rd+N5ISRlSW}1lw5{(5L@K
zwzTh&rM#;2<;oP^LJod0{WsXpN5C{w?l*Jg>av0^={~M^q}baAFOPzxfUM>`KPf|G
z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm
z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0
zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C=<NH+_Q
zuVOy!BKDYAHt^L);tLou9Iw!KVrZ;__9lB4Qu}AkDaaH65g@R}lia;0J%u}*93`p?
zaeF={6)8oIBzH4kIggVAVvNSbROx-Z(+`hO*myDp7yv#WCwMIxk<hHjD5AkCV*KFy
z7uwrr!(roY4b(1>RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2
z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq
zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o
zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X
zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj
zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2<mw_Yh7ly>oX9^^4|Aq%GA
z3(AbFR9gA_2T2i%Ck5V<FfGDt5jFr`inQh;1&EJ*>2Q2WW-(a&(j#@l6wE4Z`xg#S
za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;z<j+vge|-bMmFe5eQtw=$jBe&1J+DLGhNXR
zVF0LJkT6h0B8nsw@>vx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0
z<gP-h@3s4i1u==>FU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1
zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0
z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef
zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>=<ra>
za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%d<Ke$F$Z0AGpq$L
zh*N9G{;KEPa}gmeOBNBk0zORp;`+VU|1_04|4V$bCz(R~xePApA?YFdZU$CR63IbQ
z2Pq2(THUz7SlMWdHOdM19(SYTR)^7j>G=b<Uy4X-FL@RBUeVq-s%!3f=Wp$pdFiyc
z*UH5I+~YQSU-pf1Z~4Z+d0X6)<0i*Q_Z}vh)KKf>l^rv8Z@YN$gd9yveHY0@Wt0$s
zh^7jCp(q+6XDoekb;=%y=Wr8%<!i<hjG`j2f#)CHoE%?oHV1t_^966$UcQ|tMEj_Y
z^Dp_?#syJ7V{9Es?J3v}f}pPx{87yPa7|66#gbBs#7ePJ{bo_oH&rCWA~hx1V^t$U
z+8@1TWfn_Z`;{~9gC9mv?eoQ*Y-C)rhp|}dc#r5_J0yspKw$C`a}OGKQh(E&3WUik
z4AxbHbeGhXO7DYJ7=8m!=+Sj-HxJCb*@hx`<Q?E73ZqASI|ZO4gQX;PgpcX_I2dEP
z4PzF^;fhXQ)40w{k(P#>6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8
z2V<U){GkH!99$-?(vZQ6`9xYUH;m>;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy
zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6K<iTA=O-~d|1@8nQW|764_gHT9A
z+Jdw)Cus?cfv_Gsi;gF31B#4DZ2^Yn1Wk~wI*LZ!hnDLnI_*R~z#5pH4R3KO1Ir1F
zNQX5wC;<FU(7pj+t&{Y#h#K(_6=WtrHj4aPX$5uUHjT;c(e}35?V4?SZCg90+pyx(
z`_R8jCQe*LR*{P)PNV>F|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S
zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh?
zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI!
zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b
z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s
zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt
z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6
z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~
z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt
zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^<s*I^w2}g4)
zDT(2xL%uqsByOSZ61tavt7O>~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq
zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn
zqewq3ctA<T{c@#lWCZ$(!d{cN7=2we77Yx!0ew~Gx<3;vHo@;Z=)<i6dXzL;AY|z|
zQh^P>A%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e
z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT-
zt9<G*I5j~YwPM=zQc<-<5T)`?p=k3wJ6%=B%=d_@HDXhwqg3ij6<6Gneq}IMRsO?+
zZ$ux+&=>08^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C
z@f1gRPha1j<g?ml{#gpkD^O$XNTr0o(I;d;h4uA8LjteITT`#--;T+ZYX+t7g{&jY
z%jLmo;U5!e_41&}2`Y3PtJNiOtyHYGC;e`w)XqI9cfa-k)QH;zlhbma7)pQ1mZ#s9
zrt1Z7OQrg>q|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG
z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo
zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I
zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do
zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5(
zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae;<xSoo%JWgt|4OsWqBge(0MrWCl{^{1qR
z$9kiQL{yp=)4GQGI_Jm5&g#GDTYcGhkauMJQ(qfM)1pg_a_8YpGwNbwNKp#T3-1@6
z|CjTBM~_fXe$Rs`cJE+v;7^0eysLT1ugyST5y-lLQ?!t5I+r@})qno};JoRD-E=Xi
zX_8OynCqNAP{M@6q0{1lA$fd7YVYB^B3HOC?;KS&skUZdpr&?G*{Dvo9Hf%gnd2O9
zvFCA)Qg13bH?d=3bMwL-iMgPupd}c_KuUy2B!UeZUr<=BIK|YBv?yV$q58*?!w_CK
zhp}K1=StAQ6{?zIqvi9mLesqVm&dX(9+AzcRVtrMpZ;{ErIyVQpVYzYVcvn6%u9m3
zENe?2g{r;1I%;x<{deB!54%lK?QVcb%q|Y(3&@xG42;qPh~(~r6ouOokrhp}g_Byo
zKp4yiKG~E3?*xr!?^(OHXYKbID@Vk%L$MJN?dLjF_FD?rZRr8zTic`kxqVF61s8OU
zY1cLlYqVUOIkCpn>og&!J2;6ENW}QeL7<PXg{yny8O<B+-%z=8!`{k@uZK?dU2tpL
zoDCc1bk4tH!`>3jatbI1*9X~y=$Dm%6FwDcnCyMRL<PZ=`4kP-O>}zo`0=y7=}*Uw
zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m
zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB}<BZV)NY+Sf`GmW4*C1<w9<G3@Y
zR-2Ao^uw)%Z0Eww)CNf&GoE61(l=R$@lLulhRTBom-G)|sA)*B&(~_KWRT_L+saB5
zo*q>AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h
z@kuLO0F->{@g2!;NNd!<zny}%07Jn8Nf<E`qd>PfqM-;@F0;&wK}0fT9UrH}(8A5I
zt33(<pT6JhCadCO^EwcP0}B}m196bLHZSD1wzS~lgDzyBOMDp_>+&U;CLN|8+71@g
z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9
zq}$VrE0$GUCm6A3H5J-=Z9i*biw8<GlN{|J&^K2l_*g<#Pt^RN|DX}11Ly}*7(>ng
zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w
zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`F<!Rj$KZl*<p
zT?$eX^b9WOf%^Fc5Ow$#oiLZxFXB|4X4Ah-N23bVC3rdbHNy5`I((oY2SI(gVJE_3
zv~k-4(EcFxN5Hx@>zhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e
zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y
z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S
z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m|
z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+I<PcrA4vbhkc}Ds9
zVnPj;dD9hvN^{*9tq;`Y3-i35x*J^9kk!Mknb6QMp+R%r;|Y~}U1bd=<D2Z^=6NHx
z)o!mbv)c13!qxVmdz@Dme2Ud2?)buFbw!<Z_N}SPHX2@PRM{c<oRhmdQ=Q!h%GA-#
zE|+zRyX;@_)`kh%@3wm_ZjUz-66I&coi<`>jd|p*kyn;=mqtf8&DK^|*f+y$<HJ*z
z{kCJi%r~syv1<5SAj?Qn<RD-N0#-mimPHVGsjQ(4>38+9!sis9N=S)nINm9=CJ<;Y
z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>66<JwXm0Iz|uD_GISrZ<tb63#|b6
zmesyu7v#<;wAs4wx|xl$8!C)O(dny+&uQp5Yiylr74+Z{`kuduLfD{$!RweaKvq@@
zSKvT=l{+EaFCqSAuk-})NiD5^S-DyEOCPWcr6mSZED8GEaH3HbBi=sIw&e0Ek0*HT
zg7i-oY%env)m$!wZo6{H^btX$@qVG{e!&!~J#BILfmfs_E?=UpX#O6)G;!&c?y}Qg
zZDtQIxqNpZ+R#vKv;FOFva`NsR7883$-r&2{_WuFALO<~3Fk}Bb(WC&g8i;%)qzDY
zRjOTdfX!%Ad(<}BcYy4>7A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI
zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w
zvop0lq@II<?zr~h{;~Z%uibTbs^_R=H(HEh%|uq3KKIc_zxBu?d|hToq+T%unvO@H
z_7G`_g*WS&kUbvS*4>SuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N<n2C0jm
zX{r1Jy%RD8vWp=4fyb$$F_f=*`nvNgb$TK5DH~vUeDX&BtW7RGgbP7rCk$}DqbN_=
zG+@cCNjfaVNpOlFw+a>7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9
zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5u<efW`3H($g#7XgvMkYf+oz36no
z(7hfLHbbB2R0{1uae-^d+wzih8L%N9he3ud^j?e&dq$dH2awC*y4Q%$6QP+9{{{^S
zS|%?I`*;k>aU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I
zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H
znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@
zMx)8f>U<?#KGhQOH9sd_@m#$xV)2XXy+)7rj<v$+@Y;iI(?-Y3Sg0r<Nksvzzi#Zp
z$q~EP;jFN*8js?YBQ<`b?Z-d1$^IIsy$A>4hd!row@gM&PVo&Hx+lV@$j9yWTjTue
zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z
zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE
z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy
zWjP)n(b)TF<-|C<kuA~or~e()IVaJB8ThDOo%m84{2#Jw7lA;F7HB%yOOfao*a-Bo
z9vF{4tjJ*|r>G%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#&
zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk<oWhdAZNF5oEMySt*u%}=mX
zY^=DnO8CU4$;_0G$Mo-Kkj5NlGljS+>)n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug
zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z
z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP
z1DSd0QOZeuLW<s88&Dqv$ZDY(qEHICGi1F$d4+8O&b2468PMe9JW2)dic7s&U~)}9
zv>o*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD
zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V
zC!V8u0v?CU<?sa9rw*YNr=`U}IHdv2<G`|o3Bx8D;^GeQOIB`c%X^K&>a)4*Q+Q_u
zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@<?{mQ!v2u1l{5e{t5@ZjF*S!>hatL
zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey
z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j;
z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_
zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@
zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C
zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs
zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+
zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z
zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7
zu@@lu=j6xr*11VEIY+`B{tgd(<i-P<xW8QmX{Uu}CW{$k=4G`<yQ5DK7nY#9L<7KO
zZl2V*aS4sKmaEUS-mY%P1^cv^q{7lxZ)5qzsWF(QH6y#+dwE4lRddpa#$Z}_cCaKa
zE;TlFY<W#EqQ=~xoZ>c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@
z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r
zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9;<O_d1fh3g+@%<JHS<h;
z`xr?<<utwG<Lj5Zdhfz~Sd#5Kb7T9+cKkOui1y`+Uv$r&om%~&H3ligXMa!k1A}&8
z`oKdmM{uQUq3k>DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q
z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQ<A<k`&*~1mNB0QW1T5I+z^l>a
z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<&
z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i
z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3
zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH
z@^S7VU^UJ0YR8?<bG~Mj6Gj-lk3HOub{MXq84f%T`QY6$SQB%P+{DM48!0oDB|1i&
zZKxv58$HkYAPzeA(N@4W-r2I(ob~ZN%-H1^uVTL2tUjwxrv8WT<9HEQp}oppV?S-b
z?TWa%T=%&4xZ~a0-G(Qtj>Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW
z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;>
zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd<ZQ^<n)7B(e{N}R
zNACLEJ-M&vp2!R2b>!{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo
z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@
zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG
zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`<?!`ti2@y+pV_8st7_#g52
z1!@8-14n{+!KuOff(Jusq1w=z(B5!jxFx(cyss+1s<Z0Bs-u@|yyQrAPIYVbrs`9d
z>Pz3Lsj9iB=HSHAiCq()ns|Cr)1<p6y)@aLys9>*c605Cx}3V&x}Lg?b+6Q?)z7Kl
zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78
zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW
z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW
z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ`
zzJ*0w9<&L4aJ6A;0j|_<vbtcWAbbzpCj3Gin*xk%@5HxYh(fosHrML5=EAoJzwHRw
zh@)_=)rwlI8GD^(O|@nqTobf9QEEG(*M$^xqkm*B>~i>+y(q-=;2Xxhx2v%CYY^{}
z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|mi<iezIsIQq}e;H<1HsO1a%jmXB^n!Yj
z`bEguLTH*W^N>H2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh
zrn(!xCjE<?5dV)b*C5Aj$gepjhO+1}F~03sn})p^Uz6_w9HjtSwO;4fgQNBdkCC(S
zXIQs_lKEg{DKt7!64@q0U7<~Z9sWW2MiWn5C=n^v2(+j+NQ}hd(YScLR6bFX1e5GJ
z{f}vqE*X+(y(=SeU6&=<n3p71@^G&#A3gi#b>0Q&EH1<ywPMV@T7r4FN~KK7(R*2e
zG3w@Kn+NlNX^aE);gT>QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A
z)Kk->Ri?`oGDEJEtI*wijm(s5<vO`uZjc+%3o%>f$W78FH{+qBxiU{~kq((J3uK{m
z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m
zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo
zn{f*gZ#t2u<vX%PzAIbh8QCV^lkM_->6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s
zUXq{6UU?a>Nc@@Xlb_2k<d?Yk`js4zSLLAmT7Dyk<TW`guge>9M1Ctr<#+O?yd}rv
z_wu&<L5|BGrBD7Of0n<<JMvdKA@9n2@;7;3{*GxNK9rO44>=_t$!Yngd@N_AUj}T;
z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{
zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81
zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We
zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs;
zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*(
z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7<F8LevXU
zFGRf%^}^H(Q!h-tF!jRJ3sWyly>L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLG<X@40
zMgA4}SL9!je?|Tk`B&s$k$*-075P`>Uy*-B{uTLG<X@40MgA4}SL9!je?|Tk`B&s$
zk$*-075P`>Uy*-B{uTLG<X@40MgA4}SL9xidqwUQxmV;~k$Xk%6}eaBUXgo6?iIOL
z<X#1$JSg(7$iE{0iu^0`ugJe5|BC!8@~_ChBL9l~EAp?%zasyN{44UW$iE{0iu^0`
zugJe5|BC!8@~_ChBL9l~EAp?%zasyN{44UW$iEuoJ{&DaDjY3GsEwTSjAnVzEDxIH
zL9;w)mIux9pvk``|C;=3@~_FiCjXlJYx1wjy(agXylZl<$+;%y7~~jDCpp*TT9a!{
zt~I&V<XV$!O|CV$*5q1~YfY{-xz^-blWR?`G3|Ub9pqZ`yspW&Cf}NTYx1qhw<h13
qd~5Qp$+srontW^Wt)qNLLXk-9aux9_WlUi5WYd6^D_dVgyY*ioe@L+a

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
GIT binary patch
literal 23424
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
G`u_lkUM?>H

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff2 b/modules/LIMS/senaite/assets/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
GIT binary patch
literal 18028
zcmV(~K+nH-Pew8T0RR9107h&84*&oF0I^&E07eM_0Rl|`00000000000000000000
z0000#Mn+Uk92y`7U;vDA2m}!b3WBL5f#qcZHUcCAhI9*rFaQJ~1&1OBl~F%;WnyLq
z8)b|&?3j;$^FW}&KmNW53flIFARDZ7_Wz%hpoWaWlgHTHEHf()GI0&dMi#DFPaEt6
zCO)z0v0~C~q&0zBj^;=tv8q{$8JxX)>_`b}WQGgXi46R*CHJ}6r+;}OrvwA{_SY+o
zK)H-vy{l!P`+NG*`*x6^PGgHH4!dsolgU4RKj@I8Xz~F6o?quCX&=VQ$Q{w01;M0?
zKe|5r<z7o5`*yS~8)MszG41q#5{WWPpy7G9^(-fD<g4HS2Pp6}MR#f7LIoFspeCvR
z3+c{Ov}|bDFijfL*xJ&DWaU}da`Er7tg~)(Y2IDkd3AD?w7jnSneG!-SaWI)p`xDU
zXH9Mys?(WBfmfBO!_){Max(NjX;ffVH@MAGD6y!?&l=$WE1+*S^Cx4)$U?A><_7CD
z=eO3*x!r$<gNx(8nyyp{U13{MWIQu>aX2iFh3;}xNfx0v;SwB<Fg``NKlv&}sOOia
zl_SskHz$qk-Tj7B2@DHwWBbat?O%&GCL=1*D=EFRpwKHcVF9o~HnwAo=XtT&qlRWE
zVi`v1=H&nBv?M!wAX!1fF?LWbbVvCAjN!ns70n|1u$9{ZL&9b)AXkF-t^%6Wna*`f
z*04(m<0Gx@4&<!XDochu+x!F|DAC{R)c4o_TK-_!s|@9}TbCv3Sp`&zta~M|$%-V1
ztq`DddvEXU8JrjLh=Ul_yYF^%B5>fGG+@Z;->Hhvq<wD;VB@ph6#6G_6lL5#3gkx~
zHFE%Z^IuN$3X)Ju)24Q9Ro)B9zI%GT-16@8|DPH7fB1}tA~RrY4U!xKmRBRxkiA|Q
zKr4+b2V=R(Yj3HIK~EcS6>fF4r__4$mU>Dl_1w;-9`~5rF~@!3;r~xP-hZvOfOx)A
z#>8O3N{L{naf215f>m=bzbp7_(ssu&cx)Qo-{)!)Yz3A@Z0uZaM2yJ8#<s6khOy@V
z&}wI!ds<}Wi3oZ(j|&tv|KA}5cx}QpZ^By#9KFAF@B1dVuQA$!NDxA6LE`KPadPU;
zQjo+AqqndYk0@McX!H;i$Tx}X(u#SHJ%&iNTJu#<Xz9=-I1o~2(*?vBfO^7b&8^8!
zI*Z@{F?FmY+=Z{Cp`Jcc{axky6qgRBtRkQEW;eW-3-wE{UVkT;s_VTolPg6pyu@CK
zSyeS%s7^u`F5b$ErP4Ux#VgLuk2sI{EPRQ3O?-?&iV@{?VSLbGh?0Noj@91Fh1H!U
z01AI>OGlzm?JO5gbrj~@)NB4@?>KE(K-$w}{};@dKY#K3+Vi64S<@!Z{(I{7l=!p9
z&kjG^P~0f46i13(w!hED<gesU<d5XH<k#ev<OXsrxsqH=M#%^{mn<fylX>Jga;*Eb
z`!n|++@H8VaKG<9>VDh(y89J#=;Z$ei=GnD5TesW#|Wf)^D+9NKN4J3H5PF_t=V+Z
zdeo8*h9+8&Zfc?>>1|E4B7MAx)^uy$L>szyXre7W|81fjy+RZ1>Gd}@@${~PCOXo)
z$#HZd3)V3@lNGG%(3PyIbvyJTOJAWcN@Uh!FqUkx^&BuAvc)G}0~SKI`8ZZXw$*xP
zum-ZdtPciTAUn$XWb6vrS=JX~f5?M%9S(=QsdYP?K%Odn0S0-Ad<-tBtS3W06I^FK
z8}d2eR_n!(uK~APZ-#tl@SycxkRJ@5wmypdWV{MFt<T5%<QMMP#rTv8Dn)!jr4End
z8!An$TjN_QZBN_|-%;s$96wO$ZrvL{QYl%F!EaP1Th9SiDvOmh5WrK}3{64{{_F&y
zrSMy`6AG<_-)~t&XssC4d+gCHeK9;{jV1y%Xrvg1Cy#-D2g;>YBUY#g-Vv?5AEBj1
z`$T^tRKca*sn7<ZK}0!&|7AkCI;jT+6~rYE0#BU5AkxqT6Y+wF*hUg{if$klH$Np(
z14lF>gt%s@XUD-t>bij-4q-ilku9^;QJ3Mpc`HJ_EX4TGGQ-Og)`c~qm51<|gp7D@
zp#>Grssv^#A)&M8>ulnDM_5t#Al`#jaFpZ<#YJ@>!a$w@kEZ1<@PGs#L~kxOSz7jj
zEhb?;W)eS}0IQQuk4~JT30>4rFJ3!b+77}>$_>v#2FFEnN^%(ls*o80pv0Q>#t#%H
z@`Yy-FXQ9ULKh{Up&oA_A4B!(x^9&>i`+T|eD!&QOLVd(_avv-bFX~4^><K+`NUjl
zUA`n*5<n{f%?!4-)qpuLcwM`4xUD6=$ki+M2U1n6MQw*G7TmC^qdRw?b*#WSFG;)w
z)HldC)uy>o{%mzzrg_i~SBnr%DeE|i+^}|8?kaV(Z32{`vA^l!sp15>Z72z52FgXf
z^8ZITvJ9eXBT1~iQjW|Q`Fac^ak$^N-vI^*geh5|*CdMz;n16gV_zk|Z7q8tFfCvU
zJK^Pptnn0Rc~<r0!CgppAqmePbR1#5Tubl85FQ4lTg)+g8UrHdY9Ka1?3OcBFeRlE
zzYpoom?Fp2nZ{a4hDYQEn^Tkbje;(-5yZ};a0h|L)2vg*F=grd*^|WBo1OU#S-~Fv
zcDpzl2xPHbu|lC2Y@t*8{!%Fh(i78$=lQReu7C@B0!fO~hV;@Uos_RW`!LXs+NQHy
z@F$dGXT35dG@wzAM4<{W&5|=hvLeY%j@6DPfZK{_NfpP!+NaV|XArkdMWmsrp|+Y0
zNxjY}2dUoGHC2{GT?~El9hnDW?KmWthwM10KJ(#NAOW%mXq6&t9<|PZ;%Xe7E+vTD
zfEY+f$1Mv<nx@^jBQcU4Ljg4P-dWxOH-zo(t`hB8-Ik$N3~vY;K2XYCp*Fv_2blJm
zPc;8GW*QB>egGIAK}uv<M%BWA$}X1PZ}r3ec_|6TIBdoXwlXq~Ws001rqVG;8=+eP
zbcwJ)A;^UcGF*T_xCk`{#MzU|C0f_+{M&2Zk_ZN2^_{NVK>99VZm2WLPezQQ5K<`f
zg{8Ll|GioPYfNheMj-7-S87=w4N0WxHP`1V6Y)0M&SkYzVrwp>yfsEF7wj&T0!}dB
z)R~gGfP9pOR;GY_e0~K^^oJ-3AT+m~?Al!{>>5gNe17?OWz)$)sMH*xuQiB>FT2{i
zQ>6U_<n)x#cJkNUc|V)^vL|15d~)i9%UIk7`0hyQQOX6dwG{=#lR`i}3*A_(-}<aV
z6Bs$mG_#ni!&Ir*LWx4DW1y|U7^_H;P@~Q(g7S%hUz3y7SxDI<tR$+-%3z@EM);%g
zLObKN!YkVml!Zc2Qm{14ydZQ0tvYlF^&(mmMY>8}Ay~r4li;jzG+$&?S12{)+<*k9
z<^SX#xY|jvlvTxt(m~C7{y<eW|86c<M_B#9!3F3@>{3g>7TX#o2q$xQO|fc<%8r<e
zu{@uYv6wTaDS(!pU?WCA5)2p&Mj+Ip;0XTMc8zb%VkCGB2k$Gg;JkJFCbWHte9BlD
zCR^F6kT^z*ExAP|FFuMd7tu$>E@A3=UW(o?gVg?gDV!0q6O!{MlX$6-Bu_m&0ms66
znWS&zr{O_4O&{2uCLQvA?xC5vGZ}KV1v6)#oTewgIMSnBur0PtM0&{R5t#UEy3I9)
z`LVP?3f;o}sz*7g<a{wL*dZXtI5+zcTbzINq%3Vx?sa^oH8-vb96eb6k)$k`VM?dj
z8y1_mUUalhn>5qdTxJl^gk3>;8%SOPH@B)rmFOJ)m6?PlYa$y=RX%;}KId{m<ya`&
zf~xC+0#uqMzpD#MstCV?tz>9R#2=LNwosF@OTivgMqxpRGe}5=LtAn?VVl6VWCFLD
z7l#^^H8jY~42hR)OoVF#YDW(md!g(&pJ;yMj|UBAQa}UH?ED@%ci=*(q~Opn>kE2Q
z_4Kgf|0kEA6ary41A;)^Ku(*nirvP!Y>{FZYBLXLP6QL~vRL+uMlZ?jWukMV*(dsn
zL~~KA@jU)(UeoOz^4Gkw{fJsYQ%|UA7i79qO5=DOPBcWlv%pK!A+)*F`3WJ}t9FU3
zXhC4xMV7Z%5RjDs0=&vC4WdvD?Zi5tg4@xg8-GLUI>N$N&3aS4bHrp%3_1u9wqL)i
z)XQLsI&{Hd&bQE!3m&D0vd!4D`l1$rt_{3NS?~lj#|$GN5RmvP(j3hzJOk=+0B*2v
z)Bw133RMUM%wu<VkMnpWWVN&K8^*s5oqf-N`_{oZG|c^)?fe5daI7j+I{GC?6;bAe
zUSXe$6^9Vy1KrCfsOM#a9`s`Ns00)gifk>_+$vbzOy?yk#kvR?xGsg-ipX4wKyXqd
zROKp5))>tNy$HByaEHK%$mqd>-{Yoj`oSBK;w>+eZ&TVcj^DyXjo{DDbZ>vS2cCWB
z(6&~GZ}kUdN(*2-nI!hvbnVy@z2E#F394OZD&Jb04}`Tgaj?MoY?1`{ejE2iud51%
zQ~J0sijw(hqr_Ckbj@pm$FAVASKY(D4BS0GYPkSMqSDONRaFH+O2+jL{hI<DV209S
z)XR~VgGa)M^-;}1&#S3{@xzwR6~@}^V}twZy;sZcsTJr0S5s{W-N3D9v%1<w%kip_
zCaGQ)_4?SD)S-wrJ3}!#J==&-iR8Kz)nLlnoRC&l|C1fmMV-bqBD82vt61QE6dSAF
z*iJKFHPeAzx_T}Ct>ltJSJT~e)TNDr(}=Xt7|UhcU9eoXl&QZRR<9WomW%&m)FT~j
zTgGd3-j}Uk%CRD;$@X)NNV9+RJbifYu>yr{Fk<C+0Z7wvVjq!VGjwL>O;p>_&njI>
zyBHh_72bW<C>;8}oGeY0gpHOxiV597j7mY<#?WMmkf5x~Kf<RrP*$<_TMcAZ<977s
zG-{sG-<y$aNL=Fg)E11z=zEyh@&Zlt<-N$5T)Lf&<pEj#+<|}`9f4puO~YVB6Jm!v
z!37dKVIz9-hLJpqcp?V#EU09HXG3YfV3A{zn-)630R_n7NwnfVYInEHeM$w$$$F=a
zUOHAT9sN4j{@RNZd%w-R1}Mm~Ligs&9Lc5wlF9RUjyxD1L}DW%Q=_4K^pa5dNOiqV
zfiDy5dvZ1fJ9kyK6XwwJ5_8s27to%QJf!DXz~EWpbJWE5-c5LQu!j^}nqmNv+H<%h
z5ssJ<c#g^_qKPkFd;?x87%*ynZQ!gsBex|=gx*awoyTyPQBBvZ@H#pgVq8NqXJ!Gg
zuwA`+(oi^5nIKiFlTl*U=ybY+9YY+wRG&TyaG*FVHfLWlmTb<UHm6AP5eOjK&H%@T
z4@jLl_YGv5Jmy2q={B>k*re(&tG_mX<3&2cON*2u%V29tsXUv{#-ijs2>EuNH-x3)
zPBpi+V6gI=wn}u164_j8xi-y(B?Au2o;UO=r6&)i5S3Mx*)*{_;u}~i4dh$`VgUS-
zMG6t*?DXDYX0D2Oj31MI!HF>|aG8rjrOPnxHu4wZl;!=NGjjDoBpXf?ntrwt^dqxm
zs(lE@*QB3NH)!`rH)5kks-D89g@UX&@DU9jvrs<xLUb7(M^4Zb6^^3tZR7!hc=SMz
zY6*prxO{uSb2$<j;JZB!{&!N@FRiO@L`rit7J5FDJBlZG-SI^R&~X)B26E|MJx3Zp
zy@feJ>Y)aI=9b4n<X@Mg2JK5FwM5CTI(2DlYHRLE7-h-ky&9}X`qiByDxrocwQ6k!
zk>Py3bfdX_U;#?zsan{G>DKob2LnhCJv8o}duQK)qP{7iaaf2=K`a-VNcfC582d4a
z>sBJA*%S|NEazDxXcGPW_uZ&d7xG`~JB!U>U(}acUSn=FqOA~(pn^!aMXRnqiL0;?
zebEZYouRv}-0r;Dq&<B?o>z9>s#Rt1<!G80gW3Q`9g34ikcEkn<~yB0GE=440i1w9
z%Vr=2{=&=rZq4E{&?AkG<{r866K366I$gg?dF2R5T^g;GEw`9Q*Nk^(b|;|+1mb*%
z#4u&?3d3JFi15;ot8Oc19^cux;^0|4tLG@q3aUT$?2-_vk$Lj@p(S^1tSf2`gC-^+
z=%QnjUZHg-onrhZ@o1lIHV_2Dq?*qAxhgUYKOD3{$4MNkw#KqGMg~{D*qK}6#+(MI
zLiJU8?@7)@l#?NnZ90q6`<!@a)Mc05$F6R?dVF0a42_U&5!rIVRk%it+OLoWl=%^V
zt}(_79f^HAArEdKM!qJXXY$(d|4@mB-2tz!8yh<&*Y>HL`0p4bB)A&sMyn|rE_9nh
z?NO*RrjET8D4s(-`nS{MrdYtv*kyCnJKbsftG2D#ia@;42!8xd?a3P(&Y?vCf9na<
zQ&Ni*1Qel&Xq{Z?=%f0<LS^x97`leNoS?M1&H-Xn(H4XTZqAYsYIOp+zQ7v^2WLR!
z_a_8#QR|eBZg?(rHeyy)Ce#d@UAa5k@2V9cLthMp76uClo{creD&Bgz9m%@;ZGciy
zb&;xZf|B4Crm;}`+FCG!wta2!yrIkn%Jpu&re1E<PjbmrrsBbowaz-9RpTeuXu#&D
zFm4Z8p>SRqQt5m|Myg+8T=GDc)@^};=tM>9IDr7hdvE9-M@@<0pqv45xZTeNecbL-
zWFQt4t`9>j8~X%lz}%We>Kzh_=`XO}!;4!OWH?=p*DOs#Nt({k^IvtBEL~Qafn)I^
zm*k{y7_bIs9YE}0B6%r`EIUH8US+MGY!KQA1fi-jCx9*}oz2k1nBsXp;4K<_&S<R|
z+!NEpcbfYC>N}}w<)!EylI_)v7}3&c)V;Cfuj*eJ2yc8LK=vugqTL><#65r6%#2e|
zdYzZ)9Uq7)A$ol&ynM!|RDHc_7?FlWqjW>8TIHc`jExt)f5W|;D%GC#$u!%B*S%Z0
zsj&;bIU2jrt_7%$=!h4Q29n*A^^AI8R|stsW%O@?i+pN0YOU`z;TVuPy!N#~F8Z29
zzZh1`FU(q31wa>kmw{$q=MY>XBprL<1)Py~5TW4mgY%rg$S=4C^0qr+*A^T)Q)Q-U
zGgRb9%MdE-&i#X3xW=I`%xDzAG95!RG9<s#0S@%P{4ssMj6|f(PFTtK{&eg=M$et?
zer_yKYB>)s?v_5+qx`7NdkQ)If5}BoEp~h}XoeK>kweAMxJ8tehagx~;Nr_WP?jXa
zJ&j7%Ef3w*XWf<k`Dtf*esPy5LFqg?XcIB9IkPk2PVCIR^-+n7<HvnNOxS;rSNY$k
z!q<-6euEMl;SCbnVwt5PhJlC8e8)6(eeUqB*8$mMnR$Q&;ETvMu%R;lTOg&_)?8$`
zEVa^()w5!O5o`IR%tYnnz9leJ+<2|7dp$e$)VGU<0VsrN2!{)e*i2Km_!HkTy_op@
zsnIk4PS0pBq&7e1Cq-WNe*ebQP_BP_b6V^hnOf6Jl*FDBLVJ=#%yjrBiM`Z%lGFDo
zwHH-yVfi&trZbO`$d`z6e!q^9z6z!R^x64FT@j!px;*Fv`gCn5ntcrW!_Q4ZK!=`N
zoJV-<2+l^+1!xdB0GlIyi1aL@Bfyw-3;j%CdMMseXt6XU(|7@G1YlJY;FZ<6E=3Wj
z<90D&lAbgUUnehHsAREwMtG=6$~8Hjj0}TB^$|Sk>?V*nR)|IOMrX;$*$e23m?QN`
zk>sC^GE=h6?*Cr~596s_QE@>Nnr?{EU+_^G=LZr#V&0fEXQ3IWtrM{=t^qJ62Sp=e
zrrc>bzX^6yFV!^v7;>J9>j;`qH<hDH19MMT1+`8y)sG%_MO<QWhJX7}-!&K#jas?d
zy;gZO2VIR5z1H^NXfFwADaHGprj9Kyw6No$Yqd_S(T={z#2gbNW$Y;;P#5j-{0Iqq
z{Yz6(ka&r*xSggxVdEyX?Y53QVJz#Wj2B2nNYC=~i46iAU6ds(WkjB{Reo2yZ2cFH
z1KOLbJ7d1#n3MMhVE&yyAfdi+kxdP<3vBD^E`m_9S2y(rq1mIzE*dZNSDYg|SM_8n
zmO6SnMKXq{pYHbK`f8yE_&F1K$=pH5Q;<_Q=ykx1w&1KgW?4A9Z6Hh0ujuU5gw(c)
z&7nRlgcqO=4PWSIrL^%aZQ)})*BEYH(5EdFt~HS|W2m{IuJL*etT$vJP@H=66XgN5
z8Q}8pvQ~ulll!Gl9Z+^=yi)!QQl!(y;INZ9hFT3RpTQp9WD<t=u9}FyLz|lM^T%K;
z_F;6vJrfj%Yd?0P?KC4$4d|po%oYftn%JedFIyM&26HYvVHGfC#(R&nCXS+Z{t)t^
zVSWJ}WdR7#^Eiv>DQ4uc92eVe6nO@c>H=ouLQot``E~KLNqMqJ7(G+?GWO9Ol+q$w
z!^kMv!n{vF?RqLnxVk{a_Ar;^sw0@=+~6!4&;SCh^u<XeQK8Ry4Gm-T(Vj*P>tT=I
zo&$CwvhNOjQpenw2`5*a6Gos6cs~*TD`8H9P4=#jOU_`%L<QahFX*>!W;$57NjN%4
z39(61ZC#s7^tv`_4j}wMRT9rgDo*XtZwN-L;Qc$6v8kKkhmRrxSDkUAzGPgJ?}~_t
zk<g7QLp>woGS4=6lsD`=RL|8L3O9L()N)lmEn-M15fRC{dhZ}7eYV%O-R^gsAp{q4
z!C1}_T8gy^v@SZ5R&Li5JMJy+K8iZw3LOGA0pN1~y@w7RRl#F()ii6Y5mr~Mdy@Kz
z@FT4cm^I&#Fu_9I<Lt*^+@1e0b(+y4E>X(HAFP{XLbRALqm&)>m_we>a`hfv?eE|t
z?YdDp2yAhj-~vuw^wzVDuj%w?exOcOT(ls(F*ceCe(C5HlN{lcQ;}|mRPqFDqLEzw
zR7ldY+M6xe$$qLwekmk{Z&5cME$gpC?-8)f0m$rqaS|mj9ATNJvvyCgs(f2<G?s#j
zlCyq7V=W|3+#5GMRv3jyMSve^Et#Ab=u*f=lMF{rP2hXbA~Thc4Er=Whg%hdYCNEj
z;kX^FSJSNv%HwF&_?QB}Y>{r;2E!oy$k<WRsM?7~2V-%l??892FJ&Nc|D((m<^gBU
z9InVbh@;KM5Dz*apz7ga>5{jik#(;S>do<#m0wVcU<}>)VtYmF9O0%(C>GDzPgh6X
z9OkQLMR~y7=|MtaU!LDPPY7O)L{X#SC+M|v^X2CZ?$GS>U_|aC(VA(mIvCNk+biD|
zSpj>gd(v>_Cbq>~-x^Y3o|?eHmuC?E&z>;<!5?S(?^O9r&S^X+pEvdora!<1(g^2R
zF}c9cL+{oKVWq$6?rtz|xpFbl44EDmFIBCjiJb-Y3(jwkFAqQImExJNVfoWvtZ)_T
zk4V<B4M+9tw4kQKIG^34KQl&&Fz^SMfZ1Rr!}rgT#M3;D3P+k<)V-V;IAUzgk0mWE
z!YO?vo&!phIu^NE0<F?&&>Ij`%{$Pm$hI}bl0Kd`9KD~AchY+goL1?igDxf$qxL9<
z4sW@sD)nwWr`T>e2B8MQN|p*DVTT8)3(%AZ&D|@Zh6`cJFT4G^y6`(UdPLY-&bJYJ
z*L06f2~BX9qX}u)nrpmHP<M#fk<GgBNMKYA_9QYh8<vJ<9@F-~(AqGXdLPEfJFTIn
zp64R)U5xUof+~(#vZUz{EaXw4SAp0Y;12Y-Y*XpA#>G#La#tiZ23<>`R@u8k;ueM6
znuSTY7>XEc+I-(VvL?Y>)adHo(cZ;1I7QP^q%hu#M{BEd8&mG_!EWR7ZV_&E<NEPM
zcuS4Ye{%Gqtc-n!er+G|*<cWkM>GO;d(hGGJzX|tqyYEg2-m0zLT}a{COi$9!?9yK
zGN7&yP$a|0gL`dPUt=4d^}?zrLN?HfKP0_gdRvb}1D73Hx!tXq>7{DWPV;^X{-)cm
zFa^H5oBDL3uLk<C+v0>aFDWgFF@HL6Bt+_^g~*o*t`Hgy3M?nHhWvTp^|AQDc9_H<
zg>IaSMzd7c(Sey;1SespO=8YUUArZaCc~}}tZZX80w%)fNpMExki-qB+;8xVX@dr;
z#L52S6*aM-_$P9x<jdu9ktlJz@92>FuIui;dN#qZ_MYy^C^hrY;YAMg;K`!ZpKKFc
z9feHsool)`tFSS}Su|cL0%F;h!lpR+ym|P>kE-O`3QnHbJ%gJ$dQ_HPTT~>6WNX41
zoDEUpX-g&Hh&GP3ko<AA>F4##?q*MX1K`@=W6(Gxm1=2Tb{hn8{sJyhQBoq}S>bZT
zisRz-xDBYoYxt6--g2M1yh{#<qP09xNr@s6w?MS->QWFCISux}4==r|7+fYdS$%DZ
zXVQu{yPO<)Hn=TK`E@;l!09aY{!TMbT)H-l!(l{0j=SEj@JwW0a_h-2F0MZNpyucb
zPPb+4&j?a!6Z<r#zSSW!Qu(5~6_6s0G^U8i@%ox>nPTB>$t`(XSf-}`&+#rI#`GB>
zl=$3HORwccTnA2%>$Nmz)u7j%_ywoGri1UXVNRxSf(<@vDLKKxFo;5pTI$R~a|-sQ
zd5Rfwj+$k1t0{J`qOL^q>vZUHc7a^`cKKVa{66z?wMuQAfdZBaVVv@-wamPmes$d!
z>gv^xx<0jXO<J6=m}BiiJow`eU@2UA*K~Z_jqm?*Cp?B28V2;3;6C}+*8byL=EIJc
z@2%))H|zSX{#wNl1dKR;V_`{wA-N5-aN?q$&CIR<EVd6v!|e;ZYX_h;K*-tj_Xr#R
zVD!mpcMXWrZqS|`IB=hKzaZzy6X`0CowC9wPYMg&9n}1avJ{}*L0iZ!p`>z;7HIQS
z4RBIFD?7{o^IQ=sNQ-k!ao*<ZRhqeGmf|{bY%Roxqzv&YHX(&*=PS#s1OR(zw~6*G
zAZll^YspPb$=6UL<F@2FynT_exO*?%>+V*|-^I2=UF?{d>bE9avsWbAs{sRE-y`7r
zxVAKA9amvo4T}ZAHSF-{y1GqUHlDp4DO9I3mz5h8n|}P-9nKD|$r9AS3gbF1AX=2B
zyaK3TbKYqv%~JHKQH8v+%zQ8UVEGDZY|mb>Oe3JD_Z{+Pq%HB+J1s*y6JOlk`6~H)
zKt)YMZ*RkbU!<JI!}T{8zEt+(a&daxMztju*ROn;npHenq}*@86I)b4J&uF~&?iJt
zN?o)&ELAxfueHiio3Ybyik@o*@icyb9qQo*!QuvA1&u?hUYT)4qQ$O|oMH`uQ%7^!
z_}}e+S%sZ4PL@FquF`ewt{)}v@KZ#Df*{vuY6%Mec{@2I-?T|VsMToX1VvAe%n^j)
zvdeu6s1|35v#f;_moF<I`PGAy?=_uDS;`<l<OfIk_>GPHzJltmW-=6zqO=5;S)jz{
zFSx?ryqSMxgx|Nhv3z#kFBTuTBHsViaOHs5e&vXZ@l@mVI37<+^KvTE51!pB4Tggq
zz!NlRY2ZLno0&6bA|KHPYO<dkI`ky_l{+0el>MY;;LZG&_lzuLy{@i$&B(}_*~Zk2
z>bkQ7u&Ww%CFh{aqkT{HCbPbRX&EvPRp=}WKmyHc>S_-qbwAr0<20vEoJ(!?-ucjE
zKQ+nSlRL^VnOX0h+WcjGb6WI(8;7bsMaHXDb6ynPoOXMlf9nLKre;w*#E_whR#5!!
z!^%_+X3eJVKc$fMZP;+xP$~e(CIP1R&{2m+iTQhDoC8Yl@kLM=Wily_cu>7C1wjVU
z-^~I0P06ZSNVaN~A`#cSBH2L&tk6R%dU1(u1XdAx;g+5S^Hn9-L$v@p7C<o$=Hu{J
zxrz+#TM>CF&PqV{Z?R$}4EJi36+u2JP7l(@fYfP!=e#76LGy^f>~vs0%s*x@X8`|5
zGd6JOHsQ=feES4Vo8%1P_7F5qjiIm#oRT0kO1(<jgC4I6wQ2{Xo|wjm0krd64efBC
zGt(LP9FC(njlia=(c_lTukVx-yR9~Gt`YfGKRT==f^$Uqz)t!SwGPI)kuvX+Zjvmv
zgh<^_T!LG;_|>?Z_Dk6<DV?iVez|GsZJ9q9|E_~n&^oZp@ZP#r)@50Y)8mRQBV<Zt
zDX+2G&swV0HIzU2B)jGgp<HCCR~bCFxw$OKhJS{dJFnQcxWhHg&GJ*Y)wr*`8kbb7
zRF?6Y&IrteW+;JBSq`vvJy8vQL|A_+2fW`8-8lH@zNvF93Bm{k%c!o-fCV)*0t~GU
zSfWy;Y#>oX&j=Xd8Klk(;gk3S(ZFnc^8Gc=d;8O-R9tlGyp=2I@1teAZpGWUi;}`n
zbJOS_Z2L16nVtDnPpMn{+wR9&yU9~C<-ncppPee`>@1k7hTl5Fn_3_KzQ)u{iJPp3
z)df?Xo%9ta%(dp@DhKuQj4D8=_!*ra#Ib&OXKrsYvAG%H7Kq|43WbayvsbeeimSa=
z8~{7ya9ZUAIgLLPeuNmSB&#-`Je0Lja)M$}I41KHb7dQq$wgwX+EElNxBgyyLbA2*
z=c1VJR%EPJEw(7!UE?4w@94{pI3E%(acEYd8*Wmr^R7|IM2RZ-RVXSkXy-8$!(iB*
zQA`qh2Ze!EY6}Zs7vRz&nr|L60NlIgnO3L*Yz2k2Ivfen?drnVzzu3)1V&-t5S~S?
zw#=Sdh>K@2vA25su*@>npw&7A%|Uh9T1jR$mV*H@)pU0&2#Se`7iJlOr$mp79`DKM
z5vr*XLrg7w6lc4&S{So1KGKBqcuJ!E|HVFB?vTOjQHi)g+FwJqX@Y3q(qa#6T@3{q
zhc@2T-W}XD9x4u+LCdce$*}x!Sc#+rH-sCz6j}0EE`Tk*irUq<m0`(;!&c&G7p#_P
zOJ|kT&v8z(QpAQ%C~^@e!Ck!ICE1vSkA<!Djfg-q)Xjj-!hve17Fw+LN`@{UJN)Br
zZQc5>)y^za`}^1gFnF)C!yf_l_}I<6qfbT$Gc&Eyr?!QwJR~RE4!gKVmqjbI+I^*^
z&hz^7r-dgm@Mbfc#{JTH&^6sJCZt-NTpChB^fzQ}?etydyf~+)!d%V$0faN(f`rJb
zm_YaJZ@>Fg>Ay2&bzTx3w^u-lsulc{mX4-nH*A(32O&b^EWmSu<mNHl&EF)N<Qwv@
z+ghjNCfO8{=RX6l;$%bV;UJwTS<t3aZ9alZA|`Nj-rR_)P~(S$140`CMywS0w4K@n
zvEbSGG>k{#HJk}_ULC}SB(L7`YAs>opp9o5UcnB^kVB*rmW6{s0&~_>J!_#<Q!IQA
zfO6pF51Khiw-3ES&zJ|$tcLa{0mAHdM*u;#&JjS6&2$71z|3e-)lO=LCK!MP<y1Y+
z19)^hGF`6{P@#NOEe8oq!=8hZ$>+cEWib@v-Ms`?!&=3fDot`oH9v&$f<52>{n2l*
z1FRzJ#yQbTHO}}wt0!y8Eh-0<gy=!05)T$dd<p&_-XL+(loOF(KU||XB_8&Ud`&j6
zW~wWblPi)_Dt+fy0AJi)GpeZiwq|YIuGrGcv(nscAa@~_m+trFF56NgiRrAWJI3uF
z`lhjQpmFmzF^U1!<RrqC-I>*|Um3vjX-nWH>`JN5tWB<ptoGg-$7O92<yOQsP=C)b
zJ`}#bAW@wa=e0GehF6uTNUcd|*Ba&dCiyhdjY(|NMK^uobI9q$ZChi=zU%>_gnW%;
zUJ0V?_a#+!=>ahhrbGvmvObe8=v1uI8#gNHJ#>RwxL>E^pT05Br8+$@a9aDC1~$@*
zicSQCbQcr=DCHM*?G7Hsovk|{$3oIwvymi#YoXeVfWj{Gd#XmnDgzQPRUKNAAI44y
z{1WG&rhIR4ipmvBmq$BZ*5tmPIZmhhWgq|TcuR{6lA)+vhj(cH`0;+B^72{&a7ff*
zkrIo|<cYW*47-TiTWhvB;>pd-Yxm+VVptC@QNCDk0=Re%Sz%ta7y{5Dn9(EapBS0r
zLbDKeZepar5%cAcb<^;m>1{QhMzRmRem=+0I3ERot-)gb`i|sII^A#^Gz+x>TW5A&
z3PQcpM$lDy`zb%1yf!e8&_>D02RN950KzW>GN6n@2so&Wu09x@PB=&IkIf|zZ1W}P
zAKf*&Mo5@@G=w&290aG1@3=IMCB^|G4L7*xn;r3v&HBrD4D)Zg+)f~Ls$7*P-^i#B
z4X7ac=0&58j^@2EBZCs}YPe3rqgL<Jxn$r!S8QWfkb&3miwnf<3dO#?*0r^D`z@0O
zyL}HbgfghMrA1DVzkMTz<h8XjNM2zx@b$YHrE<H$adW4nu!w{$k5e-y$OIJc^n_-#
z?T4cd%<Il(cWf@2Jy-ZR<%BHt;L>AA1L3Y}o?}$%u~)7Rk=LLFbAdSy@-Uw6lv?0K
z&P@@M`o2Rll3GoYjotf@WNNjHbe|R?IKVn*?Rzf9v9QoFMq)ODF~>L}26@z`KA82t
z43e!^z&WGqAk$Ww8j6bc3$I|;5^BHwt`?e)zf|&+l#!8uJV_Cwy-n1yS0^Q{W*a8B
zTzTYL>tt&I&9vzGQUrO?YIm6C1r>eyh|qw~-&;7s7u1achP$K3VnXd8sV8J7ZTxTh
z5+^*J5%_#X)XL2@>h(Gmv$@)fZ@ikR$v(2Rax89xscFEi!3_;ORI0dBxw)S{r50qf
zg&_a*>2Xe{s@)7OX9O!C?^6fD8tc3bQTq9}fxhbx2@QeaO9Ej+2m!u~+u%Q6?Tgz{
zjYS}bleKcVhW~1$?t*AO^p!=Xkkgwx6OTik*R3~yg^L`wUU9Dq#$Z*iW%?s6pO_f8
zJ8w#u#Eaw7=8n{zJ}C>w{enA6XYHfUf7h)!Qaev)?V=yW{b@-z`hAz;I7^|DoFChP
z1aYQnkGauh*ps6x*_S77@z1wwGmF8ky9fMbM$dr*`vsot4uvqWn)0vTRwJqH#&D%g
zL3(0dP>%Oj&vm5Re%>*4x|h<Em3JO)$O&GXE=ft3p^9G|#?0DwWLK`p_K)+<TTv{{
z-sme#4+Oqqf)?$*$pWS2gvP{&alHNwIjdG2eeVgB&W~2ncQkQT<TEB}+r+U*Sz^2(
z{JDq=6~A;9bd6M;^@ummf%1~8*<luPLU&L(KPlUFmFbIAFWF(Em5xC%IhGNzYpP8O
zT+`%G-QRPYJlIrWo{iAsK!Q9!P2vkE5P#|jye^?ECnY~D$0dPb9DZfa1?v)yz@3g&
z;g&G9%`bXU)%GaSxc!s&q+yw?s&G0kHmhpF|71o$Tvo0$rpbSM(^6^d{uv91%{b|=
z$*Kl!b^WeJ@0d+rhNnHIz4cl+;iLmd<L-)VhjV!~YbEu}d>1J2X*mK5BH1?Nx_#7(
zepgF`+n)rHXj!RiipusEq!X81;QQBXlTvLDj=Qub(ha&D=BDx3@-V*d!D9PeXUY?l
zwZ0<4=iY!sUj4G>zTS+eYX7knN-8Oynl=NdwHS*nSz_5}*5LQ@=?Yr?uj$`C1m2OR
zK`f5SD2|;=BhU#Ama<P~$VvhmI_^8ZNrt}1AvOV7X(sz*+2GbCZLT;rBdYe9QGvD6
z)XZ03krf;EL7R4cKP%`*;hM_&31edpDiHr|`}C4$VA4K?4)t-d*ee|SqdnPMHN?%7
zx3<>TKe9QaSHQ_DUj1*cUPa*JICFt1<&S3P3zsrs^yUE;tx=x^cmW!Jq!+hohv_B>
zPDMT<UQS`;VV^r@irLILT~0+N33M1<u)sr18hR(<Wra9eQt=0KCN|yzvNvA<AN<3k
zV|hxRkue$##Qs23TChJ;07NqT3L1xe)KK-*%TLpc>0D&08dC4x@cTD<NY(g*?y)&(
z$O8b2Q6sg#wt{+cv-4vv@-+5_NBvTr6Ex1qad@WizC1F1SdwV9_ihN`8RHq?sk5jC
z#WILtbwaI9L(u>$o1$x%So1Ir(G3_AVQMvQ13un~sP(cEWi$2%5q93E7t{3VJf%K?
zuwSyDke~<K40T94pahUuQl0-LemUU;AvE^<Z_y9Yyr$?J0su3Gy5f{LKemD(&L1%W
zWEvyy)Y1GLmYP8(i-d%GK_O{23yX~H+%H&Rou8u`;RWM|q&*T>7KuB2?*#DV8YzJw
z&}SCDexnUPD!%4|y~7}VzvJ4ch)WT4%sw@ItwoNt(C*RP)h?&~^g##vnhR0!HvIYx
z0td2yz9=>t3JNySl*TszmfH6`Ir;ft@RdWs3}!J88UE|gj_GMQ6$ZYphUL2~4OY7}
zB*33_bjkRf_@l;Y!7MIdb~bVe;-m78Pz|pdy=O*3kjak63UnLt!{^!!Ljg0rJD3a~
z1Q;y5Z^MF<=Hr}rd<hCKOY==|sWDSuzL8iiX7^T&s)i%HRX)g)$n}ULLiX`pwGBZP
z9gmSoR&T(}(1y>oz>yRczx+p3RxxgJE2GX&Si)14B@2t21j4hnnP#U?T3g#+{W+Zb
z5s^@>->~-}4|_*!5pIzMCEp|3+i1XKcfUxW`8|ezAh>y{WiRcjSG*asw6;Ef(k#>V
ztguN?EGkV_mGFdq!n#W)<7E}1#EZN8O$O|}qdoE|7K?F4zo1jL-v}E8v?9qz(d$&2
zMwyK&xlC9rXo_2xw7Qe0caC?o?Pc*-QAOE!+UvRuKjG+;dk|jQhDDBe?`XT7Y5lte
zqSu0t5`;>Wv%|nhj|ZiE^IqA_lZu7OWh!2Y(627zb=r7Ends}wVk7Q5o09a@ojhH7
zU0m&h*8+j4e|OqWyJ&B`V`y=>MVO;K9=hk^6EsmVAGkLT{oUtR{JqSRY{Qi{kKw1k
z6s;0SMPJOLp!som|A`*q3t0wIj-=bG8a#MC)MHcMSQU98Juv$?$CvYX)(n`P^!`5|
zv3q@@|G@6wMqh;d;m4qvdibx2Yjml}vG9mDv&!0ne02M#D`Bo}xIB0VWh8>>WtNZQ
z$&ISlJX;*ORQIO;k62qA{^6P%3!Z=Y1EbmY02{w^yB$`;%!{kur&XTGDiO2cjA)lr
zsY^XZWy^DSAaz;kZ_VG?uWnJR7qdN18$~)>(kOoybY0~QYu9||K#|$Mby{3GduV~N
zk9H7$7=RSo+?CUYF502`b76ytBy}sFak&|HIwRvB=0D|S`c#QCJ<t@a2hh9FA+>Pq
zP)uOWI)#(n&{6|C4A^G~%B~BY21aOMoz9RuuM`Ip%oBz+NoAlb7?#`E^}7xXo!4S?
zFg8I~G%!@nXi8&aJSGFcZAxQf;0m}942=i#p-&teLvE{AKm7Sl2f}Io?!IqbC|J;h
z`=5LFOnU5?^w~SV@YwNZx$k_(kLNxZ<T-w9G;`)wdHJoGV2amO-<vG?pZ@XJ#Uo$J
zb+q{_L}lvg?U~@|P1*dSegkN;ajNUGhmyA=S^CQ6@p}9uJKGF3&96BmwaXxSvK>DE
z3cf08^-rIT_>A$}B%IJBPcN^)4;90BQtiEi!gT#+EqyAUZ|}*b_}R>SGloq&6?opL
zuT_+lwQMgg6!Cso$BwUA;k-1NcrzyE>(_X$B0HocjY~=Pk~Q08+N}(|%HjO_i+*=o
z%G6C6A30Ch<0UlG;Zdj@ed!rfUY_i9mYwK8(aYuzcUzlTJ1yPz|Bb-9b33A9zRh<?
zEh+^J@0OOsX>Gl>Ny-Q<wjX~nWiOR}_^4D)POdKUaI)X<DM%#y>#JAq-+qtI@B@&w
z$;PJbyiW=!py@g2hAi0)U1v=;avka`gd@8LC4=BEbNqL&K^UAQ5%r95#x%<j2Twi<
zWI28Jof9kY(Ikv>^qRB%KLaqMnG|6xKAm}sx!Q<xJn;TKhAi-lV_zy<;)6u(yxe`r
zG8s+nu+7X=I2SJx?KI|R<|o>wo}J=2C;NROi$mfADui4)y(3wVA3k~{j^_5%H)C6K
zlYAm1eY**HZOj($)xfKIQFtIVw<YDEZ~5huBx;6h(9UoYDe-u{#QQBex`xo0d_SF-
zZ{zr8r-x@oa=@P7G8Gz%Q<2A7_lyD&aeZ-!inR%aZ-5;iEO&XuPoZbZ6OcnjG1hFD
z=btAA?MyXPGxhQ_`_b@us-{heIodKJbCj6!H57FlM3sv+z|<{D?1@zfhGGSCy3ZI2
zt4}F|%ocaJQVlIK<}Wp7+&rp6QOq<JYmAuckgc6Zxd{^=DJ9>$4&yvz9>(Crs>Gh{
zya6-FG7Dgi92#K)64=9Csj5?Zqe~_9TwSI!2quAwa1w-*uC5!}xY`?tltb0Hq740<
zsq2QelPveZ4chr$=~U3!+c&>xyfvA1`)owOqj=i4wjY=A1577Gwg&Ko7;?il9r|_*
z8P&IDV_g2D{in5OLFxsO!kx3AhO$5aKeoM|!q|VokqMlYM@HtsRuMtBY%I35#5$+G
zpp|JOeoj^U=95HLemB04Yqv{a8X<^K9G2`&ShM_6&Bi1n?o?@MXsDj9Z*A3>#XK%J
zRc*&SlFl>l)9DyRQ{*%Z+^e1XpH?0@vhpXrnPPU*d%vOhKkimm-u<I9o!2{*RVUW0
zkpjTAF;dx9>3c%Q^v3RKp9kx@A2dS?QfS=iigGr7m><)YkV=%LA5h@Uj@9=~ABPMJ
z1UE;F&;Ttg5Kc^Qy!1SuvbNEqdgu3*l`=>s5_}dUv$B%BJbMiWrrMm7OXOdi=GOmh
zZBvXXK7VqO&zojI2Om9};zCB5i|<210I{iwiGznGCx=FT89=Ef)5!lB1cZ6lbz<Vs
z!O6)(KPRgm>gDn07*he}G&w7m!;|E(L-?+<?McI~@TA!vj4RjYnCoT*FH)-pRq74Q
z67E9_umMJOIut_@Dx-Z2hEzHqy0(3L!ra}x0phZ^)OD)P*BAJetYupvu9iOfKMRY*
z59R&ZxVR$6O$s<?dV};ZTu5t!)CO9!I>cz@0<9Z<nFBx*sw*AzBdboG>I~LqYQE<f
zdA084i)nAbA%sHr3I6f)x0A6_C#f|)+7km{+VWc=8p6a>7>HnPA436}oeN2Y(VfG6
zxNZuMK3Crm^Z_AFeHc~CVRrSl0W^?+Gbteu1g8NGYa3(8f*P{(ZT>%!jtSl6WbYVv
zmE(37t0C8vJ6O-5+o*lL9XRcFbd~GSBGbGh3~R!67g&l)7n!kJlWd)~TUy<jO~Zhv
z@xvBaLkBZ#>Xus#!&G6sR%(l(h1$xyrR5j_jM1zj#giA&@(Xl26@n<9>folx!92bQ
z24h<Dc4e3SQJcr^RE3|QaY*5jX?vj3>570+<)4!$!IQ(5yOU|4_E6aN@4v0+{Kx~Z
z;q7fp%0cHziuI%!kB~w}g9@V+1wDz0wFlzX2UOvOy|&;e;t!lAR8tV2KQHgtfk8Uf
zw;rs!(4JPODERk4ckd5I2Vq|0rd@@Mwd8MID%0^fITjYIQom^q;qhP8@|eJx{?5xX
zc1@Fj*kDknlk{c-rnCloQ3hGh7OU+@e<M~mcEvZ$(y*X$K0x5}s~CQD$(YxML3psk
zFM|TBc-aWBLjK@0qr{-u^ogBxgUZ2q9fo2sjGh*5M_>fO3>fkRMcM>J?AeVP<Ux|u
zIt<28*boJGNgvZU&+HIxSJU@0MMOMk7(|dJT9}B#3C^H5%`@R9`pq2cDNIDmG&|fk
z=;qP1KP0X0%WFW{10wdnB1|TJr}_3V9m=|9t1&c+%CUUz+SxZxbB`X)efq{sF+1tq
zKf-%4B#;+_1Fv@}nSe1EebC@A=zceZ+9L=HMG!TLs$d<`aVBpK$8UGu%?r!ZUz3ID
zw2G?KI8ia%8jnZwySwx2`P0dY`Re&F893$F0%*A8SHESTm@B%nT<YZ$)QN^ti`2>&
zlfzX%cdp=N+4S#E*%^=BQ+N`A7C}|k%$|QUn0yI6S3$MS-NjO!4hm55uyju)Q6e!}
z*OVO@A#-mfC9Pha6ng((Xl^V7{d+&u+yx)_B1{~t7d5e8L^i4J>;x<7@5;+l7-Gge
zf#9diXJ$&v^rbN5V(ee%q0xBMEgS6%qZm7hNUP%G;^J44I!BmI@M*+FWz0!+s;+iQ
zU4CuI+27bvNK8v>?7PZnVxB=heJ&_ymE0nN^W#-rqB%+JXkYGDuRw>JM_LdtLkiq*
z6%%3&^BX$jnM@2bjiGc-DymKly)wVkA-pq;jSWL#7_*moZZ4I|-N}o8SK?sIv)p|c
zu~9-B%tMc=!)YMFp*SiC0>kfnH8+X5>;+FFVN{~a9YVdIg1uGkZ~kegFy{^PU(4{(
z`CbY`XmVA3esai686Yw8djCEyF7`bfB^F1)nwv+AqYLZ&Zy=eFhYT2uMd@{sP_qS4
zbJ&>PxajjZt?&c<1^!T|pLHfX=E^FJ>-l_XCZzvRV%x}@u(FtF(mS+Umw<d2c`9Rr
zR+?yr(!A0r|CD~t7GFV?aaA(6z5nz_Nm0i$V6I-ucK$u?K&%hkODCkY(1+;DS|bQF
zb4mg|54xl}b6Ewc=m`{a+NEN`d1?%=>$e+IA74e>gCdTqi;6&=euAIpxd=Y3I5xWR
zBhGoT+T`V1@91OlQ}2YO*~P4ukd*TBBdt?Plt)_ou6Y@Db`ss+Q~A-48s>?eaJYA2
zRGOa8^~Em}EFTmKIVVbMb|ob)hJJ7ITg>yHAn2i|{2ZJU!cwt9YNDT0=*WO7Bq#Xj
zg@FjEaKoolrF8%c;49|`IT&25?O$dq<?{UbIQ0;9Tr9TA6pzz%=H>8kp3#la9&6aH
z6G|{>^C(>yP7#Dr$aeFyS0Ai_$ILhL43#*mgEl(c*4?Ae;tRL&S7Vc}Szl>B`mBuI
zB9Y%xp%CZwlH!3V(`6W4-ZuETssvI&B~_O;CbULfl)X1V%(H7VSPf`_Ka9ak@8A=z
z1l|B1QKT}NLI`WVTRd;2En5u{0CRqy9PTi$ja^inu){LJ&E&6W%JJPw#&PaTxpt?k
zpC~gjN*22Q8tpGHR|tg~ye#9a8N<%odhZJnk7Oh=(PKfhYfzLAxdE36r<6<oD}e5;
zMPsE4+rk0d2jE*#p84SO^!fW~`j-|(WExf+!}WMlI2oGcLeMqZ%ofC97d<+nflE=C
zww(j#(;Qr&ut3IEyIwm>a?A;rO&ELp_Y?8Pdw(PT^Fxn!eG_|LEbSYoBrsBA|6Fgr
zt5LntyusI{Q2fdy=>ditS;}^B;I2MD4=(>7fWt0Jp~y=?VvfvzHvQhj6dyIef46J$
zl4Xu7U9v_NJV?uBBC0!kcTS0UcrV7+<p(Ba=Bk7*SXvlcpQJatnzmyl-^GA6y=0YH
zU!Qp*(5v5`qcU7GH`fZ53mR)&#Os~1d`1FKAc~R?v^F@3sPXWHk(`{v@BF<NgpL1h
zOYj$ZQX-EI8H4?Ypq8IMFE`LLGMYNju;D(Aux0jFNCc@>@~is?Fi+jrr@l3XwD|uG
zr26jUWiv>Ju48Y<K5Q0UFt#$Wh-3Y^huuiZIhuP~4SRD>^#qn7r9mwIH-<mOw=)2D
z<iCzV917q@YTEy}IJiO<?It)?BnA;jg`vU#wb|e4BpbC^HJE}Jh7S%#;t@=RHEzf3
zve@!5mXtmM3~}?iGNYp|t2UDZWtZs+?hWj`+Vz*5E0~r*FRY^QnYC-}Vte5CD38TA
z2heFf8>Pv6Y|V|V-GZ&+&gQ?S?-`&ts{@5GXPqbmyZjUACC&oVXfNwUX0}ba(v978
zp8z!v9~8Zx8qB<QXT5I&+92wF0pO{dS4(N<h_+P+tKZn8-IlF)tWr~gMeIiH-&7y0
zvL&hwU_I>@7>oFPDm^iR@+yw`79YF)w^OHB_N;&&x7c3l^3!)IY#)}x)@D(iNaOm9
zC=^*!{`7<aJO;!0Q_GA?kGJMA-q_;pS6#JcnV+|?H`ki8UM3IyaP&Y_Cob&3B{Pk)
zm4w3$nw_t--`?`O5&1RGdSO&%Hqq;;K{ebNOqKIk%%SGD!F=%uOt^n7pXHX$w+HIP
z8dL)o*Jpb{DXQ+Ru13)nl`bL_X#5zH`D&t|K|2sG@Zx^L{-A|#-X*Z;4E;wV8qs|w
zT>={3*S=%iU=KsPXh=DDZcc``Ss>057i{pdW8M@4q+Ba@Tt%OytH!4>rbIbQw^-pR
zGGYNPzw@n=PV@)b7yVbFr;glF*Qq3>F9oBN5PUXt!?2mdGcpv^o1?Thp`jP10G2Yi
z(c93td3F3SW!Le5DUwdub!aDKoVLU6g!O?Ret21l$qOC;kdd@L#M&baVu&JZGt&<6
z!VCkvgRaav6QDW2x}tUy4~Y5(B+#Ej-8vM?DM-1?J_*&PntI3E96M!`WL#<&Z5n2u
z<QPxSVI}f8nvsYEV@sQO)6fswrNtp@sU=8(-b8Mb5P$r8S==I%7kh4B)_n@!DLI2Z
z4PP(&9*0`aDCzk=7Hs;qt@l};2A|ee_lp|_XHg@k->o`P!~vBT$YOT~gU9#PB)%JZ
zcd_u<u8SkTyW@XV6qrAJ#qjS(2-MC6glNGYe|r3T`ER-;ck$QHoSn3~1RN=RR%nUZ
zKf8<#6k1k~H@+pG{73t5FQeCnhxF-1&my@?)3Sx2>=m^LYzC!pH#W`yA1!(fA;D~b
zG#73@l)NNd;n#XrKXZEfab;@kQRnOFU2Th-1m<4mJzlj9<frYer6HiQx@?8?NJ2Do
zObcl_ecl~1qF&eiOVBk0#ZN-|Dd_D_4Xx*PUVf?)>b3pv-GF$elX7ib9!uILM_$ke
zHIGB*&=5=;ynQA{y7H93%i^d)T}y@(p>8vVhJ4L)M{0Q*@D^+SPp`EW+G6E%+`Z;u
zS3goV@Dic7vc5`?!pCN4<JvL_48+Q8LQ@>4Ts@*{)zwy)9?B||AM{zKlN4T}qQRL2
zgv+{K8bv7w)#xge16;kI1fU87!W4pX)N&|cq8&i^1r`W|Hg4366r(?-ecEJ9u&Eaw
zrhyikXQB>C9d>cpPGiu=VU3Z-u4|0V_iap!_J3o+K_R5EXk@sfu~zHwwYkpncVh!R
zqNe7Cmf_|Wmeq4#(mIO&(wCK@b4(x0?W1Qtk(`$?+$uCJCGZm_%k?l32vuShgDFMa
ztc`{$8DhB9)&?~(m&EUc=LzI1=qo#zjy#2{hLT_*aj<618qQ7mD#k2ZFGou&69;=2
z1j7=Su8k}{L*h&mfs7jg^PN&9C1Z@U!p6gXk&-7xM~{X<iLOVw!aav*!V=`4l#Z}C
z96Cuv>`nqH#aGO`;Xy_zbz^rYacIq0AH%4!Oh93TzJ820%ur)8OyeS@K?sF1V(iFO
z37Nnqj1z#1{|v7=_CX`lQA|$<1gtuNMHGNJYp1D_k;WQk-b+T6VmUK(x=bWviOZ~T
z|4e%SpuaWLWD?qN2%`S*`P;BQBw(B__wTD6epvGdJ+>DBq2oV<pcqb&6wR<4FA$2v
z5~)nCP^#1#txj(+n#>lf&F*lz+#avb4<LeKI6+c0!*aYJO0uGAzkT?h&<)eF9oO@N
zFp85j%ZswAo3`tRahjKP+mG|QpZEJg2u4s0CrFBBSdJG&Nmf)%H%!ZRT+a`}C{EHW
zFUqQJ+O8kQX<pWCKhEoZ-tYH^5fsA-lA;-w;{{QY6;;y>)3P1c^Mf#olQheVvZ|Z5
z>xXfgmv!5Z^SYn+_x}K5B%G^sRwiez&z9|f!E!#oJlT2k<v)*-8Izce`)2-oo#(W-
zoudGWwGo@1CGNHF$IO1;TKoQC#d=r1zr6R{_1!X`9kp|Iknh0E@*R+w*=1K9s{o0$
zk>COV0000$L_|bHBqAarB4TD{W@grX1CUr72@caw0faEd7-K|4L_|cawbojjHdpd6
zI6~Iv5J?-Q4*&oF000000FV;^004t70Z6Qk1Xl<E0000001Beth!e-qIiLWEb%ZLV
zlu{~6UVVTb6vR4Bl(ZyCk|ase4n~5DnVFfHdC{Mq``+`wUsuh>{X9oJ{sRC2(cs?-

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/category.jpeg b/modules/LIMS/senaite/assets/img/category.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..24b156c59c28846a454ad1b9cea717cf3ad1f7d2
GIT binary patch
literal 14522
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/client.png b/modules/LIMS/senaite/assets/img/client.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1c919242456a8e60f69296d4058a659f8ff9216
GIT binary patch
literal 8164
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/contact.png b/modules/LIMS/senaite/assets/img/contact.png
new file mode 100644
index 0000000000000000000000000000000000000000..d726d3ab9164ce7e618266128b334e6cf2745ddb
GIT binary patch
literal 21940
zcmc({2_RH^|35yHeVt_NF|ve&Y)O_OAtXyhgh^T~Ns1`TSc>eWMX8KPD$68WNya{v
zO7@Vw>@s5+!z})vq3-S0z0Y%>=X;;uUmbJK%$ei!Iq&WDe!btHv;1+nAF|fm#LNT&
zg+d@u@DH*~hv*pD8XNAjvfVCu{D_k0siVgw&#EeKk(Bp8<8ku1q?x&?q`9@RspQ#h
zTNE}+`ue+`@bEh)sVAwug>$(ZVgzAYvxe~>{4j(6EbJ^S%*-sDY;3IT+??FpT%257
zJiP1H^6>KUa&fH{T+7D~7Z4EOh6xD^!iCqt1>lT}K$*aIm{~YjSUBK3Ts-jq_-DBi
z!pFYm^qSL5P$|e7J}46(bh#FS0Fz{auKYm0{Xo}%F|x9;b8vEj6N=YD)<Bt<)-W?M
zMh(sm0iQ#d`B>I%P&H)bw{c~Y@`bB~U%AIFy`!K?z_y7Xqki~w1P7;}kg$lT>_$0x
zg-sfoTeY@nZ#UX$Y+}00%zW>@{dV>T930(_96fg2-NW;Ypa0o_z;ov#FI<d@z7!Li
zeD&J(8!0z$rDkN_&w7yk@X_O^g+;|BrO%$1RoB$k)#G2ie$(92+ScCjv9oJnaOm@w
z;gQj?apKJE+&pQ4ytu@e7Zk#@IxX;fbz(owix13e4Kp(nGaF-G&@};IW8!0G*`Uh0
z&d`R<)t6sNEu0;`<I25)Dh_FNTY|vh(@mU$G8zN2M8?!sX7=|c7V%%r?6-;iKCdna
zHxm>HkBJY0gwSj=V&x$}Z&?|!5OW0&k%$Ph%Js?aP%l`$gw_Xr#AtvhK1MT6PiS|k
zbF)*gxwJJ>BKzZMuOV2s5S=q_z$aWtD@};7`D~gB@tQ}>#=eUBca6v84bO_V@+GPT
z*?+dGx9XA`6vDqd?QK=xyRp2j^HZ6lPp3D#oQ_*e=zgYBk)cQFu(oAL0*Y{;F-n4q
zVw@E2muFGGl>C*;?=|V5q^Z@d#+&Hr@Of+;U3M8#bx?m>;6R#^#E2Ck<Q6k?i))Yk
zGNdG-@iR;CUSr64R6N?lCl<3-Hh>6ADxR`G_u3+EL|#Ac4(BYT$Aw}m)8qW^lofUE
zv}YC^Vq^S|Z_rSDt!Ua!!y??X66x%e4UThI*3fpOus-57--imRz=-;7<h4q(H!sb}
z?_tMo%m~vbkdH1ySfa>P{c}-$wKqhq;+1T|Rn)|SB6K1qE~BSYDPH~ARDr_&k=n7m
z6S_Mz5zz6LElHx+b{w=FNq5M6&7{}4?|jEV9vn)ubnhCzJE*i>jJ9d1+qU3Vfaw{p
zO|Qk0tl#X?Jd3-d(z!sYBHyKK^|Em$??okBZsQwq?+W+G9kKcNz!3HLy8b+cpCW;-
zGAb9KSXcREx?Cz(9ZJXOU)R9BcrN`YJV|MyG+DiMJ{^|lA)gV($pg1u(`?%ee%Tm9
zl;GE_*EE@tZ46l8HU?bA@M|kKxaivI8!Sq)aH#mZw{~Y|tb8{aGMl@Y9Xa$kR$Jz3
zB~v>Nu?*=?#}M|)kuRm-VEX)?T3ajDe>&V+OtvtRC9D@79IaOWbm!!HH@3St@+P^d
z33O1NCz?%{DTw5~wI}#)(7y1bTN-!1mh9LrFZ}6z@~)xv^g|!k6bc=FYj*gw*|ga|
zFX}&4pM50(SH~8tdmP`%zI>}JlX&1}jx^I{LveOZ0XTGNVj03rT82d2G#y+lnvUud
znCF)$>Nm<FM}3JoSklk_;N*K#)04bg_UvjLySyPxG6Lp{dh<!$%ty_Fzvy%(tG!Xg
zeLu;L$x`aN1=2{$U~k+qgcFZ<yx=|fQcab1JxI}Yp6ishNuvXQtH15GS2AIt(F`U3
zO$I<Ptn$Fv|FC6cgsqEJaEB^>_8}`ErW`Sa(Nzw9G^yDJVs=b`gU1B?_L0&!#LH*%
z!ot?*@*#1>iE|GUdxdV;9~d&;{2mWA7`H_0AWPY%gtVrVh_jAFxUCjR;NI5lyN#a;
z_L$Z9^_T87kl;9TMsw<IsnELe**C*xvRC5N3xM!jul8pCJfQ#av7%Lt{>C<4u|X~#
zALEMKmTf0CI!xu~eY$^T`<*D})4X14u@HI^`iNDRkp(Tgg4><0SbPKC)~*?8_cXr0
z+bKLsSa(WhUG_7qC$<JjmPJgh?c+eYTljEzs<RN5A@OV<g<l*p@=y4Hq;f>3EJM82
zyKraZp$wA|yv(o^IZyd?mW-?Vt=3RuIAbe<T(hwNc4KP|wJ@_VK&YdujP=!VRX&|=
zb)`413i~@B=FjYWdg@Kfn)sofeOJ@)0#vg7IEpIRF}O2&FM%y=@Mf+T(*(Z>jOTf(
zOk+!f&wHHGua5p_$NxV#UNan*<1{K-mzaHgL+s3(z^|^C{q0S-vk8*+b6ARQuuTcM
ziC|wXp;mIl_3;6jWM=Q~qX@;w>E~7g)c5vNNGe~-AajK@?QXfzKtr^Oa%5iV^~RnE
zcekU6g)VcnD1`Q7_=39M2Y!g*ix``Nd-|H>8z7cB%BRDs`^bu=myWa}Pl%h>bt~K-
zJ8Sn)k7?&d`sq~igNld14AXmyr>F2lIq5ah+4XEsTBdTood2U~{Es#9yBR9Z4bj;z
z4w~grj}nnPdM%6F?q2_BWt#BCiEg#TNyTG7Op~SZURxzqYzYhL)DXuLZlUYLkjLB^
z;{!I$aJVe+!{A`WmL27x-*+Gx$v47~7+}~KDn_Vw8L~9xwhVbd@m!3kz<^tDYZ>yI
z7;Lo+$!|w4`IKO9{{Nyg5bTE}vQ#7W4l))uiSnU|i-!hvjG9vUj??!b>QE$=QhH)y
z81nciW4`I%=IW^MEF(;uVLxUTW?=e7Al_IQLuBE$AJ}H6KulF%hFl#agIPM~qUZX&
zQCsX=mLY__$VGjXm}SU(7k(LHNot#Afxv-H{=eP?miRz0Z~#M$Cfd{Dz<4t=v5n_x
z>_8}+flzA5IrKUZE1H@<uuamw$(U`HVX(uos*GrBW58joBnwfJ1;5}$;K;%l4ka{B
z!N7HM3HT{4Vp1)7tq;}rv4__Amg*UY?k<xtL<;k%_;sgGOS2KN+RKn=DY7~}c2Ds#
zB#aMD+`r^tW`Ib=5I&<=(M@LU;BK+1&^INKPpd>CNAFLd$V@`Z5CK%yHEXtE3{_jG
z3NvTxkEKFE7>a#30!F@pY@Fc=t9^G^TeU|2E<cp)gLseI4UF+MiXVVC*nG~BD^w)W
z_6@D%ixjS@s}HlIL7g5*Rs4d82Y<~fDFMT*G_6vM=GvN*>3BoUGgXI{u{KifT>lnf
zk<a#XDn|1Dn<@pQnI-0+)Z8+Sllxn9m?Cnw7|Vvv(A&@iOJr0ZqKI<Ws%FU>6H$J=
zA^%>s(HFy0_@X9dIEEC~Gmou9#^YFYQ3Rp-g<b(-T9W?tM+a3o->VB$qq(naTXf#_
z6;@EiY|X~A>Y2ZL=>N?t>K=k%j9J`<7C?Wj=v&&pow~4M3iuyP0TSBS^bNfni*GW9
zh^(k85I74%@=73P01Vdgx~~*5H8wEaX|yxR?8%Hj7J;gF>DbMtc;YT|;n3H3THE+X
zz3_C{W2{PE(S(Pxa&}@Dd+UqWiWm1=tC`8AV|8269;l1kcUL%%)FOEgA}ybKsxnb0
z7H7##6icc(nUd$!M{cM~P0ZweYd+SXV|tvEwD00B10;7^cIr$Qgnn%qGVqwr3siPD
z0Z->1T!x4ue}04R1$1G|iY|)npQgbZxzYXaRfw5?Jj4z^1@ZS!t`>|ama7)KWw)(D
zhJ5t%$u$Y)n=$RU)Kqz<r6j_1d=WyZyJ%@+fm_awY?jHdf(Cl(kq0%YWn>+EuPiy}
z@y4uy1hg%IHnX-mWb0V}nZ#S0Owgh<E80bXJs*wK*)REo(YN$G_AIr{%Et`uh`sXW
z?T*JzZqPlaw1)0bd)`4p?{<XKKQ2R_hF+xD1uMO5I(b6}xz4e^d2}hi(vhR`O-_Jn
zL4T6b6&Dh_wB%<|M+n`yJgDFK_&|2NCW?E4l;oB(R#+soc3YJlqWOv9{9Zbj9A&F9
z+)<@oNwm|}^t#{6qi*X<_NR*MB6W>hm34e^{+~Oh|H=`qB79jm#I~6M^}!AUVy;Kk
zV`JJ;tor<9Z2iL6aQEnWzmBv$z9ZWobxH)C^v)r7%z6_o2KN*a&)~}%<1{HZ%36yR
zqi%J^Y%tW7Z!};NpqK&2eU8XepFojvai~(SO?{B#;Vo~JFphXzMSANtgRK$$B}6OO
zbZObyZF+NBc>P)rpkO`IWZ8u&b$=qI|3vDZQuR-PDb?NrcUx!lhtq_3KEDcChMetR
zhLmX!SG>m7Tal%*V?IBj-P1+g6LIjKhw<uF#fP*fi(T4rb<P1bt4Yx|kg%lerz%Ac
zsZ3Iad^lfAES}7jut3{vMsIf`I)!RdJKu42zmu`$c`7Y%D2T5LJATGCZc5a@)s#Hw
zPp!fZ^AEbDX<#nVHx*c~>Gte66^87*6+M^Edoor&ea*kz6uUyXL-7cqP+cp}V5R<d
z#&eyox^r9%+DSoH#B*=gq-po3LWrJ<a|;7lDxc1Q^1WJ#<pI2D*}}z5>9aE8XHw89
zE$Mm_qX=%`fW`HhM?chSDwJDb-@tu>Uhdo}ydb$VCY=0%ZIDNR((MCcM;7h&h8@`c
z+t1(Y&rSqX(ywwhw&MDeF@<@PC!Pcb?QeNKO7IfmwjX<WGt>`CHZ~5e4g~N8)35XS
zI#q5cA;A1*QnHfe;pg#)#~E9ZqKig@Bh+=rhwN+OJXAEiyij7D56;joTVayiliv14
zxibwuR<x>h5o*`n@Yv$PMA`nY2@h+1Wgpx-NifIkKg6E<<`;o~$4!6ssyHW2XD?ia
z$iW7&6rt{Ah^Z+mZT?T9Z91%T={s-)uiQ;5;GxKR4I^VZ9P4NfS>&g4-s@Mytq;Yg
z$)~=yGb=L7n>R6Ptxtw-K<qq*H1Hzq!97Cp2cEGaMn`K}a@my}e5tax_{RHj)-f4d
z1yfY*I>p6aS^@Hyk{8K|{5&WfWu!P-8owZFOo81P<mrLdYbhH@mzd^30-ZrXU&V3X
zU+wUb<r{JWDRtZJqx}>WG<n?iK2L0K@7i$VoOr}TYNI2BCJ17#44HF$WYDS>A##({
z>ENO2VLnB*(yiX3AJL6@i0w!v^nDy6ohYECRB(EP3L3)8-r~j_^FE!U&DZdrvLav&
zw)^W%e0sR%#*5P>=QrLvHOY6l^h$$jB}73R`-M_pmO^TbFP<_Gul`CuH#<>g;xmEz
z0HeYYK&lG3PE_5}9kpD?#EiK6oj10<O&*a9TJ+jLRb2cs@zZp^PwU%j5NdLOB1tu+
zWzT=i)0Mlw=xBZQ==)N1nU0Qc>z6Ruq^A*Q60c7qo@i0|GnOHwq*SDEV2|=#QuK${
zB{Eh$?;brFmzMDr9(D59X1eS}N~x@X5*BKZ+zx?3)k~HoahVS3iDCzjR)^^%pK}|p
zO%6(hEV_}7gFEI*RUr$p<Y(n~;fIn0Hg<Tu+ac*a;JXab&Cq7T?(JX-N4eH;pC!uJ
zNZ~~xk1uV3h(q8@02$v%4&!uGSb@k)jTI`?H3T7i2uBfClzh6;Av*VrnK1tj--K5*
z!(p5f+B1nPgN)S`TnLpUTb$ChxtAewr0JxS?3^U`6%pj-%%uIg{Y<EWYuBJuY~KN=
zv6RzYy$2h-&hW#NMJ{J%@}@_=(qsuGgmxo<ma)^DmSpL;ffu`ib%=snj>eK;$znsj
z+AR;Pw)sY;nMrGsBZ*uCBpji%t}7`j*fQHPYeG;>c)0W~=ao^D^O3CpF}?qeBN!U~
zuQq!I_ICRLd*k#bel;rtMB!W!$XFRD6wY9Q7?-yNSQ<c5IOH052kH_+#P^#<E<@Z=
zOrHW#_1ljGkoE-BY=zwD+I`4O49!9JAJwpC8|=WN$<iIQeQe_a9T?vH6XhQFc$$q)
zEO2=T=X7}3SF4IcVOK}D+rK-XG-*ogGf!!FMm{*G)Pp?ZJ)HE8Lx8rv$pG=LkE)8t
z!<J;z<bbOST83Oi5b%ig$k7{tAPHcZrVG%dnyuMp1C}A&zQh`O%yEzg5L^IkG5z_A
z=v_rXEIrGRn)Sh_mLVAqgJ`M{j=Z;@7GI(5WL}V6-M8+mp4Ne<NpFd$W*#_{tVAfJ
zbGQ;G29?GWjA}@|ye&15h4Wv!RK!X5gFasQ$`bl0^cChwboeslsM2QVgHnN!_58}p
zn%y@I{9k?9z@{VgaOi4ZbH&a3>1!g5gP~x+8)&%6P#F2lezI@Bp1BxCyl-cFX@~U_
z^yI^y(35v%HwDta8crA>WYARymLZ<(Kp_tl5tJhXm31`-Y^xolg7LnApLDoS?SK{`
zNU0UP*^Rm>>bfmDW{SygCr=+p8@~0|CK{3rLcuUCT8?(V+yfC?Zga9JSg$DyruIZ~
zTpjj;leloE0b!UpKbt*CBp@AV8Ty;u)7YEP0h&}?#dF2$r58dLVNcd~%=r-T0}sLp
zk(Fhp7s}O-l!)rzT2saCcH;!MkQ;UP`KzB&A$`qrFD!*DOIjwChKin+B)CSg@7rV&
zy9EyY0JVDrm?`<X6_z9*o#p;YMt<WPVf6*sjVDPrgUL6t&`K>2Y}O6Qs;;rBxcbGR
z1AAoylg^nt5~s}Ou{i(~e95d8Wz8ILJ`Ey5+m!5+*2&{RLAO1kM70HCpJMK@7Ea7Z
z(>cFTBpn+vOY1RQ2hQ1B@47;clJ_k!KFgjW=DScTz#a7U^;fT%^S?6=KLn89ScvcM
z{Yfs@G4e9>0=h~N{ds`8e;IO^f*u_mWg>+#qRn^b&&tT%ITcoc!M6#6v=>a=QE^6x
z)Cn9|4Ap}yN3jkZs&Wx*_nUBLGf!^wK8)FuXm3rr{HD|G_2S)}8lcyc%a9@~8n>tw
zo%3)yte5v%F<EaJ0y|F2K#v}3Micf5AP6LMmmEEc2bc_tsx{j*ivSt<$5Tv^RDn2B
zT<S(+qVg>+i6n_Dtfs^4G<l|l<Y&m3K5;sNy1wbFzlv}m*0RaF-_}w47)-VDy`XGE
z!B9FYj+MbKurSfmsZNCt?h&>29eBX3an{%H1Y}Oa$<sJ+PXTs3bVHff-Muztt@*;A
z8v@kL@x;UKOmhLG5-`^?m%u*DmxR)49mRM2dv5#fB}Wi0JiiVTj$u8^)cAH!$i+~v
z9%sv-Gn#d^SdCfjWV7{O?#8^9S&(V<`xi-@z{g+-a)>|i;2`E=u=Fu?{ep)^ULC@=
zHRq^sRjNGGJf6-0rRbD~>90jmP1^F99r3Y86^=OtzdkC`#jA7j@~)7|y}dZY39+gQ
zp{E4X3v(e%dtwe1v?#e1M`;K{Z4BtQs9wib1j&+-41@<H`kOQz%~!?C-3TY2tf_Yq
zZPO69V<~I#S9DNPcJ;kXEW7U7Sb!a-knWNd&=h^@NupN7bf%*C-Kyl~J*rBD)TU?n
z0(`3|{kq~zA)U*Ca8$h?6Vq-z6>OI2sm#W9nKUx-wuS(QF53T{JoZ1xLm7yF75;B@
z2iO%T?g|Ra0)7hsStbqO|Izw?%Cm$3#rl<$`4=);G5X&>M|lCaE~N`a#G}1(oc9FU
z9SGLW>>2lTI>N!*;7>(2b0Bt;u(68s{D4dw_&D4_-{^Hel+@eR^=dtuJJD$wGJ4Md
zk$cS+OaK%kK+3|PjEt24Wwf#b-eG*iz+u4*{)mZuT7P5c>omQVw*C1ha^Gj46h5wI
zbc1OkzN1MqW+-8eiU3*5sVUq0a$l$A$#?PnYJ7JBfIn`yE1=Z#!qM51iAKJAnPymL
z{MT;wJLp^S3dkS4!o+MZZU?eI4mop*zG)d!5Q3ZY^Mg_hSGlfl!-O-?>I(T~`{6qa
z7O~=-kQns;fbzq3_>iSI0j92gNlxE;ybD(}Nqy^fwr`W=^Xa6QOC6srL$iR4)@pvt
zXbqJc&BBG~+NFe_p~^dOP``ls#|uUo#<tn^!wSa!?QVa+2@EmpvquxhwxXZ)y~)Z=
z685qQ^r=p*&)N3Y&Mx_V&9+zj<V2>L!;m-8BDr2eJbuRXhp6}b5@~LS3&y=B9#p)1
z_S`ip)#P&0=`%FXUlYZj^M(H=R}f5&m4~_mZ*2bE&;RiHKf3MDk^M=bx^dN*;>a-}
z{>{FD(MDxYVw|6Fzaj2<w$RO$R9_*M4_FLX?JfPa!5)O;@iqYo(zdbZ_HETNzWbD$
zlDP%YE*Y`!3Bx##K`d;n>^)}FyQ2>en))+6dUeE~8)@XY4+6|#6~ozp5(I-y1Vsr3
z(Rg=s)p0oz5Z$=JbyN-7wF*hk@are#o_L9c;6;*A*Fv|+&;_Q87Xg*Rl1r|>p)XFb
zs<Chgundt&t(#$`T)LUaO*6YqUj$5`;}7@imzeqev;QP^uDa4SHyBP9e1D~u^|Peu
zAm{IYfSw6v@Q@S5N%Y%OIm4VZ9U7oM`|kj%N?$9qrB{nsda>xG@{nQMkzy|oWlea@
zN7?(TTldZAAMqr@$bLyvfV4Gm1|%pe@dI1EpM58WFox)oriYcO(0PV3>EhCqo#+oj
z#=r>5{h-9V0;J>A?WUwl%aC+sK$1oVjsw!QKe?}HpQ?I(`2F2A85^;@R>KA~cc!89
zilftTbk%kMmND!(FQ;pC7Bh@{Dyql3CZs<aOCxGTuq;H_#bOKx>a|<GhgO%~<O!Rp
z>8V~JJ2qy4Lp+e9{|4SeDFBEw-=y8c4R}$R(QM->aVnRBH)wT6ynv}$Xf0+02UIEF
znlnV5v7hy)$kUrrv6D5#XbWOU^exRxQat8w)R!TMt+febjUq!4=SAspx?)2-(s;U1
zOR#Y|%JkvrQaqQh_Zhx{rYO@76p3rl;+5C~T<waJ0tMpLop1Iopqb#<V$iHoth1Qh
zRsV+V`LkQ^1-CU>sPm6PHsbDJx+p_geN%kI+1d)_)E(`XDxDhS_eg(lkqvM+tZX8>
z3)_q$EBZ`%!y<J7?Z_Ui<JZ^S)s;EkvZFF2twpCiv+vC1=ZGG;cAWU%D{K5-hFFID
z+d9Mw5?zh!-zl7L@ja=2#RmgV;rN@E5PX&tgJh<15ra&gH&amqAvy<(pV{WNR5NEv
zi#Q1JW`E*yE(YORh~kK@l2X=1Jm@874)D;1u}9fGjuWN`FkMg9Gu*MP1ntFLjnA>~
z#9o-?Di4=DkLiDQu}fR(vg?)bD(172vGj*I{b(|1ikM_`BVuYCvumxGJT7;Wm+Ga@
zoby?8VSBDSZp)n7#r6CRhhXLqs&&TwXQelq&uvKE8teWsCo^6^`k_?jU$as;Lv;Vm
zWk~4}9DA^_2LWH-u}E;q)=J6l`J~T!TStO*sClbQ1Z;<)@MlEhW5CU3CGNbT>33+f
zQtj!T2pv8vEFSrhiOzXcu7)cJ5sicAKX^_kdy-_;A*_*n;87*tEA5S{@$qX+tOS-o
zQN(Mj#D?Z6e?8?H9wV!=cng+yh0%#Sr8iuUX0~Q|qu{|1EV#?7JKqinux<pYlrTM+
zNf`9rLvqhAw+s<`kd$?DapW?$k87(`vKpH69Sw^<iD0I`NfUW?Fy}&h@No_Fs3=e2
z(FTbmMZW|#mvh_t?FZ!Q8xvgQ$uuIHH8DEQCv{<OnU2lr;1_}6I)~%W+FZpyl6wg`
zM4qT$>ZnZ;^6cG6<e5uNEPU*w*Y>V9`o`JAd)N-CSFVRv=5G4trv4?{2hLfE`iLK*
zzW?I%FYpXP!>o`Ipy0`z!6<mH?8K_CA~QymwZ9vDmb}<M-Put&OUBf1Pj+xrP+)l`
z`Obf%+B(gz=<8=)<cZ36`}=st%jj6Z{Me;<DNXg%_$A7Jcu`sb(WFk%J3#u-UP`eE
zcB&xq-qX#=>?-UY+sfT1TO{^^yI=j#x}g5^)@)5^adiI^B%JE;sLz3ljKEika`dd{
zr`>Vtdph^&{i1=DO)*qt+&6U*YeOrfYkMXyrXb+DrZ2Ex^8umj#7T^mXX-!><kL0L
zP1ZzHI`{pR(!n2(XSV;hCnY1g*@ljm=ST%x6Ssc(e6m$M`tu$|{3vK*p$np`Y%27q
zTg&(Q5AM=M9XcRX*pX*v7~bK9FQ`ZNYA$6_Btv`CIA}Q<RmVk=YAVz(qS5z0?dCEI
zPbOSVm}nh(IGt8ZrP!5TpzeQ6M%0!a!`<s`$oA~=u691?R9)w&%@?UK^vRlSUfR@=
zfc@A&x?V_o2$;AuIlEZBliZG;?N>gZvxl5EKvvgWKJPD{)8o!W)S+{}qp08sR|oU5
zljg*b(lw!*j`80&yEHYu?`ZUTo}tZb6eSdM#~g?z0H*E=Ri(e7Z)qNgIohg0uFp9p
ze0-hpoh#D?_Ynzb-H?Cn`>+oHBZ2Cs3|dXT^!IV~@T-s_1a3<)Y`t}hFX*Pz`ue`q
zrAOFXAcG!_B>B?H=z{cSyHiG)6RIBiQm&MDFq<oGcO>+OL&+l#sX3$P>2?{n`mf8x
zbZM{sYQHxE_E2+Pr3y(_K-M=#Zfx$LuhS0RpINyTeS9Ln10gw@BYpH5??=6dOiPd~
z>^rL{6v1(t%~JucuS>AY%iLqnb0+htv(byz9JMWo-5nKy$LX92lx=}m_Gu+%HIMi#
zx}xv*Za@%ZV^WqO66vs<hgjxfT6qQ3#l!^}Q)co(eKz+MS}LMY6GfKKo}9?2opGY>
ze!3}B?$y&5H|b^^?;s)K#=+`CDDq~lN-S@ext|rl{sK;k(iVE#D&s@C4qt#(Vmue!
z0Np8w#_LN*d09aNT^g#NJcSFDJ`H(1Bu9?u--LM|hIA@-8wz0>_!{Y(7npM3>4&+S
zY}3lq!v``YI^9}_!dp9rqo)A<$P#R!piI>wI0`GrSSAOik+yC)Fh3*x>N7gzDermT
z#$ik?F5X3xT$6+L2yCqFO1YFDF3Uq}cvEovse+6=NdRxnij56+$R+nVm$w(w_KeuK
zo&2oU7!a@_;H;cXGWz;a0Neg<J^Mc_|NNFQF*1;%@1=J}_5q5|GYG1H1->+totC6)
z$#V75aQjGUb7!NC*emX^5F3Zk3myGgp(E%jmtY;=ywF!ErI&ZiDyKZ|ayGZ-FW_1X
zN-8-bKz94nWC@XlChWwBJ9Sa_kR$tNH+riST`D%XK<kKbMIdZWpP3U_T13U;2*y_2
zW@w5bxyD6R{oq*d`XD#S_if2um&_x-+9@EVQHA@U7EUDx-w9cl9_4-7{p#YbSCWqe
zs5o-BCB2@QhRYuE>GbEiq&ik&f*M1$DraeR&P_bB+8NV5!-~6!jByNWtB?+Sytqqh
zWdDnseDv10=sd_722TFFH~haj?>`aJ6pJj#n=Q;%NAz2p0E3`~ns|8dKzuPG6(XI%
zN6GsKvCQMJF9*F+{n}m5_Vijjy_*dEl;iDFjk}!`+s8eRjie*ngJrSZn)z7|-hX&<
z$lw%=`}sKgh$c<X{tdchVN!gcu?ugMw6{ogv_h|CNWtUr!|G3Rs7<HzXGZRgmk&j_
zGZEIs&if>wpN`ZvhKaWIB*jtX9(H!`s8xO>{^IpfHPVqgYog<Q?<7X2&ZPdK(4$}@
zYQN7|dGgfbOc{)!Gh0N3I5~4r|8c6%#d5tz<fz3<5+=7iWNWzRUKyOydl&kMUJYmm
z3ju;R{q|5}9H~LS*n5++2VI;O3+KkEm6Kl`V`DpZO7+#aJX1HoFz7<1j!7Cp&C=@N
z#XPFzU`Z_LD+j-q;X2kCH~pcYt8~IpEJflfgc}-e3^}JV<w~?wi9{6kC6w=%o=k18
z8Z2eXv5<Qe7Q%I$fE{l3a5?AVz&mnwbM1m$UT8MD>c}$0W7`P5j;xdEEPeC7^Iiwl
zwEYoJYxs~RXQey6W-9)IMND6_3vvY93T$QtG_(>ajB}TXT`(uK)yLgKO53-)dAU2I
zUrG?TBYV`FafbRJBdHRukZ>0~)ktJQwNm#!>=#kWm8B@9Z~M#*+cMjCYRQ^y==7tr
zP(zuyHAQ*lN_j5w?iz86tqX~rA44N>85pL}Iy6(L_(8m20s&uBi+^?7x=5%wa-t$+
zYN;dF!$qj6NWS*`u`90GCfjARp6+DpPX{!*u@^ySP<Hb0u3(-)k+tzrqDMX=$y1h~
zBav&+p2qGX1qODak7|jw+y~B9{N;TFA-zHt{o&%E3RUpkGNiU+t_@H}YPg@?Zu;em
z|KSC*`w_M2Aah|yT*46?w3Z?K2g)!tK7yky=d|cT?I*s}PhI_Jej&-lKARQy&^*yA
zFyH<}flSWmxNv9@lv>c^v0x`Bw6*0R#>`ETI?hSI6KqC64s^szCF`B3OcQInVO8#<
zaZ|>PeC?I~{A^#X4_P*Pk~Xv`lh#+Gr7u|S8@V+mNX83eBX+}(4B}|jCdE0cp(HBb
z3%m=g^jWLE_{1sln>MIx_NR-bFCgdF?RbuNjqnXq?8k`(GSy;u=3o2yz(*aUqvyBL
z=kv2p5cJjK!}{0h;o(3ve<I2L?D!Y>_^r$2$A&9Lmx<~56{xV<s2IDO()5EXUS-Ij
z0&Vw&o|y5}D(I>y*e4ou=farR2HCSbq&FhDH9dkG`XGU)$M?L*YB>zr%+fpV*%(M1
z1?84HLJ~cuGzv+u2i-~hrc`yIYUI+!USXgjPDrZdd2cv$7)5xC0^Luew*$dfSwPi=
zsDZ9g4VDJw7w>^2sz41xM;<i&*#)hlNgiY??@h0TYB1b*skx)g1I*~5;<0_!tS*rQ
z&SKT=^?jzzxpU7rUMDuQ#3NqWWx?aC;Du`+vzqBWgc=7gLnue-?WsbOS%k7#yJvpo
zM7_`6yh&NnVp%ui6>;}H&&fR#78u49W2kW4Kwo8o@~j!5<k9gVgqUll#X%0;i69ev
zZ>sU)Y4rtYV_xWH>LKzw&;gU!yS0L76+a&{A7VQ;qg%~<Dw}{8<=!N}{t$Hhw3!Ap
zVF)Ych2Wz)KMqVml?P3sZ13hP%U%9lC|dn3zx*SUQISuJT86laqe;2M?c>{%okjs!
zpX(G-xR0ag(-Y*lt6T*Bxk#7Zt8|zG4TC%eL(p6F<wTJYa~M5o$xq{2yWNUQoaO_n
zs9|zlxWfSYVaOYg*Cch4bV3duOjHpgKi|h65(HU$uta+%Lxw`dV_Z?@!3t!f0Yrq$
z+G0Xuq=rQZzgg*eQ+C<UC#R+F6c)@M4%rS-e3H(J7c~;i*pwk(xnCHvcMRk*E0l}^
zDBytfjKLMlLlxW^1Py~U281z7KL222CEz52eLl!E>mDDNu=H$=;2VxVSAf_Tn%)rr
zy3yh=#U0dj(RB!psd=P8@Yd&O0kR#7$CnnT!}Mm=4yOC*yr;LEf;FHpEmg8bjqs)-
z+k0KFhFGlb3D9iUvP;HCqL}Et7=mR8|Ii+c|BzL*WAJvB#Cvwh!|y+xh}>(v{RAaP
z63^oMLQZ>II;@U!6CIcCsV~?*?U&&4##?9a)9dNail6OB-Z_41|Fsz&>%Y#78JXQL
zob6v_Zy;$^V31uPabvIt%o#r}%ZOj)cM+WQCKO>mikIGq5D7LVkSLX@4+{J<$~P^P
zEL_R37&csA!)ao|92P1tf*??)InYh2?Kpxf!^Tj6O4_{)`An_=m7NYR1Wl{k{w<(j
z0l0-#5K?ITN`OsgUAt;!)8(?ukezr(V2&4nIfm{8)ztjH)hnufzoJbeFiRYvthOF;
zap}eDM1gtvYlzwn^!<xs#*olEfthr!kU_Cxf6xJ4P2tg)sy0LC=r!tR*~w4~$sMm5
zIh_wS0l7YJdUG*Oz|1wXM{u2oqxtQi)7i)kBAZQkwKrA-WP}Oad?9%FK-zuAl7e5c
zk~69r7qx_|YrNzrbU|a=?xh<!r%Q<8RLQgh6zEk0i9QMsy?#4>>L?Myao}U1qS+0t
zw&~Y3Y9so)UGgjW(jv7<*ghm{pq2?aWFSGOrWf%fdUw+t`G#1~0U^(fa4Kygj&`R4
zN)96VkoRT=s@D)$EDqH4^pvVOf6`Jj$5$M<!&?dMdb#~u^v+@=;Giu)J`1!SugLHl
z=ktw`fO@Q^=JHGfDrEVQNgg&l7S<O?sj|CbG(^+?)S&k?9_@)2rM+ic>dE9vdj`4E
zj$4<XcdX#~jov}IsKA?<c*z<?-gH3hOb}b>oQ)KOBUQU&Ds*$;p4zGmFD+Icmo8=7
z-qDB#siXmWXyM1T+mD4Iw>|t*|FK#~{Ev9=AE}kyt4%U1;Q!hmmK7ixaa4FC-70Pn
zO*>n#3~31|4z5C30gd`q3;$*BfenMan7~l^YDg!x!=g2@ab-Qpw8H&1*`xIaT&581
zRKv0I#X}M}>GK_50&0?&d#Pqb(8;Q+kged=<7HFYGFbUu)Ik8c#M4PtTyi4^^xuX>
zOR#(>SADSa$wv=6->%xn&xH3gA!A-s-I+31E6R-f!l)|$=Cr=;FuX6LSod2AZ`G%L
z2~`NzX$Edyzav;WuQEmSY|e@H8O4W(?$6{xzve;_=Hu?^uwnHf(`uSkKduhRAE;=5
zsV*q9R}Y7*$DG%aczf|6F<%*Hh3hXuGOeqrl@K9kWp`aaNUp#2s0?=P6=uBW<(td6
zodS!IKSbeGzwo_M%<@Yu`7f$QNJcvFtx<Sokq+Ys{%zR~BV90t2duau*hn9p6Xd9J
zbwnin1?VamtLUmYgw6gl^862A{f|*<Rm&*RbPhfOj?VAX6@^@Db>dhdp)S7k;;m5Q
z>#caiAlH!)ur9(kXZ9eS{dWII5!rR9k^fb!e)r?7c*{?@zKVz%73##?gD^(L<;R|X
z#{LRM;rvZCR~mE7L0#tiY5*WJrjhCH?tzEoEXqczQFCVT!50nAn)8bLB?Z@YCuw-g
z-P2*G`l8;y7S^O$jSH^zydkvJUS78JSwhAYn2DXR^o%C8Jg~tarMhBs+uXUr;g3CL
zOh*Fjq{383|H8EXBeMd|pE0p-V9WfM88T+cw738&;J1G6(N`Q>hWtr&?=SKR5M&sE
z25iVPxc<vG)^v~z3+~9XPS}-SzT;ne8%=VgcvgV2Lxkl+L;>pJrS-RajF4mj*^n3m
zuHV;9G0LPXy`D-C_%)!1j0!5lR&ATin!!wf1inoNI6_81!wxTy8k)KdXpbutJ{BF`
zAc#A?-$b>j;>*~iF?yFjbsD&a9dMPYB%%?MNSiQ*^2MEL<ovghejo8~uYbQD6mhkf
zq1lXd7hqwqAngyzqY8}a@Tz)JLGX)64pgb#o;`&nDvvkpXq{HNpW1NbgTt%Qk55Y3
zxLIM6N!1m=94-b7;+6#cF;oa(nPRZxeD@M!WZ@WF1>H-ykyLb_R2VX)k!&9dlAL?T
z9hM=L9B6VXa=@94rC+=Yz7GN6b<k@mlA?>6eTSUBV%iC?VVcJ>Bp7r$qkcZo<0_e}
zw!KN?YG8m}tmfwzAKyTz<{k4qq`=ib7U{z`v2Nv$UhkB4zmxgMbiIIUgo5HyI8m+!
z!A`DFaBHV(W_iZQ*J3=2Oh4(p7MKaB_aV#lRbeiXv`z<}>_V@ZP!_JyPYZ7FKg_GO
zW7n(3Oil<@C8Odp?E&skQY^9%o)naOz&Jnf=$%~0;cFIklQOnUCZU<@*Yl&aJ}~a=
zj~m;x9Ch6p`tF=++&twWdd%rMNj&%*0Cu3Vc6Ad0OA8%GEZH*@YGug+9ISQXSiM9M
zXc${P0BZ=p?=X7FzAY<UT@(eR2s{>A7eTPbF6yE|+ZGA#Lu0m|(?d0aRzyX*6#|5v
zi(<<VLpXG{__uoUf8s8I?7kP-kt++b7#g%fqu4gBjP~1*RuoHMuU*@upZL}x>(=~%
zf`U>bnNlHMK0Z@hvoQm~QEa%r4$$sH6=K0!t<yzlR`-qyy;ko9x$brQiwk<U4ek*6
z$kg$fDG_!aaN<A<JE*%-cXtMg)s%q9dDi3DHM*NOBoyBiO9jbObX%|;&?}=F#KPM?
zsxyMHgo(w?$p^a87jG{^;y@egV@2XsI$|%;o_-O=jqX!N6aCON<DsB!;KRLvB+9T4
zT^TGE8pYP5$RSpBK1*<2RiJtx=dNo3ZO{>IR2#E>4WJTWhVb93c9r~914>ab4m}jS
z8GP93q1BP&O=PMR+J0nnCD+utv6EX9zhqvPLzrkTi4Zb}U>Eeal5P8HUAWu(+l!tD
zs_@m+_q4Un+z+CQz@g0(sS=n$=ZzB<Z70%O{U+|KT6vugAG%^?Z8(Snb%P8XVb6gI
z?y3-?^g!|b>HguXZ(IGY_b9Zex3%8EDC*yzYIL%ntlQsKlw%oSQQqRu75H^hWkXO<
z+&L4w13l(XuY6j&3p97d#x9{qR9Xs#<Vqg!&pxmdP(iWd<34`34&K=q>K-${!?fQx
zxakj}6j6>Lm^Ch{VL1Up{(5g2l6Bht<8`tEWg8HlMQ{j3gR1m|pnNgiJ@v+|<C|Md
zHJ4rwA2SpA7@Vt9fVKWbGLX=BO{jPbVF?@C_q%*D>4^QrgTG4#O3^Z7FqQxAEKQ5Q
zb1hBdP&Lq{I3B8q{!P|NKT8>`AZk+zRRcOv@yFBb|DX)uv>w^j%l+H)1jqo;!yb|I
zmLWT$qma|LaO5)Nz&uI-H)>75(`Et9A_V$F_Z9!W^Zc%p8^HA*|J&=?52;Y~a|TOk
zoDzUMs5l1vD#(DNTd6;q2oQvA$B^8go%lyv0w*>f!-=4O8o22%-((`4OvZ_T2_k=-
zpv5mkhR|+fM<VH*0sulK0SHx{09cUNCH_C^fIm^I-X}H{Q{NZUD@m*<U=}P(EIfVk
zSX3*YD1Yaf_uHlo*8kcL{>_>FUCd{=x+(+kHbu68pJ&8EM!05d*6tZ$d_8U^0UP$4
zSn!9jgd%{#n<7v4poUTsl&P=*aa#+O=%sym@Q5}dEqlv0<w<RM)r(F;$$J9vV`wVe
zXfPMUfjp8VJ}#JSCUNhPV}exY(0Jad>WwEz)#`UBob>aZaRtX@zyjZepHf>8jj_(O
zRI~?HnEn>Mc5|@dK%R-O>qw^Ob~E%R)DGC&#FuLJl3LcM46#xGvSeFD_6Zar6L7p5
zRwCrHZpybF8^{{_yc9#P+cIf5_+mTt3Gh-IsrG3D!6Ah4ar;2mMDb&FT)_ni_1feG
z71$Tlqd6!MOBJvONE?nm#zi~Eg+w|M@~X$JEkuW{WFnH&mmx>K+9BuP+7AezZPK<i
zDV1CF_na{=zhvok?x@DP4PQmrvBO-oq8?52Q|6WNVh3*>sshwW>@vh0a_^^D_+woB
zNA_3PyQE*&i2cmoeG@LDt7>IM&Ua}udM{QMf4EMK+$QaDkUA_C=UD7v@HP7s;*kJ3
z1l6oE6+$>i*P*}H*CzOvbLeNEJJdWjP97eYlD)9z{Lv<R{bAf4OM8p5CV#~|eG*$q
zdC8TG8zOM9v^|1d18T>}nts|~A7EsuwyaiMQD02H)a9&P7lCIEDI&a<ZTU@8A28K8
zkBQk#I(s)kic*E*2{t3b?22b(i8@9;+0*sYg*%-JlME(-O9-8qa|x5g9kmdPI=RoJ
zmZpk&Yg*@!@r-<Lh~tp(#rfOy2099NU(pnoc9Y)?1t9@B#u;os=tbIB(&9Jv;4mI?
z_r84Ni?v8m`jKL>j@DwXoag$q+C0UO1Ig&S5PJZ!e@-p_(c|AcO8))A)^9D8E4T7S
ztocfQ1@agTi2bk%6&^|FcpWe#zGHeYsfG)wwf9uB*LH4;w<A~#FETFw%XF1+RpVG2
zoUxc-Y+?KU&+REUW*mEVe36OTzv)$Fe*}*qsu@;~`ZztnhJTc=T<+SRuzhy_EzXjh
z6H#3RV%YA2>&K+yPs(Kle|d<m64U2&ZYb-sC5i(jKdn>jx(rEDNQc#yDU!13>uU&S
z=#g|e0CX?m$g#+Qw<tE`C=&F@v&St%E&&$J^UqI1{*BXu5d;%dq|KY$rM{Rfn>L=e
zhY+vjnTWf&@9<iNT%~|UpDJCdCB@9kPC|wVS93?hl=Atq)AlPWr$0X3w1a)rx2Rz3
zYHKWQI~gEx=2kKXp=8pfu79-LC^%PSW5<0h&kN^G7Ok2q(o2e?-t;O41tzmgSzoDJ
zcX6Nf76?-qWXeE5gNMzEP!V_Z{+QjB17jt=o41la<hLfk4?#B31n^WRGIpRZ0u3w1
z2$M4wH~ZaHW4-knsgcXpAPO5iyUm*Ii~#};2I^X&=SWuRufIzee}7`aMeg~!PbS%4
z9qN*6DMeAb=(0BQOP4Il?%;E6I1gCdQb$6uQyu96Usu<NR4)tVN>cVbR_Pbh`q|X}
z&&Pk0vrNAa7!po%z}<pQ68DuPoRRgfP`in(MN!|<%wYy$LTnTd{fJ_%5FvxM#2V0P
zLQl!`Dq&%HmjIBSpt1jZc;fzRbj`?R2oHq<TGE?ro6y=waw=qrHFl9g7o(5>C7+R<
zK|hTq!qGLM^hV6wz9OslR`iWw`r(<HvkO$M>B+@qh_RJ1^)mngp4xz-NXHbuE3%ZP
z+BUtx%1FH#nPE3ehuw3>Ue*OX6pIt>uC9J^$kn=()X9g>`96AR8Trof$hhP36~Dj|
zkOW6dH@o7OPsknvsu?j_GL9ur8e~Sbp%;u4(xREK7$CA3U4lA+>iw__$B07l^MOU(
zny+Fv4?FaUbc@crp`wr_=qdalrmLm)9T%P!)1RYY)>7pDsX+3S%&ljiMz98~r?wv<
z`_!Uh^*57?2SxmG!hw<2MBWFV2fZj!DTk2NVRtrBxH-R!{-ZAFuUy>Ub4~8@fKvHA
zy>|x^H(yE8(^s=VP&4}HnWH~rlm4&o{R?si@LWHv!vDj%Kn9ty`=>PWTYCAAGM>K$
z>u*u~pEzDw#r5M86#jA**N;^DYPP%jK$34s`bw_PHaicDNIM)95Kbav?sa&0Y!(iR
z%<kqxDR+Ft5$r6bEOkgtM7@>=ZMdgT?!p$riW7C|zNzH#-}tBB*qpy&dH%`wX<Pso
zD%Rskkwmxfnf$OyOzvyCz~UI{ejj0Hg3<^%n<!+>b*-d1FXPypiu4r#)WNew!oOJy
zpydFwUk5+7$`yTIufg!OOfP`~ATA>a2N6tqDYeTGrodvUZXVLLuAo=Q*j--&sH9hl
zvo5%^$o^a;#{+T#Wpm$n`{fv)V3kv4*?V?M$Lv~CL0$~yUp1irHGKT}`lu&h{y5f#
z2UIC?_@IZ>Ov}FZ!%q_~RrxY+D4cs&Me`zl-PYwHsA2oQcGJUgvnf<l(xe&T0+o+;
ziz+hkI>WtKu!Q1GIQhUM)D4r~h2(@RfS|AfqgMD=K?W3LP_|hsp5q(9N^dfT91l#X
zA-O0KzCOzEw2n*Au>~t-hc}KAcV#)F*Y3g&XAX5#O&#plsza|O%N^LE?AH*r>&v#<
zrsJP4yA|?!ExBXgTY+b~Oy<ZX=?WYty4AGTTOK#C@p)VwcFapH)Irb8M4E7B%m9(-
z_oGJtKiM~b_`YhN;Neq{ad)OM7+G$lQZXqB^iSfVG#0&6otbuB^IXb(wrD56=gVF?
zHO<kDhRs9oxKdwW@-S8a&I0j+*uO#%EPXmH=prrsZ?~5ea+wYx*43uizn1d$I?$*9
z%QuiLeKuAX63$?w0B`n<;RMSsR~z-=Hosw6)m5Iuu63@#(reH2C%6*uB%blDQ9<Wg
z)po^ic~eO+WXo~@*%dRc|6X6gUC=DtMBF}N-=r~iaA3H2Lt6E)>_#1J;k)f`(H9bP
z($eGowk-<c9wK58yt+u@@v2m?Xv!uV|7f%;-bCTv<uk7au8~|@CF*f3=o5_}&(vX_
zqGEJA9f})SUEbK$9E_Dp58!+ATn8cXdHpGOrs3Fs($N3iwP<|65jcg`WDcg4;o!k%
zveX0j?!JjW>d;e1d1>OWt-Oym`XNk@<JAbWJ&eMHuF~_zbSb(N5s$|mzPgJXa9r~8
zw9)YRN%mTsxoZDU)VWGFZA57=f<V7J;JmJ3SF^X&la>=12b8AnIX@DGhC$MKRvaC}
zCKy`3QfX;2!<_$CwD_~}RuMbGz;jX5t2=tv6HTsq=Z%&=dK#qjtS0k3-)Q9wdlmB$
z(Ow`gG2{s}Syt#$D8jjyj2RFw?ugM<FMW4)r%38j>jGbx`lcnf&D!rm1D(69T>UkR
z->Mz_R6VS{;ktR*mTjBBh4d28`%Ef=X&E?I%tchu_2Rc(U!x^%4RSy`^T!@aKj*pg
zg}8thhYf?;Lw806mD~m}bO1T4AFWTR5>2~1bXQeNt^3i|(r1&pC2tT_vr{N>@<@L`
zEi9_k+j|hr<|V2TclCChX=nJSEi6_e2J7|UYS(4f8j2hKUWfQ+<3P44|Jwm+lK@>7
z8}R7DBKrqaJ=(2`O~L!F3suvZ+lw{MvdalRkS_$!0YY#sb#$Rwkp1!cTRR>USCFp`
zS|V$<>O`7ldpv(pcJym*-=+<EY9a+4sSqlWFcMYlBQ#-GW)l6NXM8EE<x>CCg762a
zCUg6&&9E(fA8Y6wTbj+>2B#CwX1NKc_ElH!xIcS^6j7dtKV~=?qBxBS0}l&{uCeND
z*t0fJtLDi;m#56P_dQ!<@w|XGrn<y!|HPU_PkL9u2aN`Ao!y0zR!>R{;esUvmxf~4
zj6o9x%+PLh1${9dX$8t#j9M~yz!fO9FnsLQW?=A)61ma_fXW=Lz(cQ?UV;b(^#DN(
z8q@@!gv7M~#z)zY#so#%3QAiy=S@#F9>_oJu$Iov4n83xNJOxz`L0CU$P+?nxSLMG
zJEf9a%qQ@zm(x4Gu+{eHx4$>jjdMTr8J!caG6TLb`}oiF_y72wUeJKcRkw38QiJb%
zPwi^FwXSqlfWk%*q)HQ%`l6Jkj}uVQ56X9iAB@p>C~CZIT=;=IcyeM@QDJGzR6ExJ
v>5}km2L=pc^}~E^6G3f?El&xsT`Nx~WZZ;nMF7Cb<uQsutLO^4-1+|j6#O{8

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/department.png b/modules/LIMS/senaite/assets/img/department.png
new file mode 100644
index 0000000000000000000000000000000000000000..61b4e0cc235addf607682036133907af9c5ecbe1
GIT binary patch
literal 7002
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/identifier.png b/modules/LIMS/senaite/assets/img/identifier.png
new file mode 100644
index 0000000000000000000000000000000000000000..46a83ee5cff69daa62d99a6b55864903e1551a22
GIT binary patch
literal 5823
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%0DfoYd
zVBt0Ev&?#QLUx1(I^Z+7h0YXf`xj0CbDrw8%!FXjs4Or6X#}5If={8h9zY{$uj#O@
zKt2Po4E~`56fu9Ir=&wJRV-g+B}jbSFUG8%&;w$#x9efY@KPWrw6%-tZ+kqD6E2X=
zb-<<z$nHTew6R=t0m=RqsjL4pdn5d?;m7@&%O}HZKxN%id)MuAc7VeRc(377SaAnn
z>6xGQ)qs|7%L;O6eKp**vz>n(<nV6UP2rq<ck?P+wl`oI){#=Wly;E60y{dHu5#u}
z1<){3*M1T_*jm!S46SG&Qb5hoEKs@&@g_Ch73QWubF&*LL)U$)fjK|bZ$C~fqrKF<
xj<*=I!Y}l@<%||=?UosQ-A4S^kD*h6&<+~rDpw8A0J#4h)7LT9uGVyj{|_xw0)+qo

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/info.png b/modules/LIMS/senaite/assets/img/info.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2dfbc706005e032abf1bdb5f0f3e3ca21005797
GIT binary patch
literal 28160
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/instrument.png b/modules/LIMS/senaite/assets/img/instrument.png
new file mode 100644
index 0000000000000000000000000000000000000000..be78b9d8393be34c2ce48f6fbf82e3fd57fee355
GIT binary patch
literal 24475
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/labproduct.png b/modules/LIMS/senaite/assets/img/labproduct.png
new file mode 100644
index 0000000000000000000000000000000000000000..2615354f4fba708c532980b7f083250d65ca7814
GIT binary patch
literal 11816
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/logo.png b/modules/LIMS/senaite/assets/img/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..14b578584106ae4aea51c39cc66da7cbe9c0f299
GIT binary patch
literal 19457
zcmeIaWmuHo_cuDUND2xfsgy`5-6fp@3ew%(NTUeO7wJ-J5Ri~A=}<sG>F(~KYslf*
zz}MgZ_nhmwuJh)+Ip;d}8-|%X*4}%qwb%Nr&$^*6lx6U4Ke!EnK=9;bCDkAhOmqkY
zh2<6|_y)Igv>*H-bCr7Ss_tO!>S5$;1`#)PFgBx+voo?VQ!_I%edE+&CIo>fWXMU1
zzw{j6n8NnCdw6oZ3r+W2c(pCThdOP!`0Z}V9sb13Ib0Mph5!lFS13BNJlLOzLuob%
zh~{CR96RtHGN9i1rY4Ef_sF6ObsE9?gyzgYb<4QqwrTX#*w|Fh*`Ze=bZYFR+ryma
zkI?>wNH7Wz?EgRhADMwB4T)9MCckfac}2JJ@a&jE3+TGz9s8M!p`3Jnk)yp|o`)oi
z6zCu*^-!;$H%l#h3&NwOr$>43!2^NUB(-vb*)oPM26D0Ti*6gEP9x(LHfwioL?fqt
z2pJV~b31f+{`~nRjAfcuHG(RTTD!Nzq^-|pq|i5^@aDu~Mk3UJh*z4L9@uzzDa@e>
zedIeX4sr+Z(UJu(X`GvrMhUP{nnGkTX&}B2?+k!jRM27E{Ic;r2r^4chep^Wd!@_Z
z80{r<MKP>@hee=I2*m85Aq!}7Es;!=d|q=ij3yB<j0RPjzGQnbNG;-Pg8sVqh@MBv
zbIpHmfCe6Bj730Imu1u(oMO7m;)RB?^$=?AigtZMfN&%sB%fC|9c3zj#&Jr4z1|hB
z=P@Ov^6%vkaJd&H-6v^`AM^T9=G7~U0>=!Pk=LuUKi;kI+Kv|IvIO^%-y#waCc*w!
zqseK&?|D&@!Zj%3ivm!Wwg0*fvcp4kBRqshOycH#5J&*c|64x4h+u=vGET?bUqZgg
zYMnsJKT>)mKhJ`XVQt;|&%Ir}TK9TY5`vN0r9=Af(o#~dKCrLV8zhSQBj5PGX9*rE
zRyp+U)<na^ea&alos4E)$?LM*`3nsTe-Mt8hh}7tb&o)y&`^1K`6HK1$c*<vpUieL
zpOZ0rJrC>nB0rH%mg479+r{>%nTZ0?=;-L5d;9y|zvnTCM74|ME|R`4tYyRWg*<m=
zxA|xTV`|}rwS}H*UlZodc8S;xU=N98hKmdubA8W_@>bvURG%y-^-R>b*^p}4>NRiY
zRD2~k^eX`>9ZhauHOJ{iC1w{z2$^MXs9lQJ(VzNmHz96d>$AVywH+K1LcQ>`Df5i3
zCehQky5$cM9lGDt2@&?Gg9S0%=TV8=ycp~E5lQ19$^8d)N9q?jkw7O#n^S_};;77V
za`}<R)4>;Cpo7nX;lUZNQWHFt8=IX3P_td%x5z@_ETi#$B1;O9ggf~z^j@;K#fCZ#
z3PQ}{5)iS1XJ&+dwMIN3=<i2}cmUJ8n}23G3$!Z)ya%$Bx=eSUG`khaCltjy)?7~D
z5w%TTvUb*wH;fqg*AGy7OgaTnp$8-aZN51otOv5X-jMUyR*gAMwK!N*S>I1)bjq81
z@~hBgyV8{%4Z<SvS7lSP-ba(lbEPvwnnZH`-T)#-2!?rcs0?T^v89tkn)HE<ULQ>Z
zY>`z#_7I5o!@no}_XQDF16g4uM$MR6IH(ZvM}JRI`Nr-<JOzOqJ^%Y?U@cc#2!SAJ
z*x0sApy3B#zYEx0yI{z|1y>sXofM%p)OTP~n&STo0D%yq|NYz)<N7-d2Uun?^<R73
z$=t`gx`WPtp8enA{r6{;n%C)f{;x9qA1#=wFH0%u6in$cr7#NQNb<kN@P9l%)wu*+
z9TO!$2`Jvb2hA<ur2hBMJ7_Axhl5(m+4~w$Wg-t4U5(IA6Po6LP6emad`nh;NQz2-
zB|<hRf{b$+RdD;cx%qNje>XmnKVR#c{x|2xyI&}rAOQ(nk(M&NkO1MKj4S87@iiys
zv1xCbcw<6qExo<_WnDT0T;y<2{eg^`6AY+0J1!W<D<h-1wu23SrDVR{8X0Qe@-h~r
z_`EVyn#dy6z8;&H!P18zG#vPK5)tI_g0exmC@1Is-oe3vMyY3#qykisE^*M5da%lA
zfy*zp^@1pgemeH`<)}%7-2+j-^M~Dp=w--@GXo)ytx34q?gJ<}-MRvWV8@@s#DSim
z6ryeR*Tsf1y1J8hyh_|3(bD!jW@o=FVBv}3Q<*1$x+wQuw!N2KwHTiu@}_Ud%g^^I
zQ%GP7S$j1*!fi90Kb<P<eNg*c9Z})l&{E`E)OUFl<!3P3=zsYgEYqGa%8m;i&?Sg%
zT24;;eJ;xvK`aaku2DIEVpdNni{1-jD#1jiB6FgbTAPFMn4hq)<m3MmN#(NYAIp#q
zTW1UPkFtCfQd#pdy`V)GT2x@^?e6aWp?R*CM@C+ftPovHZ!N6zsYlD2|9xKjNdytx
ztb~r4Igf>wc0r*~8NKxQ_!!5cCv{4nWc!(J$B!i3k%6v?{z``#6Qb?*d1fMZ7BF}>
zFnAHK(-kmyctS#gO+WplBR!8ptR-7tulmI5WOdn`t3YE^tG~kPOg$bEdx3tv7or|9
zt&k28&wjJNY@zw;)mnQP6_H1Ek*InimzDF&LT05JyV%E5U>^P`CGlK*n8rBAx!TNT
zd6#=&{!TLuzHQ`%MyoR^%S(;b+YM(_e#@UNhDYDP{`u#hZYny{T_Y&GzKTf+pD#-V
zR#+kt54+D}J6iMervz-~?#bEAC2}Q%%ImQziHh64mP4;Fr}JXFm3o%qNq6U&N+Q=<
zzG{Z_VS<#fhs4ENa!+@6!|yrAmf!P^&2D9#69;m-N{UjM+1b=_uOI)3urM>T>uPUz
z++#xbC#9x#=u8#Xft`-fy)JJlkj9f49*k7}Gto=A$Cy`y>{%(*Wh?Rg@fPFqV`%6Z
z!|16n2glyV-k!5BsunT3zvCrk<LFx@8|Mqe*8Q~0FY4LKA<4?w3?c@)^<IbHytnHS
z+=U-uU`Ln=E2`W3jjDB?Ns>qHa@l2XDz09HO+Wx+Y}=1iMKF~dB1Z)s8cvp1<5_hY
zNFTSAf~l5%^(xK}K}OprGtWVAFmSkae>77rhPMCmGJ1&-u|0F?1Dv$~>}}MIh%2A9
z!)QTP$cQ~LymP2I?j|!yi(2!0-n5yU{(W4Hl_E^UH>PEEadFZA-rc*$rGl>3A0}*e
z1nR9!)_+Zb+ip>CTgPrq79d^IEi5cT_$k5_wKg`Jw>N6^lrj%gR8$O@pRqAB!&^Uo
z#1(<gddx2@uzwczc306-<PhTg`Rk(s?nu`v3fLMiUKsyKmkLdVhJ{TLw);|1Qu=CW
zX?+$6^npp{hanl@FC|kxUM^w^nDM75Q~oG%JX{}A*a9jxQmu_#c+|{o_GK!?#`C*I
zU^pE=BO$&a*fD!@zJ2S5vrjmN2^}tb>|YAW_5ztJ7rhc4XPW}a!pM2e*SVU0J$`}<
zff$ygr>8T#!^G=nEMmrm$DlA;vzG9Piu!A*si~ETtuM&MFr+YEKJFq1BMv9rO)?E&
zK+T-mr@(K+Z$3mX)1#X0%f--_1w)Se{P_)z=CgAtAD{CIXC+~N?<3okdE;OsUyfP-
zHKpB<(}T5rcB>I>C>0JV8*YwBM0j|E{1J0)e!gwO`RTV77~UDfYQ<3i@<L&AFn0jc
z3c*a|)FXN+L`rb30mj9i`|X?8Z$~A);ntr@@b;YZ-rnA+p`jrs3hbta>%Hc6PE{43
z7jUb2cq7GjwLYZqR2Zyrdd-!Aj-LMgu{Sj^fLvsbY6kLQs0p6vn|^jd!84AvODKNG
z^Oc(K>W^mq-IP^SMv}}U%*@SG|J=i?eZc3K#(;X;yeGBbeHryL-3rkSN!Yhdnv!xA
zn23X{j>$RyGeSzrg8jppCncHr`5V3`D)`N>RwrSrD}^F<B1J&YVeJh<ipCIRCeYKv
z#k#QkZ{NnBG~yr4c|c!0Qy<?`baQh<3&%ASy>^H!FLZVDc@;{Dh=}6bi^A+iTV^ad
z_xJa+8R_XSei@v->Ccoi0zOcC2^mtnxwO2z{-$qe&M`mEfSOxZU28Oj0hObFV1SvE
zlha{-JvarIf^UbSI*Tfq-({KM#O+hdm|w4L%54>5w69m|u%C?-Nxk)$nR%emPKVA5
zvpqL+KVM}HEWi<P;|KG<-%fEmOrO8~_U+qUEgy|}ZE`L-QSY<&!NCn0dU_Xv;e>|l
z*K*e>#-LzhV`~NHrA=t@IBdN;IXNi<VPoQ{j_8%+*#M45m?4z%;!AyXb@j^E%*@p{
zB`@ctMTIK-VX3Lex`DNiz#lD3g!JH1@D;aqe&%$0@?8R&cd;|G{LJ_C;Ei5kZt{B^
z((#6A16S7rdNVUKZMb9%yD-{8dCjv&kLJnv8OlcTwOp7q$u@GpT(4ZY-{%-!!sB+C
z7G*$NEb{X5Y8^8n-o9(V2LvP>YjMn06#_Yz<mBW$P8CFJv$20CwE7`?rza;Ti(_MB
zPf9<TSEW`VG`$8Y+UFdFB-9`c9KeiDK|Ij2rHXRLuR)MhHuGq0VC6j!ZQ8sIvqlEP
z^=dj#A#1_@AAjcHOf?>V`0$|%?1|MO%=qr}%9!U;ByD3=pA*0&cGELKMrDL+fILlt
zLb14>DiS!H_8#op@yG3s!YEnl4^}C<v|E%yi7VrF26YQYR#sL>J9>U#U|_&ECwpQT
zlsKfr9vl|4;O8&t_%N6BIo_L@VA(AR;uI0_o8TVNRo`~-KbyeYLN>gXkWrqT_tPs_
zTwb0|iH=rF^WFGif2=qUBRZoirzs(MQ9t_wi+a)xY&Z?{Z7*bKbm7yQQz06`d6DKi
zh&L}uy~;M^LYkdY&J~GgTn?L`fLx-^e7W;;VwgN`vEG?4@S7TJx>b&fwzeCJwOmga
z7?$h$`}?Cx?|&p~>IIYV9!x?<)k>;&meb*nk-|pgDUSQrWG*e*uM=^X2u6%8o5`x(
zC*f4HIyWkn7Tyt%LKI3zf=|X_>aD7(8m8g3o}1n6GaHCyAKxkqeJDL;bMII|EiGp5
z8<}Aij6i`Urv37d0kU)#%9zTxrnCViW<>r`$Ls3qx-gNK|0mqkaxt)SATvngA!|>2
z`)FKToZE&ed$Ndc4Fk4&mH&_lzYgiI2x@8$`^l;avuDGUZu}O~f)w}#fjhF=+T%td
z7_)X;Om7do{<+nwS62$Wz-7;x>vXAUN3@JLVrz5YS4&Hau8y|0z}SV>oqV>i4<Fif
z%gn>Xf#!g%_|6J_g0Arf2py8<s5=4{xR{=n)zq940IxjV5rys(a-CY#J<l$D<{hKG
z(hz>1!&LT9WMrfh5w|jC4i>e~j*ON?sHDA-(U)+FUjN7T`3ruQYKAY>)cPyjHx?OT
zK6~@P((n>mm$`MNWHd7`me~EPwNIIpjW=_nQBoJbm^Nt=adL2QBq~hk$ek-0w}G#-
zIsDE&v-2-&T1MNbycK06&Q<5%3zRz)H_yqMpVD|vGzFsRbS3kv<BUn89~Z9AM22`B
zt{=9{w}$!-fB5w2Q<8#$Ld9z<7K<4bxxhJB44=7p9eXFgqcIEKj(HYQTV&jqFJEu~
zXu=;EKyV#!?-b9^&+`C}VG@=|S}{qpd-m{ou;lxopt=_?U%F-%+JU&{)5GnG(&FM5
z*+G5A5#I0}_j-_nQUYTo9nFP-k;*MZ$xxBehfdj4{eIh*AyXOU*YRc^$|zD+T0kX>
zx%yI+80g;vg){2*-@nHf)_B6HMUhx<w(pUVk=@x6nbHic>|1-sAdkBg1DOVf8QVUu
zBwqR_@$UVpJk6rg)=*NI!{M)~4oLm3ryv*_7gJ=Zc~>HpD+Wsz0YulRYTYAwA^VJw
zVV3}(epc{WX@$ThROKfjArZ_nt^F>+pLVxB^5JuVU@$OSb1pHZYGSlMw{dWEeix|>
z%@st00TBZ)xiL7k8J0+ocChS!zS@_uz@U=q)4MKRV}q&4VGYB5{W(5<SR>p-URgPO
zgqTcAOUtX91?X?pbH5bT(8`<@N4{U?78V{0#3-pGK^+0aZkt1SBPJT*cWKBR<wv9?
zB{K`P%9bT+P)P(d*_EITesu&ZLBYYlG&D75n&!}b-d#mS0a$fsTeWTFRdzu9)Vajw
zOV@H)$4($VQvc=4gLjn^S0K#u_wV1I4t^(roz=uU#8_2j#qRPWRw0xpj(@E5Yb*{{
z`-GoMNGvO-3XSc#FE20iD1imzwAK_m#(}n!mzUe~^Yc#>*n4Ye3@3nfAZVYz)%?ok
z$Hx~T&Ci|)3f5x7@OSQ>_}EdlbU@734#b~5d)COr%Iez!hVrCRZm|!qxYz8of(>%C
zpa#8*&p1ndGw;t=+#7Y$83wTG_)Oa)ryo9iczN(ECm_Ztg5=Z7*ROLb@TLn|b#$X)
zu*;RX<`CX8aew$~fVawiqNa2N)s)5FVh8(4dLY=G4%OAvxKLbFST$y1<Kx{UD2k$!
zlPO?srQYRD<sUzOe0<{8*fAss;=Z{-;s8cEI=UbdQd0O`GG2@~nwDx}qRp2ZU17iv
z-2eLZtG}}Y4x=XfqetociQG2hz4waSKNI1h&Xuunag`7Jc!yOq7l}H24Gg^S5Phkk
z!9&SyJ@~wo!Ygs4o1DY6-B(IVs@7*{6u@e%AP=Ij8f0VYbz2|I^`{V-<gK_n<Gn3x
zVQp=#B#mWDChT?4-Vwv-uq!3#;^GnpwlGsIikG27nwej}wk|I&*4ZZz3xUw|1casq
zBRhc|uR>&TXK7L0q9P+5{hXY3n@jI2Ih?n(f}q^Xba%d0uf8hGorvGnEo{|im39@g
zi7Uk(E>eS1Oofd?<M|Tkf*$#NW1`)}_sz5-f$ea?t>d!tIST)cDoq35S1b9`9rO^-
zIOWas=E`l6E_kYvqM{<}lP6w1BY5tN7_Lu}RBTFWrdRE^GqP-)^n8i-UuK}WCZ>fj
zs-)Ka2+_-5`S~t5uf32=9T;-W%HkqL@!XpRT?uLgFQ;#>6n=;ajXKts?;uzz=TY$2
z@(G$g{>%VmKZOI=)N^=1-qzB>^_Z1)=%k}4Gs%VlgbBkSuF+Lcfn-@mxf0a}5DZ?Y
z<m(&K9?8GM!J_2@b425@_JB%0$5z5kHZ!g#0YTg*i>N^=k6j}BctNYR3Xi~SJ22C>
z6YE5pxTK_sCSidl+o^ytD=Vu7XJ=>piCwypwRbJ$ot>TV#g*5@dFzAXPUGCA{(<NG
zz2{d>i}{OO9;e+PTY;)`Sqs14cu@-OOiv#&qeX|vL4FnO3G9Ah2)x_XKX`pb)dZ@*
zVy}sXog&RN)Vw|MyI2NQ8a}lV>8T?jqd1hnXI_=1&}W?4=mwi`PqXWLgc!huaNp}M
zHfnyF!UMux>Fqws0JrN9*>i>ffPVh0OiW{@+0s@@D7(i1vDW$Blggkuk}bnbum8Qc
zBZP$IHKBc#{o9m}%1+OE+Vt{V>=DnZ!<C6+qhezA<5E;iJ=6^4&CShmGRzM-!r}BK
z+QudjgOw5T3TCRX7{?L3-rP~P{U6KRC1vvSYZj?*mcIhevYn(}&j)a%4G^5It;CSb
zZ!tO*V%X)60B73}O3JQ3QR}fCm+JW(u^RB0n$kJDMIZW}S+h{Lzd)ywSGiJRq)?At
zyTrJaddjy@<w3}C&Zag^MFGI-o+`u)dB}BUGeh7{uRyy1#8=suqX6Lw#yk6xmNvT`
z3};g0L~_bE&1<91$hpQ=UC>=#u7fS3CrRi{Y0s(4&mingkn_wd6@F(0M_bka`h^5=
zQ6a!ZapJigqW`4Cm*K()R#o51ed}udG%q`*H>n>7jO?>Ha5eRGPm~jIU+k~+h~{&0
z%j0g16v33ExSP|Dz{)=-Vb|ZtMc6!<3k_=0fR2Jxez`xyidzmdCyrUukG=>t^Hm|?
zelxdP#-Qekt)!&nC~y^3o+vKs<k^MT7)>}gYnL#L_gX_u&3FQnfswI@_3`6gOe*f`
zZ{bA6rSVNtTbp{P%$G3bdj|)L9Wfqf->4ZCKN)@`<CJ!gpRzZupaseq1C&$$sBB*w
zj?KbV9WK&35gdU&_`;_7)XE0G`!i>@jI6Beq%UF$A#OKgiabA|K7fy?$lP9iocNri
zTt`NUe)v$y*x2}Ef4`dV@A}X0ef=cUi__ER-PaJUs;U)#q<{l^P>MWa)2p!z>@N`!
zusC$Mn-K(Yab1oMc11H}y+#11_pOYL=S6KbcxO!ytcK-d;H!@Vk4VCas&pQm(_PN6
zK%J=(MuN~nhLMw`xo=Ceny%|<z+-K0UodD4n2bOpFp`xeBz~T3N&Mv1t{UqC$TsxB
zQ^O`_mAbL>ll?Hii_^7%b+32h6LNvfAX4FOLc<6ya`W%jUNV73-Me?M8RWfw2QB0p
z8X8pV{a^pkY59y|WpC|{V+QE04qBAaODnjJHu!ocVd6a)bn(|*+eRXHOClz6xbwH>
zU!V-92Vd=%h*i;_`nw^)U^)ERM1RLbM;}m|k$!s3En%EHmxvgfP<D6O2?bh~ppq(d
zVq<VPgPnn9&sj1anwy*JvbVQ)et7OT?MQD#^=<7oe#ioWMY7W`)Uj<}AEDX1evHqW
zes0<&aaweLKtaQ_-Cs<yRuhZuPU2O;`QEv=C$buIK}+up-=WgJUzs80>sOwhZtVW@
zWo+BZWKn*;&^XYk_jwux{deRLTAoxG{kKpGEHXx#85xHA*1o%*l2RHuzn223HhSg#
z!b}}KYR{oFlWkcaYDn95faLVnR4vTDFTIsr+8@L&`OfU!Ab1~>@;=&-^YHgeUJLyN
zaHpM*pknkO>;d<D5w+o+o3$;WefDhkGjO5~7dc&C2>BJ8;|!=<&HX}hRd3(XEqbDc
z)T*(K)c{&B2d!`3ys14uME4-Q&(_n~Ip~rlho@PqBeC+H@nL|$5)~z()oV@J<9(33
zDpG>=&C@@5;YN?~d!;KWfn7AFzKVJUAR_Px;5<_Mfb)pxEZj(ClXY0sw^D6PAS=v{
zuTL*6-FpYrQPH5nIxY?y#kc<?U91Y<!1r*75*TjQikky~;^P3`+FK*(%WA#uUDSy5
zY82e6T7bY(FTX&OJEv+rM8^P3W5TUvv^`yK05-j_u`-K@aLfK&NYSo%Z4Zwwf$zpF
zA?mQ<ZyKN&+r51#N$0sg1mx4w(!^lL$X}gaU=OMHJ>HpX@ak<@$v~U*bNEC~`BcSN
z3zEFTE}PG@d+No+#8e3q`aSHxm=Z77rrS^n2YW+cgfIkr#369*BA5Rs-6NaoLS+w^
z5Gmh=N?>=?6$PY*Kb4`VI6Yroa7W4&0@yc3>%BdaK*}J;t%P~*D!w)4&BDT>XhSB|
z7bfO-T{M_|qb)egEl5fvf>HnDEUUu}Nz>Oav+1k+GaKU#@EX0gou8gfDdz8)fw<z0
zzW($G(k~sLfs{%L3TKraL$31CwI`pNF6CuqpZ*gXszWv$hCd4QG<hBcjip1>HtzM}
zlAR@MU;{ve3%Y6qIGUn^#H6HJaX<>kuC-hFdLBjs`$dO7i=*SQJ?*O!O2Ych`V14~
zPuxF${`^i(_4tK8j+a9zO30n!qjXR}46s;>nJGFmX^x4B@c^J)K5um*N$6omT?eg9
zcz!Z);YB#}YseYf`9lE&QUS%aq0!RWKanhuvxi40ufk|^HNY*n`VL#gG8O$!GDcFr
zD(aMV$@EvEE>=sJGCS|cKO(?nxN2P2_P!fA50cMXOpn)lBkEbT%a7B#Nmr)pLz;j7
zd}3Ded)~KqoVe2YF$(;;RIpPFB8GeP^z^WkUA9%9^Q>i0n1Gx0J_s;%rj(U*>*oH1
zJChP`nSOel_9-#3Mu44tI|CxHg!okVrm0-~7z0GkDeiFTP@a<?0HGOv%_T5fWsO*g
z=d}`!7*{-V`f8+f0bw1tHj_BOf$HfR-FgArn6CGJ38qZsVAgvbF|y{$N;rD6K@3Yb
zS7Nvei)X(cHFl<CWtr@pcW<!#1e<OjIDqnSW}tnqp)~}!=AijFjj(3oo>L&Pu3c3Y
zb=g0DzgSB=sR`~Es$%O8WynNKB(UjeFVLBRXie72DwpJN5Iry4UU1`U7G*(Bj_1_d
zaTG=Yy4}=Q<e?uv@NK^*)t|KvzUMbtVKagQCT(YRWfVx+NB|NYWdv$q*mZhgvGxK^
ziL68G=;#Q+xqZ8Hy1YRyJ?edzkPyg>d9xKi&%?Jk1oa|^1xN1(tkj1SjXKO9CK6iy
zXv09RBv%c53+wvKX#o#FL2IaV###Y*d5%G&pT<Y)(}KBgL#niY64*U}uVRV5l~DCO
z-4C%f)x)Kmfwu*4F+yRw-A^qq5i6s4!8YN3oCj9EdD)Npf|_bc?6-B_37{4SGt^M%
zdu>zuI2NE5zqmnUT!@H?XC5;#@jrmnremYjL)8Yz$w%aZv_~68=-f|B-%So+OtFQM
z4!fod4i5USEG<#uHL3d-oh^&UJZRAG$qV)|7OT$2>HoQ?L4VJ!aMS<H(&LaJby)Z$
zjI{C#tj&Ym?Xhv4&&i$%a76;GsugFV1wvys85tSu%m71r+afbHQW1{i?{TF6r$=;d
z`&|(c>b6td!zMnD&GCx;U~>D>g;uyUu|M5bAVlh_;??BhYT7h`Qp!F-kN<!n)iqhb
zZQb8~M>&b7>z^Y#4j)mX=h=MEIF+J@%|^-7R*)#oZW%>ct%`>;59!bylS#_$tmclm
z#;RLo&c5+xyTyuGIM`>(L{J$4Q|9(M+E_cJ^a5GEC>}O;?jjc^OGbvv?fPS+4Bd2k
zQeabStT>P%HG}ulG<KwK-=mLMN`)EfE4mg^3)0~f)i%FlnHv21kzN_gDlN?QMpTj5
zfgrP@Wo7Mp$-zQT|5eN0-X2Ya$FM5(apS<xP2c%un_U|yf^{^UVN$@+8U<xdr@8h}
zHhgeikOm@pT_J69DR0_53oNDuS|u$m{=+^d&+5*fP*%%Sk*V4l%qiD*M)pBscF`<I
z$rvMpM9+GWdw%@X<WF^7re`dNegXJuzhvkTP1*33#4Hi?sWL0g&c=8J{M}Vun$`>T
zx-Jb029dzdr+}RYmMeG-Oeyxs=H14DD;*Np_KKdO+lOV(Dk>@Y3bM1aN3x?R4Sph{
z2Q|kwI2Ko>V~jv)djhSStNoTRiLFdg(Q>kpSQEc()w&RhSiubxf?Mx|d=;=cfC42@
zs?&$bRu~5b4D;@+-3kO%KCb(m<{v-zp`0$B*P{60`K*K|_LIja?DpL`I1sY5o;x})
zALnftA3ND!AulN@G0-VyQqqVfgrM#_Z1R8&1ngK>&TF`DNNhGe=joL*U3C?Az#0`<
zBeulCby0uwI*PED$9G|&p)ZPX<ddgw(=Y*F;1*0dbg(A4$RY?b=zwcOjC#1Run<F6
z)4r!AGHO8i#j)ZZIS8QJUIE3ZPY1O$6u}DFs{mcE#8`^iqj7yuT|lY-bFhs-CG%w4
zr`#Aq*>JKz1mrd(^k&c>2~c;aEw#(L2ZbiU=4h8c^DJ8_X}RKUBk<|xwpXgMMV`Xe
zt|&3fO1mR-3sUig*U6#6(c7!6D%Z%4=%;3PeASDe+eD~<2_b9(C=rcr)Qn18Aqu*S
z$lSIU4ttzGZ~a)6Y1XZ$f*fO92Pdgt)ZyqaC208hwX%ngpE5CZbXu<{B%63{V<Xw=
zrpv?;t1+7iiJljXL@<nF?zEN0&#D|=8GBwL0&i2p31@#5dQcS67WWk50T`ezv##!(
zO{=ckacXho$okQ&IX?AHp6hQK>syc<;(woq9q54O*w`tewZ0h?u%?QmpH7R;#<hFe
z4RD5gL>5>(+-cZ!S<3-hhij-seQVBa#R?{%-bfyskl+#5dPKxZZx5;t7GTxh-}rbj
z5IJLADPomP;%aZw8FzhdraGpcSyk!>MDV*{8!rX}!Jb8UQWaXj1mMl|z@C{%D|r31
z36CJ$fv&EuVglT}uk=3st~b<%pAG^!28sNY-v|P#cHiXJ$LiQrNB}Gp6ld!4^I4Qh
zyyaG3idpnB1CG#jp%RiTUorQ9-VsG_HwH7f`V@r^3Qz{~aTo~a0$<QLCA2s<a~BMK
z=CK|j2(}S9q9R%u&+jRG`ZlAgsAyG|p(ujzLwI<hriMlqE##N1Yt*eTa1=-}`}KUe
zW%Evo;P?6pE>1Tl_M?8m<D(}Ga##7xVfM2<ing&>ry0bR$WJiXOjogigcuwv()OSb
zr~dF)Utga^d|aGVyK%UrP0a%c<np@apSI;1enGt&eA&zB$Bw__JD6?Xv-AS(mNXqI
zuxW>D;0WUKKu-5LFXR>vK$?`~6%-gdj6J+S&~YglNDXEN62N}0F|Sec!`tg%)oG~z
zt3pu@{Ok(dQO+)Nu(Dbs$Ls)Soj;&O514hjs(brcR4rE>Rhp)KM@;D0SDXC-be0B$
z6dI4iGzAG2m0tz*(bOF%9Cze^<m&cJ;JKOrXbMkgrMrHvj0EHs)hYV0v8er}2-KSn
z|J3q~Ku*Z8>Yo`Dh~ckFB4YaAc<dy{2Lt}0b=zCi5T3il!~<33<*wgYkWteR2#sSy
z5EuYtCp81CiXccdcn0o4&ZQI;JG%fRRc5;D4jvTH1TyFA<GiIO8b$PeVP8w_)NXhS
zoG66uNC7vYeJ%$TGJC^ANiCn+nL4nCod1ythD&dmxxV)WQ*Z@zC)$s4k~zLM&TFxT
zDuHZ$atvhal#Jd^E8QtQdKK0~WE8Iefh6=Q1b`TJ1Iy~e6H8f(nbH`EJbsxjVVrR1
zxZ+DUhptNdNL7T1vGD^i7a~tWOL)c!gw6NqeggoY`ioAby@4Yr+r03;UNpxiUx+mO
z@kIAaT2>hJXT;{!YVeBR_W*Cs>D?57lDGB`EEEcT23E7SeV&%bvKv9fOqZ3fTfMhr
zKUH(leg_rO#CdH{voE`OJB6k4RMP!aDlbrhF}Rc3ANv*hQu@9scV7CvHdW&`(en@m
z(zO3cfdB#lDusl@QC(-)BKg`{;Cb{Sw{{i^-alzvD92jgu!FL?zT0kXX-Nh%Gp<LH
zbdrND;5(QMQvL}5sv_k%z$9!NUC)K`*Jm?i{`MQAB{GX`wZQapcLjh~82J-{v%k03
zkcEXZ+M7bOCNh5X16(dDBPAvL#|T*J+5Ly$CIJR<Fqi`<Y<?!AH2iq~nejxq)j-1+
zgx{Rd6%B5-5nR&%&^FVcfCwPZc@}_PVG%ry86fjzyi(Zw8<r2F3shWuE@q70XxZvA
zm}sQmu8I9zjPzJn9r~EsRx<_#4P2nV0zef*%4-{?0tL!Rj)xED&LI;83`ClrJug;>
zu--04`WsjMV=z4EfJcPdRCMxsUcKfAFEAO^BJkvQM!tKR+1L+k#5rbJpg8=1DSJ+O
z?Rb(EbBwka`ecX<(B)<<C1zcSiyFs4mXf^TVgh?VQ9J1<e20K^Gt@GVR~w`cR()LJ
zcyxs;PthPd1~<TO#@7}%l<z765=~&M2xtircdqkzz~EpEuxI@Qz*~z$J)dj~t^lc@
z_W6^V3&wF$kJoid1?1173b7zfyz6~etVpUa0~kXDu_;cZcN=~zB3iAX1aB8T{h4+P
zJKPSKhL~|ji2ESA(+QsHKfk4aKm9!1IU+cftpXzfMN~yjU6obp_+!=iv^n|k)tP7q
z`lBjQ_HHdu6*>cH#Pn7N4}is+UxWNYDL8Mn+U&`bCp>_%w^?H8LaI<c%Yg=&T`{<V
z6kd3EsjvJ48K+L!Z;1MQPx|Bi61(wos~Pm>A5?<w`AAQ1keQil3?!*}(MAIjCxC;}
zMcqkBNp-$=9Upt9G{E-&R^T(=tT&QtyTzqTTcQlWHT~d$H6bMYS#zAwsLi?1n;qzx
zhf?SI<oO|>P`DR^%^OQ)@4Hu7U3Kf(MQRHU34-%#ZIrKlXcH$JC#ubF8ei){MF}yO
z;{{E7_z7FHn|fi^g=?tbuuC;WbpLw`K9rnwJaszAfxToh<jki+wb`_(s5jT2ymq0=
zzHv`LNn~BfOa->+%f_AGs8y&gS#RDNEa0(ao3CB*<l`S4pwNC%U<LxP?vj%7D#^;;
zip63ZCtJSlV9%+`js6zOfZjQLr-~I+@<W^hU<2^>-;$phcKx>VQZ@&&ds@LdY?%JY
z;_BP$XF^^o(B(H66?QBXv5v<xtn0YEL4o{BI1*x{xs3y=sIZjSSl3XH%i6==iM!Xi
z)r8wIjPzwkPdMg6E?=ps?P*;>R0WgffX_e;>i@oF5$;;VL>_OvY5&BtPV|;p^r+Lb
zg3MnkzTn`!(UfJW4c()vpQwq-QHMG;D3H!;=G`p60JUowWR##ju)n|aHm&r>(WhWR
zRo<={+E50zQTx})lSCxG-aIZBM`@dL4B|`aZj={djQW(4;>${n{ZyRTR*+>f)$i9~
zsTbqI{QO5yWp<Bk)v2$`^`O%i>at;b%2Md7uBz(9_vFcM_=J-RY39H~RZ*H^5M%{t
z-(>sz3HL}z4PcRxv)gAz?lm;^yXDNX5hnsrC3B7TuC97cditfGkd06{J<_sjnZtj4
z&arOERiIK%G3rAHpa^}8xRv~NXaI94G$JD6=*MG}f*3*@Rez1-Wp2{fzLB)Fv_*g$
z*7*Ca(wfpdimpcd*)PYi`{lo-h#E5{P?{)iLZKn8M}r3BFi?J($jr>dXV9E@ta>lA
z?M$ipyj&b1?~2>hP<7^iq;OgAr8Sp2{;?Y$1$8ws`eo#5bW)Nx8#O6kx3FFB?NDBC
z8L%Wd0D#dcEdjMQFTf3fgEAEUepUup8Se_9&LOs*IrSn+QQod%RV+v-^B-pc<1J>K
zN=;EAq4UD7B;J92h~bs5hd_GzgPN55CjC<W{MevCkmHU#4oq7}<*}?_@iR59$OBcB
z%gE?xqNf+Lj(lvtySqiE)Dzo?(f#AwpQ4(0v3kafXq~@po!DT0HlA)b#TsS(!`)rJ
zvvTbjGE9=0-Ql?m7Vf<B?FX6)2ifG1wB?&1PU8X;Kb1l8bLC8@8IU{J<>cl2g91KV
z(M^**Gj3T1{7j7fXO{^rHVh-ss4B*QQ!yFLNt^jYohg)LS(yi2Wu8eZt!-_h0sxOY
ztE-Lz^DqHGF<vc_g8O6{&^Z5zgZnmJs73VXz{GSNhQ7TL#+AlGkC_Py2@$;_O#NBA
z4ap(9S()s8lCy>6?@mM>pLJzm%Tq+1Sl(b)+7<=0LUWk4eIlrE2!iY^wQ;+#c`hd*
zC8YqGnb?iv#|6-g84zLksLfgc9`Q#I5mW>pW}p}T6A=MhbrryRV{%I4!C{zXq$IxU
z0esE(a<DkuZ#IpnDVDvWqM|74RArikUqv!7Ty_sFa*E2<ZNA(5j!!_~?*vwrk{=!7
z=yl`dRYGxOP6r+bYKP-Lz4D6Iz$?NW+r#9cnu>)3D(NzijoRrq8(@mq<%D{e-o@;+
zK1TUE5Pr9%txY9S(8K-%<MdNDwr)p(6hvnduS1lP5{KB@YJe2C&!$Ci^;)-(6b?VZ
z{?9Y(sengp4`;@zoHF{p+vyl6J@i!f^gOn%UY?GWjjCD*<DIVR?<Ak}f)`kHc(H!B
z9dkyLAr_;#uHem5$_3jrSo%L}aU2qTY7#g1jT)lqG?xHGq~Yb|9h-AJ-V6%?6wT1d
z473NIUMux{_D$wE<`$u#Pb;6@%mI8%P5zYboNAYq;nOgnBZaBF4%08S@*^#+RnJ7V
z!G`koK{)=-R~KM(+sy3ji1vX=0S>WnP57%kjeGYCTkw70IRupj8C&)-?Qx!)-zV(P
zn%10O8;1lj;OaZJiP8_tQTT_s07DV5mX;9~X)!`4Y`;;;kYS?xiII_n)`;Ncm6e$|
z5Z2EkL(0i|<TjRGT)x!xtTytS-l{DtE5qWWz;B#bIXG~o1(Z|qW^O4BrTWx_1kGQr
z;(U0N^e^U{H$&uvCIHJZ<ur45vf71w$n-1F(Xyq(O}c-UyOOfyisnu$n|`|62*(%`
z7hS$6lA}I!Dr;|VKL^q3PEDO0NG078)09hdTBjx)*G7Nx5@Fd5XO+=$ofKAhZ@ITo
z(~T?Wc05EQw7uED^@;U#b?a39MD*3voLj>20Hwq00yJZYu!Qm^>bgyRxI>F1TWk&T
zHwUU+^gE*ZD%a^+{1zd<!Q<nNR?g#ExJ4HOud{sm4L$oy2D)Umk6-sw-HZgEB`@eC
zSQrbrRj$V%Xpa?QoL;<Coi}cF<2*G-l(KIafMxjz;I1SsnQYwtMFmajij!YpC>Tpi
zOV2^{)EQpfZ`!oPtdZXy*(&NXH2S-83!ZsL?=MTasa7pCG!)U^gRzyQ`yFtdTuoMc
zznGXlt0BpQQw&Y;)itKMd|c(augWmY&nze?sOQ%JfY7pWYIhD{VPP&#PM25~o@XWF
z@KS#qP$%V6aMa#=lgpcD(Xo=vkm}=Wva9GpZtMNdr6ZcY=MVtGUps~xp8D`g%<@q(
zz1VUUu+V(@Qi$r_J-2bjKeg_gUQ7SnW0t;OD8Qmrt!=yF4fVKUZ{MV7({6=9B0s7O
zjAOdShh-$Pefa+@dgTF=+@;7s^Rv408`OgCwyJ<^!+^oYRbm~pv0+=Uj<i=+?p7Au
zHu3WEs_*PnOxbVSP;V7z9hB}S`jn<VyC^FprI{Q(taF?<76&|q`N786{wzqg2s(;Z
zPKqzIJ4KiPq0}#X;3R$STWy*;n=if7=*6W?Ift%#o#g#OI=qcF1*j$+RT|*Qr{-LR
z$g{q@pe~;P>htB_72W~9?6d`#SC!xM6%3lfLdGp0E_v<7xva60Ct09m6|aj-+})4p
zLYnVbk5DS8sE7)Jd5tzgO82ZMCnp<AV>RJ=1kPEQI^C{!QWJR9JL84ey3k`C86n?Z
z;u#}Vl0R3KDC-g!H>z*33AXw6%x=N6nfn!42ZVeAP_Th7nXv!D2>DA@Z03;*6re+U
z8P)Oxf2G6f$7EfdQ2m#RERsBrKi%Da!*h=1l@or|F(|}lyANaX{NiF_IGI^l?L;lG
zI-f8xoq%N3sb<dWHkGJ{C0JFdice2gCAG=tTE(^*-!a+dA3<CGfYzH);;T(Apr$Wd
zQ-R)Ejq6xcE)Z}IDi2?oz(3)Rf`JK{T*a4;qbjW2+-?Q{>o?UBdL26C(B0k5<|L5f
z@61Q>eG~><7Q^SypZD?hJ0OPy(6QuuIRzjU|JKqXS>RFnZu%IC>|%;+FZh$RS}qRi
zB_k3ufkNvFq2elwu_c4qm;?lnfU6D<2qcF*g;=;R=VTy{xBJsGldyp`3J%X5!#@vl
zF@nsJGD7evzo{ILFp#B5p<db_H$c9MzUiK_2(c-#=Y%eejg3{~hh#Jqxzh*>>-8jc
z1DO&J)&T{^lZTO!5tjS*g(kp8k^pW?&7;fv!00}60*e+$A*eE>da@VjaIlM=$=M+2
z<dVCXOy)>4!pIu|bHNVdx?w=o2r%<AKt<|=c5k1Pc4wt+Xq(31*RNk}ugfj_bo}b5
zXJ-5_FKR8i5)Y-EoSeKs1@hJ2jD5imuN8&!Mlw$GNjA|oP+at#?~+!AiCpXf_p=_8
z=~nG>AnEM9cmDP*YT@96{@iyhF`(3w057WWNs8Ur*pP+F4D|P>_H=ZV<X^0<ttFV6
zn*%UFR3T_^o>f2oC`-O}X2mujBp(dP!{R~V+sz;AWAqB~2k@y{L}jXH+0vf`{}GUA
zsPzG$m=;ay3Zw}6Z83)2oTwaG*(*s_9w-+}XTNedXKj2CNO8#W)-4ihg}O&`J=lTr
z&4;F6Ng4*DP>HX26tn9?+`6J~etjgHqGuo=<H(ftnd|rk==k;1SIupI(z^xslLYF9
z@<Ab?k@W6eia8GMwv@Z=igI$*Fa7ZImL@Etb2$LBRto9_isv?ErKNSl%RqtlIXF2F
z>-w0q*}ypz?RP*udV&vUmPy<6c(lYM)VzDpN353tLnslKFEAXLXgF9%Q$y*it)+E>
z0L1$GKCmgeRD1c%Kficld{umzFuE$X1&j~8eS@WZte36Z%k-vmlCM#E9tzgNc7(|n
zlYq*{NspWxutyaZ>!ooi1zch00<AeZ9ENhB5^fFPVn&LsaXBTWi-+v&Dl(UfMGHDp
zth;KUi^Ge*;bLH5fZVe*WuYy?;o<g~{~l8N9N{266^+sXWM}3(-6_{9GbaPkedt!>
zC9-yLWK;b6*|a?7DhQG3Uo0cZm$$jdBB#G9kOr5Z^!^GX4+CCc{W&qtDjuYm^g8&e
zSWIPG&7L79CO*U-cGdEke423gMH?~NHpm2=p+Ue_M~;Ix)K!Gts`Fi7EmtaK{cz$k
z#`1NW-eepw-)cZ_&<l5;@_fpa21>@fU_<uhpU$JBimqZ37M>dPINM!lgE7M0BHJTJ
zxd5wCZx1FTtE(0AJqkB~ez6R}eS*71A9{%!t#_mi_^?;HGzlt*N{<@n+Aa?C09^P3
z+5tJa5IphCkeU!xnHMPRg@Jl~E|Cm~A&UvF`gkBYDR@L@NQ5Y;P+JP4T;!@3CY$Z~
zRy2rZ0zKlyg(6I~90u*Vbz8Y2MiP31p6ATT(*-H$F3nvGm^RJ6ef##1!n&t7GvHiS
zUQX_fj-R>gpqsKy3T8%`;735B$sqE^8_9{Yh9ZzFXGm4VNx$s8dBzrY#$^R3uzNrc
z+oTWY$$tt;)K5<C2m(5QQ*hp}6it86sXvQW>7pvZJwlPMU}z3-uuqqg+<m$pPjP^8
z@sYW&@rQ`*I|lT^rFB=Q2qI56Kp7zb+`Iu=h#|ps=xM!@eTs7V2Td-JSZ^Wx77juw
z8{6ws6iVt!AyXt=`SxnLP^#kMs>d08%BW%pklUUEV?J_;HTnva!z%q?4%Dm~o`^D%
zBRz=EUQX)+U(!B0I!aICpn2vTIhVM;getn0H=smp`U;QYf}$akdB2gze$ulXcqRov
zxO2=nKYc8W3TbG&F0NEKUS1#?MZid7@B>ASPHDm%&Mik$0W(nf5!tM8;@w-=*q>7p
z60%i}uzue9C<g@UqeGiz-qYHMwOJ=S(H-tnYegy5xzsJUR1G4CM!C#oq`5fJ1=TV)
zFAo1tBCGFy|Nb4KqRu(104gt*p~LRgfq8o?K%`?c;490_cCi6?=yTmi5%5O4eJ^F8
zUN#05SV2TWZ0rHApT5s%xU2rU%oHt}$TFd~fwlFzhKCxB)I6tXJ$?-!p$R3%#~%sH
z+-=|iqd)-D@$)UcP=;!ryYfy)uQpotrF$Ejm>^C|A8xI^OE+`+5_V=|0`yQ36eX8a
zm)#8R7p@`dHYuRrb;BB+(~wDbKgl{k0vxXQm#5oi&<CP;DW5(a+ses7l~2n0v(EO5
zfV27zM2xw8`*u}{%@<IvbND*L2)<p#%j6KXI$|V>08f}=wKIr|kN*`IWM}!sgP+}?
z`Vx62*k0tt=^YB=y0C#VlCWwIs*Q`X^Y9FlglRYUoYaEdj+!PEluolZHs>Q-G6AIr
z*$|BJ?(lG1tFO2g^zf9D>U#zXpf*axpaN*rz1^4^8nJo@vIBrJupu%`flcKyncF5l
zm$3%;fjk9y`I@!#Aib=GlNZLGz)vLr``Dz=nvqjbm`I9=AvUS9mOB5F)iuaex_l)x
z84(eO2<U7g4yV|V7s>FC-7oh6AZTSrQ31W{ddhPi+i%mE%34723i_uTTYmlWGpfX7
zGiW$3F1M2g>#oyY<e#u(Hh(Mw<pu!m$4DOGaUf{oFlMjmFSgKe&)gr617o~4D@MZG
zOLQh{+~7J(Bm6|lUKo)4o1!B{y;DOG4|7d6;gdI~YuOdW`r$2_BI8&oGABjAplbEU
zV+>xr*r5y=LLA6>^HZ^diJzozT%Vl!8tnG|sfrY_j5^pS?4ynjuUOg5eQz5-aax4y
zYZl2JP(3viQ$JCmr5`41sK?G7In;($NrjSdkElw3au?RdbONaRUcMMVZHFNbvR^cF
zZ-&MV{Gn7qFHhicT^}x(z~p2G)doM!<|y=3$Ip`Fg$?T7U@RiGQ#BRgB7KrE!^q>e
z`X~^aYbM~%gOnbP&|S(bX1_zh4<ZGK_>M!@)H9;yS04^tFTA2!h6T!1v(XcuIDMV-
z;?PcE{=$2A{UCM@)LI&&WtpEmN#wHZO$*$E1wWW(msoYJtoIx(HVVbT!4a+KJ4sV#
zx-d*eu1%d131lCI1o}8x8jH=p(%OgufKOcW+^S8LbbNVvG1)14@pmI_Ku^+=mJV+8
z4PUcp0sTpMq4!*;cUXfRV96r)l;(xloC4=+O4jYX3bvlw9!Vkrg+L_o)1y#z&~j7+
zDiNUNXzTHp0UW)hr7nNA-TYsG#iAb`7Uny%quwKOmd}8Rd_YMlTnHLh^iNc@E5&7a
z^;X|E>YRRVbX@u!rvR2(V+6G=vD3eQ$BzTag5cIvr>>rGgC-R95H`ns95+pHS*sY)
z9|%f08cNeB&=xKQ&;?&J_fP^uD|=Znlg#AI*|$l5(a!M1K`iEYvcglf>2vQ~f<x>1
zmVdS#1&EHY5grcBe^$OCH+{nVsZfTozu-XN6riv8S1=xV15K!AFL{>l3Nqx#L*#g)
zpZ&ur*Y*%5ZJr|h@$hXgRK9AEUqy<)!?e1in4%_|9acT|+@XM1y}Wq&HgpN7-h}q+
z*RmmJxggB4p}?2%Xm&#@s}IUv$r;X7&`=Och>LsmIVx(GzdqcMkeb?md1I`s$i+bO
z)U=W<M4s!JF0WOWpT!V)Pc7bvQtJf{35zE`8yj1i%&?@43`|c$!#(e8U(SDeaqBrJ
zuiGJ~OtzvRO^FkjJ9c;Y@TOjO@9e<0S9xVTcH^0s$Qqq_5)Up8T>`7YR^DKnpvY94
zBzkwy%9ccZg(Gm*<I{WskqryzUH$PP2x6$Os@f-Y)t%*kKF#J7(!#yvj~*hI>=8Y5
zkjvxitnVOTg<4?^)QcRb7uj3tG!S8tXJu!@Cs)1p)f|$!oc-G@&6CgN^n8u=VO2wn
zY6S8dv7;APJ)jh#enQ+R0S0{_NoNM7n!JizetaE`xe;uyi)Rf1#IJKO+#>}BsR~$-
zy%z|$f40~FmL2}9moGP<|NL_rJN<JFfJv|l04AAlZA*EHtXaPBO`G2-(oG1N^4}IY
zMl@btY;IQ0bQ7;a9Djz;K|&)5#h(7{_%$R@^u5C0u8#leW&XeUyz`yb_2#O8?JIZh
zIUq=6Fo1V+n+8xgD}DibqulEbhjnHKh;KbIAp3ZgbbzB6RDc5xr(=(!?8PESAMf&m
zrsAt(_Nt%+FNiaYg}iOeyDCoIe1CnjX#wc=Dkl27a7w|32KUYJjH~`<a9lr}Wf*X4
zHKzd(gjmH!4_u)a$t1tIb|Vl#^W-jc4PVF!XXODk;(z=8gvg*5@0Q`V>&EDA7a+{^
z6W?6L1IlqbfuNno*BdnI5orlYI?#w+JU3?lS5iZ2AnD9!8dW7;8p!4<h?&R0yCWI_
z>Gk^9037~VTF^)`tcrSi_fYcy6SdP5`UF7HSI2d4xX4vAa5g^Z2uo){%7VMcUdcdj
zjdgtrK&in?7!c9)?gMzYAlkB?{owYZpzZwn*a!i)HvzZzLx5%wTC-hsFEqc6Pm*t2
zc>ca3A{F3BJiXu%udwhbWVv$~A(w|V>KHcyjFN+!GfW<$m$&ac1ecn>XbY#bDAcPx
zdJOWCtHaRXA$SJ`J80=E0nH-sOFf^}qa+EkJj;9@g1--5so@c{b$uSBm=`Q19(eo3
z%>4%sY7|M52FQzZE9p+%S9|A%+~C7~|4z5xRii$+HRve{2dzqzbfG3-MPv+VXXF(D
z4$!;_;sLs=GATIDZ_%PdlJW`*?ZN9Wv}r=?>AJIIW}o-Sn!2s_8j(V8&VpQmn%NHV
z+0kZg3FwSe`D1MJu1~l)e)_`06+C+hJo`e{<L2Dst5<Zu#wr~QY(bY6L%Xqw7uvMQ
z6rJ;w)H{Mc%A1prfEYC!a<n<&VGd4`?l7)td4F(AND+>HZU8c2hC-dnEzX)78EKvZ
z*KiI<sb_4~{h82V(p9?`1`xLuE~E})+CKs}a|j6pul68><gh~sjuV11K#M6H!|f`{
z00$}|HVRDuxTd1mV7>^XhW_psr-vbH_}9M%G=Z)B)>FnoQrVcQ4^%(oETd-gfn+K=
zjeZv+t~V+oHVa@*^c-RDBi+G#tui024HIy`%dc*z%b<7K@8I+hK9enYeLu)sEbzFd
z&9SnTV9+yT<r~O@d5H0L>JL%#M5RNc8F=);&C5E(BIlNA2xkHF&mFM0&g}tV1rRFg
z4`g4AGxpVjA>46hiv-Q8H)4ua0tnd)^xug?ds1#;&d7hX0zJd;lP~@~fiUQ3V{D*l
z%~d&uuSIx2z*W)M9za@!^S1wLImFU<mLYqfT5bLoq8IH~Bb~k7NFgO7NQ<wJ*_Es7
z$JSi8mi224CYbxm0KLS*MfzVwfhdDcNO?F8Zq)HdZ}=egzgI!ftG<1EQoz3BKS-LU
z{P#<mTQ6U|ngT$$<_m+S_+d51zdy{XzIycvp=Qv;b0m9UIgo|-cZ~pfO2!ujHn5fy
z{M~9`nW9_z-%A2UR1KOK_dt=?h2P?umH>Wea^5;c?UAEc_NyO>RhaC}QX*IWJB|Q{
zP0(c)Gq9FFKV2`g8B+zwH9QuM|9KUVtqE}Y76K{VSae4&?6AN30||gsx~wP{ut(DG
zawCqElB84q3LRiD22yY(<!qPK7R2O=Xn_TNA*d|eW4uuyAdcwOBg+QXCLiz8A};)m
ziX<fg0XgSi{|5L7V0Mm&1W*XRTMzw5V*w9gp^!b2Y4_FB5p2t$Z$oCu|GHpEKtLr}
ze)1IM6;7fV)&I;M5D|Rs4ZaSB6tRo_M?lDThnd1dj9_#_-#`bq#{YS46E^sTO7;-L
z`Db%8x#P=!Z3V)IEn39>R3=@^(~}R2=<iG?@_lJ&QWcd&w~b#Vq@q&(pZj+@kC5JH
zDe1|A1|aB(nwy(*|1&f(J-exz!$$y~{M3^0KWahKboKRv>;e8iZHE}w675`$)tba&
zrqe*0(I2K{_j-M1WkJ_rW{+a_L}QQsT{il4)U1i)wQN)W!IsNy6~aZPxwF|2#JE-V
zeIViLLrw>68}=d1HmRn<8kc|PMBq=SQpg!<h&Az@t(zUH$)Kb2mCa^}S6;k<E;>bC
z_6Ns*&qaoI>Q)X@eX~3Cn|C%e5Y|N8Dd7PO4G5&W@As_$7ml9&!>72KhZK3C>)&hg
z<6)Oy#x-F>HWlP;yC#WQtq1?k)Bkt>tS;*Wpg{Nvis#?1PhGonIVokyLJ7mS{|n?}
BQE31G

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/manufacturer.png b/modules/LIMS/senaite/assets/img/manufacturer.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2bed9c3dfd99114cd349f8eab57fa663ba6e664
GIT binary patch
literal 5874
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/method.png b/modules/LIMS/senaite/assets/img/method.png
new file mode 100644
index 0000000000000000000000000000000000000000..480ed613c6c55b6affa0db6cad26df72b7806b0d
GIT binary patch
literal 24931
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

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/sample.jpg b/modules/LIMS/senaite/assets/img/sample.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ce8c82c6e6b6c49318fa64176027e24f0bfd66e9
GIT binary patch
literal 28777
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
G|2F|s&$q$=

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/supplier.png b/modules/LIMS/senaite/assets/img/supplier.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ca926a29d199696e05f2124ecabfc55957152b6
GIT binary patch
literal 51624
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
Ho0I<oy+a$B

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/img/worksheet.png b/modules/LIMS/senaite/assets/img/worksheet.png
new file mode 100644
index 0000000000000000000000000000000000000000..4658d081f3986e37ee95897fe2ab57d1dc3f3877
GIT binary patch
literal 2372
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
J>4D(Oe*!=$E5HB%

literal 0
HcmV?d00001

diff --git a/modules/LIMS/senaite/assets/js/bootstrap.min.js b/modules/LIMS/senaite/assets/js/bootstrap.min.js
new file mode 100644
index 000000000..0e846b780
--- /dev/null
+++ b/modules/LIMS/senaite/assets/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+  * Bootstrap v4.1.1 (https://getbootstrap.com/)
+  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+  */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,c){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function h(r){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{},e=Object.keys(s);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(s).filter(function(t){return Object.getOwnPropertyDescriptor(s,t).enumerable}))),e.forEach(function(t){var e,n,i;e=r,i=s[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return r}e=e&&e.hasOwnProperty("default")?e.default:e,c=c&&c.hasOwnProperty("default")?c.default:c;var r,n,s,a,l,u,f,d,_,g,m,p,v,E,y,T,C,I,A,D,b,S,w,N,O,k,P,L,j,R,H,W,M,x,U,K,F,V,Q,B,Y,G,q,z,X,J,Z,$,tt,et,nt,it,rt,st,ot,at,lt,ht,ct,ut,ft,dt,_t,gt,mt,pt,vt,Et,yt,Tt,Ct,It,At,Dt,bt,St,wt,Nt,Ot,kt,Pt,Lt,jt,Rt,Ht,Wt,Mt,xt,Ut,Kt,Ft,Vt,Qt,Bt,Yt,Gt,qt,zt,Xt,Jt,Zt,$t,te,ee,ne,ie,re,se,oe,ae,le,he,ce,ue,fe,de,_e,ge,me,pe,ve,Ee,ye,Te,Ce,Ie,Ae,De,be,Se,we,Ne,Oe,ke,Pe,Le,je,Re,He,We,Me,xe,Ue,Ke,Fe,Ve,Qe,Be,Ye,Ge,qe,ze,Xe,Je,Ze,$e,tn,en,nn,rn,sn,on,an,ln,hn,cn,un,fn,dn,_n,gn,mn,pn,vn,En,yn,Tn,Cn=function(i){var e="transitionend";function t(t){var e=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(e)},t),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");e&&"#"!==e||(e=t.getAttribute("href")||"");try{return 0<i(document).find(e).length?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=i(t).css("transition-duration");return parseFloat(e)?(e=e.split(",")[0],1e3*parseFloat(e)):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){i(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],s=e[i],o=s&&l.isElement(s)?"element":(a=s,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(o))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+o+'" but expected type "'+r+'".')}var a}};return i.fn.emulateTransitionEnd=t,i.event.special[l.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(i(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}},l}(e),In=(n="alert",a="."+(s="bs.alert"),l=(r=e).fn[n],u={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",d="fade",_="show",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){r.removeData(this._element,s),this._element=null},t._getRootElement=function(t){var e=Cn.getSelectorFromElement(t),n=!1;return e&&(n=r(e)[0]),n||(n=r(t).closest("."+f)[0]),n},t._triggerCloseEvent=function(t){var e=r.Event(u.CLOSE);return r(t).trigger(e),e},t._removeElement=function(e){var n=this;if(r(e).removeClass(_),r(e).hasClass(d)){var t=Cn.getTransitionDurationFromElement(e);r(e).one(Cn.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){r(t).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=r(this),e=t.data(s);e||(e=new i(this),t.data(s,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),r.fn[n]=g._jQueryInterface,r.fn[n].Constructor=g,r.fn[n].noConflict=function(){return r.fn[n]=l,g._jQueryInterface},g),An=(p="button",E="."+(v="bs.button"),y=".data-api",T=(m=e).fn[p],C="active",I="btn",D='[data-toggle^="button"]',b='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+y,FOCUS_BLUR_DATA_API:(A="focus")+E+y+" blur"+E+y},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=m(this._element).closest(b)[0];if(n){var i=m(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&m(this._element).hasClass(C))t=!1;else{var r=m(n).find(w)[0];r&&m(r).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!m(this._element).hasClass(C),m(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!m(this._element).hasClass(C)),t&&m(this._element).toggleClass(C)},t.dispose=function(){m.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=m(this).data(v);t||(t=new n(this),m(this).data(v,t)),"toggle"===e&&t[e]()})},o(n,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),n}(),m(document).on(O.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;m(e).hasClass(I)||(e=m(e).closest(N)),k._jQueryInterface.call(m(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,D,function(t){var e=m(t.target).closest(N)[0];m(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),m.fn[p]=k._jQueryInterface,m.fn[p].Constructor=k,m.fn[p].noConflict=function(){return m.fn[p]=T,k._jQueryInterface},k),Dn=(L="carousel",R="."+(j="bs.carousel"),H=".data-api",W=(P=e).fn[L],M={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},x={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},U="next",K="prev",F="left",V="right",Q={SLIDE:"slide"+R,SLID:"slid"+R,KEYDOWN:"keydown"+R,MOUSEENTER:"mouseenter"+R,MOUSELEAVE:"mouseleave"+R,TOUCHEND:"touchend"+R,LOAD_DATA_API:"load"+R+H,CLICK_DATA_API:"click"+R+H},B="carousel",Y="active",G="slide",q="carousel-item-right",z="carousel-item-left",X="carousel-item-next",J="carousel-item-prev",Z={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},$=function(){function s(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(e),this._element=P(t)[0],this._indicatorsElement=P(this._element).find(Z.INDICATORS)[0],this._addEventListeners()}var t=s.prototype;return t.next=function(){this._isSliding||this._slide(U)},t.nextWhenVisible=function(){!document.hidden&&P(this._element).is(":visible")&&"hidden"!==P(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(K)},t.pause=function(t){t||(this._isPaused=!0),P(this._element).find(Z.NEXT_PREV)[0]&&(Cn.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=P(this._element).find(Z.ACTIVE_ITEM)[0];var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)P(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?U:K;this._slide(i,this._items[t])}},t.dispose=function(){P(this._element).off(R),P.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=h({},M,t),Cn.typeCheckConfig(L,t,x),t},t._addEventListeners=function(){var e=this;this._config.keyboard&&P(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(P(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&P(this._element).on(Q.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=P.makeArray(P(t).parent().find(Z.ITEM)),this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===U,i=t===K,r=this._getItemIndex(e),s=this._items.length-1;if((i&&0===r||n&&r===s)&&!this._config.wrap)return e;var o=(r+(t===K?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(P(this._element).find(Z.ACTIVE_ITEM)[0]),r=P.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return P(this._element).trigger(r),r},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){P(this._indicatorsElement).find(Z.ACTIVE).removeClass(Y);var e=this._indicatorsElement.children[this._getItemIndex(t)];e&&P(e).addClass(Y)}},t._slide=function(t,e){var n,i,r,s=this,o=P(this._element).find(Z.ACTIVE_ITEM)[0],a=this._getItemIndex(o),l=e||o&&this._getItemByDirection(t,o),h=this._getItemIndex(l),c=Boolean(this._interval);if(t===U?(n=z,i=X,r=F):(n=q,i=J,r=V),l&&P(l).hasClass(Y))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&o&&l){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(l);var u=P.Event(Q.SLID,{relatedTarget:l,direction:r,from:a,to:h});if(P(this._element).hasClass(G)){P(l).addClass(i),Cn.reflow(l),P(o).addClass(n),P(l).addClass(n);var f=Cn.getTransitionDurationFromElement(o);P(o).one(Cn.TRANSITION_END,function(){P(l).removeClass(n+" "+i).addClass(Y),P(o).removeClass(Y+" "+i+" "+n),s._isSliding=!1,setTimeout(function(){return P(s._element).trigger(u)},0)}).emulateTransitionEnd(f)}else P(o).removeClass(Y),P(l).addClass(Y),this._isSliding=!1,P(this._element).trigger(u);c&&this.cycle()}},s._jQueryInterface=function(i){return this.each(function(){var t=P(this).data(j),e=h({},M,P(this).data());"object"==typeof i&&(e=h({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new s(this,e),P(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&(t.pause(),t.cycle())})},s._dataApiClickHandler=function(t){var e=Cn.getSelectorFromElement(this);if(e){var n=P(e)[0];if(n&&P(n).hasClass(B)){var i=h({},P(n).data(),P(this).data()),r=this.getAttribute("data-slide-to");r&&(i.interval=!1),s._jQueryInterface.call(P(n),i),r&&P(n).data(j).to(r),t.preventDefault()}}},o(s,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return M}}]),s}(),P(document).on(Q.CLICK_DATA_API,Z.DATA_SLIDE,$._dataApiClickHandler),P(window).on(Q.LOAD_DATA_API,function(){P(Z.DATA_RIDE).each(function(){var t=P(this);$._jQueryInterface.call(t,t.data())})}),P.fn[L]=$._jQueryInterface,P.fn[L].Constructor=$,P.fn[L].noConflict=function(){return P.fn[L]=W,$._jQueryInterface},$),bn=(et="collapse",it="."+(nt="bs.collapse"),rt=(tt=e).fn[et],st={toggle:!0,parent:""},ot={toggle:"boolean",parent:"(string|element)"},at={SHOW:"show"+it,SHOWN:"shown"+it,HIDE:"hide"+it,HIDDEN:"hidden"+it,CLICK_DATA_API:"click"+it+".data-api"},lt="show",ht="collapse",ct="collapsing",ut="collapsed",ft="width",dt="height",_t={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},gt=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=tt.makeArray(tt('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=tt(_t.DATA_TOGGLE),i=0;i<n.length;i++){var r=n[i],s=Cn.getSelectorFromElement(r);null!==s&&0<tt(s).filter(t).length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){tt(this._element).hasClass(lt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!tt(this._element).hasClass(lt)&&(this._parent&&0===(t=tt.makeArray(tt(this._parent).find(_t.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(t=null),!(t&&(e=tt(t).not(this._selector).data(nt))&&e._isTransitioning))){var i=tt.Event(at.SHOW);if(tt(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(tt(t).not(this._selector),"hide"),e||tt(t).data(nt,null));var r=this._getDimension();tt(this._element).removeClass(ht).addClass(ct),(this._element.style[r]=0)<this._triggerArray.length&&tt(this._triggerArray).removeClass(ut).attr("aria-expanded",!0),this.setTransitioning(!0);var s="scroll"+(r[0].toUpperCase()+r.slice(1)),o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){tt(n._element).removeClass(ct).addClass(ht).addClass(lt),n._element.style[r]="",n.setTransitioning(!1),tt(n._element).trigger(at.SHOWN)}).emulateTransitionEnd(o),this._element.style[r]=this._element[s]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&tt(this._element).hasClass(lt)){var e=tt.Event(at.HIDE);if(tt(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();if(this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",Cn.reflow(this._element),tt(this._element).addClass(ct).removeClass(ht).removeClass(lt),0<this._triggerArray.length)for(var i=0;i<this._triggerArray.length;i++){var r=this._triggerArray[i],s=Cn.getSelectorFromElement(r);if(null!==s)tt(s).hasClass(lt)||tt(r).addClass(ut).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){t.setTransitioning(!1),tt(t._element).removeClass(ct).addClass(ht).trigger(at.HIDDEN)}).emulateTransitionEnd(o)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){tt.removeData(this._element,nt),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=h({},st,t)).toggle=Boolean(t.toggle),Cn.typeCheckConfig(et,t,ot),t},t._getDimension=function(){return tt(this._element).hasClass(ft)?ft:dt},t._getParent=function(){var n=this,t=null;Cn.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=tt(this._config.parent)[0];var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return tt(t).find(e).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){if(t){var n=tt(t).hasClass(lt);0<e.length&&tt(e).toggleClass(ut,!n).attr("aria-expanded",n)}},a._getTargetFromElement=function(t){var e=Cn.getSelectorFromElement(t);return e?tt(e)[0]:null},a._jQueryInterface=function(i){return this.each(function(){var t=tt(this),e=t.data(nt),n=h({},st,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(nt,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return st}}]),a}(),tt(document).on(at.CLICK_DATA_API,_t.DATA_TOGGLE,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=tt(this),e=Cn.getSelectorFromElement(this);tt(e).each(function(){var t=tt(this),e=t.data(nt)?"toggle":n.data();gt._jQueryInterface.call(t,e)})}),tt.fn[et]=gt._jQueryInterface,tt.fn[et].Constructor=gt,tt.fn[et].noConflict=function(){return tt.fn[et]=rt,gt._jQueryInterface},gt),Sn=(pt="dropdown",Et="."+(vt="bs.dropdown"),yt=".data-api",Tt=(mt=e).fn[pt],Ct=new RegExp("38|40|27"),It={HIDE:"hide"+Et,HIDDEN:"hidden"+Et,SHOW:"show"+Et,SHOWN:"shown"+Et,CLICK:"click"+Et,CLICK_DATA_API:"click"+Et+yt,KEYDOWN_DATA_API:"keydown"+Et+yt,KEYUP_DATA_API:"keyup"+Et+yt},At="disabled",Dt="show",bt="dropup",St="dropright",wt="dropleft",Nt="dropdown-menu-right",Ot="position-static",kt='[data-toggle="dropdown"]',Pt=".dropdown form",Lt=".dropdown-menu",jt=".navbar-nav",Rt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ht="top-start",Wt="top-end",Mt="bottom-start",xt="bottom-end",Ut="right-start",Kt="left-start",Ft={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Vt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Qt=function(){function l(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=l.prototype;return t.toggle=function(){if(!this._element.disabled&&!mt(this._element).hasClass(At)){var t=l._getParentFromElement(this._element),e=mt(this._menu).hasClass(Dt);if(l._clearMenus(),!e){var n={relatedTarget:this._element},i=mt.Event(It.SHOW,n);if(mt(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof c)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var r=this._element;"parent"===this._config.reference?r=t:Cn.isElement(this._config.reference)&&(r=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),"scrollParent"!==this._config.boundary&&mt(t).addClass(Ot),this._popper=new c(r,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===mt(t).closest(jt).length&&mt(document.body).children().on("mouseover",null,mt.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),mt(this._menu).toggleClass(Dt),mt(t).toggleClass(Dt).trigger(mt.Event(It.SHOWN,n))}}}},t.dispose=function(){mt.removeData(this._element,vt),mt(this._element).off(Et),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;mt(this._element).on(It.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=h({},this.constructor.Default,mt(this._element).data(),t),Cn.typeCheckConfig(pt,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=l._getParentFromElement(this._element);this._menu=mt(t).find(Lt)[0]}return this._menu},t._getPlacement=function(){var t=mt(this._element).parent(),e=Mt;return t.hasClass(bt)?(e=Ht,mt(this._menu).hasClass(Nt)&&(e=Wt)):t.hasClass(St)?e=Ut:t.hasClass(wt)?e=Kt:mt(this._menu).hasClass(Nt)&&(e=xt),e},t._detectNavbar=function(){return 0<mt(this._element).closest(".navbar").length},t._getPopperConfig=function(){var e=this,t={};"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=h({},t.offsets,e._config.offset(t.offsets)||{}),t}:t.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:t,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},l._jQueryInterface=function(e){return this.each(function(){var t=mt(this).data(vt);if(t||(t=new l(this,"object"==typeof e?e:null),mt(this).data(vt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},l._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=mt.makeArray(mt(kt)),n=0;n<e.length;n++){var i=l._getParentFromElement(e[n]),r=mt(e[n]).data(vt),s={relatedTarget:e[n]};if(r){var o=r._menu;if(mt(i).hasClass(Dt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&mt.contains(i,t.target))){var a=mt.Event(It.HIDE,s);mt(i).trigger(a),a.isDefaultPrevented()||("ontouchstart"in document.documentElement&&mt(document.body).children().off("mouseover",null,mt.noop),e[n].setAttribute("aria-expanded","false"),mt(o).removeClass(Dt),mt(i).removeClass(Dt).trigger(mt.Event(It.HIDDEN,s)))}}}},l._getParentFromElement=function(t){var e,n=Cn.getSelectorFromElement(t);return n&&(e=mt(n)[0]),e||t.parentNode},l._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||mt(t.target).closest(Lt).length)):Ct.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!mt(this).hasClass(At))){var e=l._getParentFromElement(this),n=mt(e).hasClass(Dt);if((n||27===t.which&&32===t.which)&&(!n||27!==t.which&&32!==t.which)){var i=mt(e).find(Rt).get();if(0!==i.length){var r=i.indexOf(t.target);38===t.which&&0<r&&r--,40===t.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===t.which){var s=mt(e).find(kt)[0];mt(s).trigger("focus")}mt(this).trigger("click")}}},o(l,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Ft}},{key:"DefaultType",get:function(){return Vt}}]),l}(),mt(document).on(It.KEYDOWN_DATA_API,kt,Qt._dataApiKeydownHandler).on(It.KEYDOWN_DATA_API,Lt,Qt._dataApiKeydownHandler).on(It.CLICK_DATA_API+" "+It.KEYUP_DATA_API,Qt._clearMenus).on(It.CLICK_DATA_API,kt,function(t){t.preventDefault(),t.stopPropagation(),Qt._jQueryInterface.call(mt(this),"toggle")}).on(It.CLICK_DATA_API,Pt,function(t){t.stopPropagation()}),mt.fn[pt]=Qt._jQueryInterface,mt.fn[pt].Constructor=Qt,mt.fn[pt].noConflict=function(){return mt.fn[pt]=Tt,Qt._jQueryInterface},Qt),wn=(Yt="modal",qt="."+(Gt="bs.modal"),zt=(Bt=e).fn[Yt],Xt={backdrop:!0,keyboard:!0,focus:!0,show:!0},Jt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},Zt={HIDE:"hide"+qt,HIDDEN:"hidden"+qt,SHOW:"show"+qt,SHOWN:"shown"+qt,FOCUSIN:"focusin"+qt,RESIZE:"resize"+qt,CLICK_DISMISS:"click.dismiss"+qt,KEYDOWN_DISMISS:"keydown.dismiss"+qt,MOUSEUP_DISMISS:"mouseup.dismiss"+qt,MOUSEDOWN_DISMISS:"mousedown.dismiss"+qt,CLICK_DATA_API:"click"+qt+".data-api"},$t="modal-scrollbar-measure",te="modal-backdrop",ee="modal-open",ne="fade",ie="show",re={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},se=function(){function r(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=Bt(t).find(re.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var t=r.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isTransitioning&&!this._isShown){Bt(this._element).hasClass(ne)&&(this._isTransitioning=!0);var n=Bt.Event(Zt.SHOW,{relatedTarget:t});Bt(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),Bt(document.body).addClass(ee),this._setEscapeEvent(),this._setResizeEvent(),Bt(this._element).on(Zt.CLICK_DISMISS,re.DATA_DISMISS,function(t){return e.hide(t)}),Bt(this._dialog).on(Zt.MOUSEDOWN_DISMISS,function(){Bt(e._element).one(Zt.MOUSEUP_DISMISS,function(t){Bt(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),!this._isTransitioning&&this._isShown){var n=Bt.Event(Zt.HIDE);if(Bt(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=Bt(this._element).hasClass(ne);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),Bt(document).off(Zt.FOCUSIN),Bt(this._element).removeClass(ie),Bt(this._element).off(Zt.CLICK_DISMISS),Bt(this._dialog).off(Zt.MOUSEDOWN_DISMISS),i){var r=Cn.getTransitionDurationFromElement(this._element);Bt(this._element).one(Cn.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(r)}else this._hideModal()}}},t.dispose=function(){Bt.removeData(this._element,Gt),Bt(window,document,this._element,this._backdrop).off(qt),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=h({},Xt,t),Cn.typeCheckConfig(Yt,t,Jt),t},t._showElement=function(t){var e=this,n=Bt(this._element).hasClass(ne);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&Cn.reflow(this._element),Bt(this._element).addClass(ie),this._config.focus&&this._enforceFocus();var i=Bt.Event(Zt.SHOWN,{relatedTarget:t}),r=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,Bt(e._element).trigger(i)};if(n){var s=Cn.getTransitionDurationFromElement(this._element);Bt(this._dialog).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()},t._enforceFocus=function(){var e=this;Bt(document).off(Zt.FOCUSIN).on(Zt.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===Bt(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?Bt(this._element).on(Zt.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||Bt(this._element).off(Zt.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?Bt(window).on(Zt.RESIZE,function(t){return e.handleUpdate(t)}):Bt(window).off(Zt.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){Bt(document.body).removeClass(ee),t._resetAdjustments(),t._resetScrollbar(),Bt(t._element).trigger(Zt.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(Bt(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=Bt(this._element).hasClass(ne)?ne:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=te,n&&Bt(this._backdrop).addClass(n),Bt(this._backdrop).appendTo(document.body),Bt(this._element).on(Zt.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&Cn.reflow(this._backdrop),Bt(this._backdrop).addClass(ie),!t)return;if(!n)return void t();var i=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){Bt(this._backdrop).removeClass(ie);var r=function(){e._removeBackdrop(),t&&t()};if(Bt(this._element).hasClass(ne)){var s=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e)[0].style.paddingRight,i=Bt(e).css("padding-right");Bt(e).data("padding-right",n).css("padding-right",parseFloat(i)+r._scrollbarWidth+"px")}),Bt(re.STICKY_CONTENT).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css("margin-right");Bt(e).data("margin-right",n).css("margin-right",parseFloat(i)-r._scrollbarWidth+"px")}),Bt(re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css("margin-right");Bt(e).data("margin-right",n).css("margin-right",parseFloat(i)+r._scrollbarWidth+"px")});var t=document.body.style.paddingRight,e=Bt(document.body).css("padding-right");Bt(document.body).data("padding-right",t).css("padding-right",parseFloat(e)+this._scrollbarWidth+"px")}},t._resetScrollbar=function(){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e).data("padding-right");"undefined"!=typeof n&&Bt(e).css("padding-right",n).removeData("padding-right")}),Bt(re.STICKY_CONTENT+", "+re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e).data("margin-right");"undefined"!=typeof n&&Bt(e).css("margin-right",n).removeData("margin-right")});var t=Bt(document.body).data("padding-right");"undefined"!=typeof t&&Bt(document.body).css("padding-right",t).removeData("padding-right")},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=$t,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},r._jQueryInterface=function(n,i){return this.each(function(){var t=Bt(this).data(Gt),e=h({},Xt,Bt(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new r(this,e),Bt(this).data(Gt,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},o(r,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Xt}}]),r}(),Bt(document).on(Zt.CLICK_DATA_API,re.DATA_TOGGLE,function(t){var e,n=this,i=Cn.getSelectorFromElement(this);i&&(e=Bt(i)[0]);var r=Bt(e).data(Gt)?"toggle":h({},Bt(e).data(),Bt(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var s=Bt(e).one(Zt.SHOW,function(t){t.isDefaultPrevented()||s.one(Zt.HIDDEN,function(){Bt(n).is(":visible")&&n.focus()})});se._jQueryInterface.call(Bt(e),r,this)}),Bt.fn[Yt]=se._jQueryInterface,Bt.fn[Yt].Constructor=se,Bt.fn[Yt].noConflict=function(){return Bt.fn[Yt]=zt,se._jQueryInterface},se),Nn=(ae="tooltip",he="."+(le="bs.tooltip"),ce=(oe=e).fn[ae],ue="bs-tooltip",fe=new RegExp("(^|\\s)"+ue+"\\S+","g"),ge={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!(_e={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(de={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},pe="out",ve={HIDE:"hide"+he,HIDDEN:"hidden"+he,SHOW:(me="show")+he,SHOWN:"shown"+he,INSERTED:"inserted"+he,CLICK:"click"+he,FOCUSIN:"focusin"+he,FOCUSOUT:"focusout"+he,MOUSEENTER:"mouseenter"+he,MOUSELEAVE:"mouseleave"+he},Ee="fade",ye="show",Te=".tooltip-inner",Ce=".arrow",Ie="hover",Ae="focus",De="click",be="manual",Se=function(){function i(t,e){if("undefined"==typeof c)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=oe(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(oe(this.getTipElement()).hasClass(ye))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),oe.removeData(this.element,this.constructor.DATA_KEY),oe(this.element).off(this.constructor.EVENT_KEY),oe(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&oe(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===oe(this.element).css("display"))throw new Error("Please use show on visible elements");var t=oe.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){oe(this.element).trigger(t);var n=oe.contains(this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=Cn.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&oe(i).addClass(Ee);var s="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,o=this._getAttachment(s);this.addAttachmentClass(o);var a=!1===this.config.container?document.body:oe(this.config.container);oe(i).data(this.constructor.DATA_KEY,this),oe.contains(this.element.ownerDocument.documentElement,this.tip)||oe(i).appendTo(a),oe(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new c(this.element,i,{placement:o,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Ce},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),oe(i).addClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().on("mouseover",null,oe.noop);var l=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,oe(e.element).trigger(e.constructor.Event.SHOWN),t===pe&&e._leave(null,e)};if(oe(this.tip).hasClass(Ee)){var h=Cn.getTransitionDurationFromElement(this.tip);oe(this.tip).one(Cn.TRANSITION_END,l).emulateTransitionEnd(h)}else l()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=oe.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==me&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),oe(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(oe(this.element).trigger(i),!i.isDefaultPrevented()){if(oe(n).removeClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().off("mouseover",null,oe.noop),this._activeTrigger[De]=!1,this._activeTrigger[Ae]=!1,this._activeTrigger[Ie]=!1,oe(this.tip).hasClass(Ee)){var s=Cn.getTransitionDurationFromElement(n);oe(n).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){oe(this.getTipElement()).addClass(ue+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||oe(this.config.template)[0],this.tip},t.setContent=function(){var t=oe(this.getTipElement());this.setElementContent(t.find(Te),this.getTitle()),t.removeClass(Ee+" "+ye)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?oe(e).parent().is(t)||t.empty().append(e):t.text(oe(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getAttachment=function(t){return _e[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)oe(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==be){var e=t===Ie?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Ie?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;oe(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}oe(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=h({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ae:Ie]=!0),oe(e.getTipElement()).hasClass(ye)||e._hoverState===me?e._hoverState=me:(clearTimeout(e._timeout),e._hoverState=me,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===me&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ae:Ie]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=pe,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===pe&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=h({},this.constructor.Default,oe(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),Cn.typeCheckConfig(ae,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=oe(this.getTipElement()),e=t.attr("class").match(fe);null!==e&&0<e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(oe(t).removeClass(Ee),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=oe(this).data(le),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),oe(this).data(le,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return ge}},{key:"NAME",get:function(){return ae}},{key:"DATA_KEY",get:function(){return le}},{key:"Event",get:function(){return ve}},{key:"EVENT_KEY",get:function(){return he}},{key:"DefaultType",get:function(){return de}}]),i}(),oe.fn[ae]=Se._jQueryInterface,oe.fn[ae].Constructor=Se,oe.fn[ae].noConflict=function(){return oe.fn[ae]=ce,Se._jQueryInterface},Se),On=(Ne="popover",ke="."+(Oe="bs.popover"),Pe=(we=e).fn[Ne],Le="bs-popover",je=new RegExp("(^|\\s)"+Le+"\\S+","g"),Re=h({},Nn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),He=h({},Nn.DefaultType,{content:"(string|element|function)"}),We="fade",xe=".popover-header",Ue=".popover-body",Ke={HIDE:"hide"+ke,HIDDEN:"hidden"+ke,SHOW:(Me="show")+ke,SHOWN:"shown"+ke,INSERTED:"inserted"+ke,CLICK:"click"+ke,FOCUSIN:"focusin"+ke,FOCUSOUT:"focusout"+ke,MOUSEENTER:"mouseenter"+ke,MOUSELEAVE:"mouseleave"+ke},Fe=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){we(this.getTipElement()).addClass(Le+"-"+t)},r.getTipElement=function(){return this.tip=this.tip||we(this.config.template)[0],this.tip},r.setContent=function(){var t=we(this.getTipElement());this.setElementContent(t.find(xe),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Ue),e),t.removeClass(We+" "+Me)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=we(this.getTipElement()),e=t.attr("class").match(je);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=we(this).data(Oe),e="object"==typeof n?n:null;if((t||!/destroy|hide/.test(n))&&(t||(t=new i(this,e),we(this).data(Oe,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Re}},{key:"NAME",get:function(){return Ne}},{key:"DATA_KEY",get:function(){return Oe}},{key:"Event",get:function(){return Ke}},{key:"EVENT_KEY",get:function(){return ke}},{key:"DefaultType",get:function(){return He}}]),i}(Nn),we.fn[Ne]=Fe._jQueryInterface,we.fn[Ne].Constructor=Fe,we.fn[Ne].noConflict=function(){return we.fn[Ne]=Pe,Fe._jQueryInterface},Fe),kn=(Qe="scrollspy",Ye="."+(Be="bs.scrollspy"),Ge=(Ve=e).fn[Qe],qe={offset:10,method:"auto",target:""},ze={offset:"number",method:"string",target:"(string|element)"},Xe={ACTIVATE:"activate"+Ye,SCROLL:"scroll"+Ye,LOAD_DATA_API:"load"+Ye+".data-api"},Je="dropdown-item",Ze="active",$e={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},tn="offset",en="position",nn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+$e.NAV_LINKS+","+this._config.target+" "+$e.LIST_ITEMS+","+this._config.target+" "+$e.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,Ve(this._scrollElement).on(Xe.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?tn:en,r="auto"===this._config.method?t:this._config.method,s=r===en?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Ve.makeArray(Ve(this._selector)).map(function(t){var e,n=Cn.getSelectorFromElement(t);if(n&&(e=Ve(n)[0]),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[Ve(e)[r]().top+s,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){Ve.removeData(this._element,Be),Ve(this._scrollElement).off(Ye),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=h({},qe,"object"==typeof t&&t?t:{})).target){var e=Ve(t.target).attr("id");e||(e=Cn.getUID(Qe),Ve(t.target).attr("id",e)),t.target="#"+e}return Cn.typeCheckConfig(Qe,t,ze),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&t>=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||t<this._offsets[r+1])&&this._activate(this._targets[r])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",");t=t.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var n=Ve(t.join(","));n.hasClass(Je)?(n.closest($e.DROPDOWN).find($e.DROPDOWN_TOGGLE).addClass(Ze),n.addClass(Ze)):(n.addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_LINKS+", "+$e.LIST_ITEMS).addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_ITEMS).children($e.NAV_LINKS).addClass(Ze)),Ve(this._scrollElement).trigger(Xe.ACTIVATE,{relatedTarget:e})},t._clear=function(){Ve(this._selector).filter($e.ACTIVE).removeClass(Ze)},n._jQueryInterface=function(e){return this.each(function(){var t=Ve(this).data(Be);if(t||(t=new n(this,"object"==typeof e&&e),Ve(this).data(Be,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},o(n,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return qe}}]),n}(),Ve(window).on(Xe.LOAD_DATA_API,function(){for(var t=Ve.makeArray(Ve($e.DATA_SPY)),e=t.length;e--;){var n=Ve(t[e]);nn._jQueryInterface.call(n,n.data())}}),Ve.fn[Qe]=nn._jQueryInterface,Ve.fn[Qe].Constructor=nn,Ve.fn[Qe].noConflict=function(){return Ve.fn[Qe]=Ge,nn._jQueryInterface},nn),Pn=(on="."+(sn="bs.tab"),an=(rn=e).fn.tab,ln={HIDE:"hide"+on,HIDDEN:"hidden"+on,SHOW:"show"+on,SHOWN:"shown"+on,CLICK_DATA_API:"click"+on+".data-api"},hn="dropdown-menu",cn="active",un="disabled",fn="fade",dn="show",_n=".dropdown",gn=".nav, .list-group",mn=".active",pn="> li > .active",vn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',En=".dropdown-toggle",yn="> .dropdown-menu .active",Tn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&rn(this._element).hasClass(cn)||rn(this._element).hasClass(un))){var t,i,e=rn(this._element).closest(gn)[0],r=Cn.getSelectorFromElement(this._element);if(e){var s="UL"===e.nodeName?pn:mn;i=(i=rn.makeArray(rn(e).find(s)))[i.length-1]}var o=rn.Event(ln.HIDE,{relatedTarget:this._element}),a=rn.Event(ln.SHOW,{relatedTarget:i});if(i&&rn(i).trigger(o),rn(this._element).trigger(a),!a.isDefaultPrevented()&&!o.isDefaultPrevented()){r&&(t=rn(r)[0]),this._activate(this._element,e);var l=function(){var t=rn.Event(ln.HIDDEN,{relatedTarget:n._element}),e=rn.Event(ln.SHOWN,{relatedTarget:i});rn(i).trigger(t),rn(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){rn.removeData(this._element,sn),this._element=null},t._activate=function(t,e,n){var i=this,r=("UL"===e.nodeName?rn(e).find(pn):rn(e).children(mn))[0],s=n&&r&&rn(r).hasClass(fn),o=function(){return i._transitionComplete(t,r,n)};if(r&&s){var a=Cn.getTransitionDurationFromElement(r);rn(r).one(Cn.TRANSITION_END,o).emulateTransitionEnd(a)}else o()},t._transitionComplete=function(t,e,n){if(e){rn(e).removeClass(dn+" "+cn);var i=rn(e.parentNode).find(yn)[0];i&&rn(i).removeClass(cn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(rn(t).addClass(cn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),Cn.reflow(t),rn(t).addClass(dn),t.parentNode&&rn(t.parentNode).hasClass(hn)){var r=rn(t).closest(_n)[0];r&&rn(r).find(En).addClass(cn),t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=rn(this),e=t.data(sn);if(e||(e=new i(this),t.data(sn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),i}(),rn(document).on(ln.CLICK_DATA_API,vn,function(t){t.preventDefault(),Tn._jQueryInterface.call(rn(this),"show")}),rn.fn.tab=Tn._jQueryInterface,rn.fn.tab.Constructor=Tn,rn.fn.tab.noConflict=function(){return rn.fn.tab=an,Tn._jQueryInterface},Tn);!function(t){if("undefined"==typeof t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=Cn,t.Alert=In,t.Button=An,t.Carousel=Dn,t.Collapse=bn,t.Dropdown=Sn,t.Modal=wn,t.Popover=On,t.Scrollspy=kn,t.Tab=Pn,t.Tooltip=Nn,Object.defineProperty(t,"__esModule",{value:!0})});
+//# sourceMappingURL=bootstrap.min.js.map
\ No newline at end of file
diff --git a/modules/LIMS/senaite/classes/autoloader.php b/modules/LIMS/senaite/classes/autoloader.php
new file mode 100644
index 000000000..d882a65c3
--- /dev/null
+++ b/modules/LIMS/senaite/classes/autoloader.php
@@ -0,0 +1,37 @@
+<?php
+
+class Autoloader {
+
+
+        /**
+         * LoadClasses
+         * Checks if a class with name $className exists in the class directory
+         * If it does, include it, otherwise throw an exception
+         *
+         * @param string $className
+         * @return void
+         */
+        public static function loadClasses($class) {
+            // Retrieve the structure from the class name provided
+            $structure = explode('\\', $class);
+            $lastIndex = count($structure);
+
+            // The class to include is at the last index of the structure
+            $className = $structure[$lastIndex-1];
+            $classDirectory = 'classes/';
+
+            // Loop through the levels of the structure and add the 
+            // directory names into the directory tree variable
+            for($i = 2; $i < $lastIndex-1; $i++) {
+                $classDirectory .= $structure[$i]."/";
+            }
+            
+            // Check if file exists
+            // if it does, include it, otherwise throw an exception
+            if(file_exists($classDirectory . $className . '.php')) {
+                require_once($classDirectory . $className . '.php');
+            } else {
+                throw new \Exception('Could not find class '. $class);
+            }
+        }
+    }
\ No newline at end of file
diff --git a/modules/LIMS/senaite/classes/config.php b/modules/LIMS/senaite/classes/config.php
new file mode 100644
index 000000000..6d654f1c3
--- /dev/null
+++ b/modules/LIMS/senaite/classes/config.php
@@ -0,0 +1,26 @@
+<?php
+
+// Config class, deals with intial setups including setting of authentication headers for
+// API requests and dealing with other application-wide options
+class Config {
+
+
+
+  /**
+   * getLimsURI
+   * Retrieves the URL at which the LIMS resides
+   *
+   * @return void
+   */
+  public function getLimsURL() {
+    $URI = sqlFetchArray(sqlStatement("SELECT * FROM globals WHERE gl_name = 'lims_url'"))['gl_value'];
+    $URI .= '/senaite/@@API/senaite/v1/';
+    return $URI;
+  }
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/modules/LIMS/senaite/config.php b/modules/LIMS/senaite/config.php
new file mode 100644
index 000000000..e69de29bb
diff --git a/modules/LIMS/senaite/index.php b/modules/LIMS/senaite/index.php
new file mode 100644
index 000000000..8f858e073
--- /dev/null
+++ b/modules/LIMS/senaite/index.php
@@ -0,0 +1,58 @@
+<?php
+
+// the auto-loader will load in all the classes native to this application
+require_once 'classes/autoloader.php';
+spl_autoload_register('Autoloader::loadClasses');
+
+// start a session different from the one in EHR
+session_start();
+
+// libraries used
+include_once('../libraries/dependencies/functions.php');
+include_once("../libraries/Guzzle/index.php");
+include_once("../../../library/sql.inc");
+
+$config = new Config;
+$limsURL = $config->getLimsURL();
+
+
+$parser = new \GuzzleHttp\Cookie\SetCookie;
+$jar = new \GuzzleHttp\Cookie\SessionCookieJar('session_id', true);
+
+// retrieve login cookie from session and put it in a jar to be used by 
+// all the API requests
+if (isset($_SESSION['login_cookie']) && ($_SESSION['login_cookie'] != null)) {
+  $cookie = $parser->fromString($_SESSION['login_cookie']);
+  $jar->setCookie($cookie);
+  unset($_SESSION['login_cookie']);
+}
+
+// easy CURL library
+$client = new \GuzzleHttp\Client([
+  'base_uri' => $limsURL,
+  'cookies' => $jar
+]);
+
+//  action routing
+$action = isset($_GET['action']) ? $_GET['action'] : 'index';
+
+if (!file_exists('pages/'.$action.'.php')) {
+  $action = 'dashboard';
+}
+
+if (!isset($_SESSION['lims_login']) || !isset($_SESSION['lims_user'])) {
+  $action = 'login';
+  require_once('pages/'.$action.'.php');
+} else {
+  require_once('templates/base/header.php');
+  require_once('pages/'.$action.'.php');
+  require_once('templates/base/footer.php');
+}
+
+
+
+
+
+
+
+?>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/analysis.php b/modules/LIMS/senaite/pages/analysis.php
new file mode 100644
index 000000000..2511172b4
--- /dev/null
+++ b/modules/LIMS/senaite/pages/analysis.php
@@ -0,0 +1,384 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'analysis';
+}
+
+switch($sub) {
+
+  case 'categories':
+    $categories = getDataFromUrl($client, 'analysiscategory');
+    
+
+  break;
+
+  case 'createcategories':
+    $labDepartments = getDataFromUrl($client, 'department');
+    $errors = [];
+    $required = ['title', 'department'];
+    if (isset($_POST['submit'])) {
+      if (!checkRequiredFields($required, $_POST)) {
+        $errors[] = 'Please fill in the required fields';
+      }
+      if (count($errors) === 0) {
+        try {
+          $client->post('analysiscategory', [
+            'json' => [
+              'title' => $_POST['title'],
+              'Title' => $_POST['title'],
+              'description' => valueOrNull($_POST['description']),
+              'Department' => $_POST['department'],
+              'SortKey' => valueOrNull($_POST['sortKey'])
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=analysis&sact=categories');
+      }
+    }
+    
+  break;
+
+
+  case 'services':
+    $analysisServices = getDataFromUrl($client, 'analysisservice?inactive_state=active');
+    
+  break;
+
+  case 'createservices':
+    $errors = [];
+    $identifierTypes = getDataFromUrl($client, 'identifiertype');
+    $analysisCategories = getDataFromUrl($client, 'analysiscategory');
+    $labDepartments = getDataFromUrl($client, 'department');
+    if (isset($_POST['submit'])) {
+      $required = ['title', 'category',  'identifierType', 'identifier', 'analysisKeyword', 'pointOfCapture', 'exponentialFormatPrecision'];
+      if (!(checkRequiredFields($required, $_POST))) {
+        
+        $errors[] = 'Please fill in all the required fields';
+      }
+
+      if (count($errors) === 0) {
+
+        /**
+         * Have to do this part in two steps until some issues with senaite's API are resolved
+         * https://github.com/senaite/senaite.jsonapi/issues/28
+         */
+        try {
+
+         $serviceCreated = $client->post('analysisservice' , [
+            'form_params' => [
+              'title' => $_POST['title'],
+              'Title' => $_POST['title'],
+              'Category' => $_POST['category'],
+              'description' => valueOrNull($_POST['description']),
+              'SortKey' => valueOrNull($_POST['sortKey']),
+              'ShortTitle' => valueOrNull($_POST['shortTitle']),
+              'CommercialID' => valueOrNull($_POST['commercialID']),
+              'ProtocolID' => valueOrNull($_POST['protocolID']),
+              'Unit' => valueOrNull($_POST['unit']),
+              'Keyword' => $_POST['analysisKeyword'],
+              'PointOfCapture' => $_POST['pointOfCapture'],
+              'Price' => valueOrNull($_POST['price']),
+              'BulkPrice' => valueOrNull($_POST['bulkPrice']),
+              'VAT' => valueOrNull($_POST['VAT']),
+              'Department' => valueOrNull($_POST['department']),
+              'Remarks' => valueOrNull($_POST['remarks']),
+              'ExponentialFormatPrecision' => $_POST['exponentialFormatPrecision'],
+            ],
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        $serviceCreatedUid = json_decode($serviceCreated->getBody()->getContents())->items[0]->uid;
+        
+        // update the entry with the identifiers
+        try {
+          $client->post('update/'.$serviceCreatedUid, [
+            'json' => [
+              'Identifiers' => [ 
+                'Identifier' => $_POST['identifier'],
+                'IdentifierType' => $_POST['identifierType'],
+                'Description' => valueOrNull($_POST['identifierDescription']),
+                'value' => ''
+              ],
+            ]
+          ]);
+        } catch (Exception $e) {
+          $exceptionMessage = $e->getMessage();
+          if (strpos($exceptionMessage, 'LowerDetectionLimit') !== false || strpos($exceptionMessage, 'UpperDetectionLimit') !== false) {
+            header('location: index.php?action=analysis&sact=services');
+          } else {
+            die($e->getMessage());
+            $client->get('delete/'.$serviceCreatedUid);
+            header('location: index.php?action=analysis&sact=services');
+          }
+        }
+         
+      }
+
+    }
+
+  break;
+
+
+  case 'profiles':
+
+    $analysisProfiles = getDataFromUrl($client, 'analysisprofile');
+  
+  break;
+
+  case 'createprofiles':
+    $analysesServices = getDataFromUrl($client, 'analysisservice?inactive_state=active');
+    $errors = [];
+    $required = ['title', 'analyses'];
+    
+    if (isset($_POST['submit'])) {
+      if (!checkRequiredFields($required, $_POST)) {
+        $errors[] = 'Please fill in the required fields';
+      }
+
+      if (count($errors) === 0) {
+        $selectedServices = null;
+        if (is_array($_POST['analyses'])) {
+          $selectedServices = $_POST['analyses'];
+        } else {
+          $selectedServices = [ $_POST['analyses'] ];
+        }
+        
+        try {
+          var_dump($selectedServices);
+          $client->post('analysisprofile', [
+            'json' => [
+              'title' => $_POST['title'],
+              'Title' => $_POST['title'],
+              'description' => valueOrNull($_POST['description']),
+              'Service' => $selectedServices,
+              'ProfileKey' => valueOrNull($_POST['profileKeyword']),
+              'CommercialID' => valueOrNull($_POST['commercialID']),
+            ],
+            'form_params' => [
+              'title' => $_POST['title']
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=analysis&sact=categories');
+      }
+    }
+  break;
+
+  case 'createrequests':
+
+    $ajax = [ 'clientContacts' ];
+    $clients = getDataFromUrl($client, 'client');
+
+    // unable to send AJAX requests to the senaite API due to CORS( cross-rogin resource sharing) being disabled (can't send authentication
+    // cookie to the API).
+    // workaround - load the contacts for each client here and use javascript to generate the select from already existing data
+
+    $contacts = [];
+    foreach ($clients as $contactClient) {
+      $contactDetails = getDataFromUrl($client, 'search?getParentUID='.$contactClient->uid);
+      if (!empty($contactDetails)) {
+        $contacts[$contactClient->uid][] = $contactDetails;
+      }
+    }
+
+    $samples = getDataFromUrl($client, 'sample');
+    $analysisProfiles = getDataFromUrl($client, 'analysisprofile');
+    $sampleTypes = getDataFromUrl($client, 'sampletype');
+    $storageLocations = getDataFromUrl($client, 'storagelocation');
+    $samplePoints = getDataFromUrl($client, 'samplepoint');
+    $containers = getDataFromUrl($client, 'container');
+    $analysisCategories = getDataFromUrl($client, 'analysiscategory');
+    $analyses = getDataFromUrl($client, 'analysisservice');
+    $errors = [];
+
+    if (isset($_POST['submit'])) {
+      $required = [ 'client' , 'contact' , 'sampleDate', 'sampleType', 'analyses' ];
+
+      if (!(checkRequiredFields($required, $_POST))) {
+        $errors[] = 'Please fill in all the required fields';
+      }
+      if (!isset($_POST['analysisProfies'])) {
+        $_POST['analysisProfiles'] = '';
+      }
+      if (!isset($_POST['samplePoint'])) {
+        $_POST['samplePoint'] = '';
+      }
+      if (count($errors) === 0) { 
+        $clientInformation = getDataFromUrl($client, 'client/'.$_POST['client'])[0];
+        $sampleTypeInformation = getDataFromUrl($client, 'sampletype/'.$_POST['sampleType'])[0];
+        $contactInformation = getDataFromUrl($client, 'contact/'.$_POST['contact'])[0];
+
+        try {
+          $response = $client->post('analysisrequest', [
+            'json' => [
+              'parent_path' => $clientInformation->path,
+              'Contact' => $contactInformation->path,
+              'Profiles' => valueOrNull($_POST['analysisProfiles']),
+              'DateSampled' => $_POST['sampleDate'],
+              'SampleType' => "New SampleType",
+              'SamplePoint' => valueOrNull($_POST['samplePoint']),
+              'Priority' => valueOrNull($_POST['priority']),
+              'EnvironmentalConditions' => valueOrNull($_POST['environmentalConditions']),
+              'AdHoc' => valueOrNull($_POST['adhoc']),
+              'Analyses' => $_POST['analyses'],
+            ],
+          ]);
+          header('location: index.php?action=analysis&sact=requests');
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+      }
+    }
+
+
+
+  break;
+
+  case 'requests':
+
+    $analysisRequests = getDataFromUrl($client, 'analysisrequest');
+  break;
+
+
+  case 'request':
+    if (isset($_GET['id']) && ($_GET['id'] != null )) {
+      $id = $_GET['id'];
+    } else {
+      header('location: index.php?action=analysis&sact=requests');
+    }
+
+
+    $procedureInformation = sqlStatement("SELECT * FROM lims_analysisrequests WHERE analysisrequest_id = ?", [ $id ]);
+    $procedureInformation = sqlFetchArray($procedureInformation);
+
+
+    $analysisRequestInformation = getDataFromUrl($client, 'analysisrequest/'.$id.'?workflow=yes')[0];
+    $sampleInformation = getDataFromUrl($client, 'sample/'.$analysisRequestInformation->SampleUID.'?workflow=yes')[0];
+    $analysts = getDataFromUrl($client, 'users');
+
+    // need to account for retracted analysis results
+    $analysisInformation = getDataFromUrl($client, $analysisRequestInformation->Analyses[0]->api_url.'?workflow=yes')[0]; 
+    if (isset($_POST['receiveSample'])) {
+
+      
+      try {
+        $client->post('update/'.$id, [
+          'json' => [
+            'transition' => 'receive',
+          ]
+        ]);
+
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+      
+
+      $updateAnalysisRequests = sqlStatement("UPDATE lims_analysisrequests SET status = ? WHERE analysisrequest_id = ?", [ 'received', $id ]);
+      if ($updateAnalysisRequests) {
+        header('location: index.php?action=analysis&sact=requests');
+      }
+    }
+
+    if (isset($_POST['submitResult'])) {
+      try {
+        $client->post('update/'.$analysisInformation->uid, [
+          'form_params' => [
+            'Result' => $_POST['result'],
+            'transition' => 'submit',
+          ]
+        ]);
+
+        // this requires UDL/LDL validation to work
+        // https://github.com/senaite/senaite.jsonapi/issues/28
+
+        $client->post('update/'.$analysisRequestInformation->uid, [
+          'json' => [
+            'transition' => 'submit',
+            'Analyst' => $_POST['analyst'],
+          ]
+        ]);
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+    }
+
+
+    // this requires UDL/LDL validation to work
+    // https://github.com/senaite/senaite.jsonapi/issues/28
+
+    if (isset($_POST['verifyResult'])) {
+      try {
+        $client->post('update/'.$id, [
+          'json' => [
+            'transition' => 'verify'
+          ]
+        ]);
+
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+    }
+
+
+    if (isset($_POST['publish'])) {
+      try {
+        // submit report
+        // data needed - proc_order_id, date_collected, date_report, source, specimen_num, report_status, review_status, report_notes
+       
+       
+        $procedure_id = sqlFetchArray(sqlStatement(" SELECT * FROM lims_analysisrequests WHERE analysisrequest_id = ?", [$analysisRequestInformation->uid]))['procedure_order_id'];
+        $procedure_order_details = sqlFetchArray(sqlStatement("SELECT * FROM procedure_order WHERE procedure_order_id = ?", [ $procedure_id ]));
+        $procedure_order_code_details = sqlFetchArray(sqlStatement("SELECT * FROM procedure_order_code WHERE procedure_order_id = ?", [ $procedure_id ]));
+        $procedure_type_details = sqlFetchArray(sqlStatement("SELECT * FROM procedure_type WHERE name = ?", [ $procedure_order_code_details['procedure_name']]));
+
+        $date_collected = $analysisRequestInformation->DateReceived;
+        $date_report = date('c');
+        $source = "LIMS"; // not sure what the source should be. faculty performing analysis? user that was logged in while clicking the publish button?
+        $specimen_num = 1;
+        $report_status = 'complete';
+        $review_status = 'reviewed';
+        $report_notes = $analysisRequestInformation->Remarks;
+        $procedure_order_seq = sqlFetchArray(sqlStatement("SELECT procedure_order_seq FROM procedure_order_code WHERE procedure_order_id = ?", [$procedure_id]))['procedure_order_seq'];
+        
+        $createProcedureReport = sqlStatement("INSERT INTO procedure_report (`procedure_order_id`,`procedure_order_seq`,
+                                              `date_collected`,`date_report`,`source`,`specimen_num`,`report_status`, `review_status`, `report_notes`) VALUES(?,?,?,?,?,?,?,?,?)",
+                                              [$procedure_id, $procedure_order_seq, $date_collected, $date_report, $source, $specimen_num, $report_status, $review_status, $report_notes]);
+        if ($createProcedureReport) {
+          $client->post('update/'.$analysisRequestInformation->uid, [
+            'json' => [
+              'transition' => 'publish'
+            ]
+          ]);
+          // need some extra details here
+          /*
+          $procedureReportID = sqlFetchArray(sqlStatement("SELECT procedure_report_id FROM procedure_report WHERE procedure_order_id = ?", [ $procedure_id ]))['procedure_report_id'];
+          
+          $createProcedureResult = sqlStatement("INSERT INTO procedure_result(procedure_report_id, result_data_type, result_code, result_text,date,
+                                                 facility, units, result, range, abnormal, comments, result_status VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
+                                                 []);
+          */
+        }
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+    }
+
+
+
+
+  break;
+
+
+
+}
+
+
+
+require_once('./templates/pages/site/analysis/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/client.php b/modules/LIMS/senaite/pages/client.php
new file mode 100644
index 000000000..fd016f599
--- /dev/null
+++ b/modules/LIMS/senaite/pages/client.php
@@ -0,0 +1,132 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'clients';
+}
+
+
+switch($sub) {
+
+  case 'createcontacts':
+    $errors = [];
+    $labClients = getDataFromUrl($client, 'client');
+    if (isset($_POST['submit'])) {
+      $required = ['contactFirstName', 'contactSurname'];
+
+      if (!(checkRequiredFields($required, $_POST))) {
+        $errors[] = 'Please fill in all the required fields';
+      }
+
+      if (count($errors) === 0) {
+        try {
+          $client->post('contact', [
+            'json' => [
+              'Salutation' => valueOrNull($_POST['contactTitle']),
+              'Firstname' => $_POST['contactFirstName'],
+              'Middleinitial' => valueOrNull($_POST['contactMiddleInitial']),
+              'parent_uid' => $_POST['client'],
+              'Middlename' => valueOrNull($_POST['contactMiddleName']),
+              'Surname' => $_POST['contactSurname'], 
+              'JobTitle' => valueOrNull($_POST['contactJobTitle']),
+              'Department' => valueOrNull($_POST['contactDepartment']),
+              'EmailAddress' => valueOrNull($_POST['contactEmailAddress']),
+              'BusinessPhone' => valueOrNull($_POST['contactPhoneBusiness']),     
+            ]
+          ]);
+
+          header('location: index.php?action=site&sact=setup');
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+      }
+
+    }
+
+  break;
+  case 'createclient':
+    $errors = [];
+
+    if (isset($_POST['submit'])) {
+      $required = [ 'name', 'clientid'];
+
+      // general required field check
+      if (!(checkRequiredFields($required, $_POST))) {
+        $errors[] = 'Please fill in all the required fields';
+      }
+
+      if (!is_numeric($_POST['clientid'])) {
+        $errors[] = 'The client ID has to be numeric'; 
+      }
+      if (count($errors) === 0) {       
+        /*
+          To-do:
+         * Physical, Postal and Billing addresses need to be consolidated into Schemas specific to the LIMS
+         */
+
+        try {
+          $createdClient = $client->post('client', [
+            'json' => [
+              'Name' => $_POST['name'],
+              'title' => $_POST['name'],
+              'ClientID' => (int)$_POST['clientid'],
+              'TaxNumber' => valueOrNull($_POST['vat']),
+              'Phone' =>  valueOrNull($_POST['phone']),
+              'Fax' =>  valueOrNull($_POST['fax']),
+              'EmailAddress' =>  valueOrNull($_POST['email']),
+              'AccountType' =>  valueOrNull($_POST['acctype']),
+              'AccountName' =>  valueOrNull($_POST['accname']),
+              'AccountNumber' =>  valueOrNull($_POST['accnum']),
+              'BankName' =>  valueOrNull($_POST['bankname']),
+              'PhysicalAddress' => json_encode([
+                'city' =>  valueOrNull($_POST['phycity']),
+                'district' =>  valueOrNull($_POST['phydistrict']),
+                'state' =>  valueOrNull($_POST['phystate']),
+                'address' =>  valueOrNull($_POST['phyaddress']),
+                'zip' =>  valueOrNull($_POST['phypostal']),
+                'country' =>  valueOrNull($_POST['phycountry']),
+              ]),
+              'PostalAddress' => json_encode([
+                'city' =>  valueOrNull($_POST['postcity']),
+                'district' =>  valueOrNull($_POST['postdistrict']),
+                'state' =>  valueOrNull($_POST['poststate']),
+                'address' =>  valueOrNull($_POST['postaddress']),
+                'zip' =>  valueOrNull($_POST['postpostal']),
+                'country' =>  valueOrNull($_POST['postcountry']),
+              ]),
+              'BillingAddress' => json_encode([
+                'city' =>  valueOrNull($_POST['billcity']),
+                'district' =>  valueOrNull($_POST['billdistrict']),
+                'state' =>  valueOrNull($_POST['billstate']),
+                'address' =>  valueOrNull($_POST['billaddress']),
+                'zip' =>  valueOrNull($_POST['billpostal']),
+                'country' =>  valueOrNull($_POST['billcountry']),
+              ]),
+ 
+              ],
+            'form_params' => [
+                'title' => $_POST['name']
+              ]
+            
+          ]);
+          header('location: index.php?action=client');
+        } catch(Exception $e) {
+          die($e->getMessage());
+        }
+      }
+    }
+  break;
+
+  case 'clients':
+  default:
+  
+    $limsClients = json_decode($client->get('client')->getBody()->getContents())->items;
+
+
+}
+
+
+
+
+require_once('./templates/pages/site/clients/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/dashboard.php b/modules/LIMS/senaite/pages/dashboard.php
new file mode 100644
index 000000000..4bcc2c86c
--- /dev/null
+++ b/modules/LIMS/senaite/pages/dashboard.php
@@ -0,0 +1,105 @@
+<?php
+
+
+// analyses statistics
+$analysesAssignPending = [];
+$analysesResultPending = [];
+$analysesToVerify = [];
+$analysesVerified = [];
+
+$analysesData = $client->request('GET', 'analysis');
+$analysesData = json_decode($analysesData->getBody()->getContents());
+$analysesItemCount = $analysesData->count;
+
+foreach ($analysesData->items as $item) {
+  if ($item->review_state === 'sample_received') {
+    $analysesAssignPending[] = $item;
+    $analysesResultPending[] = $item;
+  }
+  if ($item->review_state === 'to_be_verified') {
+    $analysesToVerify[] = $item;
+  }
+  if ($item->review_state === 'verified') {
+    $analysesVerified[] = $item;
+  }
+}
+
+// analysis requests data
+$arReceptionPending = [];
+$arResultsPending = [];
+$arToVerify = [];
+$arVerified = [];
+$arPublished = [];
+
+$arData = $client->get('analysisrequest')->getBody()->getContents();
+$arData = json_decode($arData);
+$arItemCount = $arData->count;
+
+foreach ($arData->items as $item) {
+  if ($item->review_state === 'sample_due') {
+    $arReceptionPending[] = $item;
+  }
+  if ($item->review_state === 'sample_received') {
+    $arResultsPending[] = $item;
+  }
+  if ($item->review_state === 'to_be_verified') {
+    $arToVerify[] = $item;
+  }
+  if ($item->review_state === 'verified') {
+    $arVerified[] = $item;
+  }
+  if ($item->review_state === 'published') {
+    $arPublished[] = $item;
+  }
+}
+
+// worksheet statistics 
+
+$worksheetResultPending = [];
+$worksheetToVerify = [];
+$worksheetVerified = [];
+
+$worksheetData = $client->get('worksheet')->getBody()->getContents();
+$worksheetData = json_decode($worksheetData);
+$worksheetItemCount = $worksheetData->count;
+
+foreach ($worksheetData->items as $item) {
+
+  if ($item->review_state === 'open') {
+    $worksheetResultPending[] = $item;
+  }
+  if ($item->review_state === 'to_be_verified') {
+    $worksheetToVerify[] = $item;
+  }
+  if ($item->review_state === 'verified') {
+    $worksheetVerified[] = $item;
+  }
+}
+
+// sample statistics
+
+$sampleReceptionPending =[];
+$sampleReceived = [];
+$sampleRejected = [];
+
+$sampleData = $client->get('sample')->getBody()->getContents();
+$sampleData = json_decode($sampleData);
+$sampleDataItemCount = $sampleData->count;
+
+foreach ($sampleData->items as $item) {
+
+  if ($item->review_state === 'sample_due') {
+    $sampleReceptionPending[] = $item;
+  }
+  if ($item->review_state === 'sample_received') {
+    $sampleReceived[] = $item;
+  }
+  if ($item->review_state === 'rejected') {
+    $sampleRejected[] = $item;
+  }
+  
+}
+
+
+require_once('./templates/pages/dashboard.php');
+
diff --git a/modules/LIMS/senaite/pages/instrument.php b/modules/LIMS/senaite/pages/instrument.php
new file mode 100644
index 000000000..c003f046c
--- /dev/null
+++ b/modules/LIMS/senaite/pages/instrument.php
@@ -0,0 +1,145 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'instruments';
+}
+
+switch($sub) {
+  case 'locations':
+
+    $instrumentLocationData = $client->get('instrumentlocation')->getBody()->getContents();
+    $instrumentLocationData = json_decode($instrumentLocationData)->items;
+
+  break;
+
+  case 'createlocation':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || strlen($_POST['title']) === 0) {
+        $errors[] = 'Please enter a title';
+      } 
+
+      if ( isset($errors) && count($errors) <= 0) {
+        try {
+          $client->request('post', 'instrumentlocation', [
+            'form_params' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+            ]
+          ]);
+        } catch(Exception $e) {
+          $errors[] = $e->getMessage();
+        } finally {
+          header('location: index.php?action=instrument&sact=locations');
+        }
+      }
+    }
+
+  break;
+
+  case 'types':
+
+    $instrumentTypeData = $client->get('instrumenttype')->getBody()->getContents();
+    $instrumentTypeData = json_decode($instrumentTypeData)->items;
+
+  break;
+
+  case 'createtype':
+  $errors = [];
+  if (isset($_POST['submit'])) {
+    if (!isset($_POST['title']) || strlen($_POST['title']) === 0) {
+      $errors[] = 'Please enter a title';
+    } 
+
+    if ( isset($errors) && count($errors) <= 0) {
+      try {
+        $client->request('post', 'instrumenttype', [
+          'form_params' => [
+            'title' => $_POST['title'],
+            'description' => $_POST['description'],
+          ]
+        ]);
+      } catch(Exception $e) {
+        $errors[] = $e->getMessage();
+      } finally {
+        header('location: index.php?action=instrument&sact=types');
+      }
+    }
+  }
+  
+  break;
+
+
+  case 'createinstrument':
+    $instrumentTypes = getDataFromUrl($client, 'instrumenttype', true);
+    $instrumentLocations = getDataFromUrl($client, 'instrumentlocation', true);
+    $manufacturers = getDataFromUrl($client, 'manufacturer', true); 
+    $suppliers = getDataFromUrl($client, 'supplier', true);
+    $methods = getDataFromUrl($client, 'method', true);
+    $errors = [];
+    if (isset($_POST['submit'])) {
+        
+        $required = [
+            'title',
+            'instrumenttype',
+            'manufacturer',
+            'supplier',
+            'location',
+        ];
+        if (!(isset($_POST['methods']))) {
+          $_POST['methods'] = [];
+        }
+
+        if (!checkRequiredFields($required, $_POST)) {
+          $errors[] = 'Please fill in the required fields';
+        }
+
+        if (!isset($_POST['location'])) {
+          $_POST['location'] = null;
+        }
+
+        if (count($errors) === 0) {
+          try {
+            $response = $client->post('instrument', [
+              'json' => [
+                "title" => $_POST["title"],
+                "AssetNumber" => valueOrNull($_POST["assetNum"]),
+                "description" => valueOrNull($_POST["description"]),
+                "InstrumentType" => $_POST["instrumenttype"],
+                "Manufacturer" => $_POST["manufacturer"],
+                "Supplier" => $_POST["supplier"],
+                "InstrumentLocation" => valueOrNull($_POST["location"]),
+                "Model" => valueOrNull($_POST["modelno"]),
+                "SerialNo" => valueOrNull($_POST["serialno"]),
+                "Methods" => valueOrNulL($_POST["methods"]),
+                "DataInterface" => valueOrNull($_POST["exportinterface"]),
+                "InlabCalibrationProcedure" => valueOrNull($_POST["calibproc"]),
+                "PreventiveMaintenanceProcedure" => valueOrNull($_POST["preventproc"])
+              ],
+              'form_params' => [
+                'title' => $_POST['title'],
+              ]
+            ]);
+            header('location: index.php?action=instrument');
+          } catch (Exception $e) {
+            die($e->getMessage());
+          }
+      }
+
+    }
+
+  break;
+
+  case 'instruments':
+  default:
+  $sub = 'instruments';
+  $instrumentData = getDataFromUrl($client, 'instrument', true);
+
+
+
+
+}
+
+require_once('./templates/pages/site/instruments/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/laboratory.php b/modules/LIMS/senaite/pages/laboratory.php
new file mode 100644
index 000000000..ce29f51e8
--- /dev/null
+++ b/modules/LIMS/senaite/pages/laboratory.php
@@ -0,0 +1,126 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'laboratories';
+}
+
+switch($sub) {
+
+  case 'contacts':
+    $contacts = json_decode($client->get('labcontact')->getBody()->getContents())->items;
+  break;
+
+  case 'createcontacts':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      $required = [ 'fname' , 'sname' ];
+      foreach ($required as $requiredField) {
+        if (!isset($_POST[$requiredField]) || strlen($_POST[$requiredField]) === 0) {
+          $errors[] = 'Please fill in all the fields';
+          break;
+        }
+      }
+
+      if (count($errors) === 0) {
+        try {
+          $client->post('labcontact', [
+            'form_params' => [
+              'Salutation' => $_POST['title'],
+              'Firstname' => $_POST['fname'],
+              'Middleinitial' => $_POST['midinitial'],
+              'Middlename' => $_POST['mname'],
+              'Surname' => $_POST['sname'],
+              'JobTitle' => $_POST['jtitle'],
+              'EmailAddress' => $_POST['email'],
+              'BusinessPhone' => $_POST['bphone'],
+              'BusinessFax' => $_POST['bfax'],
+              'HomePhone' => $_POST['hphone'],
+              'MobilePhone' => $_POST['mphone']
+            ]
+          ]); 
+          } catch(Exception $e) {
+            die($e->getMessage());
+        }
+        header('location: index.php?action=laboratory&sact=contacts');
+      }
+    }
+  break;
+
+
+  case 'departments':
+    $departments = json_decode($client->get('department')->getBody()->getContents())->items;
+  break;
+
+  case 'createdepartments':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      if ( !isset($_POST['title']) || strlen($_POST['title']) === 0) {
+        $errors[] = 'Please fill in all the fields';
+      }
+      if (count($errors) === 0) {
+        try {
+          $client->post('department', [
+            'form_params' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['desc']
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=laboratory&sact=departments');
+      }
+    }
+    
+  break;
+
+  case 'products':
+    $products = json_decode($client->get('labproduct')->getBody()->getContents())->items;
+  break;
+
+
+  case 'createproducts':
+  $errors = [];
+  if (isset($_POST['submit'])) {
+    $required = [ 'title' , 'pwVAT' ];
+    foreach ($required as $requiredField) {
+      if (!isset($_POST[$requiredField]) || strlen($_POST[$requiredField]) === 0) {
+        $errors[] = 'Please fill in all the fields';
+        break;
+      }
+    }
+    if (count($errors) === 0) {
+      try {
+        $client->post('labproduct', [
+          'form_params' => [
+            'title' => $_POST['title'],
+            'description' => $_POST['description'],
+            'Volume' => $_POST['volume'],
+            'Unit' => $_POST['unit'],
+            'VAT' => $_POST['vat'],
+            'Price' => $_POST['pwVAT']
+          ]
+        ]);
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+      header('location: index.php?action=laboratory&sact=products');
+    }
+  }
+  
+  break;
+
+  case 'information':
+  default:
+  $sub = 'information';
+
+  $labInformation = json_decode($client->get('laboratory')->getBody()->getContents())->items;
+  $labContacts = json_decode($client->get('labcontact')->getBody()->getContents())->items;
+
+}
+
+
+
+require_once('./templates/pages/site/laboratory/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/lims.php b/modules/LIMS/senaite/pages/lims.php
new file mode 100644
index 000000000..cd60622dc
--- /dev/null
+++ b/modules/LIMS/senaite/pages/lims.php
@@ -0,0 +1,46 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'index';
+}
+
+
+
+
+
+switch($sub) {
+  case 'index':
+  default:
+  $sub = 'index';
+  $limsInformation = getDataFromUrl($client, getDataFromUrl($client, 'bikasetup')[0]->api_url)[0];
+  
+  if (isset($_POST['submit'])) {
+    if (!isset($_POST['passLifetime']) || ($_POST['passLifetime'] === '')) {
+      $errors[] = 'Please enter a password lifetime (0 if disabled)';
+    }
+
+    if (count($errors) === 0) {
+      $selfVerification = ( isset($_POST['selfVerify']) && $_POST['selfVerify'] === 'on') ? true : false;
+      try {
+        $client->post('update/'.$limsInformation->uid, [
+          'json' => [
+            'PasswordLifetime' => $_POST['passLifetime'],
+            'SelfVerificationEnabled' => $selfVerification
+          ]
+        ]);
+        
+        header('location: index.php?action=lims');
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+    }
+  }
+
+}
+
+
+
+
+require_once('./templates/pages/site/lims/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/login.php b/modules/LIMS/senaite/pages/login.php
new file mode 100644
index 000000000..22f57a47a
--- /dev/null
+++ b/modules/LIMS/senaite/pages/login.php
@@ -0,0 +1,47 @@
+<?php
+
+
+// basic validations
+if (isset($_POST['submit'])) {
+  $errors = [];
+  if (!isset($_POST['username'])) {
+    $errors[] = 'Please enter a username';
+  }
+  if (!isset($_POST['password']) || strlen($_POST['password']) <= 0) {
+    echo $_POST['password'];
+    $errors[] = 'Please enter a password';
+  }
+
+  if (count($errors) <= 0) {
+    $authenticated = true;
+    try {
+      $authRequest = $client->request('POST','login', [
+        'form_params' => [ 
+                            '__ac_name' => $_POST['username'],
+                            '__ac_password' => $_POST['password'], 
+                        ],      
+      ]);
+    } catch(\GuzzleHttp\Exception\ClientException $e) {
+      $authenticated = false;
+    }
+    if ($authenticated) {
+      session_start();
+      $_SESSION['lims_login'] = 'senaite';
+      $_SESSION['lims_user'] = $_POST['username'];
+      $_SESSION['login_cookie'] = $authRequest->getHeader('set-cookie')[0];
+      header('location: index.php');
+    } else {
+      $errors[] = 'Please enter valid credentials';
+    }
+    
+  }
+}
+
+
+
+
+
+
+
+
+require_once('./templates/pages/login.php');
diff --git a/modules/LIMS/senaite/pages/logout.php b/modules/LIMS/senaite/pages/logout.php
new file mode 100644
index 000000000..bcd006b14
--- /dev/null
+++ b/modules/LIMS/senaite/pages/logout.php
@@ -0,0 +1,7 @@
+<?php
+
+
+// logout process
+session_destroy();
+$jar->clear();
+header('location: index.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/method.php b/modules/LIMS/senaite/pages/method.php
new file mode 100644
index 000000000..2f5e613e9
--- /dev/null
+++ b/modules/LIMS/senaite/pages/method.php
@@ -0,0 +1,169 @@
+<?php
+
+
+// get sub-action
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'method';
+}
+
+
+switch($sub) {
+
+
+  case 'container':
+
+    $containers = json_decode($client->get('container')->getBody()->getContents())->items;
+
+
+  break;
+
+
+  case 'createcontainer':
+
+    $containerTypes = json_decode($client->get('containertype')->getBody()->getContents())->items;
+    $errors = [];
+    
+    if (isset($_POST['submit'])) {
+      $required = ['title', 'capacity'];
+      foreach ($required as $requiredField) {
+        if (valueOrNull($_POST[$requiredField]) === null ) {
+          $errors[] = 'Please fill in all the fields';
+          break;
+        }
+      }
+
+      /*
+       TO-DO:
+       - Pre-preservation
+       */
+      
+      if (count($errors) === 0) {
+        try {
+          $client->request('post', 'container', [
+            'json' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+              'ContainerType' => valueOrNull($_POST['containertype']),
+              'Capacity' => $_POST['capacity'],
+              'SecuritySealIntact' => valueOrNull($_POST['seal'])
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=method&sact=container');
+        
+      }
+    }
+  break;
+
+
+  case 'containertype':
+
+    $containerTypes = json_decode($client->get('containertype')->getBody()->getContents())->items;
+
+  break;
+
+
+  case 'createcontainertype':
+    $containerTypes = json_decode($client->get('containertype')->getBody()->getContents())->items;
+    $errors = [];
+    
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || (strlen($_POST['title']) === 0)) {
+        $errors[] = ' Please fill in all the required fields ';
+      }
+
+      if (count($errors) === 0) {
+        try {
+          $client->request('post', 'containertype', [
+            'json' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+              'parent_path' => "/senaite/bika_setup/bika_containertypes" // Parent path required temporarily, Senaite side issue
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=method&sact=containertype');
+        
+      }
+    }
+
+  break;
+
+  case 'createmethod':
+     // get method details
+    $methods = json_decode($client->get('method')->getBody()->getContents())->items;
+    $errors = [];
+    
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || (strlen($_POST['title']) === 0)) {
+        $errors[] = ' Please fill in all the required fields ';
+      }
+
+      if (count($errors) === 0) {
+        try {
+          $client->request('post', 'method', [
+            'form_params' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+              'MethodID' => $_POST['methodid'],
+              'Instructions' => $_POST['instructions'],
+              'ManualEntryOfResultsViewField' => (isset($_POST['manualentry']) && ($_POST['manualentry'])) ? true : false,
+              'Accredited' => (isset($_POST['accredited']) && ($_POST['accredited'])) ? true : false,
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=method');
+        
+      }
+    }
+
+  break;
+
+  case 'identifiertype':
+    $identifierTypes = getDataFromUrl($client, 'identifiertype');
+  break;
+
+  case 'createidentifiertype':
+  $errors = [];
+  if (isset($_POST['submit'])) {
+    if (!isset($_POST['title']) || strlen($_POST['title']) === 0) {
+      $errors[] = 'Please fill in all the required fields';
+    }
+    if (count($errors) === 0) {
+      try {
+        $client->post('identifiertype', [
+          'form_params' => [
+            'title' => $_POST['title'],
+            'description' => valueOrNull($_POST['description'])
+          ]
+        ]);
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+      header('location: index.php?action=method&sact=identifiertype');
+      
+    }
+  }
+
+  
+
+  break;
+
+  case 'method':
+  default:
+    $methods = json_decode($client->get('method')->getBody()->getContents())->items;
+
+}
+
+
+
+
+require_once('./templates/pages/site/methods/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/procedure.php b/modules/LIMS/senaite/pages/procedure.php
new file mode 100644
index 000000000..968dca819
--- /dev/null
+++ b/modules/LIMS/senaite/pages/procedure.php
@@ -0,0 +1,81 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'list';
+}
+
+switch ($sub) {
+
+  case 'view':
+    if (isset($_GET['id']) && ($_GET['id'] != null )) {
+      $id = $_GET['id'];
+    } else {
+      header('location: index.php?action=procedure');
+    }
+
+    $procedure = sqlFetchArray(sqlStatement("SELECT * FROM procedure_order WHERE procedure_order_id = ?", [ $id ]));
+    $procedureInformation = sqlFetchArray(sqlStatement("SELECT * FROM procedure_order WHERE procedure_order_id = ?", [ $id ]));
+    if (!$procedure) {
+      die('No procedure with the given ID was found');
+    } else {
+
+      $analysisRequests = getDataFromUrl($client, 'analysisrequest', true);
+      
+      if (isset($_POST['assignAR'])) {
+        $arToAssign = $_POST['analysisrequest'];
+        $status = 'processing';
+        
+        $assignAR = sqlStatement("INSERT INTO lims_analysisrequests(`procedure_order_id`, `analysisrequest_id`, `status`) VALUES(?, ?, ?)", [$id, $arToAssign, $status]);
+        $updateProcedureOrder = sqlStatement("UPDATE procedure_order SET order_status = ? WHERE procedure_order_id = ?", [ 'assigned', $id]);
+        if ($assignAR && $updateProcedureOrder) {
+          header('location: index.php?action=procedure');
+        }
+      }
+
+      if (isset($_POST['updateAR'])) {
+        $arToAssign = $_POST['analysisrequest'];
+        $updateAR = sqlStatement("UPDATE lims_analysisrequests SET analysisrequest_id = ? WHERE procedure_order_id = ?", [$arToAssign, $id]);
+
+        if ($updateAR) {
+          header('location: index.php?action=procedure');
+        }
+      }
+      
+
+
+
+    }
+
+  break;
+
+  default:
+  case 'list':
+  $sub = 'list';
+  
+  if (isset($_POST['submit'])) {
+    $procedureId = $_POST['procedure_id'];
+    $updateOrderStatus = sqlStatement("UPDATE procedure_order SET order_status='routed' WHERE procedure_order_id=?", [ $procedureId ]);
+    if ($updateOrderStatus) {
+      echo "<div class='alert alert-success'> Order accepted! </div>";
+    }
+  }
+  $procedureQuery = sqlStatement("SELECT * FROM procedure_order");
+  $procedures = [];
+  while ($procedure = sqlFetchArray($procedureQuery)) {
+    $procedures[] = $procedure;
+  }
+
+
+  break;
+}
+
+
+
+require_once('./templates/pages/site/procedures/'.$sub.'.php');
+?>
+
+
+
+
diff --git a/modules/LIMS/senaite/pages/resource.php b/modules/LIMS/senaite/pages/resource.php
new file mode 100644
index 000000000..533056606
--- /dev/null
+++ b/modules/LIMS/senaite/pages/resource.php
@@ -0,0 +1,78 @@
+<?php
+
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'manufacturer';
+}
+
+$errors = [];
+switch($sub) {
+
+
+  case 'supplier':
+    $supplierDetails = $client->get('supplier')->getBody()->getContents();
+    $supplierDetails = json_decode($supplierDetails)->items;
+
+  break;
+
+  case 'createsupplier':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['name']) || strlen($_POST['name']) === 0) {
+        $errors[] = 'Please enter a name';
+      } 
+
+      if ( isset($errors) && count($errors) <= 0) {
+        try {
+          // TO-DO: add rest of the form params
+          $client->request('post', 'supplier', [
+            'form_params' => [
+              'title' => $_POST['name'],
+            ]
+          ]);
+        } catch(Exception $e) {
+          $errors[] = $e->getMessage();
+        } finally {
+          header('location: index.php?action=resource&sact=supplier');
+        }
+      }
+    }
+  break;
+
+
+  case 'createmanufacturer':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || strlen($_POST['title']) === 0) {
+        $errors[] = 'Please enter a title';
+      } 
+
+      if ( isset($errors) && count($errors) <= 0) {
+        try {
+          $client->request('post', 'manufacturer', [
+            'form_params' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+            ]
+          ]);
+        } catch(Exception $e) {
+          $errors[] = $e->getMessage();
+        } finally {
+          header('location: index.php?action=resource');
+        }
+      }
+    }
+  break;
+
+
+  case 'manufacturer':
+  default:
+  $manufacturerDetails = $client->get('manufacturer')->getBody()->getContents();
+  $manufacturerDetails = json_decode($manufacturerDetails)->items;
+
+}
+
+
+require_once('./templates/pages/site/resources/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/sample.php b/modules/LIMS/senaite/pages/sample.php
new file mode 100644
index 000000000..4a6f66b3e
--- /dev/null
+++ b/modules/LIMS/senaite/pages/sample.php
@@ -0,0 +1,259 @@
+<?php
+
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'sample';
+}
+
+
+switch ($sub) {
+
+  case 'types':
+    $sampleTypes = json_decode($client->get('sampletype')->getBody()->getContents())->items;
+   
+
+  break;
+
+
+  case 'createtype':
+    $samplePoints = json_decode($client->get('samplepoint')->getBody()->getContents())->items;
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      $required = [
+        'title',
+        'retentionDays',
+        'retentionHours',
+        'retentionMinutes',
+        'typePrefix',
+        'minimumVolume',
+        'admittedStickerTemplates',
+        'defaultSmallSticker',
+        'defaultLargeSticker'
+      ];
+  
+      foreach ($required as $requiredField) {
+        if (valueOrNull($_POST[$requiredField]) === null ) {
+          $errors[] = 'Please fill in all the fields';
+          break;
+        }
+      }
+
+      // custom validations
+      if (count($errors) === 0) {
+       if (!is_array($_POST['admittedStickerTemplates'])) {
+        $admittedStickerTemplates = [ $_POST['admittedStickerTemplates' ] ];
+       } else {
+         $admittedStickerTemplates = $_POST['admittedStickerTemplates'];
+       }
+       
+        // whitespaces not allowed in type prefix
+        if (preg_match('/\s/', $_POST['typePrefix'])) {
+          $errors[] = 'Whitespaces are not allowed in the type prefix';
+        }
+
+        // default small sticker should be in the admittedstickertemplate list
+        $smallStickerFlag = 0;
+        foreach($admittedStickerTemplates as $allowed) {
+          if ($_POST['defaultSmallSticker'] === $allowed) {
+            $smallStickerFlag = 1;
+          }
+        }
+
+        if ($smallStickerFlag != 1) {
+          $errors[] = 'The default small sticker value can only be one of the values from the picked admitted sticker template list.';
+        }
+
+        // default large sticker should be in the admittedstickertemplate list
+        $largeStickerFlag = 0;
+        foreach($admittedStickerTemplates as $allowed) {
+          if ($_POST['defaultLargeSticker'] === $allowed) {
+            $largeStickerFlag = 1;
+          }
+        }
+
+        if ($largeStickerFlag != 1) {
+          $errors[] = 'The default large sticker value can only be one of the values from the picked admitted sticker template list.';
+        }
+      }
+      if (count($errors) === 0) {
+        try {
+          $response = $client->post('sampletype', [
+            'json' => [
+              'title' => $_POST['title'],
+              'description' => valueOrNull($_POST['description']),
+              'RetentionPeriod' => (['hours' => $_POST['retentionHours'], 'minutes' => $_POST['retentionMinutes'], 'days' => $_POST['retentionDays']]),
+              'Hazardous' => (isset($_POST['hazardous']) && ($_POST['hazardous'] === 'on')) ? true : false,
+              'SampleMatrix' => null,
+              'Prefix' => $_POST['typePrefix'],
+              'MinimumVolume' => $_POST['minimumVolume'],
+              'ContainerType' => null,
+              'SamplePoints' => null,
+              'AdmittedStickerTemplates' => [ (['value' => '', 'small_default' => $_POST['defaultSmallSticker'], 'large_default' => $_POST['defaultLargeSticker'], 
+                                             'admitted' => [ $admittedStickerTemplates ]
+                                              ])],
+            ]
+          ]);
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=sample&sact=types');
+      }
+    }
+    
+  break;
+
+  
+  case 'points':
+
+    $samplePoints = getDataFromUrl($client, 'samplepoint');
+
+    
+  break;
+
+  case 'createpoints':
+
+    $samplePoints = json_decode($client->get('samplepoint')->getBody()->getContents())->items;
+    $sampleTypes = getDataFromUrl($client, 'sampletype');
+    $errors = [];
+
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || valueOrNull($_POST['title']) === null) {
+        $errors[] = 'Please fill in the required fields';
+      }
+
+      // specific validations
+      if (count($errors) === 0) {
+        if (isset($_POST['latBear']) && ($_POST['latBear'] != 'N' && $_POST['latBear'] != 'S')) {
+          $errors[] = 'Latitude bearing can only be N (north) or S (south)';
+        }
+
+        if (isset($_POST['longBear']) && ($_POST['longBear'] != 'W' && $_POST['longBear'] != 'E')) {
+          $errors[] = 'Latitude bearing can only be E (east) or W (west)';
+        }
+      }
+      var_dump($_POST['sampleTypes']);
+      if (count($errors) === 0) {
+        try {
+          $client->post('samplepoint', [
+            'json' => [
+                'title' => $_POST['title'],
+                'Title' => $_POST['title'],
+                'description' => valueOrNull($_POST['description']),
+                'SamplingFrequency' => [ 
+                  'hours' => $_POST['sampleHours'],
+                  'minutes' => $_POST['sampleMinutes'],
+                  'days' => $_POST['sampleDays']
+                ],
+                'SampleTypes' => valueOrNull($_POST['sampleTypes']),
+                'Composite' => (isset($_POST['composite']) ? 'true' : 'false'),
+                'Latitude' => [
+                  'seconds' => valueOrNull($_POST['latSec']),
+                  'minutes' => valueOrNull($_POST['latMin']),
+                  'degrees' => valueOrNull($_POST['latDeg']),
+                  'bearing' => valueOrNull($_POST['latBear'])
+                ],
+                'Longitude' => [
+                  'seconds' => valueOrNull($_POST['longSec']),
+                  'minutes' => valueOrNull($_POST['longMin']),
+                  'degrees' => valueOrNull($_POST['longDeg']),
+                  'bearing' => valueOrNull($_POST['longBear'])
+                ],
+                'Elevation' => valueOrNull($_POST['elevation'])
+      
+            ]]);
+
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+        header('location: index.php?action=sample&sact=points');
+      }
+     
+      
+    }
+  
+  break;
+  
+  case 'conditions':
+    $sampleConditions = getDataFromUrl($client, 'samplecondition');
+  break;
+
+  case 'createconditions':
+  $errors = [];
+  if (isset($_POST['submit'])) {
+    if (!isset($_POST['title']) || valueOrNull($_POST['title']) === null) {
+      $errors[] = 'Please fill in the required fields';
+    }
+
+    if (count($errors) === 0) {
+      try {
+        $client->post('samplecondition', [
+          'json' => [
+            'title' => $_POST['title'],
+            'description' => $_POST['description'],
+          ],
+          'form_params' => [
+            'title' => $_POST['title'],
+          ]
+        ]);
+
+        header('location: index.php?action=sample&sact=conditions');
+      } catch (Exception $e) {
+        die($e->getMessage());
+      }
+    }
+
+
+  }
+
+  break;
+
+
+  case 'matrices':
+
+    $sampleMatrices = getDataFromUrl($client, 'samplematrix');
+
+  break;
+
+
+  case 'creatematrices':
+    $errors = [];
+    if (isset($_POST['submit'])) {
+      if (!isset($_POST['title']) || valueOrNull($_POST['title']) === null) {
+        $errors[] = 'Please fill in the required fields';
+      }
+
+      if (count($errors) === 0) {
+        try {
+          $client->post('samplematrix', [
+            'json' => [
+              'title' => $_POST['title'],
+              'description' => $_POST['description'],
+            ],
+            'form_params' => [
+              'title' => $_POST['title'],
+            ]
+          ]);
+
+          header('location: index.php?action=sample&sact=matrices');
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+      }
+
+
+    }
+
+  break;
+
+
+
+  case 'types':
+  default:
+    $sampleTypes = json_decode($client->get('sampletype')->getBody()->getContents())->items;
+    $sub = 'types';
+   
+}
+
+require_once('./templates/pages/site/samples/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/site.php b/modules/LIMS/senaite/pages/site.php
new file mode 100644
index 000000000..2d3877d3e
--- /dev/null
+++ b/modules/LIMS/senaite/pages/site.php
@@ -0,0 +1,7 @@
+<?php
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'setup';
+}
+require_once('./templates/pages/site/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/pages/worksheet.php b/modules/LIMS/senaite/pages/worksheet.php
new file mode 100644
index 000000000..e92ccc435
--- /dev/null
+++ b/modules/LIMS/senaite/pages/worksheet.php
@@ -0,0 +1,183 @@
+<?php
+
+if (isset($_GET['sact']) && ($_GET['sact'] != null )) {
+  $sub = $_GET['sact'];
+} else {
+  $sub = 'analysis';
+}
+
+switch($sub) {
+
+  case 'templates':
+    $worksheetTemplates = getDataFromUrl($client, 'worksheettemplate', true);
+
+  break;
+
+
+  case 'createtemplate':
+  $errors = [];
+  $methods = getDataFromUrl($client, 'method', true);
+  $instruments = getDataFromUrl($client, 'instrument', true);
+  $analysisServices = getDataFromUrl($client, 'analysisservice', true);
+  if (isset($_POST['submit'])) {
+    $required = [ 'title', 'analysisTypes' ];
+
+    if (!checkRequiredFields($required, $_POST)) {
+      $errors[] = 'Please fill in the required fields';
+    }
+
+    if (count($errors) === 0) {
+      // duplicate and analysis validation
+      
+      $duplicateList = $_POST['duplicateOf'];
+      $analysisList = $_POST['analysisTypes'];
+      $count = 0;
+      foreach ($analysisList as $key => $analyses) {
+        if (($analyses) && $analyses !== '') {
+          $count++;
+        }
+        if ($analyses === 'd' && $duplicateList[$key] === '') {
+          $errors[] = ' Please select a duplicate source for '. ($key+1);
+        }
+      }
+      if ($count === 0) {
+        $errors[] = ' Please fill at least one worksheet layout field';
+      }
+      foreach ($duplicateList as $key => $duplicate) {
+        if ($duplicate != '' && $analysisList[$key] === 'd') {
+          if ( $analysisList[$duplicate-1] === 'd') {
+            $errors[] = ($key + 1). " cannot be a duplicate of ". $duplicate. " because ". $duplicate. " is already a duplicate";
+          }
+          if ($duplicate-1 == $key) {
+            $errors[] = $duplicate." cannot be a duplicate of itself ";
+          }
+        }
+      }
+
+
+      if (count($errors) === 0) {
+        $layout = [];
+
+        foreach ($analysisList as $key => $analyses) {
+          if ($analyses && $analyses !== '') {
+            if ($analyses === 'd') {
+              $layout[] = [
+                'type' => 'd',
+                'pos' => ($key+1),
+                'dup' => $duplicateList[$key]
+              ];
+            } else {
+              $layout[] = [
+                'type' => 'a',
+                'pos' => ($key+1)
+              ];
+            }
+          }
+        }
+
+        try {
+          $client->post('worksheettemplate', [
+            'json' => [
+              'title' => $_POST['title'],
+              'Layout' => $layout,
+              'description' => valueOrNull($_POST['description']),
+              'RestrictToMethod' => valueOrNull($_POST['method']),
+              'Instrument' => valueOrNull($_POST['instrument']),
+              'Service' => valueOrNull($_POST['analysisServices'])
+            ],
+            'form_params' => [
+              'title' => $_POST['title']
+            ]
+          ]);
+          header('location: index.php?action=worksheet&sact=templates');
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+
+      }
+
+    }
+  }
+
+  break;
+
+
+  case 'worksheets':
+
+    $worksheets = getDataFromUrl($client, 'worksheet', true);
+
+  break;
+
+  case 'createworksheets':
+    $errors = [];
+    $analysts = getDataFromUrl($client, 'users');
+    $worksheetTemplates = getDataFromUrl($client, 'worksheettemplate');
+    $instruments = getDataFromUrl($client, 'instrument');
+    $analyses = getDataFromUrl($client, 'analysis?review_state=sample_received');
+    if (isset($_POST['submit'])) {
+      $required = [ 'analyst' ];
+      if (!checkRequiredFields($required, $_POST)) {
+        $errors[] = 'Please fill in the required fields';
+      }
+
+
+      /**
+       * Seems to not completely update worksheets with analyses - waiting for senaite's response
+       * Related to the LDL/UDL errors again: https://github.com/senaite/senaite.jsonapi/issues/28
+       */
+
+      if (count($errors) === 0) {
+        $layout = [];
+
+        $count = 0;
+        foreach($_POST['analyses'] as $analysis) {
+          $analysisInformation = getDataFromUrl($client, 'analysis/'.$analysis)[0];
+          $layout[] = [
+            'position' => ++$count,
+            'type' => 'a',
+            'analysis_uid' => $analysis,
+            'container_uid' => $analysisInformation->parent_uid
+          ];
+        }
+
+        try {
+          $client->post('worksheet', [
+            'json' => [
+              'Analyst' => $_POST['analyst'],
+              'Layout' => $layout,
+              'WorksheetTemplate' => valueOrNull($_POST['template']),
+              'Instrument' => valueOrNull($_POST['instrument']),
+              'parent_path' => "/senaite/worksheets",
+              'Analyses' => $_POST['analyses']
+            ]
+          ]);
+
+          header('location: index.php?action=worksheet&sact=worksheets');
+        } catch (Exception $e) {
+          die($e->getMessage());
+        }
+      }
+    }
+
+  break;
+
+  case 'worksheet':
+    if (isset($_GET['id']) && ($_GET['id'] != null )) {
+      $id = $_GET['id'];
+    } else {
+      header('location: index.php?action=worksheet&sact=worksheets');
+    }
+    $errors = [];
+    $worksheetData = getDataFromUrl($client, 'worksheet/'.$id)[0];
+    $analysts = getDataFromUrl($client, 'users');
+    $worksheetTemplates = getDataFromUrl($client, 'worksheettemplate');
+    $instruments = getDataFromUrl($client, 'instrument');
+    $analyses = getDataFromUrl($client, 'analysis?review_state=sample_received');
+    
+  break;
+
+}
+
+
+
+require_once('./templates/pages/site/worksheets/'.$sub.'.php');
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/base/footer.php b/modules/LIMS/senaite/templates/base/footer.php
new file mode 100644
index 000000000..046fe5cc2
--- /dev/null
+++ b/modules/LIMS/senaite/templates/base/footer.php
@@ -0,0 +1,24 @@
+
+
+</div>
+
+
+<script
+    src="https://code.jquery.com/jquery-3.3.1.min.js"
+    integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
+    crossorigin="anonymous"></script>
+    <script
+    src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
+    integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
+    crossorigin="anonymous"></script>
+    <script src="assets/js/bootstrap.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/gijgo@1.9.10/js/gijgo.min.js" type="text/javascript"></script>
+    <script>
+    $(function () {
+        $('[data-toggle="tooltip"]').tooltip()
+    });
+   
+    $('#datepicker').datetimepicker({ footer: true, modal: true });
+</script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/base/header.php b/modules/LIMS/senaite/templates/base/header.php
new file mode 100644
index 000000000..0378a01f3
--- /dev/null
+++ b/modules/LIMS/senaite/templates/base/header.php
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Senaite LIMS - <?php echo strtoupper($action); ?></title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css"
+     integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
+    <link rel="stylesheet" href="assets/css/bootstrap.min.css">
+    <link href="https://cdn.jsdelivr.net/npm/gijgo@1.9.10/css/gijgo.min.css" rel="stylesheet" type="text/css" />
+    <link rel="stylesheet" href="assets/css/style.css">
+  </head>
+  <body>
+    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+      <a href="index.php" class="navbar-brand display-4">Senaite LIMS</a>
+      <button class="navbar-toggler" data-toggle="collapse" data-target="#navbarContent">
+        <span class="navbar-toggler-icon"></span>
+      </button>
+      <div class="collapse navbar-collapse" id="navbarContent">
+        <ul class="navbar-nav ml-auto">
+          <li class="nav-item">
+            <div class="dropdown dropleft">
+              <a href="#" class="nav-link dropdown-toggle" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><?php echo $_SESSION['lims_user']; ?></a>
+              <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
+                <a href="index.php" class="dropdown-item"><i class="fas fa-tachometer-alt fa-sm"></i> Dashboard</a>
+                <a href="index.php?action=lims" class="dropdown-item"><i class="fas fa-cogs fa-sm"></i> Manage LIMS </a>
+                <a href="index.php?action=procedure" class="dropdown-item"><i class="fas fa-sitemap fa-sm"></i> Manage Procedure Requests</a>
+                <a href="index.php?action=site&sact=setup" class="dropdown-item"><i class="fas fa-sitemap fa-sm"></i> Site Setup</a>
+                <a href="index.php?action=logout" class="dropdown-item"><i class="fas fa-user-times fa-sm"></i> Logout</a>
+                
+              </div>
+            </div>
+          </li>
+
+        </ul>
+      </div>
+    </nav>
+
+
+    <div class="container">
+
+    
+
+
+    
+    
+
+
+
+
+
+
+   
+
diff --git a/modules/LIMS/senaite/templates/pages/dashboard.php b/modules/LIMS/senaite/templates/pages/dashboard.php
new file mode 100644
index 000000000..2fe6d133f
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/dashboard.php
@@ -0,0 +1,163 @@
+        
+        <div class="col-12">
+          <div class="card">
+            <div class="card-header">
+              System Dashboard
+            </div>
+            <div class="card-body">
+              <div class="card">
+                <div class="card-header">
+                  Quick Links
+                </div>
+                <div class="card-body">
+                  <div class="row">
+                    <div class="col">
+                      <a href="index.php?action=analysis&sact=createrequests" class="btn btn-primary">Create analysis requests</a>
+                    </div>
+                    <div class="col">
+                      <a href="index.php?action=worksheet&sact=worksheets" class="btn btn-primary">Create worksheets</a>
+                    </div>
+                  </div>
+                </div>
+
+              </div>
+              <br>
+              <div class="card">
+                <div class="card-header">
+                  Analyses
+                </div>
+                <div class="card-body">
+                  <div class="row">
+                    <div class="col">
+                      Assignments Pending ( <?php echo count($analysesAssignPending); ?> of <?php echo $analysesItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar" style="width: <?php echo ((count($analysesAssignPending)) / valueOrZero($analysesItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                        
+                      </div>
+                    </div>
+                    <div class="col">
+                      Results Pending ( <?php echo count($analysesResultPending); ?> of <?php echo $analysesItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar"  style="width: <?php echo ((count($analysesResultPending)) / valueOrZero($analysesItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                        
+                      </div>
+                    </div>
+                    <div class="col">
+                      To be verified ( <?php echo count($analysesToVerify); ?> of <?php echo $analysesItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-warning" role="progressbar" style="width: <?php echo ((count($analysesToVerify)) / valueOrZero($analysesItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                        
+                      </div>
+                    </div>
+                    <div class="col">
+                      Verified ( <?php echo count($analysesVerified); ?> of <?php echo $analysesItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-success" role="progressbar" style="width: <?php echo ((count($analysesVerified)) / valueOrZero($analysesItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                        
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <br />
+              <div class="card">
+                <div class="card-header">
+                  Analysis Requests
+                </div>
+                <div class="card-body">
+                  <div class="row">
+                    <div class="col">
+                      Reception Pending (<?php echo count($arReceptionPending); ?> of <?php echo $arItemCount; ?>)
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar" style="width: <?php echo ((count($arReceptionPending)) / valueOrZero($arItemCount))* 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Results Pending ( <?php echo count($arResultsPending); ?> of <?php echo $arItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar" style="width: <?php echo ((count($arResultsPending)) / valueOrZero($arItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      To be verified ( <?php echo count($arToVerify); ?> of <?php echo $arItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-warning" role="progressbar" style="width: <?php echo ((count($arToVerify)) / valueOrZero($arItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Verified ( <?php echo count($arVerified); ?> of <?php echo $arItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-success" role="progressbar" style="width: <?php echo ((count($arVerified)) / valueOrZero($arItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Published ( <?php echo count($arPublished); ?> of <?php echo $arItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-success" role="progressbar" style="width: <?php echo ((count($arPublished)) / valueOrZero($arItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <br />
+              <div class="card">
+                <div class="card-header">
+                  Worksheets
+                </div>
+                <div class="card-body">
+                  <div class="row">
+                    <div class="col">
+                      Results Pending ( <?php echo count($worksheetResultPending); ?> of <?php echo $worksheetItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar" style="width: <?php echo ((count($worksheetResultPending)) / valueOrZero($worksheetItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      To be verified ( <?php echo count($worksheetToVerify); ?> of <?php echo $worksheetItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-warning" role="progressbar" style="width: <?php echo ((count($worksheetToVerify)) / valueOrZero($worksheetItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Verified ( <?php echo count($worksheetVerified); ?> of <?php echo $worksheetItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-success" role="progressbar" style="width: <?php echo ((count($worksheetVerified)) / valueOrZero($worksheetItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <br />
+              <div class="card">
+                <div class="card-header">
+                  Samples
+                </div>
+                <div class="card-body">
+                  <div class="row">
+                    <div class="col">
+                      Reception pending ( <?php echo count($sampleReceptionPending); ?> of <?php echo $sampleDataItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-info" role="progressbar" style="width: <?php echo ((count($sampleReceptionPending)) / valueOrZero($sampleDataItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Samples received ( <?php echo count($sampleReceived); ?> of <?php echo $sampleDataItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-success" role="progressbar" style="width: <?php echo ((count($sampleReceived)) / valueOrZero($sampleDataItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                    <div class="col">
+                      Samples rejected ( <?php echo count($sampleRejected); ?> of <?php echo $sampleDataItemCount; ?> )
+                      <div class="progress">
+                        <div class="progress-bar progress-bar bg-danger" role="progressbar" style="width: <?php echo ((count($sampleRejected)) / valueOrZero($sampleDataItemCount)) * 100; ?>%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"></div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              
+            </div>
+          </div>
+        
+        </div>
+        <br />
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/login.php b/modules/LIMS/senaite/templates/pages/login.php
new file mode 100644
index 000000000..c5c6753e3
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/login.php
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">
+  <title>Senaite LIMS - Login</title>
+  <link rel="stylesheet" href="assets/css/bootstrap.min.css">
+  <link rel="stylesheet" href="assets/css/style.css">
+</head>
+<body class="login-bg">
+
+  <div class="container h-100">
+    <div class="d-flex h-100 justify-content-center align-items-center">
+      <div class="card w-50">
+        <img class="card-img-top img-logo" src="assets/img/logo.png" alt="Card image cap">
+        <div class="card-body">
+        <p class="display-4 login-title text-center"> Senaite LIMS </p>
+        <hr />
+        <form method="POST" act="">
+          <div class="form-group">
+            <label for="username">Username</label>
+            <input type="text" class="form-control" id="username" name="username" aria-describedby="usernameHelp" placeholder="Enter username" />
+          </div>
+          <div class="form-group">
+            <label for="password">Password</label>
+            <input type="password" class="form-control" name="password" id="password" placeholder="Password">
+          </div>
+          <button type="submit" name="submit" class="btn btn-primary btn-orange">Login</button>
+          <hr />
+          <?php if (isset($errors)) { ?> 
+            <div class="alert alert-danger form-group">
+              <ul>
+                <?php foreach($errors as $error) { ?>
+                  <li> <?php echo $error; ?></li>
+                <?php } ?>
+              </ul>
+            </div>
+          <?php } ?>
+            
+        </form>
+        </div>
+      </div>
+    </div>
+  </div>
+
+
+
+  <script
+    src="https://code.jquery.com/jquery-3.3.1.min.js"
+    integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
+    crossorigin="anonymous"></script>
+    <script
+    src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
+    integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
+    crossorigin="anonymous"></script>
+    <script src="assets/js/bootstrap.min.js"></script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/categories.php b/modules/LIMS/senaite/templates/pages/site/analysis/categories.php
new file mode 100644
index 000000000..634f4d9dd
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/categories.php
@@ -0,0 +1,48 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Category</th>
+              <th>Department</th>
+              <th>Sort Key</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($categories as $category) {
+                  $categoryInformation = getDataFromUrl($client, $category->api_url)[0];
+                  $departmentInformation = getDataFromUrl($client, $categoryInformation->Department->api_url)[0];
+            ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $category->title; ?></td>
+              <td><?php echo $departmentInformation->title; ?></td>
+              <td><?php echo $categoryInformation->SortKey; ?></td>
+              <td><?php if ($category->review_state === 'active') echo "Active"; else echo "Dormant"; ?></td>
+            
+            </tr>                
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=analysis&sact=createcategories" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/createcategories.php b/modules/LIMS/senaite/templates/pages/site/analysis/createcategories.php
new file mode 100644
index 000000000..4dcf24d7b
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/createcategories.php
@@ -0,0 +1,68 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Analysis Category</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Used in item listings and search results."></i></label>
+        <textarea type="text" class="form-control" id="description" name="description"></textarea>
+      </div>
+
+      <div class="form-group">
+        <label for="comments">Comments <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="To be displayed below each Analysis Category section on results reports."></i></label>
+        <textarea type="text" class="form-control" id="comments" name="comments"></textarea>
+      </div>
+
+      <div class="form-group">
+        <label for="department">Department <span class="badge badge-danger">Required</span> </label>
+        <select name="department" id="department" class="form-control">
+          <?php foreach ($labDepartments as $labDepartment) { ?>
+            <option value="<?php echo $labDepartment->uid; ?>"><?php echo $labDepartment->title; ?></option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="sortKey">Sort Key <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Float value from 0.0 - 1000.0 indicating the sort order. Duplicate values are ordered alphabetically."></i></label>
+        <input type="text" class="form-control" name="sortKey" id="sortKey">
+      </div>
+      
+
+      <div class="form-group">
+      
+      </div>
+
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/createprofiles.php b/modules/LIMS/senaite/templates/pages/site/analysis/createprofiles.php
new file mode 100644
index 000000000..c823386fe
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/createprofiles.php
@@ -0,0 +1,66 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Manufacturer Type</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Used in item listings and search results."></i></label>
+        <textarea type="text" class="form-control" id="description" name="description"></textarea>
+      </div>
+
+      <div class="form-group">
+        <label for="profileKeyword">Profile Keyword <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The profile's keyword is used to uniquely identify it in import files. 
+                  It has to be unique, and it may not be the same as any Calculation Interim field ID."></i></label>
+        <input type="text" class="form-control" id="profileKeyword" name="profileKeyword">
+      </div>
+
+      <div class="form-group">
+        <label for="analyses">Profile Analyses <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The analyses included in this profile, grouped per category."></i> </label>
+        <select multiple="multiple" name="analyses[]" id="analyses" class="form-control">
+          <?php foreach ($analysesServices as $analysesService) { ?>
+            <option value="<?php echo $analysesService->uid; ?>"><?php echo $analysesService->title; ?></option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="commercialID">Commercial ID <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The profile's commercial ID for accounting purposes."></i></label>
+        <input type="text" class="form-control" name="commercialID" id="commercialID">
+      </div>
+
+      <br>
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/createrequests.php b/modules/LIMS/senaite/templates/pages/site/analysis/createrequests.php
new file mode 100644
index 000000000..535d27034
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/createrequests.php
@@ -0,0 +1,173 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">Create Analysis Request</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="client">Client <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The assigned client of this request"></i></label>
+        <select name="client" id="client" class="form-control" onchange="updateContacts(this)">
+          <?php foreach ($clients as $labClient) {
+            ?>
+            <option value="<?php echo $labClient->uid; ?>"> <?php echo $labClient->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="contact">Contact  <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The primary contact of this analysis request, who will receive notifications and publications via email"></i></label>
+       <select name="contact" id="contact" class="form-control">
+       </select>
+      </div>
+
+
+      <!-- optional-fields:
+      cc-contacts
+      cc-emails
+      !-->
+
+      <div class="form-group">
+        <label for="analysisProfiles">Analysis Profiles <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Analysis profiles apply a certain set of analyses"></i></label>
+        <select name="analysisProfiles" id="analysisProfiles" class="form-control">
+          <?php foreach ($analysisProfiles as $analysisProfile) { ?>
+            <option value="<?php echo $analysisProfile->uid; ?>"> <?php echo $analysisProfile->title; ?> </option> 
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="datepicker">Date Sampled <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The date when the sample was taken"></i></label>
+        <input type="text" name="sampleDate" id="datepicker" onchange="parseDate(this)" />
+      </div>
+
+
+      <div class="form-group">
+        <label for="sampleType">Sample Type <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Create a new sample of this type"></i></label>
+        <select name="sampleType" id="sampleType" class="form-control">
+        <?php foreach ($sampleTypes as $sampleType) { ?>
+          <option value="<?php echo $sampleType->uid; ?>"> <?php echo $sampleType->title; ?> </option>
+        <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="samplePoint">Sample Point <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Location where sample was taken"></i></label>
+        <select name="samplePoint" id="samplePoint" class="form-control">
+        <?php foreach ($samplePoints as $samplePoint) { ?>
+          <option value="<?php echo $samplePoint->uid; ?>"> <?php echo $samplePoint->title; ?> </option>
+        <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="priority">Priority</label>
+        <select name="priority" id="priority" class="form-control">
+
+                        <option value="1">Highest</option>
+                        <option value="2">High</option>
+                        <option value="3" selected="selected">Medium</option>
+                        <option value="4">Low</option>
+                        <option value="5">Lowest</option>
+
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="environmentalConditions"> Environmental Conditions <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The environmental condition during sampling"></i> </label>
+        <input type="text" name="environmentalConditions" class="form-control" id="environmentalConditions" />
+      </div>
+
+
+      <div class="form-group">
+        <label for="adhoc">Sampled AdHoc <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Was the sample taken in non-scheduled matter, e.g. out of a recurring sampling schedule?"></i></label>
+        <input type="text" name="adhoc" class="form-control" id="adhoc" />       
+      </div>
+
+
+      <div class="form-group">
+        <label for="analyses"> Analyses <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"data-placement="top" title="Select the analyses to perform"></i> </label>
+        <select multiple="multiple" name="analyses" id="analyses" class="form-control"> 
+          <?php foreach ($analyses as $analysis) { ?>
+            <option value="<?php echo $analysis->uid; ?> "> <?php echo $analysis->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+
+      <div class="form-group">
+      
+      </div>
+
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+</div>
+
+
+<script type="text/javascript">
+
+  var contactsArray = <?php echo json_encode($contacts); ?>;
+
+  document.addEventListener("DOMContentLoaded", function(event) { 
+
+    var client = document.querySelector('#client');
+    updateContacts(client);
+  });
+  
+
+  function updateContacts(client) {
+
+    // get the contact select element
+   var contactSelect = document.getElementById('contact');
+   // clear it of all current options
+   contactSelect.options.length = 0;
+
+   // get the contacts for the selected client
+   var contacts = contactsArray[client.value];
+
+   // generate an option list based on the contacts
+   if (contacts) {
+     contacts[0].forEach(function(element) {
+       contactSelect.options[contactSelect.options.length] = new Option(element.title, element.uid, 0, 0);
+     });
+   } else {
+     contactSelect.options[contactSelect.options.length] = new Option('Please add a contact for this client in the site setup', '', 0,0);
+   }
+  }
+
+
+  function parseDate(date) {
+    var parsedDate = Date.parse(date.value);
+    parsedDate = new Date(parsedDate);
+    parsedDate = parsedDate.getFullYear() + "-" + (parsedDate.getMonth()+1) + "-" + parsedDate.getDate() + " " + parsedDate.getHours() + ":" +parsedDate.getMinutes();
+    date.value = parsedDate;
+  }
+
+</script>
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/createservices.php b/modules/LIMS/senaite/templates/pages/site/analysis/createservices.php
new file mode 100644
index 000000000..6fc69ff05
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/createservices.php
@@ -0,0 +1,179 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Analysis Service</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Used in item listings and search results."></i></label>
+        <textarea type="text" class="form-control" id="description" name="description"></textarea>
+      </div>
+
+      <h5>Identifier Information <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Select identifiers by which this object can be referenced."></i></h5>
+      <div class="form-group">
+        <label for="identifierType">Identifier Type <span class="badge badge-danger">Required</span></label>
+        <select name="identifierType" id="identifierType" class="form-control">
+          <?php foreach ($identifierTypes as $identifierType) { ?>
+            <option value="<?php echo $identifierType->uid; ?>"><?php echo $identifierType->title; ?></option>
+          <?php } ?>
+        </select>
+      </div>
+      <div class="form-group">
+        <label for="identifier">Identifier <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" name="identifier" id="identifier">
+      </div>
+      <div class="form-group">
+        <label for="identifierDescription">Description</label>
+        <input type="text" class="form-control" name="identifierDescription" id="identifierDescription">
+      </div>
+      <hr>
+
+      <div class="form-group">  
+        <label for="category">Analysis Category <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The category the analysis service belongs to"></i></label>
+        <select name="category" id="category" class="form-control">
+          <?php foreach ($analysisCategories as $analysisCategory) {
+            ?> <option value="<?php echo $analysisCategory->uid; ?>"><?php echo $analysisCategory->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="shortTitle">Short Title <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="If text is entered here, it is used instead of the title when the service is listed in column headings. "></i></label>
+        <input type="text" name="shortTitle" id="shortTitle" class="form-control">
+      </div>
+
+      <div class="form-group">
+        <label for="sortKey">Sort Key <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Float value from 0.0 - 1000.0 indicating the sort order. Duplicate values are ordered alphabetically."></i></label>
+        <input type="text" name="sortKey" class="form-control" id="sortKey">
+      </div>
+
+      <div class="form-group">
+        <label for="commercialID">Commercial ID <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The service's commercial ID for accounting purposes"></i></label>
+        <input type="text" name="commercialID" class="form-control" id="commercialID">
+      </div>
+
+      <div class="form-group">
+        <label for="protocolID"> Protocol ID  <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The service's analytical protocol ID"></i></label>
+        <input type="text" name="protocolID" class="form-control" id="protocolID">
+      </div>
+
+      <div class="form-group">
+        <label for="unit"> Unit <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The measurement units for this analysis service' results, e.g. mg/l, ppm, dB, mV, etc."></i> </label>
+        <input type="text" name="unit" class="form-control" id="unit">
+      </div>
+
+      <div class="form-group">
+        <label for="analysisKeyword"> Analysis Keyword <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The unique keyword used to identify the analysis service in import files of bulk AR requests and results imports from instruments.
+                   It is also used to identify dependent analysis services in user defined results calculations"></i> <span class="badge badge-danger">Required</span> </label>
+        <input type="text" name="analysisKeyword" class="form-control" id="analysisKeyword">
+      </div>
+
+      <label for="pointOfCapture"> Point Of Capture <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The unique keyword used to identify the analysis service in import files of bulk AR requests and results imports from instruments.
+                   It is also used to identify dependent analysis services in user defined results calculations"></i> <span class="badge badge-danger">Required</span>  </label>
+      <div class="form-check">
+        <input type="radio" name="pointOfCapture" value="lab" class="form-check-input" id="pointOfCapture" /> 
+        <label for="pointOfCapture">Lab</label>
+      </div>
+
+      <div class="form-check">
+        <input type="radio" name="pointOfCapture" value="field" class="form-check-input" id="pointOfCapture" /> 
+        <label for="pointOfCapture">Field</label>
+      </div>
+
+      <div class="form-group">
+        <label for="price"> Price (excluding VAT) </label>
+        <input type="text" name="price" class="form-control" id="price" />
+      </div>
+
+      <div class="form-group">
+        <label for="bulkPrice"> Bulk price (excluding VAT) <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The price charged per analysis for clients who qualify for bulk discounts"></i> </label>
+        <input type="text" name="bulkPrice" class="form-control" id="bulkPrice" />
+      </div>
+
+      <div class="form-group">
+        <label for="VAT"> VAT % <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Enter percentage value eg. 14.0"></i></label>
+        <input type="text" name="VAT" class="form-control" id="VAT" />
+      </div>
+
+      <div class="form-group">
+        <label for="labDepartment">Department <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The laboratory department"></i></label>
+        <select name="department" id="labDepartment" class="form-control">
+            <?php foreach ($labDepartments as $labDepartment) {
+              ?> <option value="<?php echo $labDepartment->uid; ?>"> <?php echo $labDepartment->title; ?></option>
+            <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="remarks">Remarks</label>
+        <input type="text" class="form-control" id="remarks" name="remarks"/>
+      </div>
+
+      <div class="form-group">
+        <label for="exponentialFormatPrecision">Exponential format precision <span class="badge badge-danger">Required</span> </label>
+        <input type="text" class="form-control" id="exponentialFormatPrecision" name="exponentialFormatPrecision" />
+      </div>
+
+      <div class="form-group">
+        <label for="lowerDetectionLimit">Lower Detection Limit (LDL) <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The Lower Detection Limit is the lowest value to which the measured parameter can be measured using the specified testing methodology.
+                   Results entered which are less than this value will be reported as < LDL"></i></label>
+        <input type="text" class="form-control" placeholder="0.0" id="lowerDetectionLimit" name="lowerDetectionLimit" />
+      </div>
+
+      <div class="form-group">
+        <label for="upperDetectionLimit">Upper Detection Limit (LDL) <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The Upper Detection Limit is the highest value to which the measured parameter can be measured using the specified testing methodology.
+                   Results entered which are greater than this value will be reported as > UDL"></i></label>
+        <input type="text" class="form-control" placeholder="10000" id="upperDetectionLimit" name="upperDetectionLimit" />
+      </div>
+      
+
+
+
+
+
+
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/profiles.php b/modules/LIMS/senaite/templates/pages/site/analysis/profiles.php
new file mode 100644
index 000000000..c40f63a1d
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/profiles.php
@@ -0,0 +1,47 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Profile</th>
+              <th>Department</th>
+              <th>Profile Key</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($analysisProfiles as $analysisProfile) {
+                  $profileInformation = getDataFromUrl($client, $analysisProfile->api_url)[0];
+            ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $analysisProfile->title; ?></td>
+              <td><?php echo $analysisProfile->description; ?></td>
+              <td><?php echo $profileInformation->ProfileKey; ?></td>
+              <td><?php if ($profileInformation->review_state === 'active') echo "Active"; else echo "Dormant"; ?></td>
+            
+            </tr>                
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=analysis&sact=createprofiles" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/request.php b/modules/LIMS/senaite/templates/pages/site/analysis/request.php
new file mode 100644
index 000000000..cb9a00825
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/request.php
@@ -0,0 +1,94 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Analysis Request - <?php echo $analysisRequestInformation->title; ?></div>
+    <div class="card-body">
+    <?php 
+        if (!$procedureInformation) { ?>
+          <div class='alert alert-danger'> Please assign the analysis request to a procedure order. </div>
+       <?php } else { ?>
+      <form method="POST">
+      <?php if ($sampleInformation->workflow_info[0]->review_state === 'sample_due') { ?>
+        <button type="submit" name="receiveSample" class="btn btn-success"> Receive Sample </button>
+      <?php } else if($sampleInformation->workflow_info[0]->review_state === 'sample_received' && $analysisInformation->workflow_info[0]->review_state === 'sample_received') {
+         ?>
+        <table class="table">
+          <thead>
+            <tr>
+              <th> Analysis </th>
+              <th> Partition </th>
+              <th> Result </th>
+              <th> Instrument </th>
+              <th> Analyst </th>
+              <th> Status </th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <?php 
+                    $samplePartitionInformation = getDataFromUrl($client, $analysisInformation->SamplePartition->api_url)[0];
+                    $instrumentTitle = ($analysisInformation->Instrument === '') ? getDataFromUrl($analysisInformation->Instrument->api_url)[0]->title : null;
+              ?>
+              <td> <?php echo $analysisInformation->title; ?></td>
+              <td><?php echo $samplePartitionInformation->title; ?></td>
+              <td><input class="form-control" type="text" name="result" /></td>
+              <td><?php echo $instrumentTitle; ?></td>
+              <td>
+                  <select name="analyst" id="analyst" class="custom-select">
+                    <?php foreach ($analysts as $analyst) { ?>
+                      <option value="<?php echo $analyst->username;?>"> <?php echo $analyst->fullname; ?> </option>
+                    <?php } ?>
+                  </select>
+              </td>
+              <td> <?php echo $sampleInformation->workflow_info[0]->status; ?></td>
+
+            </tr>
+          </tbody>
+        
+        </table>      
+        <button type="submit" name="submitResult" class="btn btn-primary">Submit Result</button>
+        <?php } else if ($analysisInformation->workflow_info[0]->review_state === 'to_be_verified') { 
+          ?>
+          <table class="table">
+          <thead>
+            <tr>
+              <th> Analysis </th>
+              <th> Partition </th>
+              <th> Result </th>
+              <th> Status </th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <?php 
+                    $samplePartitionInformation = getDataFromUrl($client, $analysisInformation->SamplePartition->api_url)[0];
+                    $instrumentTitle = ($analysisInformation->Instrument === '') ? getDataFromUrl($analysisInformation->Instrument->api_url)[0]->title : null;
+              ?>
+              <td> <?php echo $analysisInformation->title; ?></td>
+              <td><?php echo $samplePartitionInformation->title; ?></td>
+              <td><input class="form-control" type="text" name="result" value="<?php echo $analysisInformation->Result; ?>" readonly/></td>
+              <td> <?php echo $sampleInformation->workflow_info[0]->status; ?></td>
+
+            </tr>
+          </tbody>
+        
+        </table> 
+        <button type="submit" name="verifyResult" class="btn btn-primary">Verify Results</button>
+        <?php } else if ($analysisInformation->workflow_info[0]->review_state === 'verified') {
+          ?>
+        <button name="publish" type="submit" class="btn btn-primary">Publish results</button>
+        <?php } else { ?>
+          
+          <div class="alert alert-success"> The results for this analysis request have already been published! </div>
+
+        <?php } ?>
+      </form>
+        
+    
+    
+        <?php } ?>
+    </div>
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/requests.php b/modules/LIMS/senaite/templates/pages/site/analysis/requests.php
new file mode 100644
index 000000000..91092d0f8
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/requests.php
@@ -0,0 +1,93 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Analysis Requests</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Priority</th>
+              <th>Progress</th>
+              <th>Request ID</th>
+              <th>Creator</th>
+              <th>Sample</th>
+              <th>Client</th>
+              <th>Sample Type</th>
+              <th>Date Sampled</th>
+              <th>Date Verified</th>
+              <th>State</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($analysisRequests as $analysisRequest) {
+                  $arInformation = getDataFromUrl($client, $analysisRequest->api_url)[0];
+                  $progress = 0;
+                  $state = '';
+                  switch ($analysisRequest->review_state) {
+                    case 'sample_due':
+                      $progress = 0;
+                      $state = 'Sample Due';
+                    break;
+                    case 'sample_received':
+                      $progress = 0;
+                      $state = 'Sample Received';
+                    break;
+                    case 'to_be_verified': 
+                      $progress = 50;
+                      $state = 'To be verified';
+                    break;
+                    case 'received':
+                      $progress = 75;
+                      $state = 'Received';
+                    break;
+                    case 'verified':
+                      $state = 'Verified';
+                    case 'published':
+                      $progress = 100;
+                      $state = 'Published';
+                    break;
+                  }
+                  $dateSampled = new DateTime($arInformation->DateSampled);
+                  $dateVerified = new DateTime($arInformation->DateReceived);
+                  
+            ?>
+            
+              <tr>
+                <td>#</td>
+                <td><?php echo $arInformation->Priority; ?></td>
+                <td>  
+                  <div class="progress">
+                    <div class="progress-bar bg-success" role="progressbar" style="width: <?php echo $progress; ?>%" aria-valuenow="<?php echo $progress; ?>" aria-valuemin="0" aria-valuemax="100"><?php echo $progress; ?>%</div>
+                  </div>
+                </td>
+                <td><a href="index.php?action=analysis&sact=request&id=<?php echo $arInformation->uid; ?>"><?php echo $arInformation->id; ?></a></td>
+                <td><?php echo $arInformation->CreatorFullName; ?></td>
+                <td><?php echo $arInformation->SampleID; ?></td>
+                <td><?php echo $arInformation->ClientTitle; ?></td>
+                <td><?php echo $arInformation->SampleTypeTitle; ?></td>
+                <td><?php echo $dateSampled->format('Y-m-d');  ?></td>
+                <td><?php echo $dateVerified->format('Y-m-d'); ?></td>
+                <td><?php echo $state; ?></td>
+              </tr>     
+                   
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=analysis&sact=createrequests" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/analysis/services.php b/modules/LIMS/senaite/templates/pages/site/analysis/services.php
new file mode 100644
index 000000000..e3f85cc16
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/analysis/services.php
@@ -0,0 +1,85 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Service</th>
+              <th>Category</th>
+              <th>Keyword</th>
+              <th>Methods</th>
+              <th>Unit</th>
+              <th>Price</th>
+              <th>Calculation</th>
+              <th>Sort Key</th>
+              <th>Status</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($analysisServices as $analysisService) {
+                  
+                  $analysisServiceInformation = getDataFromUrl($client, $analysisService->api_url)[0];
+                  if (isset($analysisServiceInformation->Category->api_url)) {
+                    $categoryInformation = getDataFromUrl($client, $analysisServiceInformation->Category->api_url)[0];
+                  }
+                  
+                  $methods = [];
+                  $calculations = [];
+                  if ($analysisServiceInformation->Method) {
+                    foreach ($analysisServiceInformation->Method as $method) {
+                      $methods[] = $method->title;
+                    }
+                  }
+                  if ($analysisServiceInformation->Calculation) {
+                    foreach ($analysisServiceInformation->Calculation as $calculation) {
+                      $calculations[] = $calculation->title;
+                    }
+                  }
+
+            ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $analysisService->title; ?></td>
+              <td><?php if (isset($categoryInformation)) echo $categoryInformation->title; else echo "No category found!"; ?></td>
+              <td><?php echo $analysisServiceInformation->Keyword; ?></td>
+              <td><?php foreach ($methods as $index => $method) {
+                        echo $method; 
+                        if ($index != count($methods) - 1) 
+                          echo ",";
+                  }?>
+              </td>
+              <td><?php echo $analysisServiceInformation->Unit; ?> </td>
+              <td><?php echo $analysisServiceInformation->Price; ?> </td>
+              <td><?php foreach ($calculations as $index => $calculation) {
+                        echo $calculation; 
+                        if ($index != count($calculations) - 1) 
+                          echo ",";
+                  }?>
+              </td>
+              <td><?php echo $analysisServiceInformation->SortKey; ?> </td>
+              <td><?php if ($analysisService->review_state === 'active') echo "Active"; else echo "Dormant"; ?></td>
+            
+            </tr>                
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=analysis&sact=createservices" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/clients/clients.php b/modules/LIMS/senaite/templates/pages/site/clients/clients.php
new file mode 100644
index 000000000..f152c40b3
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/clients/clients.php
@@ -0,0 +1,38 @@
+
+  <div class="col-12">
+    
+      <div class="card">
+        <div class="card-header">Clients</div>
+        <div class="card-body">
+          <table class="table">
+            <thead>
+              <tr>
+                <th>#</th>
+                <th>Name</th>
+                <th>Client ID</th>
+                <th>Email Address</th>
+                <th>Phone</th>
+                <th>Status</th>
+              </tr>
+            </thead>
+            <tbody>
+              <?php foreach($limsClients as $limsClient) { 
+                $limsClientData = json_decode($client->get($limsClient->api_url)->getBody()->getContents())->items[0]; ?>
+              <tr>
+                <td>#</td>
+                <td><?php echo $limsClientData->Name; ?></td>
+                <td><?php echo $limsClientData->ClientID; ?></td> 
+                <td><?php echo $limsClientData->EmailAddress; ?></td>
+                <td><?php echo $limsClientData->Phone; ?></td>
+                <td><?php if ($limsClient->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+              </tr>
+              <?php } ?>
+            </tbody>
+          
+          </table>
+
+          <a href="index.php?action=client&sact=createclient" class="btn btn-outline-success">Create new</a>
+        </div>
+      </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/clients/createclient.php b/modules/LIMS/senaite/templates/pages/site/clients/createclient.php
new file mode 100644
index 000000000..1bfd5961b
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/clients/createclient.php
@@ -0,0 +1,250 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Client</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+
+      <ul class="nav nav-tabs" id="clientTab" role="tablist">
+
+        <li class="nav-item">
+          <a href="#default" class="nav-link active" id="default-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Default <span class="badge badge-danger">Required</span></a>
+        </li>
+
+        <li class="nav-item">
+          <a href="#address" class="nav-link" id="address-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Address</a>
+        </li>
+
+        <li class="nav-item">
+          <a href="#bank" class="nav-link" id="bank-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Bank Details</a>
+        </li>
+
+      </ul>
+      <br />
+      <div class="tab-content" id="supplierTabContent">
+
+        <div class="tab-pane fade show active" id="default" role="tabpanel" aria-labelledby="default-tab">
+          <div class="form-group">
+            <label for="title">Name <span class="badge badge-danger">Required</span></label>
+            <input type="text" class="form-control" id="name" name="name" >
+          </div>
+
+          <div class="form-group">
+            <label for="clientid">Client ID <span class="badge badge-danger">Required</span></label>
+            <input type="text" class="form-control" id="clientid" name="clientid" >
+          </div>
+
+          <div class="form-group">
+            <label for="vat">VAT number</label>
+            <input type="text" class="form-control" id="vat" name="vat" >
+          </div>
+          
+          <div class="form-group">
+            <label for="phone">Phone</label>
+            <input type="text" class="form-control" id="phone" name="phone">
+          </div>
+
+          <div class="form-group">
+            <label for="fax">Fax</label>
+            <input type="text" class="form-control" id="fax" name="fax">
+          </div>
+
+          <div class="form-group">
+            <label for="title">eMail Address</label>
+            <input type="email" class="form-control" id="email" name="email"/>
+          </div>
+        </div>
+
+        <div class="tab-pane fade" id="address" role="tabpanel" aria-labelledby="address-tab">
+          <h5 style>Physical Address</h5>
+          <br />
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="phycountry">Country:</label>
+              <input type="text" class="form-control" name="phycountry" />
+            </div>
+            <div class="form-group col-6">
+              <label for="Copy">Copy From</label>
+              <select class="custom-select" name="copy">
+                <option value="postal">Postal Address</option>
+                <option value="billing">Billing Address</option>
+              </select>
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="phystate">State</label>
+              <input type="text" class="form-control" name="phystate" />
+            </div>
+            <div class="form-group col-6">
+              <label for="phydistrict">District</label>
+              <input type="text" class="form-control" name="phydistrict" />
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="phycity">City</label>
+              <input type="text" class="form-control" name="phycity">
+            </div>
+            <div class="form-group col-6">
+              <label for="phypostal">Postal Code</label>
+              <input type="text" class="form-control" name="phypostal">
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label for="phyaddress">Address: </label>
+            <textarea class="form-control" name="phyaddress" id="phyaddress"></textarea>
+          </div>
+
+          <hr />
+          <h5 style>Postal Address</h5>
+          <br />
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="postcountry">Country:</label>
+              <input type="text" class="form-control" name="postcountry" />
+            </div>
+            <div class="form-group col-6">
+              <label for="Copy">Copy From</label>
+              <select class="custom-select" name="copy">
+                <option value="physical">Physical Address</option>
+                <option value="billing">Billing Address</option>
+              </select>
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="poststate">State</label>
+              <input type="text" class="form-control" name="poststate" />
+            </div>
+            <div class="form-group col-6">
+              <label for="postdistrict">District</label>
+              <input type="text" class="form-control" name="postdistrict" />
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="postcity">City</label>
+              <input type="text" class="form-control" name="postcity">
+            </div>
+            <div class="form-group col-6">
+              <label for="postpostal">Postal Code</label>
+              <input type="text" class="form-control" name="postpostal">
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label for="postaddress">Address: </label>
+            <textarea class="form-control" name="postaddress" id="postaddress"></textarea>
+          </div>
+          
+          <hr />
+
+          <h5 style>Billing Address</h5>
+          <br />
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="billcountry">Country:</label>
+              <input type="text" class="form-control" name="billcountry" />
+            </div>
+            <div class="form-group col-6">
+              <label for="Copy">Copy From</label>
+              <select class="custom-select" name="copy">
+                <option value="postal">Postal Address</option>
+                <option value="physical">Physical Address</option>
+              </select>
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="billstate">State</label>
+              <input type="text" class="form-control" name="billstate" />
+            </div>
+            <div class="form-group col-6">
+              <label for="billdistrict">District</label>
+              <input type="text" class="form-control" name="billdistrict" />
+            </div>
+          </div>
+
+          <div class="form-row">
+            <div class="form-group col-6">
+              <label for="billcity">City</label>
+              <input type="text" class="form-control" name="billcity">
+            </div>
+            <div class="form-group col-6">
+              <label for="billpostal">Postal Code</label>
+              <input type="text" class="form-control" name="billpostal">
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label for="billaddress">Address: </label>
+            <textarea class="form-control" name="billaddress" id="billaddress"></textarea>
+          </div>
+
+
+        </div>
+
+        <div class="tab-pane fade" id="bank" role="tabpanel" aria-labelledby="bank-tab">
+          <div class="form-group">
+            <label for="title">Account Type</label>
+            <input type="text" class="form-control" id="acctype" name="acctype" />
+          </div>
+
+          <div class="form-group">
+            <label for="description">Account Name</label>
+            <input type="text" class="form-control" id="accname" name="accname">
+          </div>
+
+          <div class="form-group">
+            <label for="description">Account Number</label>
+            <input type="text" class="form-control" id="accnum" name="accnum">
+          </div>
+
+          <div class="form-group">
+            <label for="description">Bank Name</label>
+            <input type="text" class="form-control" id="bankname" name="bankname">
+          </div>
+          
+        </div>
+
+        
+
+
+
+      </div>
+      
+      
+
+      <button name="submit" type="submit" class="btn btn-primary">Create</button>
+    
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/clients/createcontacts.php b/modules/LIMS/senaite/templates/pages/site/clients/createcontacts.php
new file mode 100644
index 000000000..973b9fd83
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/clients/createcontacts.php
@@ -0,0 +1,81 @@
+<div class="col-12">
+
+  <f class="card">
+    <div class="card-header">Create new client contact</div>
+    <div class="card-body">
+      
+    <form class="mx-auto form w-50" method="POST" act="">
+          <div class="form-group">
+            <label for="contactTitle"> Title <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"data-placement="top" title="Greeting title eg. Mr, Mrs, Dr"></i> </label>
+            <input type="text" name="contactTitle" id="contactTitle" class="form-control" />
+          </div>
+
+          <div class="form-group">
+            <label for="contactFirstName"> First Name <span class="badge badge-danger">Required</span> </label>
+            <input type="text" name="contactFirstName" id="contactFirstName" class="form-control" />
+          </div>
+
+          <div class="form-group">
+            <label for="contactMiddleInitial"> Middle Initial </label>
+            <input type="text" name="contactMiddleInitial" id="contactMiddleInitial" class="form-control" />
+          </div>
+
+          <div class="form-group">
+            <label for="client"> Client <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"data-placement="top" title="Pick the client this contact belongs to"></i> </label>
+            <select name="client" id="client" class="form-control">
+              <?php foreach ($labClients as $labClient) { ?>
+                <option value="<?php echo $labClient->uid;?>"> <?php echo $labClient->title; ?> </option>
+              <?php } ?>
+            </select>
+          </div>
+
+          <div class="form-group">
+            <label for="contactMiddleName"> Middle name </label>
+            <input type="text" name="contactMiddleName" id="contactMiddleName" class="form-control"/>
+          </div>
+
+          <div class="form-group">
+            <label for="contactSurname"> Surname <span class="badge badge-danger">Required</span> </label>
+            <input type="text" name="contactSurname" id="contactSurname" class="form-control"/>
+          </div>
+
+          <div class="form-group">
+            <label for="contactJobTitle"> Job title </label>
+            <input type="text" name="contactJobTitle" id="contactJobTitle" class="form-control"/>
+          </div>
+
+          <div class="form-group">
+            <label for="contactDepartment"> Department </label>
+            <input type="text" name="contactDepartment" id="contactDepartment" class="form-control" />
+          </div>
+
+          <div class="form-group">
+            <label for="contactEmailAddress"> Email Address </label>
+            <input type="text" name="contactEmailAddress" id="contactEmailAddress"  class="form-control"/>
+          </div>
+
+          <div class="form-group">
+            <label for="contactPhoneBusiness"> Phone (business) </label>
+            <input type="text" name="contactPhoneBusiness" id="contactPhoneBusiness" class="form-control"/>
+          </div>
+    
+          <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+
+
+
+
+</div>
+
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/createinstrument.php b/modules/LIMS/senaite/templates/pages/site/instruments/createinstrument.php
new file mode 100644
index 000000000..b293e17c8
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/createinstrument.php
@@ -0,0 +1,174 @@
+  <div class="col-12">
+  
+
+    <div class="card">
+      <div class="card-header">New Instrument</div>
+      <div class="card-body">
+      
+          <form class="mx-auto w-50" method="POST" act="">
+            <ul class="nav nav-tabs" id="instrumentTab" role="tablist">
+              <li class="nav-item">
+                <a href="#default" class="nav-link active" id="default-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Default <span class="badge badge-danger">Required</span></a>
+              </li>
+
+              <li class="nav-item">
+                <a href="#procedure" class="nav-link" id="procedure-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Procedures</a>
+              </li>
+
+              <li class="nav-item">
+                <a href="#info" class="nav-link" id="info-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Additional Info <span class="badge badge-danger">Required</span></a>
+              </li>
+            </ul>
+            <br />
+
+            <div class="tab-content" id="instrumentTabContent">
+            
+              <div class="tab-pane fade show active" id="default" role="tabpanel" aria-labelledby="default-tab">
+                <div class="form-group">
+                  <label for="title">Title <span class="badge badge-danger">Required</span></label>
+                  <input type="text" class="form-control" id="title" name="title" required/>
+                </div>
+                 
+                <div class="form-group">
+                  <label for="description">Asset Number <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="The instrument's ID in the lab's asset register"></i></label>
+                  <input type="text" class="form-control" id="assetNum" name="assetNum">
+                </div>
+                
+                <div class="form-group">
+                  <label for="description">Description  <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Used in item listings and search results."></i></label>
+                  <textarea name="description" id="description" class="form-control"></textarea>
+                </div>
+
+                <div class="form-group">
+                  <label for="instrumenttype">Instrument Type <span class="badge badge-danger">Required</span></label>
+                  <select name="instrumenttype" class="custom-select" id="instrumenttype">
+                    <?php foreach($instrumentTypes as $instrumentType) { ?>
+                      <option value="<?php echo $instrumentType->uid; ?>"> <?php echo $instrumentType->title; ?> </option>
+                    <?php } ?>
+                  </select>
+                </div>
+
+                <div class="form-group">
+                  <label for="manufacturer">Manufacturer <span class="badge badge-danger">Required</span></label>
+                  <select name="manufacturer" class="custom-select" id="manufacturer">
+                    <?php foreach($manufacturers as $manufacturer) { ?>
+                      <option value="<?php echo $manufacturer->uid; ?>"> <?php echo $manufacturer->title; ?> </option>
+                    <?php } ?>
+                  </select>
+                </div>
+
+                <div class="form-group">
+                  <label for="supplier">Suppliers <span class="badge badge-danger">Required</span></label>
+                  <select name="supplier" class="custom-select" id="supplier">
+                    <?php foreach($suppliers as $supplier) { ?>
+                      <option value="<?php echo $supplier->uid; ?>"> <?php echo $supplier->title; ?> </option>
+                    <?php } ?>
+                  </select>
+                </div>
+
+                <div class="form-group">
+                  <label for="modelno">Model <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="The instrument's model number"></i></label>
+                  <input type="text" class="form-control" name="modelno" id="modelno">
+                </div>
+
+                <div class="form-group">
+                  <label for="serialno">Serial No <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="The serial number that uniquely identifies the instrument"></i></label>
+                  <input type="text" class="form-control" name="serialno" id="serialno">
+                </div>
+                
+                <h3> Methods </h3>
+                <?php foreach ($methods as $method) { ?>
+                <div class="form-check">
+                  <input class="form-check-input" name="methods[]" type="checkbox" value="<?php echo $method->uid; ?>" id="defaultCheck1">
+                  <label class="form-check-label" for="defaultCheck1">
+                    <?php echo $method->title; ?>
+                  </label>                 
+                </div>
+                <br>
+                <?php } ?>
+
+                <div class="form-group">
+                  <label for="exportinterface">Data interface <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Select an Export interface for this instrument."></i></label>
+                  <select name="exportinterface" class="custom-select" id="exportinterface">
+                    <option value="">None</option>
+                    <option value="foss.fiastar.fiastar" selected="selected">FOSS - FIAStar</option>
+                    <option value="lachat.quickchem">LaChat QuickChem FIA</option>
+                    <option value="varian.vistapro.icp">Varian Vista-PRO ICP</option>
+                  </select>
+                </div>
+
+
+              </div>
+
+              <div class="tab-pane fade" id="procedure" role="tabpanel" aria-labelledby="procedure-tab">
+              
+                <div class="form-group">
+                  <label for="calibproc">In-lab calibration procedure <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Instructions for in-lab regular calibration routines intended for analysts"></i></label>
+                  <textarea name="calibproc" id="calibproc" class="form-control"></textarea>
+                </div>
+
+                <div class="form-group">
+                  <label for="preventproc">Preventive maintenance procedure <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Instructions for regular preventive and maintenance routines intended for analysts"></i></label>
+                  <textarea name="preventproc" id="preventproc" class="form-control"></textarea>
+                </div>
+              
+              </div>
+
+              <div class="tab-pane fade" id="info" role="tabpanel" aria-labelledby="info-tab">
+              
+                <div class="form-group">
+                  <label for="location">Instrument Location <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="The room and location where the instrument is installed"></i></label>
+                  <select name="location" id="location" class="form-control" value="">
+                    <?php foreach($instrumentLocations as $instrumentLocation) { ?>
+                        <option value="<?php echo $instrumentLocation->uid; ?>"> <?php echo $instrumentLocation->title; ?> </option>
+                    <?php } ?>
+                  </select>
+                </div>
+
+                <div class="form-group">
+                    <label for="instrumentphoto">Photo image file <i class="fas fa-question-circle" data-toggle="tooltip"
+                    data-placement="top" title="Photo of the instrument"></i></label>
+                    <input type="file" class="form-control-file" name="instrumentphoto" id="instrumentphoto" />
+                </div>
+
+                <!-- 
+                  TO-DO: Add datepicker for installation date of instrument
+                !-->
+
+
+                <div class="form-group">
+                    <label for="installcert">Installation Certificate<i class="fas fa-question-circle" data-toggle="tooltip"
+                    data-placement="top" title="Installation certificate upload"></i></label>
+                    <input type="file" class="form-control-file" name="installcert" id="installcert" />
+                </div>
+            
+            </div>
+
+
+            </div>
+            <button name="submit" type="submit" class="btn btn-primary">Submit</button>
+          </form>
+          <br />
+          <?php 
+          if (isset($errors) && count($errors) > 0 ) {
+            foreach($errors as $error) {
+              ?>
+              <div class=" mx-auto w-50 alert alert-danger"><?php echo $error; ?></div>
+          <?php } } ?>
+
+
+      </div>
+    </div>
+  
+  
+  
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/createlocation.php b/modules/LIMS/senaite/templates/pages/site/instruments/createlocation.php
new file mode 100644
index 000000000..c24ae11fd
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/createlocation.php
@@ -0,0 +1,38 @@
+
+  <div class="col-12">
+
+    <div class="card">
+
+      <div class="card-header">New Instrument Location</div>
+      <div class="card-body">
+      
+        <form class="mx-auto form w-50" method="POST" act="">
+          <div class="form-group">
+            <label for="title">Title</label>
+            <input type="text" class="form-control" id="title" name="title" required/>
+          </div>
+
+          <div class="form-group">
+            <label for="description">Description</label>
+            <input type="text" class="form-control" id="description" name="description">
+          </div>
+
+          <button name="submit" class="btn btn-primary">Create</button>
+        </form>
+        <br />
+        <?php if (count($errors) > 0) { ?>
+          <div class="alert alert-danger w-50 mx-auto">
+            <ul>
+              <?php foreach($errors as $error) { ?>
+                <li> <?php echo $error; ?> </li>
+              <?php } ?>
+            </ul>
+          </div>
+        <?php } ?>
+        
+
+      </div>
+    </div>
+  
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/createtype.php b/modules/LIMS/senaite/templates/pages/site/instruments/createtype.php
new file mode 100644
index 000000000..0cfa06634
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/createtype.php
@@ -0,0 +1,38 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Instrument Type</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title</label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description</label>
+        <input type="text" class="form-control" id="description" name="description">
+      </div>
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/instruments.php b/modules/LIMS/senaite/templates/pages/site/instruments/instruments.php
new file mode 100644
index 000000000..667c06492
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/instruments.php
@@ -0,0 +1,53 @@
+
+  <div class="col-12">
+    
+      <div class="card">
+        <div class="card-header">Instruments</div>
+        <div class="card-body">
+
+          <table class="table">
+            <thead>
+              <tr>
+                <th>#</th>
+                <th>Instrument</th>
+                <th>Type</th>
+                <th>Brand</th>
+                <th>Model</th>
+                <th>Expiry Date</th>
+                <th>Methods</th>
+                <th>Status</th>
+              </tr>
+            </thead>
+
+            <tbody>
+              <?php foreach($instrumentData as $instrument) {
+                    $instrumentInformation = json_decode($client->get($instrument->api_url)->getBody()->getContents())->items[0];    
+              ?>
+              <tr>
+                <td>#</td>
+                <td><?php echo $instrumentInformation->title; ?></td>
+                <td><?php echo $instrumentInformation->InstrumentTypeName; ?></td>
+                <td><?php echo $instrumentInformation->ManufacturerName; ?></td>
+                <td><?php echo $instrumentInformation->Model; ?></td>
+                <td><?php echo $instrumentInformation->expires; ?></td>
+                <td><?php echo "no methods"; ?></td>
+                <td><?php if ($instrument->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+              
+              </tr>                
+              <?php } ?>
+            
+            </tbody>
+          
+          
+          </table>
+
+          <a href="index.php?action=instrument&sact=createinstrument" class="btn btn-outline-success">Create new</a>
+
+
+
+        </div>
+      </div>
+  
+  
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/locations.php b/modules/LIMS/senaite/templates/pages/site/instruments/locations.php
new file mode 100644
index 000000000..720488104
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/locations.php
@@ -0,0 +1,37 @@
+
+  <div class="col-12">
+
+    <div class="card">
+
+      <div class="card-header">Instrument Locations </div>
+      <div class="card-body">
+        <form action="index.php?action=instrument&sact=createlocation" method="POST">
+          <table class="table table-bordered">
+            <thead>
+              <tr>
+                <th>#</th>
+                <th>Title</th>
+                <th>Description</th>
+                <th>Status</th>
+              </tr>
+            </thead>
+            <tbody>
+              <?php foreach($instrumentLocationData as $instrumentLocation) { ?>
+              <tr>
+                <td>#</td>
+                <td><?php echo $instrumentLocation->title; ?></td>
+                <td><?php echo $instrumentLocation->description; ?></td>
+                <td><?php if ($instrumentLocation->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+              </tr>
+              <?php } ?>
+            </tbody>
+          </table>
+        
+        
+          <a href="index.php?action=instrument&sact=createlocation" class="btn btn-outline-success">Create new</a>
+        </form>
+      </div>
+
+    </div>
+
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/instruments/types.php b/modules/LIMS/senaite/templates/pages/site/instruments/types.php
new file mode 100644
index 000000000..0b9d6b6c6
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/instruments/types.php
@@ -0,0 +1,37 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">Instrument Types </div>
+  <div class="card-body">
+    <form action="index.php?action=instrument&sact=createlocation" method="POST">
+      <table class="table table-bordered">
+        <thead>
+          <tr>
+            <th>#</th>
+            <th>Title</th>
+            <th>Description</th>
+            <th>Status</th>
+          </tr>
+        </thead>
+        <tbody>
+          <?php foreach($instrumentTypeData as $instrumentType) { ?>
+          <tr>
+            <td>#</td>
+            <td><?php echo $instrumentType->title; ?></td>
+            <td><?php echo $instrumentType->description; ?></td>
+            <td><?php if ($instrumentType->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+          </tr>
+          <?php } ?>
+        </tbody>
+      </table>
+    
+    
+      <a href="index.php?action=instrument&sact=createtype" class="btn btn-outline-success">Create new</a>
+    </form>
+  </div>
+
+</div>
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/contacts.php b/modules/LIMS/senaite/templates/pages/site/laboratory/contacts.php
new file mode 100644
index 000000000..1eaf70c7b
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/contacts.php
@@ -0,0 +1,42 @@
+
+  <div class="col-12">
+    <div class="card">
+      <div class="card-header"> Lab Contacts </div>
+      <div class="card-body">
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Name</th>
+              <th>Department</th>
+              <th>Phone</th>
+              <th>Fax</th>
+              <th>Mobile Phone</th>
+              <th>Email Address</th>
+              <th>Status</th>
+            </tr>
+          </thead>
+          <tbody>
+          <?php foreach($contacts as $contact) {
+              $contactDetails = json_decode($client->get($contact->api_url)->getBody()->getContents())->items[0];
+            ?> 
+            <tr>
+              <td>#</td>
+              <td><?php echo $contact->title; ?></td>
+              <td><!-- To-Do: Schema related data !--></td>
+              <td><?php echo $contactDetails->BusinessPhone; ?></td>
+              <td><?php echo $contactDetails->BusinessFax; ?></td>
+              <td><?php echo $contactDetails->MobilePhone; ?></td>
+              <td><?php echo $contactDetails->EmailAddress; ?></td>
+              <td><?php if ($contact->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+          
+          </tbody>
+        </table>
+        <a href="index.php?action=laboratory&sact=createcontacts" class="btn btn-outline-success">Create new</a>
+
+      </div>
+    </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/createcontacts.php b/modules/LIMS/senaite/templates/pages/site/laboratory/createcontacts.php
new file mode 100644
index 000000000..2fdc08b10
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/createcontacts.php
@@ -0,0 +1,88 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Create Lab Contact</div>
+    <div class="card-body">
+
+      <form method="POST" action="" class="w-50 mx-auto">
+        <div class="form-group">
+          <label for="title">Title <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Greeting title eg. Mr, Mrs, Dr"></i></label>
+          <input type="text" class="form-control" id="title" name="title" />
+        </div>
+
+        <div class="form-group">
+          <label for="fname">First name <span class="badge badge-danger">Required</span> </label>
+          <input type="text" class="form-control" id="fname" name="fname" />
+        </div>
+
+        <div class="form-group">
+          <label for="midinitial"> Middle Initial </label>
+          <input type="text" class="form-control" id="midinitial" name="midinitial" />
+        </div>
+
+        <div class="form-group">
+          <label for="mname"> Middle name </label>
+          <input type="text" class="form-control" id="mname" name="mname" />
+        </div>
+
+        <div class="form-group">
+          <label for="sname">Surname <span class="badge badge-danger">Required</span> </label>
+          <input type="text" class="form-control" id="sname" name="sname" />
+        </div>
+
+        <div class="form-group">
+          <label for="jtitle"> Job title </label>
+          <input type="text" class="form-control" id="jtitle" name="jtitle" />
+        </div>
+
+        <div class="form-group">
+          <label for="email"> Email Address </label>
+          <input type="text" class="form-control" id="email" name="email" />
+        </div>
+
+        <div class="form-group">
+          <label for="bphone"> Phone (business) </label>
+          <input type="text" class="form-control" id="bphone" name="bphone" />
+        </div>
+
+        <div class="form-group">
+          <label for="bfax"> Fax (business) </label>
+          <input type="text" class="form-control" id="bfax" name="bfax" />
+        </div>
+
+        <div class="form-group">
+          <label for="hphone"> Phone (home) </label>
+          <input type="text" class="form-control" id="hphone" name="hphone" />
+        </div>
+
+        <div class="form-group">
+          <label for="mphone"> Phone (mobile) </label>
+          <input type="text" class="form-control" id="mphone" name="mphone" />
+        </div>
+
+         <div class="form-group">
+            <label for="signature">Signature <i class="fas fa-question-circle" data-toggle="tooltip"
+                    data-placement="top" title="Upload a scanned signature to be used on printed analysis results reports. Ideal size is 250 pixels wide by 150 high"></i></label>
+            <input type="file" class="form-control-file" name="signature" id="signature" />
+        </div>
+
+        <!-- TO-DO: Departments, Default Departments !-->
+
+        <button name="submit" type="submit" class="btn btn-primary">Submit</button>
+      
+      </form>
+      <br />
+      <?php 
+          if (isset($errors) && count($errors) > 0 ) {
+            foreach($errors as $error) {
+              ?>
+              <div class=" mx-auto w-50 alert alert-danger"><?php echo $error; ?></div>
+          <?php } } ?>
+    
+    </div>
+  
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/createdepartments.php b/modules/LIMS/senaite/templates/pages/site/laboratory/createdepartments.php
new file mode 100644
index 000000000..ad6391aab
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/createdepartments.php
@@ -0,0 +1,36 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Create Lab Department</div>
+    <div class="card-body">
+
+      <form method="POST" action="" class="w-50 mx-auto">
+        <div class="form-group">
+          <label for="title">Title <span class="badge badge-danger">Required</span></label>
+          <input type="text" class="form-control" id="title" name="title" />
+        </div>
+
+        <div class="form-group">
+          <label for="description"> Description </label>
+          <input type="text" class="form-control" id="desc" name="desc" />
+        </div>
+
+        <!-- TO-DO: Manager !-->
+
+        <button name="submit" type="submit" class="btn btn-primary">Submit</button>
+      
+      </form>
+      <br />
+      <?php 
+          if (isset($errors) && count($errors) > 0 ) {
+            foreach($errors as $error) {
+              ?>
+              <div class=" mx-auto w-50 alert alert-danger"><?php echo $error; ?></div>
+          <?php } } ?>
+    
+    </div>
+  
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/createproducts.php b/modules/LIMS/senaite/templates/pages/site/laboratory/createproducts.php
new file mode 100644
index 000000000..b6fb18912
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/createproducts.php
@@ -0,0 +1,59 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Create Lab Product</div>
+    <div class="card-body">
+
+      <form method="POST" action="" class="w-50 mx-auto">
+        <div class="form-group">
+          <label for="title">Title <span class="badge badge-danger">Required</span></label>
+          <input type="text" class="form-control" id="title" name="title" />
+        </div>
+
+        <div class="form-group">
+          <label for="description"> Description </label>
+          <textarea type="text" class="form-control" id="description" name="description"></textarea>
+        </div>
+
+        <div class="form-group">
+          <label for="volume">Volume </label>
+          <input type="text" class="form-control" id="volume" name="volume" />
+        </div>
+
+        <div class="form-group">
+          <label for="unit"> Unit </label>
+          <input type="text" class="form-control" id="unit" name="unit" />
+        </div>
+
+        <div class="form-group">
+          <label for="vat"> VAT %   <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Enter percentage value eg. 14.0"></i></label>
+          <input type="text" class="form-control" id="vat" name="vat" />
+        </div>
+
+        <div class="form-group">
+          <label for="pwVAT">Price excluding VAT <span class="badge badge-danger">Required</span></label>
+          <input type="text" class="form-control" id="pwVAT" name="pwVAT" />
+        </div>
+
+
+
+        <!-- TO-DO: Manager !-->
+
+        <button name="submit" type="submit" class="btn btn-primary">Submit</button>
+      
+      </form>
+      <br />
+      <?php 
+          if (isset($errors) && count($errors) > 0 ) {
+            foreach($errors as $error) {
+              ?>
+              <div class=" mx-auto w-50 alert alert-danger"><?php echo $error; ?></div>
+          <?php } } ?>
+    
+    </div>
+  
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/departments.php b/modules/LIMS/senaite/templates/pages/site/laboratory/departments.php
new file mode 100644
index 000000000..847b132af
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/departments.php
@@ -0,0 +1,40 @@
+
+  <div class="col-12">
+    <div class="card">
+      <div class="card-header"> Lab Departments </div>
+      <div class="card-body">
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Name</th>
+              <th>Description</th>
+              <th>Manager</th>
+              <th>Manager Phone</th>
+              <th>Manager Email</th>
+              <th>Status</th>
+            </tr>
+          </thead>
+          <tbody>
+          <?php foreach($departments as $department) {
+              $departmentDetails = json_decode($client->get($department->api_url)->getBody()->getContents())->items[0];
+            ?> 
+            <tr>
+              <td>#</td>
+              <td><?php echo $department->title; ?></td>
+              <td><?php echo $department->description; ?></td>
+              <td><?php echo $departmentDetails->ManagerName; ?></td>
+              <td><?php echo $departmentDetails->ManagerPhone; ?></td>
+              <td><?php echo $departmentDetails->ManagerEmail; ?></td>
+              <td><?php if ($department->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+          
+          </tbody>
+        </table>
+        <a href="index.php?action=laboratory&sact=createdepartments" class="btn btn-outline-success">Create new</a>
+
+      </div>
+    </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/information.php b/modules/LIMS/senaite/templates/pages/site/laboratory/information.php
new file mode 100644
index 000000000..8a9f24e71
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/information.php
@@ -0,0 +1,57 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Laboratory Information</div>
+    <div class="card-body">
+
+      <form method="POST" action="" class="w-50 mx-auto">
+        <div class="form-group">
+          <label for="title">Name <span class="badge badge-danger">Required</span></label>
+          <input type="text" class="form-control" id="name" name="name" />
+        </div>
+
+        <div class="form-group">
+          <label for="description"> VAT number </label>
+          <input type="text" class="form-control" id="vat" name="vat" />
+        </div>
+
+        <div class="form-group">
+          <label for="description"> Phone </label>
+          <input type="text" class="form-control" id="phone" name="phone" />
+        </div>
+
+        <div class="form-group">
+          <label for="description"> Fax </label>
+          <input type="text" class="form-control" id="fax" name="fax" />
+        </div>
+
+        <div class="form-group">
+          <label for="supervisor"> Fax  <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Supervisor of the lab"></i> </label>
+          <select name="supervisor" class="custom-select">
+            <?php foreach ($labContacts as $contact) { ?>
+            <?php } ?>
+          </select>
+        </div>
+
+
+
+        <!-- TO-DO: Manager !-->
+
+        <button name="submit" type="submit" class="btn btn-primary">Submit</button>
+      
+      </form>
+      <br />
+      <?php 
+          if (isset($errors) && count($errors) > 0 ) {
+            foreach($errors as $error) {
+              ?>
+              <div class=" mx-auto w-50 alert alert-danger"><?php echo $error; ?></div>
+          <?php } } ?>
+    
+    </div>
+  
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/laboratory/products.php b/modules/LIMS/senaite/templates/pages/site/laboratory/products.php
new file mode 100644
index 000000000..30b6aa965
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/laboratory/products.php
@@ -0,0 +1,43 @@
+
+  <div class="col-12">
+    <div class="card">
+      <div class="card-header"> Lab Departments </div>
+      <div class="card-body">
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Title</th>
+              <th>Volume</th>
+              <th>Unit</th>
+              <th>Price</th>
+              <th>VAT amount</th>
+              <th>Total Price</th>
+              <th>Status</th>
+            </tr>
+          </thead>
+          <tbody>
+          <?php foreach($products as $product) {
+              $productsDetails = json_decode($client->get($product->api_url)->getBody()->getContents())->items[0];
+              $productsDetails->VATAmount = (($productsDetails->VAT/100) * $productsDetails->Price);
+            ?> 
+            <tr>
+              <td>#</td>
+              <td><?php echo $product->title; ?></td>
+              <td><?php echo $productsDetails->Volume; ?></td>
+              <td><?php echo $productsDetails->Unit; ?></td>
+              <td><?php echo $productsDetails->Price; ?></td>
+              <td><?php echo $productsDetails->VATAmount; ?></td>
+              <td><?php echo ($productsDetails->Price + $productsDetails->VATAmount); ?></td>
+              <td><?php if ($product->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+          
+          </tbody>
+        </table>
+        <a href="index.php?action=laboratory&sact=createproducts" class="btn btn-outline-success">Create new</a>
+
+      </div>
+    </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/lims/index.php b/modules/LIMS/senaite/templates/pages/site/lims/index.php
new file mode 100644
index 000000000..c340e6ffd
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/lims/index.php
@@ -0,0 +1,33 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Manage LIMS</div>
+    <div class="card-body">
+
+      <form class="mx-auto w-50" method="POST">
+        
+        <div class="form-group">
+          <label for="passLifetime"> Password lifetime <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"data-placement="top" title="The number of days before a password expires. 0 disables password expiry"></i> </label>
+          <input type="text" name="passLifetime" id="passLifetime" class="form-control" value="<?php echo $limsInformation->PasswordLifetime; ?>" />
+        </div>
+
+        <div class="form-check">
+          <input class="form-check-input" id="selfVerify" type="checkbox" name="selfVerify" <?php if ($limsInformation->SelfVerificationEnabled) echo "checked"; ?>>
+          <label class="form-check-label" for="selfVerify">
+          Allow self-verification of results <span class="badge badge-danger">Required</span>
+          </label>
+        </div>
+
+        <br />
+      
+      
+
+        <button name="submit" type="submit" class="btn btn-primary">Update Settings</button>
+      </form>
+    
+    
+    </div>
+  </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/container.php b/modules/LIMS/senaite/templates/pages/site/methods/container.php
new file mode 100644
index 000000000..0217acfce
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/container.php
@@ -0,0 +1,50 @@
+<div class="col-12">
+
+
+<div class="card">
+  <div class="card-header">
+    Methods
+  </div>
+  <div class="card-body">
+    <table class="table">
+      <thead>
+        <tr>
+          <th>#</th>
+          <th>Container</th>
+          <th>Description</th>
+          <th>Container Type</th>
+          <th>Capacity</th>
+          <th>Pre-Preserved</th>
+          <th>Status</th>
+        </tr>
+      </thead>  
+      <tbody>
+          <?php foreach($containers as $container) {
+                $containerInformation = json_decode($client->get($container->api_url)->getBody()->getContents())->items[0];
+                $containerTypeInformation = null;
+                if(!empty($containerInformation->ContainerType)) {
+                  $containerTypeInformation = json_decode($client->get($containerInformation->ContainerType->api_url)->getBody()->getContents())->items[0];             
+                }
+          ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $container->title; ?></td>
+              <td><?php echo $container->description; ?></td>
+              <td><?php if (isset($containerTypeInformation)) echo $containerTypeInformation->title; else echo "No Container Type"; ?></td>
+              <td><?php echo $containerInformation->Capacity; ?></td>
+              <td></td>
+              <td><?php if ($container->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+      </tbody>
+  
+    </table>
+    <a href="index.php?action=method&sact=createcontainer" class="btn btn-outline-success">Create new</a>
+  
+  
+  </div>
+</div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/containertype.php b/modules/LIMS/senaite/templates/pages/site/methods/containertype.php
new file mode 100644
index 000000000..3bd43860b
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/containertype.php
@@ -0,0 +1,38 @@
+<div class="col-12">
+
+
+<div class="card">
+  <div class="card-header">
+    Methods
+  </div>
+  <div class="card-body">
+    <table class="table">
+      <thead>
+        <tr>
+          <th>#</th>
+          <th>Container Type</th>
+          <th>Description</th>
+          <th>Status</th>
+        </tr>
+      </thead>  
+      <tbody>
+          <?php foreach($containerTypes as $containerType) { ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $containerType->title; ?></td>
+              <td><?php echo $containerType->description; ?></td>
+              <td><?php if ($containerType->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+      </tbody>
+  
+    </table>
+    <a href="index.php?action=method&sact=createcontainertype" class="btn btn-outline-success">Create new</a>
+  
+  
+  </div>
+</div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/createcontainer.php b/modules/LIMS/senaite/templates/pages/site/methods/createcontainer.php
new file mode 100644
index 000000000..6a82f61ef
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/createcontainer.php
@@ -0,0 +1,63 @@
+<div class="col-12">
+
+<div class="card">
+  <div class="card-header">
+    Create new container
+  </div>
+  <div class="card-body">
+    <form action="" class="w-50 mx-auto" method="POST">
+
+      <div class="form-group">
+        <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+        <input type="text" class="form-control" id="title" name="title" /> 
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle" data-toggle="tooltip"
+              data-placement="top" title="Used in item listings and search results."></i></label>
+        <textarea name="description" id="description" class="form-control"></textarea>
+      </div>
+
+      <div class="form-group">
+        <label for="containertype">Container Type</label>
+        <select name="containertype" id="containertype" class="form-control">
+          <option value=""></option>
+          <?php foreach ($containerTypes as $containerType) { ?>
+            <option value="<?php echo $containerType->uid; ?>"><?php echo $containerType->title; ?></option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="capacity">Capacity <span class="badge badge-danger">Required</span>  <i class="fas fa-question-circle" data-toggle="tooltip"
+              data-placement="top" title="Maximum possible size or volume of samples."></i></label>
+        <input type="text" class="form-control" id="capacity" name="capacity" />
+      </div>
+
+
+      <div class="form-check">
+        <input class="form-check-input" type="checkbox" name="seal" id="seal">
+        <label class="form-check-label" for="seal">
+          Security Seal Intact (Y/N)
+        </label>
+      </div>
+      <br>
+      <button type="submit" name="submit" class="btn btn-primary">Submit</button>
+
+    
+    </form>
+    <?php if (count($errors) > 0) { ?>
+          <div class="alert alert-danger w-50 mx-auto">
+            <ul>
+              <?php foreach($errors as $error) { ?>
+                <li> <?php echo $error; ?> </li>
+              <?php } ?>
+            </ul>
+          </div>
+    <?php } ?>
+  
+  
+  </div>
+</div>
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/createcontainertype.php b/modules/LIMS/senaite/templates/pages/site/methods/createcontainertype.php
new file mode 100644
index 000000000..b8e4c184b
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/createcontainertype.php
@@ -0,0 +1,40 @@
+<div class="col-12">
+
+<div class="card">
+  <div class="card-header">
+    Create new container type
+  </div>
+  <div class="card-body">
+    <form action="" class="w-50 mx-auto" method="POST">
+
+      <div class="form-group">
+        <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+        <input type="text" class="form-control" id="title" name="title" /> 
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle" data-toggle="tooltip"
+              data-placement="top" title="Used in item listings and search results."></i></label>
+        <textarea name="description" id="description" class="form-control"></textarea>
+      </div>
+
+
+
+      <button type="submit" name="submit" class="btn btn-primary">Submit</button>
+
+    
+    </form>
+    <?php if (count($errors) > 0) { ?>
+          <div class="alert alert-danger w-50 mx-auto">
+            <ul>
+              <?php foreach($errors as $error) { ?>
+                <li> <?php echo $error; ?> </li>
+              <?php } ?>
+            </ul>
+          </div>
+    <?php } ?>
+  
+  </div>
+</div>
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/createidentifiertype.php b/modules/LIMS/senaite/templates/pages/site/methods/createidentifiertype.php
new file mode 100644
index 000000000..b65bd9f90
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/createidentifiertype.php
@@ -0,0 +1,39 @@
+<div class="col-12">
+
+<div class="card">
+  <div class="card-header">
+    Create new identifier type
+  </div>
+  <div class="card-body">
+    <form action="" class="w-50 mx-auto" method="POST">
+
+      <div class="form-group">
+        <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+        <input type="text" class="form-control" id="title" name="title" /> 
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description <i class="fas fa-question-circle" data-toggle="tooltip"
+              data-placement="top" title="Describes the method in layman terms. This information is made available to lab clients"></i></label>
+        <textarea name="description" id="description" class="form-control"></textarea>
+      </div>
+
+
+      <button type="submit" name="submit" class="btn btn-primary">Submit</button>
+
+    
+    </form>
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+  
+  </div>
+</div>
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/createmethod.php b/modules/LIMS/senaite/templates/pages/site/methods/createmethod.php
new file mode 100644
index 000000000..ed615ddc7
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/createmethod.php
@@ -0,0 +1,68 @@
+  <div class="col-12">
+
+    <div class="card">
+      <div class="card-header">
+        Create new method
+      </div>
+      <div class="card-body">
+        <form action="" class="w-50 mx-auto" method="POST">
+
+          <div class="form-group">
+            <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+            <input type="text" class="form-control" id="title" name="title" /> 
+          </div>
+
+          <div class="form-group">
+            <label for="description">Description <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Describes the method in layman terms. This information is made available to lab clients"></i></label>
+            <textarea name="description" id="description" class="form-control"></textarea>
+          </div>
+
+          <div class="form-group">
+            <label for="methodid">Method ID <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Define an identifier code for the method. It must be unique."></i></label>
+            <input type="text" class="form-control" id="methodid" name="methodid" />
+          </div>
+        
+          <div class="form-group">
+            <label for="instructions">Instructions <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Technical description and instructions intended for analysts"></i></label>
+            <textarea name="instructions" id="instructions" class="form-control"></textarea>
+          </div>
+
+          <div class="form-check">  
+            <input type="checkbox" class="form-check-input" id="manualentry" name="manualentry" />
+            <label for="manualentry" class="form-check-label">
+              Manual entry of results <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="The results for the Analysis Services that use this method can be set manually"></i>
+            </label>
+          </div>
+          <br>
+          <div class="form-check">  
+            <input type="checkbox" class="form-check-input" id="accredited" name="accredited" />
+            <label for="accredited" class="form-check-label">
+              Accredited <i class="fas fa-question-circle" data-toggle="tooltip"
+                  data-placement="top" title="Check if the method has been accredited"></i>
+            </label>
+          </div>
+          <br>
+
+
+          <button type="submit" name="submit" class="btn btn-primary">Submit</button>
+
+        
+        </form>
+        <?php if (count($errors) > 0) { ?>
+          <div class="alert alert-danger w-50 mx-auto">
+            <ul>
+              <?php foreach($errors as $error) { ?>
+                <li> <?php echo $error; ?> </li>
+              <?php } ?>
+            </ul>
+          </div>
+        <?php } ?>
+      
+      </div>
+    </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/identifiertype.php b/modules/LIMS/senaite/templates/pages/site/methods/identifiertype.php
new file mode 100644
index 000000000..672d5b425
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/identifiertype.php
@@ -0,0 +1,38 @@
+<div class="col-12">
+
+
+<div class="card">
+  <div class="card-header">
+    Methods
+  </div>
+  <div class="card-body">
+    <table class="table">
+      <thead>
+        <tr>
+          <th>#</th>
+          <th>Title</th>
+          <th>Description</th>
+          <th>Status</th>
+        </tr>
+      </thead>  
+      <tbody>
+          <?php foreach($identifierTypes as $identifierType) { ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $identifierType->title; ?></td>
+              <td><?php echo $identifierType->description; ?></td>
+              <td><?php if ($identifierType->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+          <?php } ?>
+      </tbody>
+  
+    </table>
+    <a href="index.php?action=method&sact=createidentifiertype" class="btn btn-outline-success">Create new</a>
+  
+  
+  </div>
+</div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/methods/method.php b/modules/LIMS/senaite/templates/pages/site/methods/method.php
new file mode 100644
index 000000000..febe41e95
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/methods/method.php
@@ -0,0 +1,40 @@
+  <div class="col-12">
+
+
+        <div class="card">
+          <div class="card-header">
+            Methods
+          </div>
+          <div class="card-body">
+            <table class="table">
+              <thead>
+                <tr>
+                  <th>#</th>
+                  <th>Method</th>
+                  <th>Description</th>
+                  <th>Instrument</th>
+                  <th>Status</th>
+                </tr>
+              </thead>  
+              <tbody>
+                  <?php foreach($methods as $method) { ?>
+                    <tr>
+                      <td>#</td>
+                      <td><?php echo $method->title; ?></td>
+                      <td><?php echo $method->description; ?></td>
+                      <td><?php echo "Instruments Here"; ?></td>
+                      <td><?php if ($method->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+                    </tr>
+                  <?php } ?>
+              </tbody>
+          
+            </table>
+            <a href="index.php?action=method&sact=createmethod" class="btn btn-outline-success">Create new</a>
+          
+          
+          </div>
+        </div>
+  
+  
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/procedures/list.php b/modules/LIMS/senaite/templates/pages/site/procedures/list.php
new file mode 100644
index 000000000..cec1c938d
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/procedures/list.php
@@ -0,0 +1,48 @@
+<div class="col-12">
+
+
+  <div class="card">
+    <div class="card-header">Procedure Request List</div>
+    <div class="card-body">
+      <table class="table">
+        <thead>
+          <tr>
+            <th>ID</th>
+            <th>Procedure Name</th>
+            <th>Procedure Priority</th>
+            <th>Diagnosis Codes</th>
+            <th>Order Status</th>
+            <th></th>
+          </tr>
+        </thead>
+        <tbody>
+          <?php foreach ($procedures as $procedure) {
+            $procedureCodeDetails = sqlStatement("SELECT * FROM procedure_order_code WHERE procedure_order_id = ?", [ $procedure['procedure_order_id'] ]);
+            $procedureCodeDetails = sqlFetchArray($procedureCodeDetails);
+            ?>
+          <tr>
+            <td><?php echo $procedure['procedure_order_id']; ?></td>
+            <td><a href="index.php?action=procedure&sact=view&id=<?php echo $procedure['procedure_order_id']; ?>"><?php echo $procedureCodeDetails['procedure_name']; ?> </a></td>
+            <td><?php echo $procedure['order_priority']; ?></td>
+            <td><?php echo $procedureCodeDetails['diagnoses']; ?></td>
+            <td><?php echo $procedure['order_status']; ?></td>
+            <?php if ($procedure['order_status'] === 'pending') {
+              ?> <td>
+              <form method="POST" action="">
+                <input type="hidden" name="procedure_id" value="<?php echo $procedure['procedure_order_id']; ?>" />
+                <button type="submit" name="submit" class="btn btn-success"> Accept Procedure Request </button>
+              </form>
+              </td>
+            <?php } ?>
+          </tr>
+          <?php } ?>
+        </tbody>
+      
+      
+      </table>
+    </div>
+  </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/procedures/view.php b/modules/LIMS/senaite/templates/pages/site/procedures/view.php
new file mode 100644
index 000000000..d7554d759
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/procedures/view.php
@@ -0,0 +1,68 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Procedure Order Details</div>
+    <div class="card-body">
+      <?php if ($procedure['order_status'] === 'pending') {
+        ?> <div class="alert alert-danger"> Please accept the procedure order. </div>
+      <?php } else { 
+        
+        $arAssigned = sqlFetchArray(sqlStatement("SELECT * FROM lims_analysisrequests WHERE procedure_order_id = ?", [ $id ]));
+        
+        if (!$arAssigned) { ?>
+          <form method="POST" class="w-50 mx-auto">
+            
+            <div class="form-group">
+              <label for="analysisrequest"> Analysis Request </label>
+              <select name="analysisrequest" id="analysisrequest" class="form-control"> 
+                <?php foreach ($analysisRequests as $analysisRequest) { ?>
+                  <option value="<?php echo $analysisRequest->uid;?>"> <?php echo $analysisRequest->title; ?> </option>
+                <?php } ?>
+              </select>
+      
+              
+            </div>
+
+            <button name="assignAR" type="submit" class="btn btn-primary">Assign Analysis Request</button>
+          </form>
+      <?php } else if ($procedureInformation) { ?>
+        <form method="POST" class="w-50 mx-auto">
+            
+            <div class="form-group">
+              <label for="analysisrequest"> Analysis Request </label>
+              <select name="analysisrequest" id="analysisrequest" class="form-control"> 
+                <?php foreach ($analysisRequests as $analysisRequest) { ?>
+                  <option value="<?php echo $analysisRequest->uid;?>"> <?php echo $analysisRequest->title; ?> </option>
+                <?php } ?>
+              </select>
+      
+              
+            </div>
+
+            <button name="updateAR" type="submit" class="btn btn-primary">Update Analysis Request</button>
+          </form>
+
+
+      <?php   }
+       
+       ?>
+        
+        
+
+
+
+      
+    
+
+
+
+
+     <?php } ?>
+    </div>
+  
+  </div>
+
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/resources/createmanufacturer.php b/modules/LIMS/senaite/templates/pages/site/resources/createmanufacturer.php
new file mode 100644
index 000000000..865bf4324
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/resources/createmanufacturer.php
@@ -0,0 +1,38 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Manufacturer Type</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title</label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description</label>
+        <input type="text" class="form-control" id="description" name="description">
+      </div>
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/resources/createsupplier.php b/modules/LIMS/senaite/templates/pages/site/resources/createsupplier.php
new file mode 100644
index 000000000..cbff3898f
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/resources/createsupplier.php
@@ -0,0 +1,267 @@
+
+  <div class="col-12">
+
+    <div class="card">
+
+      <div class="card-header">New Supplier</div>
+      <div class="card-body">
+      
+        <form class="mx-auto form w-50" method="POST" act="">
+
+          <ul class="nav nav-tabs" id="supplierTab" role="tablist">
+
+            <li class="nav-item">
+              <a href="#default" class="nav-link active" id="default-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Default <span class="badge badge-danger">Required</span></a>
+            </li>
+
+            <li class="nav-item">
+              <a href="#address" class="nav-link" id="address-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Address</a>
+            </li>
+
+            <li class="nav-item">
+              <a href="#bank" class="nav-link" id="bank-tab" data-toggle="tab" role="tab" aria-controls="home" aria-selected="true">Bank Details</a>
+            </li>
+
+          </ul>
+          <br />
+          <div class="tab-content" id="supplierTabContent">
+
+            <div class="tab-pane fade show active" id="default" role="tabpanel" aria-labelledby="default-tab">
+              <div class="form-group">
+                <label for="title">Name <span class="badge badge-danger">Required</span></label>
+                <input type="text" class="form-control" id="name" name="name" required/>
+              </div>
+
+              <div class="form-group">
+                <label for="vat">VAT number</label>
+                <input type="text" class="form-control" id="vat" name="vat">
+              </div>
+              
+              <div class="form-group">
+                <label for="phone">Phone</label>
+                <input type="text" class="form-control" id="phone" name="phone">
+              </div>
+
+              <div class="form-group">
+                <label for="fax">Fax</label>
+                <input type="text" class="form-control" id="fax" name="fax">
+              </div>
+
+              <div class="form-group">
+                <label for="website">Website</label>
+                <input type="text" class="form-control" id="website" name="website">
+              </div>
+            </div>
+
+            <div class="tab-pane fade" id="address" role="tabpanel" aria-labelledby="address-tab">
+              <div class="form-group">
+                <label for="title">eMail Address</label>
+                <input type="email" class="form-control" id="email" name="email"/>
+              </div>
+              <h5 style>Physical Address</h5>
+              <br />
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="phycountry">Country:</label>
+                  <input type="text" class="form-control" name="phycountry" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="Copy">Copy From</label>
+                  <select class="custom-select" name="copy">
+                    <option value="postal">Postal Address</option>
+                    <option value="billing">Billing Address</option>
+                  </select>
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="phystate">State</label>
+                  <input type="text" class="form-control" name="phystate" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="phydistrict">District</label>
+                  <input type="text" class="form-control" name="phydistrict" />
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="phycity">City</label>
+                  <input type="text" class="form-control" name="phycity">
+                </div>
+                <div class="form-group col-6">
+                  <label for="phypostal">Postal Code</label>
+                  <input type="text" class="form-control" name="phypostal">
+                </div>
+              </div>
+
+              <div class="form-group">
+                <label for="phyaddress">Address: </label>
+                <textarea class="form-control" name="phyaddress" id="phyaddress"></textarea>
+              </div>
+
+              <hr />
+              <h5 style>Postal Address</h5>
+              <br />
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="postcountry">Country:</label>
+                  <input type="text" class="form-control" name="postcountry" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="Copy">Copy From</label>
+                  <select class="custom-select" name="copy">
+                    <option value="physical">Physical Address</option>
+                    <option value="billing">Billing Address</option>
+                  </select>
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="poststate">State</label>
+                  <input type="text" class="form-control" name="poststate" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="postdistrict">District</label>
+                  <input type="text" class="form-control" name="postdistrict" />
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="postcity">City</label>
+                  <input type="text" class="form-control" name="postcity">
+                </div>
+                <div class="form-group col-6">
+                  <label for="postpostal">Postal Code</label>
+                  <input type="text" class="form-control" name="postpostal">
+                </div>
+              </div>
+
+              <div class="form-group">
+                <label for="postaddress">Address: </label>
+                <textarea class="form-control" name="postaddress" id="postaddress"></textarea>
+              </div>
+              
+              <hr />
+
+              <h5 style>Billing Address</h5>
+              <br />
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="billcountry">Country:</label>
+                  <input type="text" class="form-control" name="billcountry" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="Copy">Copy From</label>
+                  <select class="custom-select" name="copy">
+                    <option value="postal">Postal Address</option>
+                    <option value="physical">Physical Address</option>
+                  </select>
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="billstate">State</label>
+                  <input type="text" class="form-control" name="billstate" />
+                </div>
+                <div class="form-group col-6">
+                  <label for="billdistrict">District</label>
+                  <input type="text" class="form-control" name="billdistrict" />
+                </div>
+              </div>
+
+              <div class="form-row">
+                <div class="form-group col-6">
+                  <label for="billcity">City</label>
+                  <input type="text" class="form-control" name="billcity">
+                </div>
+                <div class="form-group col-6">
+                  <label for="billpostal">Postal Code</label>
+                  <input type="text" class="form-control" name="billpostal">
+                </div>
+              </div>
+
+              <div class="form-group">
+                <label for="billaddress">Address: </label>
+                <textarea class="form-control" name="billaddress" id="billaddress"></textarea>
+              </div>
+
+
+            </div>
+
+            <div class="tab-pane fade" id="bank" role="tabpanel" aria-labelledby="bank-tab">
+              <div class="form-group">
+                <label for="title">Account Type</label>
+                <input type="text" class="form-control" id="acctype" name="acctype" />
+              </div>
+
+              <div class="form-group">
+                <label for="description">Account Name</label>
+                <input type="text" class="form-control" id="accname" name="accname">
+              </div>
+
+              <div class="form-group">
+                <label for="description">Account Number</label>
+                <input type="text" class="form-control" id="accnum" name="accnum">
+              </div>
+
+              <div class="form-group">
+                <label for="description">Bank Name</label>
+                <input type="text" class="form-control" id="bankname" name="bankname">
+              </div>
+
+              <div class="form-group">
+                <label for="description">Bank branch</label>
+                <input type="text" class="form-control" id="bankbranch" name="bankbranch">
+              </div>
+
+              <div class="form-group">
+                <label for="description">NIB</label>
+                <input type="text" class="form-control" id="nib" name="nib">
+              </div>
+
+              <div class="form-group">
+                <label for="description">IBN</label>
+                <input type="text" class="form-control" id="IBN" name="IBN">
+              </div>
+
+              <div class="form-group">
+                <label for="description">SWIFT code</label>
+                <input type="text" class="form-control" id="swift" name="swift">
+              </div>
+
+
+            </div>
+
+
+          </div>
+          
+          
+
+          <button name="submit" type="submit" class="btn btn-primary">Create</button>
+        
+        </form>
+        <br />
+        <?php if (count($errors) > 0) { ?>
+          <div class="alert alert-danger w-50 mx-auto">
+            <ul>
+              <?php foreach($errors as $error) { ?>
+                <li> <?php echo $error; ?> </li>
+              <?php } ?>
+            </ul>
+          </div>
+        <?php } ?>
+        
+
+      </div>
+    </div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/resources/manufacturer.php b/modules/LIMS/senaite/templates/pages/site/resources/manufacturer.php
new file mode 100644
index 000000000..cc91bc64e
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/resources/manufacturer.php
@@ -0,0 +1,43 @@
+
+  <div class="col-12">
+
+    <div class="card">
+      <div class="card-header">
+        Manufacturers
+      </div>
+      <div class="card-body">
+
+        <form action="">
+          <table class="table">
+            <thead>
+              <tr>
+                <th> # </th>
+                <th>Title</th>
+                <th>Description</th>
+                <th>Status</th>
+              </tr>
+            </thead>
+            <tbody>
+            <?php foreach($manufacturerDetails as $manufacturer) { ?>
+              <tr>
+                <td> # </td>
+                <td> <?php echo $manufacturer->title; ?></td>
+                <td> <?php echo $manufacturer->description; ?></td>
+                <td> <?php if ($manufacturer->review_state == "active") echo "Active"; else echo "Dormant";  ?></td>              
+              </tr>
+           <?php } ?>
+            </tbody>
+          
+          
+          </table>
+        
+        
+        <a href="index.php?action=resource&sact=createmanufacturer" class="btn btn-outline-success">Create new</a>
+        </form>
+      
+      
+      </div>
+      
+    </div>
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/resources/supplier.php b/modules/LIMS/senaite/templates/pages/site/resources/supplier.php
new file mode 100644
index 000000000..1117894b2
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/resources/supplier.php
@@ -0,0 +1,49 @@
+
+  <div class="col-12">
+
+<div class="card">
+  <div class="card-header">
+    Manufacturers
+  </div>
+  <div class="card-body">
+
+    <form action="">
+      <table class="table">
+        <thead>
+          <tr>
+            <th> # </th>
+            <th>Name</th>
+            <th>eMail</th>
+            <th>Phone</th>
+            <th>Fax</th>
+            <th>Status</th>
+          </tr>
+        </thead>
+        <tbody>
+        <?php foreach($supplierDetails as $supplier) {
+          $supplierData = json_decode($client->get($supplier->api_url)->getBody()->getContents())->items[0];
+          ?>
+          <tr>
+            <td> # </td>
+            <td> <?php echo $supplier->title; ?></td>
+            <td> <?php echo $supplierData->EmailAddress; ?></td>
+            <td> <?php echo $supplierData->Phone; ?> </td>
+            <td> <?php echo $supplierData->Fax; ?> </td>
+            <td> <?php if ($supplier->review_state == "active") echo "Active"; else echo "Dormant";  ?></td>              
+          </tr>
+       <?php } ?>
+        </tbody>
+      
+      
+      </table>
+    
+    
+    <a href="index.php?action=resource&sact=createsupplier" class="btn btn-outline-success">Create new</a>
+    </form>
+  
+  
+  </div>
+  
+</div>
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/conditions.php b/modules/LIMS/senaite/templates/pages/site/samples/conditions.php
new file mode 100644
index 000000000..8a881f937
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/conditions.php
@@ -0,0 +1,41 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Conditions</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Sample Point</th>
+              <th>Description</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach ($sampleConditions as $sampleCondition) { ?>
+              <tr>
+                <td># </td>
+                <td><?php echo $sampleCondition->title; ?></td>
+                <td><?php echo $sampleCondition->description; ?></td>
+                <td><?php echo "Active"; ?></td>
+              </tr>
+           <?php } ?>
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=sample&sact=createconditions" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/createconditions.php b/modules/LIMS/senaite/templates/pages/site/samples/createconditions.php
new file mode 100644
index 000000000..c74561f77
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/createconditions.php
@@ -0,0 +1,42 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Create Sample Condition</div>
+    <div class="card-body">
+
+
+    <form method="POST" action="" class="w-50 mx-auto" > 
+      <div class="form-group">
+        <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+        <input type="text" name="title" id="title" class="form-control" />
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description  </label>
+        <textarea name="description" id="description" class="form-control" ></textarea>
+      </div>
+
+
+      <button type="submit" name="submit" class="btn btn-primary"> Submit </button>
+
+    </form>
+
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+    
+    </div>
+  
+  </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/creatematrices.php b/modules/LIMS/senaite/templates/pages/site/samples/creatematrices.php
new file mode 100644
index 000000000..8c3a57b90
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/creatematrices.php
@@ -0,0 +1,42 @@
+<div class="col-12">
+
+  <div class="card">
+    <div class="card-header">Create Sample Matrix</div>
+    <div class="card-body">
+
+
+    <form method="POST" action="" class="w-50 mx-auto" > 
+      <div class="form-group">
+        <label for="title"> Title <span class="badge badge-danger">Required</span> </label>
+        <input type="text" name="title" id="title" class="form-control" />
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description  </label>
+        <textarea name="description" id="description" class="form-control" ></textarea>
+      </div>
+
+
+      <button type="submit" name="submit" class="btn btn-primary"> Submit </button>
+
+    </form>
+
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+    
+    </div>
+  
+  </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/createpoints.php b/modules/LIMS/senaite/templates/pages/site/samples/createpoints.php
new file mode 100644
index 000000000..92a202cf6
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/createpoints.php
@@ -0,0 +1,155 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Sample Type</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description</label>
+        <input type="text" class="form-control" id="description" name="description">
+      </div>
+
+      <h5>Sampling Frequency <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="If a sample is taken periodically at this sample point, enter frequency here, e.g. weekly"></i> </h5>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="sampleDays" placeholder="Number of Days" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Days</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="sampleHours"  placeholder="Number of Hours" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Hours</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="sampleMinutes"  placeholder="Number of Minutes" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Minutes</span>
+        </div>
+      </div>
+
+      <div class="form-group">
+        <label for="sampleTypes">Sample Types</label>
+        <select multiple="multiple" name="sampleTypes[]" id="sampleTypes" class="form-control">
+          <?php foreach ($sampleTypes as $sampleType) { ?>
+            <option value="<?php echo $sampleType->uid; ?>"> <?php echo $sampleType->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+            
+      <div class="form-check">
+        <input class="form-check-input" type="checkbox" value="" id="Composite" name="composite">
+        <label class="form-check-label" for="Composite">
+          Composite <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Check this box if the samples taken at this point are 'composite' and put together from more than one sub sample
+                  , e.g. several surface samples from a dam mixed together to be a representative sample for the dam. The default, unchecked, indicates 'grab' samples"></i>
+        </label>
+      </div>
+      <br>
+
+      <h5>Latitude <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Enter the Sample Point's latitude in degrees 0-90, minutes 0-59, seconds 0-59 and N/S indicator"></i> </h5>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="latDeg" placeholder="0" aria-label="Degrees" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Degrees</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="latMin"  placeholder="0" aria-label="Minutes" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Minutes</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="latSec"  placeholder="0" aria-label="Seconds" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Seconds</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="latBear"  placeholder="0" aria-label="Bearing" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Bearing</span>
+        </div>
+      </div>
+
+      <h5>Longitude <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Enter the Sample Point's longitutde in degrees 0-90, minutes 0-59, seconds 0-59 and E/W indicator"></i> </h5>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="longDeg" placeholder="0" aria-label="Degrees" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Degrees</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="longMin"  placeholder="0" aria-label="Minutes" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Minutes</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="longSec"  placeholder="0" aria-label="Seconds" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Seconds</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="longBear"  placeholder="0" aria-label="Bearing" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Bearing</span>
+        </div>
+      </div>
+
+      <div class="form-group">
+        <label for="elevation">Elevation <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The height or depth at which the sample has to be taken"></i></label>
+        <input type="text" class="form-control" id="elevation" name="elevation"/>
+      </div>
+
+      <br>
+
+
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/createtype.php b/modules/LIMS/senaite/templates/pages/site/samples/createtype.php
new file mode 100644
index 000000000..0d48f4900
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/createtype.php
@@ -0,0 +1,155 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Sample Type</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" required/>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description</label>
+        <input type="text" class="form-control" id="description" name="description">
+      </div>
+
+      <h5>Retention Period <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The period for which un-preserved samples of this type can be kept before they expire and cannot be analysed any further"></i> </h5>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="retentionDays" placeholder="Number of Days" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Days</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="retentionHours"  placeholder="Number of Hours" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Hours</span>
+        </div>
+      </div>
+
+      <div class="input-group w-50 mb-3">
+        <input type="text" class="form-control" name="retentionMinutes"  placeholder="Number of Minutes" aria-label="Number of Days" aria-describedby="basic-addon2">
+        <div class="input-group-append">
+          <span class="input-group-text" id="basic-addon2">Minutes</span>
+        </div>
+      </div>
+
+      <div class="form-check">
+        <input class="form-check-input" type="checkbox" value="" id="defaultCheck1">
+        <label class="form-check-label" for="defaultCheck1">
+          Hazardous <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Samples of this type should be treated as hazardous"></i>
+        </label>
+      </div>
+      <br>
+      <div class="form-group">
+        <label for="matrix">Sample Matrix</label>
+        <select name="matrix" id="matrix" class="form-control"></select>
+      </div>
+
+      <div class="form-group">
+        <label for="typePrefix">Sample Type Prefix <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Prefixes can not contain spaces."></i> </label>
+        <input type="text" class="form-control" name="typePrefix" id="typePrefix">
+      </div>
+
+      <div class="form-group">
+        <label for="minimumVolume">Minimum Volume<span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The minimum sample volume required for analysis eg. '10 ml' or '1 kg'."></i> </label>
+        <input type="text" class="form-control" name="minimumVolume" id="minimumVolume">
+      </div>
+
+      <div class="form-group">
+        <label for="containerType">Default Container Type</label>
+        <select name="containerType" id="containerType" class="form-control"></select>
+      </div>
+
+      <div class="form-group">
+        <label for="points">Sample Points <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="The list of sample points from which this sample type can be collected. If no sample points are selected, then all sample points are available."></i></label>
+        <select name="points" id="points" class="form-control">
+          <option value=""></option>
+          <?php foreach ($samplePoints as $samplePoint) { ?>
+            <option value="<?php echo $samplePoint->uid; ?>"><?php echo $samplePoint->title; ?></option>
+          <?php
+          }
+          ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="stickerTemplates"> Admitted sticker templates <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Defines the stickers to use for this sample type."></i> </label>
+        <br>
+        <small> Admitted Sticker Templates </small>
+        <select multiple="multiple" class="form-control" name="admittedStickerTemplates[]" id="">
+          <option value="Code_128_1x48mm.pt">Code 128 1x48mm</option>
+          <option value="Code_128_1x72mm.pt">Code 128 1x72mm</option>
+          <option value="Code_39_1x54mm.pt">Code 39 1x54mm</option>
+          <option value="Code_39_1x72mm.pt">Code 39 1x72mm</option>
+          <option value="Code_39_2ix1i.pt">Code 39 2ix1i</option>
+          <option value="Code_93_2dx38mm.pt">Code 93 2dx38mm</option>
+          <option value="Code_93_2x38mm.pt">Code 93 2x38mm</option>
+          <option value="QR_1x14mmx39mm.pt">QR 1x14mmx39mm</option>
+        </select>
+        <br>
+
+        <small> Default small sticker </small>
+        <select class="form-control" name="defaultSmallSticker" id="">
+          <option value="Code_128_1x48mm.pt">Code 128 1x48mm</option>
+          <option value="Code_128_1x72mm.pt">Code 128 1x72mm</option>
+          <option value="Code_39_1x54mm.pt">Code 39 1x54mm</option>
+          <option value="Code_39_1x72mm.pt">Code 39 1x72mm</option>
+          <option value="Code_39_2ix1i.pt">Code 39 2ix1i</option>
+          <option value="Code_93_2dx38mm.pt">Code 93 2dx38mm</option>
+          <option value="Code_93_2x38mm.pt">Code 93 2x38mm</option>
+          <option value="QR_1x14mmx39mm.pt">QR 1x14mmx39mm</option>
+        </select>
+        <br>
+
+        <small> Default large sticker </small>
+        <select class="form-control" name="defaultLargeSticker" id="">
+          <option value="Code_128_1x48mm.pt">Code 128 1x48mm</option>
+          <option value="Code_128_1x72mm.pt">Code 128 1x72mm</option>
+          <option value="Code_39_1x54mm.pt">Code 39 1x54mm</option>
+          <option value="Code_39_1x72mm.pt">Code 39 1x72mm</option>
+          <option value="Code_39_2ix1i.pt">Code 39 2ix1i</option>
+          <option value="Code_93_2dx38mm.pt">Code 93 2dx38mm</option>
+          <option value="Code_93_2x38mm.pt">Code 93 2x38mm</option>
+          <option value="QR_1x14mmx39mm.pt">QR 1x14mmx39mm</option>
+        </select>
+        <br>
+      
+      </div>
+
+      
+
+      
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/matrices.php b/modules/LIMS/senaite/templates/pages/site/samples/matrices.php
new file mode 100644
index 000000000..53676a627
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/matrices.php
@@ -0,0 +1,41 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Matrices</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Sample Point</th>
+              <th>Description</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach ($sampleMatrices as $sampleMatrix) { ?>
+              <tr>
+                <td># </td>
+                <td><?php echo $sampleMatrix->title; ?></td>
+                <td><?php echo $sampleMatrix->description; ?></td>
+                <td><?php echo "Active"; ?></td>
+              </tr>
+           <?php } ?>
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=sample&sact=creatematrices" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/points.php b/modules/LIMS/senaite/templates/pages/site/samples/points.php
new file mode 100644
index 000000000..c96fed3d3
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/points.php
@@ -0,0 +1,67 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Points</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Sample Point</th>
+              <th>Description</th>
+              <th>Owner</th>
+              <th>Sample Types</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($samplePoints as $samplePoint) {
+                  $samplePointInformation = getDataFromUrl($client, $samplePoint->api_url)[0]; 
+                  $sampleTypeIDs = [];
+                  $sampleTypes = [];
+                  if ($samplePointInformation->SampleTypes) {
+                    foreach ($samplePointInformation->SampleTypes as $samplePointTypeIDs) {
+                      $sampleTypeIDs[] = $samplePointTypeIDs->uid;
+                    }
+                    foreach ($sampleTypeIDs as $sampleTypeID) {
+                      $sampleTypeInformation = getDataFromUrl($client, 'sampletype/'.$sampleTypeID)[0];
+                      $sampleTypes[] = $sampleTypeInformation->title;
+                    }
+                  }
+                  
+            ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $samplePointInformation->title; ?></td>
+              <td><?php echo $samplePointInformation->description; ?></td>
+              <td>temp name</td>
+              <td><?php 
+              foreach ($sampleTypes as $key => $sampleType) {
+                  echo $sampleType;
+                  if ($key != count($sampleTypes)-1) {
+                    echo ",";
+                  }
+              } ?></td>
+              <td><?php if ($samplePoint->review_state === 'active') echo "Active"; else echo "Dormant"; ?></td>
+            
+            </tr>                
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=sample&sact=createpoints" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/samples/types.php b/modules/LIMS/senaite/templates/pages/site/samples/types.php
new file mode 100644
index 000000000..1f42e4050
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/samples/types.php
@@ -0,0 +1,82 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Sample Type</th>
+              <th>Description</th>
+              <th>Hazardous</th>
+              <th>Retention Period</th>
+              <th>Sample Matrix</th>
+              <th>Default Container</th>
+              <th>Sample Points</th>
+              <th>Prefix</th>
+              <th>Minimum Volume</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+
+          <tbody>
+            <?php foreach($sampleTypes as $sampleType) {
+                  $sampleInformation = json_decode($client->get($sampleType->api_url)->getBody()->getContents())->items[0];   
+                  $samplePoints = [];
+                  $samplePointsAPI = [];
+                  if ($sampleInformation->SamplePoints) {
+
+                    foreach ($sampleInformation->SamplePoints as $pointInfo) {
+                      $samplePointsAPI[] = $pointInfo->api_url;
+                    } 
+                    $samplePoints = [];
+                    foreach ($samplePointsAPI as $samplePointAPI) {
+                      $info = json_decode($client->get($samplePointAPI)->getBody()->getContents())->items[0];
+                      $samplePoints[] = $info->title;
+                    }
+                  }
+            ?>
+            <tr>
+              <td>#</td>
+              <td><?php echo $sampleInformation->title; ?></td>
+              <td><?php echo $sampleInformation->description; ?></td>
+              <td><?php echo $sampleInformation->Hazardous; ?></td>
+              <td><?php echo $sampleInformation->RetentionPeriod->days." days ".$sampleInformation->RetentionPeriod->hours." hours ".$sampleInformation->RetentionPeriod->minutes." minutes "; ?></td>
+              <td><?php echo $sampleInformation->SampleMatrix; ?></td>
+              <td><?php echo $sampleInformation->ContainerType; ?></td>
+              <td>
+              <?php if (count($samplePoints) > 0) {
+                      foreach($samplePoints as $samplePoint) {
+                        echo $samplePoint; 
+                        if ($samplePoint != $samplePoints[count($samplePoints)-1]) {
+                          echo ",";
+                        }
+                      } 
+                    } 
+              ?>
+              </td>
+              <td><?php echo $sampleInformation->Prefix; ?></td>
+              <td><?php echo $sampleInformation->MinimumVolume; ?></td>
+              <td><?php if ($sampleType->review_state === 'active') echo "Active"; else echo "Dormant"; ?></td>
+            
+            </tr>                
+            <?php } ?>
+          
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=sample&sact=createtype" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/setup.php b/modules/LIMS/senaite/templates/pages/site/setup.php
new file mode 100644
index 000000000..b7e9cd14d
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/setup.php
@@ -0,0 +1,141 @@
+
+
+  <br>
+  <div class="col-12"> 
+    <div class="card">
+    
+      <div class="card-header">
+        Site Setup
+      </div>
+      <div class="card-body">
+        <div class="card">
+          <div class="card-header">Instruments</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-4">
+                <a href="index.php?action=instrument&sact=locations"><img src="./assets/img/instrument.png" class="setup-icon rounded" alt="..."> Instrument Locations</a>
+              </div>
+              <div class="col-4">
+                <a href="index.php?action=instrument&sact=types"><img src="./assets/img/instrument.png" class="setup-icon rounded" alt="..."> Instrument Types</a>
+              </div>
+              <div class="col-4">
+                <a href="index.php?action=instrument"><img src="./assets/img/instrument.png" class="setup-icon rounded" alt="..."> Instruments </a>
+              </div>
+            </div>
+          </div>
+        </div>
+        <br />
+        <div class="card">
+          <div class="card-header">Manufacturers, Suppliers and Worksheets</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-3">
+                <a href="index.php?action=resource&sact=manufacturer"><img src="./assets/img/manufacturer.png" class="setup-icon rounded" alt="..."> Manufacturers </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=resource&sact=supplier"><img src="./assets/img/supplier.png" style="height: 50px; width: 100px" class="rounded" alt="..."> Suppliers </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=worksheet&sact=templates"><img src="./assets/img/worksheet.png" style="height: 50px; width: 50px" class="rounded" alt="..."> Worksheet Templates </a>
+              </div>
+            </div>
+          </div>
+        </div>
+        <br />
+        <div class="card">
+          <div class="card-header">Methods, Containers, Identifier Types</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-3">
+                <a href="index.php?action=method"><img src="./assets/img/method.png" style="height: 50px; width: 50px" class="rounded" alt="..."> Methods </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=method&sact=containertype"><img src="./assets/img/labproduct.png" style="height: 50px; width: 50px" class="rounded" alt="..."> Container Types </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=method&sact=container"><img src="./assets/img/labproduct.png" style="height: 50px; width: 50px" class="rounded" alt="..."> Containers </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=method&sact=identifiertype"><img src="./assets/img/identifier.png" style="height: 50px; width: 50px" class="rounded" alt="..."> Identifier Types </a>
+              </div>
+            </div>
+          </div>
+        </div>
+        <br />
+
+        <div class="card">
+          <div class="card-header">Analyses Details</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-2">
+                <a href="index.php?action=client"><img src="./assets/img/client.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Clients </a>
+              </div>
+              <div class="col-2">
+                <a href="index.php?action=client&sact=createcontacts"><img src="./assets/img/client.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Client Contacts </a>
+              </div>
+              <div class="col-2">
+                <a href="index.php?action=analysis&sact=categories"><img src="./assets/img/category.jpeg" style="height: 50px; width: 50px" class="rounded" alt="...">  Analysis Categories  </a>
+              </div>
+              <div class="col-2">
+                <a href="index.php?action=analysis&sact=profiles"><img src="./assets/img/client.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Analysis Profiles </a>
+              </div>
+              <div class="col-2">
+                <a href="index.php?action=analysis&sact=services"><img src="./assets/img/client.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Analysis Services </a>
+              </div>
+              <div class="col-2">
+                <a href="index.php?action=analysis&sact=requests"><img src="./assets/img/client.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Analysis Requests </a>
+              </div>
+              
+            </div>
+          </div>
+        </div>
+        <br />
+
+        <div class="card">
+          <div class="card-header">Laboratory Details</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-3">
+                <a href="index.php?action=laboratory&sact=contacts"><img src="./assets/img/contact.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Lab Contacts </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=laboratory&sact=departments"><img src="./assets/img/department.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Lab Departments </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=laboratory&sact=products"><img src="./assets/img/labproduct.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Lab Products </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=laboratory&sact=info"><img src="./assets/img/info.png" style="height: 50px; width: 50px" class="rounded" alt="...">  Lab Information </a>
+              </div>
+            </div>
+          </div>
+        </div>
+        <br />
+
+        <div class="card">
+          <div class="card-header">Samples</div>
+          <div class="card-body">
+            <div class="row">
+              <div class="col-3">
+                <a href="index.php?action=sample&sact=types"><img src="./assets/img/sample.jpg" style="height: 50px; width: 50px" class="rounded" alt="...">  Sample Types </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=sample&sact=points"><img src="./assets/img/sample.jpg" style="height: 50px; width: 50px" class="rounded" alt="...">  Sample Points </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=sample&sact=matrices"><img src="./assets/img/sample.jpg" style="height: 50px; width: 50px" class="rounded" alt="...">  Sample Matrices </a>
+              </div>
+              <div class="col-3">
+                <a href="index.php?action=sample&sact=conditions"><img src="./assets/img/sample.jpg" style="height: 50px; width: 50px" class="rounded" alt="...">  Sample Conditions </a>
+              </div>
+            </div>
+          </div>
+        </div>
+
+
+      </div>
+    
+    </div>
+  
+  
+  </div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/worksheets/createtemplate.php b/modules/LIMS/senaite/templates/pages/site/worksheets/createtemplate.php
new file mode 100644
index 000000000..2d8c339b1
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/worksheets/createtemplate.php
@@ -0,0 +1,156 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Worksheet Template</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="title">Title <span class="badge badge-danger">Required</span></label>
+        <input type="text" class="form-control" id="title" name="title" />
+      </div>
+
+      <div class="form-group">
+        <label for="description">Description</label>
+        <textarea type="text" class="form-control" id="description" name="description"></textarea>
+      </div>
+
+      <div class="form-group">
+        <label for="method">Method <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Restrict the available analysis services and instruments to
+                   those with the selected method. In order to apply this change to the services list, you should save the change first."></i>
+        </label>
+
+        <select name="method" id="method" class="form-control">
+          <option value="">Not specified</option>
+
+          <?php foreach ($methods as $method) { ?>
+          <option value="<?php echo $method->uid; ?>"> <?php echo $method->title; ?></option>
+          <?php } ?>
+
+        </select>
+
+      </div>
+
+      <div class="form-group">
+        <label for="instrument">Instrument <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Select the preferred instrument"></i>
+        </label>
+        
+        <select name="instrument" id="instrument" class="form-control">
+          <option value="">Not specified</option>
+
+          <?php foreach ($instruments as $instrument) { ?>
+          <option value="<?php echo $instrument->uid; ?>"> <?php echo $instrument->title; ?></option>
+          <?php } ?>
+
+        </select>
+
+      </div>
+
+      <div class="form-group">
+        <label for="analysisService">Analysis Service <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Select the preferred instrument"></i></label>
+
+        <select name="analysisServices[]" multiple="multiple" id="analysisService" class="form-control">
+          <?php foreach ($analysisServices as $analysisService) { ?>
+            <option value="<?php echo $analysisService->uid;?>"><?php echo $analysisService->title; ?></option>
+          <?php } ?>
+        </select>
+      </div>
+      <h4 for="layout">Worksheet Layout <span class="badge badge-danger">Required</span> <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="Specify the size of the Worksheet, e.g. corresponding to a specific instrument's tray size. 
+                  Then select an Analysis 'type' per Worksheet position. Where QC samples are selected, also select which Reference Sample should be used.
+                   If a duplicate analysis is selected, indicate which sample position it should be a duplicate of"></i> </h4>
+      <br>
+      <div class="form-group">
+        <table class="table"> 
+          <thead>
+            <tr>
+              <th>Pos</th>
+              <th>Analysis Type</th>
+              <th>Reference Definition</th>
+              <th>Dup of  <i class="fas fa-question-circle fa-sm" data-toggle="tooltip"
+                  data-placement="top" title="(only if analysis type is a duplicate)"></i></th>
+            </tr>
+          </thead>
+          <tbody id="posContainer">
+            <?php for ($i = 0; $i < 5; $i++) { ?>
+              <tr>
+                <td> <?php echo $i+1; ?></td>
+                <td>
+                  <select name="analysisTypes[]" class="form-control">
+                    <option value="">No layout</option>
+                    <option value="a">Analysis</option>
+                    <option value="d">Duplicate</option>
+                  </select>
+                </td>
+                <td></td>
+                <td>
+                  <select name="duplicateOf[]" class="form-control">
+                    <option value=""></option>
+                    <option value="1">1</option>
+                    <option value="2">2</option>
+                    <option value="3">3</option>
+                    <option value="4">4</option>
+                    <option value="5">5</option>
+                  </select>
+                </td>
+              </tr>
+
+            <?php } ?>
+          </tbody>
+        
+        </table>
+
+        
+      </div>
+
+
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+    
+
+  </div>
+</div>
+
+
+</div>
+
+<script type='text/javascript'>
+        function addFields(){
+            // Number of inputs to create
+            var number = document.getElementById("numOfPos").value;
+            // Container <div> where dynamic content will be placed
+            var container = document.getElementById("layoutFieldContainer");
+            // Clear previous contents of the container
+            while (container.hasChildNodes()) {
+                container.removeChild(container.lastChild);
+            }
+            for (i=0;i<number;i++){
+                // Append a node with a random text
+                container.appendChild(document.createTextNode("Member " + (i+1)));
+                // Create an <input> element, set its type and name attributes
+                var input = document.createElement("td");
+                input.type = "text";
+                input.name = "member" + i;
+                input.className += ' form-control';
+                container.appendChild(input);
+                // Append a line break 
+                container.appendChild(document.createElement("br"));
+            }
+        }
+</script>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/worksheets/createworksheets.php b/modules/LIMS/senaite/templates/pages/site/worksheets/createworksheets.php
new file mode 100644
index 000000000..18d118c99
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/worksheets/createworksheets.php
@@ -0,0 +1,107 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">New Worksheet</div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="analyst">Analyst <span class="badge badge-danger">Required</span></label>
+        <select name="analyst" id="analyst" class="custom-select">
+          <?php foreach ($analysts as $analyst) { ?>
+            <option value="<?php echo $analyst->username;?>"> <?php echo $analyst->fullname; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="template">Select Template</label>
+        <select name="template" id="template" class="custom-select">
+          <?php foreach ($worksheetTemplates as $worksheetTemplate) { ?>
+            <option value="<?php echo $worksheetTemplate->uid;?>"> <?php echo $worksheetTemplate->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Select Instrument</label>
+        <select name="instrument" id="instrument" class="custom-select">
+          <?php foreach ($instruments as $instrument) { ?>
+            <option value="<?php echo $instrument->uid;?>"> <?php echo $instrument->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="analyses"> Analyses <span class="badge badge-danger">Required</span>  </label>
+        <table class="table w-100">
+          <thead>
+            <tr>
+              <th> <input class="form-control" type="checkbox" id="check-all" onchange="checkAll()"/></th>
+              <th>Priority</th>
+              <th>Client</th>
+              <th>Order</th>
+              <th>Request ID</th>
+              <th>Category</th>
+              <th>Analysis</th>
+            </tr>
+          </thead>
+          <tbody>
+            <?php foreach ($analyses as $analysis) {
+                  $analysisData = getDataFromUrl($client, $analysis->api_url)[0];
+                  $aRequestData = getDataFromUrl($client, $analysisData->parent_url)[0];
+                  $aCategoryData = getDataFromUrl($client, $analysisData->Category->api_url)[0];
+                  $clientData = getDataFromUrl($client, $aRequestData->Client->api_url)[0];
+              ?>
+              <tr> 
+                <td><input class="form-control" value="<?php echo $analysis->uid; ?>" type="checkbox" name="analyses[]" id="checkbox-<?php echo $analysis->uid;?>" name="<?php echo $analysis->uid; ?>" /></td>
+                <td><?php echo $aRequestData->Priority; ?></td>
+                <td><?php echo $clientData->title; ?></td>
+                <td><?php echo $aRequestData->ClientOrderNumber; ?></td>
+                <td><?php echo $analysisData->parent_id; ?></td>
+                <td><?php echo $aCategoryData->title; ?></td>
+                <td><?php echo $analysisData->title; ?></td>
+              </tr>
+           <?php  } ?>
+          </tbody>
+        </table>
+      </div>
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+  </div>
+</div>
+</div>
+
+<script type="text/javascript">
+
+  function checkAll() {
+    var checkAll = document.getElementById('check-all');
+    if (checkAll.checked == true) {
+      var elements = document.querySelectorAll('*[id^="checkbox-"]');
+      elements.forEach(function(element) {
+        element.checked = true;
+      });
+    } else {
+      var elements = document.querySelectorAll('*[id^="checkbox-"]');
+      elements.forEach(function(element) {
+        element.checked = false;
+      });
+    }
+    
+  }
+
+</script>
+
diff --git a/modules/LIMS/senaite/templates/pages/site/worksheets/templates.php b/modules/LIMS/senaite/templates/pages/site/worksheets/templates.php
new file mode 100644
index 000000000..b4ecb3c63
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/worksheets/templates.php
@@ -0,0 +1,47 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Title</th>
+              <th>Description</th>
+              <th>Instrument</th>
+              <th>Active</th>
+            </tr>
+          </thead>
+            <?php foreach ($worksheetTemplates as $worksheetTemplate) {
+              $templateData = getDataFromUrl($client, $worksheetTemplate->api_url)[0];
+
+              ?>
+            <tr>
+              <td>#</td>
+              <td> <?php echo $worksheetTemplate->title; ?> </td>
+              <td> <?php echo $worksheetTemplate->description; ?></td>
+              <td> <?php echo $templateData->InstrumentTitle; ?></td>
+              <td> <?php if ($worksheetTemplate->review_state === 'active') echo 'Active'; else echo 'Dormant'; ?></td>
+            </tr>
+              
+            <?php } ?>
+          <tbody>
+           
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=worksheet&sact=createtemplate" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/worksheets/worksheet.php b/modules/LIMS/senaite/templates/pages/site/worksheets/worksheet.php
new file mode 100644
index 000000000..503c90b2f
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/worksheets/worksheet.php
@@ -0,0 +1,108 @@
+
+  <div class="col-12">
+
+<div class="card">
+
+  <div class="card-header">Update Worksheet - <?php echo $worksheetData->title; ?></div>
+  <div class="card-body">
+  
+    <form class="mx-auto form w-50" method="POST" act="">
+      <div class="form-group">
+        <label for="analyst">Analyst <span class="badge badge-danger">Required</span></label>
+        <select name="analyst" id="analyst" class="custom-select">
+          <?php foreach ($analysts as $analyst) { ?>
+            <option value="<?php echo $analyst->username;?>" <?php if ($worksheetData->Analyst === $analyst->username) echo "selected"; ?>> <?php echo $analyst->fullname; ?> </option>
+          <?php } ?>
+           
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="template">Select Template</label>
+        <select name="template" id="template" class="custom-select">
+          <?php foreach ($worksheetTemplates as $worksheetTemplate) { ?>
+            <option value="<?php echo $worksheetTemplate->uid;?>" <?php if ($worksheetTemplate->uid === $worksheetData->WorksheetTemplate->uid) echo "selected"; ?>> <?php echo $worksheetTemplate->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="description">Select Instrument</label>
+        <select name="instrument" id="instrument" class="custom-select">
+          <?php foreach ($instruments as $instrument) { ?>
+            <option value="<?php echo $instrument->uid;?>"  <?php if ($instrument->uid === $worksheetData->Instrument->uid) echo "selected"; ?>> <?php echo $instrument->title; ?> </option>
+          <?php } ?>
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="analyses"> Analyses <span class="badge badge-danger">Required</span>  </label>
+        <table class="table w-100">
+          <thead>
+            <tr>
+              <th> <input class="form-control" type="checkbox" id="check-all" onchange="checkAll()"/></th>
+              <th>Priority</th>
+              <th>Client</th>
+              <th>Order</th>
+              <th>Request ID</th>
+              <th>Category</th>
+              <th>Analysis</th>
+            </tr>
+          </thead>
+          <tbody>
+          <?php foreach ($analyses as $analysis) {
+                  $analysisData = getDataFromUrl($client, $analysis->api_url)[0];
+                  $aRequestData = getDataFromUrl($client, $analysisData->parent_url)[0];
+                  $aCategoryData = getDataFromUrl($client, $analysisData->Category->api_url)[0];
+                  $clientData = getDataFromUrl($client, $aRequestData->Client->api_url)[0];
+              ?>
+              <tr> 
+                <td><input class="form-control" value="<?php echo $analysis->uid; ?>" type="checkbox" name="analyses[]" id="checkbox-<?php echo $analysis->uid;?>" name="<?php echo $analysis->uid; ?>" /></td>
+                <td><?php echo $aRequestData->Priority; ?></td>
+                <td><?php echo $clientData->title; ?></td>
+                <td><?php echo $aRequestData->ClientOrderNumber; ?></td>
+                <td><?php echo $analysisData->parent_id; ?></td>
+                <td><?php echo $aCategoryData->title; ?></td>
+                <td><?php echo $analysisData->title; ?></td>
+              </tr>
+           <?php  } ?>
+          </tbody>
+        </table>
+      </div>
+
+      <button name="submit" class="btn btn-primary">Create</button>
+    </form>
+    <br />
+    <?php if (count($errors) > 0) { ?>
+      <div class="alert alert-danger w-50 mx-auto">
+        <ul>
+          <?php foreach($errors as $error) { ?>
+            <li> <?php echo $error; ?> </li>
+          <?php } ?>
+        </ul>
+      </div>
+    <?php } ?>
+  </div>
+</div>
+</div>
+
+
+<script type="text/javascript">
+
+function checkAll() {
+  var checkAll = document.getElementById('check-all');
+  if (checkAll.checked == true) {
+    var elements = document.querySelectorAll('*[id^="checkbox-"]');
+    elements.forEach(function(element) {
+      element.checked = true;
+    });
+  } else {
+    var elements = document.querySelectorAll('*[id^="checkbox-"]');
+    elements.forEach(function(element) {
+      element.checked = false;
+    });
+  }
+  
+}
+
+</script>
\ No newline at end of file
diff --git a/modules/LIMS/senaite/templates/pages/site/worksheets/worksheets.php b/modules/LIMS/senaite/templates/pages/site/worksheets/worksheets.php
new file mode 100644
index 000000000..45c48f5b8
--- /dev/null
+++ b/modules/LIMS/senaite/templates/pages/site/worksheets/worksheets.php
@@ -0,0 +1,55 @@
+
+  <div class="col-12">
+    
+    <div class="card">
+      <div class="card-header">Sample Types</div>
+      <div class="card-body">
+
+        <table class="table">
+          <thead>
+            <tr>
+              <th>#</th>
+              <th>Worksheet</th>
+              <th>Analyst</th>
+              <th>Template</th>
+              <th>Samples</th>
+              <th>QC Analyses</th>
+              <th>Routine Analyses</th>
+              <th>State</th>
+            </tr>
+          </thead>
+            <?php foreach ($worksheets as $worksheet) {
+              $worksheetData = getDataFromUrl($client, $worksheet->api_url)[0];
+              $analystDetails = getDataFromUrl($client, 'users/'.$worksheet->Analyst)[0];
+              $worksheetTemplateData = getDataFromUrl($client, $worksheetData->WorksheetTemplate->api_url)[0];
+
+              ?>
+            <tr>
+              <td>#</td>
+              <td><a href="index.php?action=worksheet&sact=worksheet&id=<?php echo $worksheetData->uid; ?>"><?php echo $worksheetData->title; ?></a></td>
+              <td><?php echo $analystDetails->fullname; ?></td>
+              <td><?php echo $worksheetTemplateData->title; ?></td>
+              <td><?php echo count($worksheetData->Analyses); ?></td>
+              <td>0</td>
+              <td><?php echo count($worksheetData->Analyses); ?></td>
+              <td><?php echo $worksheet->review_state; ?></td>
+            </tr>
+              
+            <?php } ?>
+          <tbody>
+           
+          </tbody>
+        
+        
+        </table>
+
+        <a href="index.php?action=worksheet&sact=createworksheets" class="btn btn-outline-success">Create new</a>
+
+
+
+      </div>
+    </div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/sites/default/roles.json b/sites/default/roles.json
index efb176f6a..7e582eb38 100644
--- a/sites/default/roles.json
+++ b/sites/default/roles.json
@@ -1,1634 +1,2031 @@
-[ { 
-    "title" : "Default Role",
-    "menu_data" : [ { 
-        "label" : "Calendar",
-        "menu_id" : "cal0",
-        "target" : "cal",
-        "url" : "/interface/main/main_info.php",
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Flow Board",
-        "menu_id" : "pfb0",
-        "target" : "flb",
-        "url" : "/interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1",
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : "!disable_pat_trkr",
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Messages ",
-        "menu_id" : "msg0",
-        "target" : "pat",
-        "url" : "/interface/main/messages/messages.php?form_active=1",
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Patient/Client",
-        "menu_id" : "patimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Finder",
-            "menu_id" : "fin0",
-            "target" : "fin",
-            "url" : "/interface/main/finder/dynamic_finder.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Add New/Search",
-            "menu_id" : "new0",
-            "target" : "pat",
-            "url" : "/interface/new/new.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Recycle bin",
-            "menu_id" : "rbin",
-            "target" : "rbin0",
-            "url" : "/interface/patient_file/recover.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Summary",
-            "menu_id" : "dem1",
-            "target" : "pat",
-            "url" : "/interface/patient_file/summary/demographics.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Visits",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Create Visit",
-                "menu_id" : "nen1",
-                "target" : "enc",
-                "url" : "/interface/forms/patient_encounter/new.php?autoloaded=1&calenc=",
-                "children" : [ ],
-                "requirement" : 1,
-                "parent" : "Visits",
-                "mainParent" : "patimg"
-            }, { 
-                "label" : "Current",
-                "menu_id" : "enc2",
-                "target" : "enc",
-                "url" : "/interface/patient_file/encounter/encounter_top.php",
-                "children" : [ ],
-                "requirement" : 3,
-                "parent" : "Visits",
-                "mainParent" : "patimg"
-            }, { 
-                "label" : "Visit History",
-                "menu_id" : "ens1",
-                "target" : "enc",
-                "url" : "/interface/patient_file/history/encounters.php",
-                "children" : [ ],
-                "requirement" : 1,
-                "parent" : "Visits",
-                "mainParent" : "patimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Records",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Patient Record Request",
-                "menu_id" : "prq1",
-                "target" : "enc",
-                "url" : "/interface/patient_file/transaction/record_request.php",
-                "children" : [ ],
-                "requirement" : 1,
-                "parent" : "Records",
-                "mainParent" : "patimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Visit Forms",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Import",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Upload",
-                "menu_id" : "ccr0",
-                "target" : "pat",
-                "url" : "/interface/patient_file/ccr_import.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Import",
-                "mainParent" : "patimg"
-            }, { 
-                "label" : "Pending Approval",
-                "menu_id" : "apr0",
-                "target" : "pat",
-                "url" : "/interface/patient_file/ccr_pending_approval.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Import",
-                "mainParent" : "patimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Fees",
-        "menu_id" : "feeimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Fee Sheet",
-            "menu_id" : "cod2",
-            "target" : "enc",
-            "url" : "/interface/patient_file/encounter/load_form.php?formname=fee_sheet",
-            "children" : [ ],
-            "requirement" : 2,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "Payment",
-            "menu_id" : "pay1",
-            "target" : "enc",
-            "url" : "/interface/patient_file/front_payment.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "Checkout",
-            "menu_id" : "bil1",
-            "target" : "enc",
-            "url" : "/interface/patient_file/pos_checkout.php?framed=1",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "Billing",
-            "menu_id" : "bil0",
-            "target" : "pat",
-            "url" : "/interface/billing/billing_report.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : "!simplified_demographics"
-        }, { 
-            "label" : "Posting",
-            "menu_id" : "bil0",
-            "target" : "pat",
-            "url" : "/interface/billing/sl_eob_search.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "Batch Payments",
-            "menu_id" : "npa0",
-            "target" : "pat",
-            "url" : "/interface/billing/new_payment.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "Verify Patient Billing Data",
-            "menu_id" : "npa0",
-            "target" : "pat",
-            "url" : "/interface/reports/pre_billing_issues.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : null
-        }, { 
-            "label" : "EDI History",
-            "menu_id" : "edi0",
-            "target" : "pat",
-            "url" : "/interface/billing/edih_view.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "feeimg",
-            "global_req" : "enable_edihistory_in_menu"
-        } ],
-        "requirement" : 0,
-        "global_req" : "enable_fees_in_menu",
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Inventory",
-        "menu_id" : "invimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Management",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/drugs/drug_inventory.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "invimg",
-            "global_req" : null
-        }, { 
-            "label" : "Destroyed",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/reports/destroyed_drugs_report.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "invimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : "inhouse_pharmacy",
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Procedures",
-        "menu_id" : "proimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Providers",
-            "menu_id" : "orl0",
-            "target" : "pat",
-            "url" : "/interface/orders/procedure_provider_list.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Configuration",
-            "menu_id" : "ort0",
-            "target" : "pat",
-            "url" : "/interface/orders/types.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Load Compendium",
-            "menu_id" : "orc0",
-            "target" : "pat",
-            "url" : "/interface/orders/load_compendium.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Pending Review",
-            "menu_id" : "orp1",
-            "target" : "enc",
-            "url" : "/interface/orders/orders_results.php?review=1",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Patient Results",
-            "menu_id" : "orr1",
-            "target" : "enc",
-            "url" : "/interface/orders/orders_results.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Lab Overview",
-            "menu_id" : "lda1",
-            "target" : "enc",
-            "url" : "/interface/patient_file/summary/labdata.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Batch Results",
-            "menu_id" : "orb0",
-            "target" : "pat",
-            "url" : "/interface/orders/orders_results.php?batch=1",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Electronic Reports",
-            "menu_id" : "ore0",
-            "target" : "pat",
-            "url" : "/interface/orders/list_reports.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        }, { 
-            "label" : "Lab Documents",
-            "menu_id" : "dld0",
-            "target" : "pat",
-            "url" : "/interface/main/display_documents.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "proimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "New Crop",
-        "menu_id" : "feeimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 1,
-        "global_req" : [ "erx_enable", "newcrop_user_role" ],
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Administration",
-        "menu_id" : "admimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Globals",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/edit_globals.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Edit Menu",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/main/tabs/edit_menu.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : "!role_based_menu_status"
-        }, { 
-            "label" : "Manage Roles",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/main/tabs/edit_roles.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : "role_based_menu_status"
-        }, { 
-            "label" : "Facilities",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/usergroup/facilities.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Users",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/usergroup/usergroup_admin.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Addr Book",
-            "menu_id" : "adb0",
-            "target" : "adm",
-            "url" : "/interface/usergroup/addrbook_list.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Practice",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/controller.php?practice_settings&pharmacy&action=list",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Codes",
-            "menu_id" : "sup0",
-            "target" : "adm",
-            "url" : "/interface/patient_file/encounter/superbill_custom_full.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Layouts",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/edit_layout.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Lists",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/edit_list.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "ACL",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/usergroup/adminacl.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Files",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/manage_site_files.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Backup",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/main/backup.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        }, { 
-            "label" : "Rules",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/rules/index.php?action=browse!list",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : "enable_cdr"
-        }, { 
-            "label" : "Alerts",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/super/rules/index.php?action=alerts!listactmgr",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : "enable_cdr"
-        }, { 
-            "label" : "Patient Reminders",
-            "menu_id" : "adm0",
-            "target" : "adm",
-            "url" : "/interface/patient_file/reminder/patient_reminders.php?mode=admin&patient_id=",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : "enable_cdr"
-        }, { 
-            "label" : "Other",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Language",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/language/language.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "language" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Forms",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/forms_admin/forms_admin.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "forms" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Calendar Administration",
-                "menu_id" : "adm0",
-                "target" : "lst",
-                "url" : "/modules/calendar/admin.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "calendar" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Logs",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/logview/logview.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "users" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Database",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "##SQL_ADMIN##",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "database" ],
-                "global_req" : "!disable_sql_admin_link",
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "eRx Logs",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/logview/erx_logview.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "super" ],
-                "global_req" : [ "erx_enable", "newcrop_user_role" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Certificates",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/usergroup/ssl_certificates_admin.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "users" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Native Data Loads",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/super/load_codes.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "super" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "External Data Loads",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/code_systems/dataloads_ajax.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "acl_req" : [ "admin", "super" ],
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Merge Encounters",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/modules/merge_encounters/index.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Merge Patients",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/patient_file/merge_patients.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            }, { 
-                "label" : "Audit Log Tamper",
-                "menu_id" : "adm0",
-                "target" : "adm",
-                "url" : "/interface/reports/audit_log_tamper_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "global_req" : "enable_auditlog_encryption",
-                "parent" : "Other",
-                "mainParent" : "admimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "admimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Reports",
-        "menu_id" : "repimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Clients",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Patient List",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/patient_list.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Patient List By Referrer",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/patient_list_by_referrer.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Prescriptions and Dispensations",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/prescriptions_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "global_req" : "!disable_prescriptions",
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Patient List Creation",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/patient_list_creation.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Clinical",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/clinical_reports.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Immunization Registry",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/immunization_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Clients",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Visits",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Appointments",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/appointments_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Patient Flow Board",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/patient_flow_board_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "global_req" : "!disable_pat_trkr",
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Encounters",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/encounters_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Patient Billing Encounter by Carrier",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/encounters_report_carrier.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Appointments and Encounters",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/appt_encounter_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Superbill",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/custom_report_range.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Eligibility",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/edi_270.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Eligibility Response",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/edi_271.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Claim Status Request",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/edi_276.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Chart Location Activity",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/chart_location_activity.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "global_req" : "!disable_chart_tracker",
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Charts Checked Out",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/charts_checked_out.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "global_req" : "!disable_chart_tracker",
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Services by Category",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/services_by_category.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Syndromic Surveillance",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/non_reported.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Visits",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Financial",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Sales by Item",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/sales_by_item.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Cash Receipts by Provider",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/billing/sl_receipts_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Front Office Receipts",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/front_receipts_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Receipts Summary",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/receipts_by_method_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Collections",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/collections_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Patient Ledger by Date",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/pat_ledger.php?form=0",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Adjustments",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/adjustments.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Financial Summary by Service Code",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/svc_code_financial_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Financial",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Inventory",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "List",
-                "url" : "/interface/reports/inventory_list.php",
-                "target" : "rep",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Inventory",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Activity",
-                "url" : "/interface/reports/inventory_activity.php",
-                "target" : "rep",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Inventory",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Transactions",
-                "url" : "/interface/reports/inventory_transactions.php",
-                "target" : "rep",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Inventory",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : "inhouse_pharmacy"
-        }, { 
-            "label" : "Procedures",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Pending Orders",
-                "url" : "/interface/orders/pending_orders.php",
-                "target" : "rep",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Procedures",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Procedure Statistics",
-                "url" : "/interface/orders/procedure_stats.php",
-                "target" : "rep",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Procedures",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Insurance",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Patient Insurance Distribution",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/insurance_allocation_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Insurance",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Indigent Patients",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/billing/indigent_patients_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Insurance",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Unique Seen Patients",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/unique_seen_patients_report.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Insurance",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Blank Forms",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        }, { 
-            "label" : "Services",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Background Services",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/background_services.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Services",
-                "mainParent" : "repimg"
-            }, { 
-                "label" : "Direct Message Log",
-                "menu_id" : "rep0",
-                "target" : "rep",
-                "url" : "/interface/reports/direct_message_log.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Services",
-                "mainParent" : "repimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "repimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : null,
-        "menu_id" : null,
-        "target" : null,
-        "url" : null,
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Miscellaneous",
-        "menu_id" : "misimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Patient Education",
-            "menu_id" : "ped0",
-            "target" : "msc",
-            "url" : "/interface/reports/patient_edu_web_lookup.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Portal Dashboard",
-            "menu_id" : "por2",
-            "target" : "por",
-            "url" : "/patient_portal/patient/provider",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Authorizations",
-            "menu_id" : "aun0",
-            "target" : "msc",
-            "url" : "/interface/main/authorizations/authorizations.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Addr Book",
-            "menu_id" : "adb0",
-            "target" : "msc",
-            "url" : "/interface/usergroup/addrbook_list.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Order Catalog",
-            "menu_id" : "ort0",
-            "target" : "msc",
-            "url" : "/interface/orders/types.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Chart Tracker",
-            "menu_id" : "cht0",
-            "target" : "msc",
-            "url" : "/custom/chart_tracker.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : "!disable_chart_tracker"
-        }, { 
-            "label" : "BatchCom",
-            "menu_id" : "adm0",
-            "target" : "msc",
-            "url" : "/interface/batchcom/batchcom.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Pass Phrase",
-            "menu_id" : "pwd0",
-            "target" : "msc",
-            "url" : "/interface/usergroup/user_info.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Preferences",
-            "menu_id" : "prf0",
-            "target" : "msc",
-            "url" : "/interface/super/edit_globals.php?mode=user",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "New Documents",
-            "menu_id" : "adm0",
-            "target" : "msc",
-            "url" : "/controller.php?document&list&patient_id=00",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Utilities",
-            "menu_id" : null,
-            "target" : null,
-            "url" : null,
-            "children" : [ { 
-                "label" : "Validate Attached Documents",
-                "menu_id" : "adm0",
-                "target" : "msc",
-                "url" : "/interface/usergroup/docs_validation.php",
-                "children" : [ ],
-                "requirement" : 0,
-                "parent" : "Utilities",
-                "mainParent" : "misimg"
-            } ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        }, { 
-            "label" : "Document Templates",
-            "menu_id" : "adm0",
-            "target" : "msc",
-            "url" : "/interface/super/manage_document_templates.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "misimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Popups",
-        "menu_id" : "popup",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Issues",
-            "menu_id" : "Popup:Issues",
-            "target" : "pop",
-            "url" : "/interface/patient_file/problem_encounter.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Export",
-            "menu_id" : "Popup:Export",
-            "target" : "pop",
-            "url" : "/interface/../custom/export_xml.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Import",
-            "menu_id" : "Popup:Import",
-            "target" : "pop",
-            "url" : "/interface/../custom/import_xml.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Appts",
-            "menu_id" : "Popup:Appts",
-            "target" : "pop",
-            "url" : "/interface/reports/appointments_report.php?patient=",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Superbill",
-            "menu_id" : "Popup:Superbill",
-            "target" : "pop",
-            "url" : "/interface/patient_file/printed_fee_sheet.php?fill=1",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Payment",
-            "menu_id" : "Popup:Payment",
-            "target" : "pop",
-            "url" : "/interface/patient_file/front_payment.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Letter",
-            "menu_id" : "Popup:Letter",
-            "target" : "pop",
-            "url" : "/interface/patient_file/letter.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : null
-        }, { 
-            "label" : "Chart Label",
-            "menu_id" : "Popup:Chart Label",
-            "target" : "pop",
-            "url" : "/interface/patient_file/label.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : "chart_label_type"
-        }, { 
-            "label" : "Barcode Label",
-            "menu_id" : "Popup:Barcode Label",
-            "target" : "pop",
-            "url" : "/interface/patient_file/barcode_label.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : "barcode_label_type"
-        }, { 
-            "label" : "Address Label",
-            "menu_id" : "Popup:Address Label",
-            "target" : "pop",
-            "url" : "/interface/patient_file/addr_label.php",
-            "children" : [ ],
-            "requirement" : 1,
-            "mainParent" : null,
-            "parent" : "popup",
-            "global_req" : "addr_label_type"
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "QA Measures",
-        "menu_id" : "mips",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "View Reports",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/report_results.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : null
-        }, { 
-            "label" : "Create MIPS Report",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/clinical_measures.php?type=pqrs",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "enable_pqrs"
-        }, { 
-            "label" : "Select Measures",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/measure_activate.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "enable_pqrs"
-        }, { 
-            "label" : "Delete Old Reports",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/truncate_reports.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "enable_pqrs"
-        }, { 
-            "label" : "Report Database Import",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/import_data.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "pqrs_demosystem"
-        }, { 
-            "label" : "Remove_Provider_Assignments",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/reset_provider_to_unassigned.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "enable_pqrs"
-        }, { 
-            "label" : "Provider Encounter Counts",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/provider_encounter_counts.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : null
-        }, { 
-            "label" : "Upload Claim Files",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/filemanager/index.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : null
-        }, { 
-            "label" : "Change Demo Database",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/reload_demo_database.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : "pqrs_demosystem"
-        }, { 
-            "label" : "XML Editor",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/modules/MIPS/xmleditor/index.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : null
-        }, { 
-            "label" : "Alerts Log",
-            "menu_id" : "rep0",
-            "target" : "rep",
-            "url" : "/interface/reports/cdr_log.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "mips",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : "enable_pqrs",
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Help",
-        "menu_id" : "modimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "About",
-            "menu_id" : "adm0",
-            "target" : "pat",
-            "url" : "/interface/main/about_page.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "modimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    } ],
-    "item_list" : [ "cb-parent-cal0-Calendar", "cb-parent-msg0-Messages ", "cb-parent-patimg-Patient/Client", "cb-child1-patimg-Finder", "cb-child1-patimg-Add New/Search", "cb-child1-patimg-Summary", "cb-child1-patimg-Visits", "cb-child2-patimg-Patient/Client-Create Visit", "cb-child2-patimg-Patient/Client-Current", "cb-child2-patimg-Patient/Client-Visit History", "cb-child1-patimg-Records", "cb-child2-patimg-Patient/Client-Patient Record Request", "cb-child1-patimg-Visit Forms", "cb-child1-patimg-Import", "cb-child2-patimg-Patient/Client-Upload", "cb-child2-patimg-Patient/Client-Pending Approval", "cb-parent-feeimg-Fees", "cb-child1-feeimg-Fee Sheet", "cb-child1-feeimg-Payment", "cb-child1-feeimg-Checkout", "cb-child1-feeimg-Billing", "cb-child1-feeimg-Posting", "cb-child1-feeimg-Batch Payments", "cb-child1-feeimg-Verify Patient Billing Data", "cb-child1-feeimg-EDI History", "cb-parent-invimg-Inventory", "cb-child1-invimg-Management", "cb-child1-invimg-Destroyed", "cb-parent-proimg-Procedures", "cb-child1-proimg-Providers", "cb-child1-proimg-Configuration", "cb-child1-proimg-Load Compendium", "cb-child1-proimg-Pending Review", "cb-child1-proimg-Patient Results", "cb-child1-proimg-Lab Overview", "cb-child1-proimg-Batch Results", "cb-child1-proimg-Electronic Reports", "cb-child1-proimg-Lab Documents", "cb-parent-feeimg-New Crop", "cb-child1-feeimg-e-Rx", "cb-child1-feeimg-e-Rx Renewal", "cb-child1-feeimg-e-Rx EPCS", "cb-parent-admimg-Administration", "cb-child1-admimg-Globals", "cb-child1-admimg-Edit Menu", "cb-child1-admimg-Manage Roles", "cb-child1-admimg-Facilities", "cb-child1-admimg-Users", "cb-child1-admimg-Addr Book", "cb-child1-admimg-Practice", "cb-child1-admimg-Codes", "cb-child1-admimg-Layouts", "cb-child1-admimg-Lists", "cb-child1-admimg-ACL", "cb-child1-admimg-Files", "cb-child1-admimg-Backup", "cb-child1-admimg-Rules", "cb-child1-admimg-Alerts", "cb-child1-admimg-Patient Reminders", "cb-child1-admimg-Other", "cb-child2-admimg-Administration-Language", "cb-child2-admimg-Administration-Forms", "cb-child2-admimg-Administration-Calendar Administration", "cb-child2-admimg-Administration-Logs", "cb-child2-admimg-Administration-Database", "cb-child2-admimg-Administration-eRx Logs", "cb-child2-admimg-Administration-Certificates", "cb-child2-admimg-Administration-Native Data Loads", "cb-child2-admimg-Administration-External Data Loads", "cb-child2-admimg-Administration-Merge Encounters", "cb-child2-admimg-Administration-Merge Patients", "cb-child2-admimg-Administration-Audit Log Tamper", "cb-parent-repimg-Reports", "cb-child1-repimg-Clients", "cb-child2-repimg-Reports-Patient List", "cb-child2-repimg-Reports-Patient List By Referrer", "cb-child2-repimg-Reports-Prescriptions and Dispensations", "cb-child2-repimg-Reports-Patient List Creation", "cb-child2-repimg-Reports-Clinical", "cb-child2-repimg-Reports-Immunization Registry", "cb-child1-repimg-Visits", "cb-child2-repimg-Reports-Appointments", "cb-child2-repimg-Reports-Patient Flow Board", "cb-child2-repimg-Reports-Encounters", "cb-child2-repimg-Reports-Patient Billing Encounter by Carrier", "cb-child2-repimg-Reports-Appointments and Encounters", "cb-child2-repimg-Reports-Superbill", "cb-child2-repimg-Reports-Eligibility", "cb-child2-repimg-Reports-Eligibility Response", "cb-child2-repimg-Reports-Claim Status Request", "cb-child2-repimg-Reports-Chart Location Activity", "cb-child2-repimg-Reports-Charts Checked Out", "cb-child2-repimg-Reports-Services by Category", "cb-child2-repimg-Reports-Syndromic Surveillance", "cb-child1-repimg-Financial", "cb-child2-repimg-Reports-Sales by Item", "cb-child2-repimg-Reports-Cash Receipts by Provider", "cb-child2-repimg-Reports-Front Office Receipts", "cb-child2-repimg-Reports-Receipts Summary", "cb-child2-repimg-Reports-Collections", "cb-child2-repimg-Reports-Patient Ledger by Date", "cb-child2-repimg-Reports-Adjustments", "cb-child2-repimg-Reports-Financial Summary by Service Code", "cb-child1-repimg-Inventory", "cb-child2-repimg-Reports-List", "cb-child2-repimg-Reports-Activity", "cb-child2-repimg-Reports-Transactions", "cb-child1-repimg-Procedures", "cb-child2-repimg-Reports-Pending Orders", "cb-child2-repimg-Reports-Procedure Statistics", "cb-child1-repimg-Insurance", "cb-child2-repimg-Reports-Patient Insurance Distribution", "cb-child2-repimg-Reports-Indigent Patients", "cb-child2-repimg-Reports-Unique Seen Patients", "cb-child1-repimg-Blank Forms", "cb-child2-repimg-Reports-Demographics", "cb-child2-repimg-Reports-Superbill/Fee Sheet", "cb-child2-repimg-Reports-Referral", "cb-child1-repimg-Services", "cb-child2-repimg-Reports-Background Services", "cb-child2-repimg-Reports-Direct Message Log", "cb-parent-misimg-Miscellaneous", "cb-child1-misimg-Patient Education", "cb-child1-misimg-Portal Dashboard", "cb-child1-misimg-Authorizations", "cb-child1-misimg-Addr Book", "cb-child1-misimg-Order Catalog", "cb-child1-misimg-Chart Tracker", "cb-child1-misimg-BatchCom", "cb-child1-misimg-Pass Phrase", "cb-child1-misimg-Preferences", "cb-child1-misimg-Utilities", "cb-child1-misimg-New Documents", "cb-child2-misimg-Miscellaneous-Validate Attached Documents", "cb-child1-misimg-Document Templates", "cb-parent-popup-Popups", "cb-child1-popup-Issues", "cb-child1-popup-Export", "cb-child1-popup-Import", "cb-child1-popup-Appts", "cb-child1-popup-Superbill", "cb-child1-popup-Payment", "cb-child1-popup-Letter", "cb-child1-popup-Chart Label", "cb-child1-popup-Barcode Label", "cb-child1-popup-Address Label", "cb-parent-mips-QA Measures", "cb-child1-mips-View Reports", "cb-child1-mips-Create MIPS Report", "cb-child1-mips-Select Measures", "cb-child1-mips-Delete Old Reports", "cb-child1-mips-Report Database Import", "cb-child1-mips-Remove_Provider_Assignments", "cb-child1-mips-Provider Encounter Counts", "cb-child1-mips-Upload Claim Files", "cb-child1-mips-Change Demo Database", "cb-child1-mips-XML Editor", "cb-child1-mips-Alerts Log", "cb-parent-modimg-Help", "cb-child1-modimg-About", "cb-parent-pfb0-Flow Board", "cb-child1-patimg-Recycle bin" ]
-}, { 
-    "title" : "Front Desk",
-    "menu_data" : [ { 
-        "label" : "Calendar",
-        "menu_id" : "cal0",
-        "target" : "cal",
-        "url" : "/interface/main/main_info.php",
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Flow Board",
-        "menu_id" : "pfb0",
-        "target" : "flb",
-        "url" : "/interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1",
-        "children" : [ ],
-        "requirement" : 0,
-        "global_req" : "!disable_pat_trkr",
-        "parent" : null,
-        "mainParent" : null
-    }, { 
-        "label" : "Patient/Client",
-        "menu_id" : "patimg",
-        "target" : null,
-        "url" : null,
-        "children" : [ { 
-            "label" : "Finder",
-            "menu_id" : "fin0",
-            "target" : "fin",
-            "url" : "/interface/main/finder/dynamic_finder.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        }, { 
-            "label" : "Add New/Search",
-            "menu_id" : "new0",
-            "target" : "pat",
-            "url" : "/interface/new/new.php",
-            "children" : [ ],
-            "requirement" : 0,
-            "mainParent" : null,
-            "parent" : "patimg",
-            "global_req" : null
-        } ],
-        "requirement" : 0,
-        "global_req" : null,
-        "parent" : null,
-        "mainParent" : null
-    } ],
-    "item_list" : [ "cb-parent-cal0-Calendar", "cb-parent-patimg-Patient/Client", "cb-child1-patimg-Finder", "cb-child1-patimg-Add New/Search", "cb-parent-pfb0-Flow Board" ]
-} ]
+[
+    {
+        "title": "Default Role",
+        "menu_data": [
+            {
+                "label": "Calendar",
+                "menu_id": "cal0",
+                "target": "cal",
+                "url": "/interface/main/main_info.php",
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Flow Board",
+                "menu_id": "pfb0",
+                "target": "flb",
+                "url": "/interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1",
+                "children": [],
+                "requirement": 0,
+                "global_req": "!disable_pat_trkr",
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Messages ",
+                "menu_id": "msg0",
+                "target": "pat",
+                "url": "/interface/main/messages/messages.php?form_active=1",
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Patient/Client",
+                "menu_id": "patimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Finder",
+                        "menu_id": "fin0",
+                        "target": "fin",
+                        "url": "/interface/main/finder/dynamic_finder.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Add New/Search",
+                        "menu_id": "new0",
+                        "target": "pat",
+                        "url": "/interface/new/new.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Recycle bin",
+                        "menu_id": "rbin",
+                        "target": "rbin0",
+                        "url": "/interface/patient_file/recover.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Summary",
+                        "menu_id": "dem1",
+                        "target": "pat",
+                        "url": "/interface/patient_file/summary/demographics.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Visits",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Create Visit",
+                                "menu_id": "nen1",
+                                "target": "enc",
+                                "url": "/interface/forms/patient_encounter/new.php?autoloaded=1&calenc=",
+                                "children": [],
+                                "requirement": 1,
+                                "parent": "Visits",
+                                "mainParent": "patimg"
+                            },
+                            {
+                                "label": "Current",
+                                "menu_id": "enc2",
+                                "target": "enc",
+                                "url": "/interface/patient_file/encounter/encounter_top.php",
+                                "children": [],
+                                "requirement": 3,
+                                "parent": "Visits",
+                                "mainParent": "patimg"
+                            },
+                            {
+                                "label": "Visit History",
+                                "menu_id": "ens1",
+                                "target": "enc",
+                                "url": "/interface/patient_file/history/encounters.php",
+                                "children": [],
+                                "requirement": 1,
+                                "parent": "Visits",
+                                "mainParent": "patimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Records",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Patient Record Request",
+                                "menu_id": "prq1",
+                                "target": "enc",
+                                "url": "/interface/patient_file/transaction/record_request.php",
+                                "children": [],
+                                "requirement": 1,
+                                "parent": "Records",
+                                "mainParent": "patimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Visit Forms",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Import",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Upload",
+                                "menu_id": "ccr0",
+                                "target": "pat",
+                                "url": "/interface/patient_file/ccr_import.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Import",
+                                "mainParent": "patimg"
+                            },
+                            {
+                                "label": "Pending Approval",
+                                "menu_id": "apr0",
+                                "target": "pat",
+                                "url": "/interface/patient_file/ccr_pending_approval.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Import",
+                                "mainParent": "patimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Fees",
+                "menu_id": "feeimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Fee Sheet",
+                        "menu_id": "cod2",
+                        "target": "enc",
+                        "url": "/interface/patient_file/encounter/load_form.php?formname=fee_sheet",
+                        "children": [],
+                        "requirement": 2,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Payment",
+                        "menu_id": "pay1",
+                        "target": "enc",
+                        "url": "/interface/patient_file/front_payment.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Checkout",
+                        "menu_id": "bil1",
+                        "target": "enc",
+                        "url": "/interface/patient_file/pos_checkout.php?framed=1",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Billing",
+                        "menu_id": "bil0",
+                        "target": "pat",
+                        "url": "/interface/billing/billing_report.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": "!simplified_demographics"
+                    },
+                    {
+                        "label": "Posting",
+                        "menu_id": "bil0",
+                        "target": "pat",
+                        "url": "/interface/billing/sl_eob_search.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Batch Payments",
+                        "menu_id": "npa0",
+                        "target": "pat",
+                        "url": "/interface/billing/new_payment.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Verify Patient Billing Data",
+                        "menu_id": "npa0",
+                        "target": "pat",
+                        "url": "/interface/reports/pre_billing_issues.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "EDI History",
+                        "menu_id": "edi0",
+                        "target": "pat",
+                        "url": "/interface/billing/edih_view.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "feeimg",
+                        "global_req": "enable_edihistory_in_menu"
+                    }
+                ],
+                "requirement": 0,
+                "global_req": "enable_fees_in_menu",
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Inventory",
+                "menu_id": "invimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Management",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/drugs/drug_inventory.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "invimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Destroyed",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/reports/destroyed_drugs_report.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "invimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": "inhouse_pharmacy",
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Procedures",
+                "menu_id": "proimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Providers",
+                        "menu_id": "orl0",
+                        "target": "pat",
+                        "url": "/interface/orders/procedure_provider_list.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Configuration",
+                        "menu_id": "ort0",
+                        "target": "pat",
+                        "url": "/interface/orders/types.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Load Compendium",
+                        "menu_id": "orc0",
+                        "target": "pat",
+                        "url": "/interface/orders/load_compendium.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Pending Review",
+                        "menu_id": "orp1",
+                        "target": "enc",
+                        "url": "/interface/orders/orders_results.php?review=1",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Patient Results",
+                        "menu_id": "orr1",
+                        "target": "enc",
+                        "url": "/interface/orders/orders_results.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Lab Overview",
+                        "menu_id": "lda1",
+                        "target": "enc",
+                        "url": "/interface/patient_file/summary/labdata.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Batch Results",
+                        "menu_id": "orb0",
+                        "target": "pat",
+                        "url": "/interface/orders/orders_results.php?batch=1",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Electronic Reports",
+                        "menu_id": "ore0",
+                        "target": "pat",
+                        "url": "/interface/orders/list_reports.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Lab Documents",
+                        "menu_id": "dld0",
+                        "target": "pat",
+                        "url": "/interface/main/display_documents.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "proimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "New Crop",
+                "menu_id": "feeimg",
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 1,
+                "global_req": [
+                    "erx_enable",
+                    "newcrop_user_role"
+                ],
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Administration",
+                "menu_id": "admimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Globals",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/edit_globals.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Edit Menu",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/main/tabs/edit_menu.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": "!role_based_menu_status"
+                    },
+                    {
+                        "label": "Manage Roles",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/main/tabs/edit_roles.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": "role_based_menu_status"
+                    },
+                    {
+                        "label": "Facilities",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/usergroup/facilities.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Users",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/usergroup/usergroup_admin.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Addr Book",
+                        "menu_id": "adb0",
+                        "target": "adm",
+                        "url": "/interface/usergroup/addrbook_list.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Practice",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/controller.php?practice_settings&pharmacy&action=list",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Codes",
+                        "menu_id": "sup0",
+                        "target": "adm",
+                        "url": "/interface/patient_file/encounter/superbill_custom_full.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Layouts",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/edit_layout.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Lists",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/edit_list.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "ACL",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/usergroup/adminacl.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Files",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/manage_site_files.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Backup",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/main/backup.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Rules",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/rules/index.php?action=browse!list",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": "enable_cdr"
+                    },
+                    {
+                        "label": "Alerts",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/super/rules/index.php?action=alerts!listactmgr",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": "enable_cdr"
+                    },
+                    {
+                        "label": "Patient Reminders",
+                        "menu_id": "adm0",
+                        "target": "adm",
+                        "url": "/interface/patient_file/reminder/patient_reminders.php?mode=admin&patient_id=",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": "enable_cdr"
+                    },
+                    {
+                        "label": "Other",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Language",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/language/language.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "language"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Forms",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/forms_admin/forms_admin.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "forms"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Calendar Administration",
+                                "menu_id": "adm0",
+                                "target": "lst",
+                                "url": "/modules/calendar/admin.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "calendar"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Logs",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/logview/logview.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "users"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Database",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "##SQL_ADMIN##",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "database"
+                                ],
+                                "global_req": "!disable_sql_admin_link",
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "eRx Logs",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/logview/erx_logview.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "super"
+                                ],
+                                "global_req": [
+                                    "erx_enable",
+                                    "newcrop_user_role"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Certificates",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/usergroup/ssl_certificates_admin.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "users"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Native Data Loads",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/super/load_codes.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "super"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "External Data Loads",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/code_systems/dataloads_ajax.php",
+                                "children": [],
+                                "requirement": 0,
+                                "acl_req": [
+                                    "admin",
+                                    "super"
+                                ],
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Merge Encounters",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/modules/merge_encounters/index.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Merge Patients",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/patient_file/merge_patients.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            },
+                            {
+                                "label": "Audit Log Tamper",
+                                "menu_id": "adm0",
+                                "target": "adm",
+                                "url": "/interface/reports/audit_log_tamper_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "global_req": "enable_auditlog_encryption",
+                                "parent": "Other",
+                                "mainParent": "admimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "admimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Reports",
+                "menu_id": "repimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Clients",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Patient List",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/patient_list.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Patient List By Referrer",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/patient_list_by_referrer.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Prescriptions and Dispensations",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/prescriptions_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "global_req": "!disable_prescriptions",
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Patient List Creation",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/patient_list_creation.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Clinical",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/clinical_reports.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Immunization Registry",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/immunization_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Clients",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Visits",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Appointments",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/appointments_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Patient Flow Board",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/patient_flow_board_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "global_req": "!disable_pat_trkr",
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Encounters",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/encounters_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Patient Billing Encounter by Carrier",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/encounters_report_carrier.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Appointments and Encounters",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/appt_encounter_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Superbill",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/custom_report_range.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Eligibility",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/edi_270.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Eligibility Response",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/edi_271.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Claim Status Request",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/edi_276.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Chart Location Activity",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/chart_location_activity.php",
+                                "children": [],
+                                "requirement": 0,
+                                "global_req": "!disable_chart_tracker",
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Charts Checked Out",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/charts_checked_out.php",
+                                "children": [],
+                                "requirement": 0,
+                                "global_req": "!disable_chart_tracker",
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Services by Category",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/services_by_category.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Syndromic Surveillance",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/non_reported.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Visits",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Financial",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Sales by Item",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/sales_by_item.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Cash Receipts by Provider",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/billing/sl_receipts_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Front Office Receipts",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/front_receipts_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Receipts Summary",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/receipts_by_method_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Collections",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/collections_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Patient Ledger by Date",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/pat_ledger.php?form=0",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Adjustments",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/adjustments.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Financial Summary by Service Code",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/svc_code_financial_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Financial",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Inventory",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "List",
+                                "url": "/interface/reports/inventory_list.php",
+                                "target": "rep",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Inventory",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Activity",
+                                "url": "/interface/reports/inventory_activity.php",
+                                "target": "rep",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Inventory",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Transactions",
+                                "url": "/interface/reports/inventory_transactions.php",
+                                "target": "rep",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Inventory",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": "inhouse_pharmacy"
+                    },
+                    {
+                        "label": "Procedures",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Pending Orders",
+                                "url": "/interface/orders/pending_orders.php",
+                                "target": "rep",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Procedures",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Procedure Statistics",
+                                "url": "/interface/orders/procedure_stats.php",
+                                "target": "rep",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Procedures",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Insurance",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Patient Insurance Distribution",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/insurance_allocation_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Insurance",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Indigent Patients",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/billing/indigent_patients_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Insurance",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Unique Seen Patients",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/unique_seen_patients_report.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Insurance",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Blank Forms",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Services",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Background Services",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/background_services.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Services",
+                                "mainParent": "repimg"
+                            },
+                            {
+                                "label": "Direct Message Log",
+                                "menu_id": "rep0",
+                                "target": "rep",
+                                "url": "/interface/reports/direct_message_log.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Services",
+                                "mainParent": "repimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "repimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": null,
+                "menu_id": null,
+                "target": null,
+                "url": null,
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Miscellaneous",
+                "menu_id": "misimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Patient Education",
+                        "menu_id": "ped0",
+                        "target": "msc",
+                        "url": "/interface/reports/patient_edu_web_lookup.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Portal Dashboard",
+                        "menu_id": "por2",
+                        "target": "por",
+                        "url": "/patient_portal/patient/provider",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Authorizations",
+                        "menu_id": "aun0",
+                        "target": "msc",
+                        "url": "/interface/main/authorizations/authorizations.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Addr Book",
+                        "menu_id": "adb0",
+                        "target": "msc",
+                        "url": "/interface/usergroup/addrbook_list.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Order Catalog",
+                        "menu_id": "ort0",
+                        "target": "msc",
+                        "url": "/interface/orders/types.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Chart Tracker",
+                        "menu_id": "cht0",
+                        "target": "msc",
+                        "url": "/custom/chart_tracker.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": "!disable_chart_tracker"
+                    },
+                    {
+                        "label": "BatchCom",
+                        "menu_id": "adm0",
+                        "target": "msc",
+                        "url": "/interface/batchcom/batchcom.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Pass Phrase",
+                        "menu_id": "pwd0",
+                        "target": "msc",
+                        "url": "/interface/usergroup/user_info.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Preferences",
+                        "menu_id": "prf0",
+                        "target": "msc",
+                        "url": "/interface/super/edit_globals.php?mode=user",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "New Documents",
+                        "menu_id": "adm0",
+                        "target": "msc",
+                        "url": "/controller.php?document&list&patient_id=00",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Utilities",
+                        "menu_id": null,
+                        "target": null,
+                        "url": null,
+                        "children": [
+                            {
+                                "label": "Validate Attached Documents",
+                                "menu_id": "adm0",
+                                "target": "msc",
+                                "url": "/interface/usergroup/docs_validation.php",
+                                "children": [],
+                                "requirement": 0,
+                                "parent": "Utilities",
+                                "mainParent": "misimg"
+                            }
+                        ],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Document Templates",
+                        "menu_id": "adm0",
+                        "target": "msc",
+                        "url": "/interface/super/manage_document_templates.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "misimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Popups",
+                "menu_id": "popup",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Issues",
+                        "menu_id": "Popup:Issues",
+                        "target": "pop",
+                        "url": "/interface/patient_file/problem_encounter.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Export",
+                        "menu_id": "Popup:Export",
+                        "target": "pop",
+                        "url": "/interface/../custom/export_xml.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Import",
+                        "menu_id": "Popup:Import",
+                        "target": "pop",
+                        "url": "/interface/../custom/import_xml.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Appts",
+                        "menu_id": "Popup:Appts",
+                        "target": "pop",
+                        "url": "/interface/reports/appointments_report.php?patient=",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Superbill",
+                        "menu_id": "Popup:Superbill",
+                        "target": "pop",
+                        "url": "/interface/patient_file/printed_fee_sheet.php?fill=1",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Payment",
+                        "menu_id": "Popup:Payment",
+                        "target": "pop",
+                        "url": "/interface/patient_file/front_payment.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Letter",
+                        "menu_id": "Popup:Letter",
+                        "target": "pop",
+                        "url": "/interface/patient_file/letter.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Chart Label",
+                        "menu_id": "Popup:Chart Label",
+                        "target": "pop",
+                        "url": "/interface/patient_file/label.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": "chart_label_type"
+                    },
+                    {
+                        "label": "Barcode Label",
+                        "menu_id": "Popup:Barcode Label",
+                        "target": "pop",
+                        "url": "/interface/patient_file/barcode_label.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": "barcode_label_type"
+                    },
+                    {
+                        "label": "Address Label",
+                        "menu_id": "Popup:Address Label",
+                        "target": "pop",
+                        "url": "/interface/patient_file/addr_label.php",
+                        "children": [],
+                        "requirement": 1,
+                        "mainParent": null,
+                        "parent": "popup",
+                        "global_req": "addr_label_type"
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "QA Measures",
+                "menu_id": "mips",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "View Reports",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/report_results.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Create MIPS Report",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/clinical_measures.php?type=pqrs",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "enable_pqrs"
+                    },
+                    {
+                        "label": "Select Measures",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/measure_activate.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "enable_pqrs"
+                    },
+                    {
+                        "label": "Delete Old Reports",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/truncate_reports.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "enable_pqrs"
+                    },
+                    {
+                        "label": "Report Database Import",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/import_data.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "pqrs_demosystem"
+                    },
+                    {
+                        "label": "Remove_Provider_Assignments",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/reset_provider_to_unassigned.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "enable_pqrs"
+                    },
+                    {
+                        "label": "Provider Encounter Counts",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/provider_encounter_counts.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Upload Claim Files",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/filemanager/index.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Change Demo Database",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/reload_demo_database.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": "pqrs_demosystem"
+                    },
+                    {
+                        "label": "XML Editor",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/modules/MIPS/xmleditor/index.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Alerts Log",
+                        "menu_id": "rep0",
+                        "target": "rep",
+                        "url": "/interface/reports/cdr_log.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "mips",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": "enable_pqrs",
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Help",
+                "menu_id": "modimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "About",
+                        "menu_id": "adm0",
+                        "target": "pat",
+                        "url": "/interface/main/about_page.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "modimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            }
+        ],
+        "item_list": [
+            "cb-parent-cal0-Calendar",
+            "cb-parent-msg0-Messages ",
+            "cb-parent-patimg-Patient/Client",
+            "cb-child1-patimg-Finder",
+            "cb-child1-patimg-Add New/Search",
+            "cb-child1-patimg-Summary",
+            "cb-child1-patimg-Visits",
+            "cb-child2-patimg-Patient/Client-Create Visit",
+            "cb-child2-patimg-Patient/Client-Current",
+            "cb-child2-patimg-Patient/Client-Visit History",
+            "cb-child1-patimg-Records",
+            "cb-child2-patimg-Patient/Client-Patient Record Request",
+            "cb-child1-patimg-Visit Forms",
+            "cb-child1-patimg-Import",
+            "cb-child2-patimg-Patient/Client-Upload",
+            "cb-child2-patimg-Patient/Client-Pending Approval",
+            "cb-parent-feeimg-Fees",
+            "cb-child1-feeimg-Fee Sheet",
+            "cb-child1-feeimg-Payment",
+            "cb-child1-feeimg-Checkout",
+            "cb-child1-feeimg-Billing",
+            "cb-child1-feeimg-Posting",
+            "cb-child1-feeimg-Batch Payments",
+            "cb-child1-feeimg-Verify Patient Billing Data",
+            "cb-child1-feeimg-EDI History",
+            "cb-parent-invimg-Inventory",
+            "cb-child1-invimg-Management",
+            "cb-child1-invimg-Destroyed",
+            "cb-parent-proimg-Procedures",
+            "cb-child1-proimg-Providers",
+            "cb-child1-proimg-Configuration",
+            "cb-child1-proimg-Load Compendium",
+            "cb-child1-proimg-Pending Review",
+            "cb-child1-proimg-Patient Results",
+            "cb-child1-proimg-Lab Overview",
+            "cb-child1-proimg-Batch Results",
+            "cb-child1-proimg-Electronic Reports",
+            "cb-child1-proimg-Lab Documents",
+            "cb-parent-feeimg-New Crop",
+            "cb-child1-feeimg-e-Rx",
+            "cb-child1-feeimg-e-Rx Renewal",
+            "cb-child1-feeimg-e-Rx EPCS",
+            "cb-parent-admimg-Administration",
+            "cb-child1-admimg-Globals",
+            "cb-child1-admimg-Edit Menu",
+            "cb-child1-admimg-Manage Roles",
+            "cb-child1-admimg-Facilities",
+            "cb-child1-admimg-Users",
+            "cb-child1-admimg-Addr Book",
+            "cb-child1-admimg-Practice",
+            "cb-child1-admimg-Codes",
+            "cb-child1-admimg-Layouts",
+            "cb-child1-admimg-Lists",
+            "cb-child1-admimg-ACL",
+            "cb-child1-admimg-Files",
+            "cb-child1-admimg-Backup",
+            "cb-child1-admimg-Rules",
+            "cb-child1-admimg-Alerts",
+            "cb-child1-admimg-Patient Reminders",
+            "cb-child1-admimg-Other",
+            "cb-child2-admimg-Administration-Language",
+            "cb-child2-admimg-Administration-Forms",
+            "cb-child2-admimg-Administration-Calendar Administration",
+            "cb-child2-admimg-Administration-Logs",
+            "cb-child2-admimg-Administration-Database",
+            "cb-child2-admimg-Administration-eRx Logs",
+            "cb-child2-admimg-Administration-Certificates",
+            "cb-child2-admimg-Administration-Native Data Loads",
+            "cb-child2-admimg-Administration-External Data Loads",
+            "cb-child2-admimg-Administration-Merge Encounters",
+            "cb-child2-admimg-Administration-Merge Patients",
+            "cb-child2-admimg-Administration-Audit Log Tamper",
+            "cb-parent-repimg-Reports",
+            "cb-child1-repimg-Clients",
+            "cb-child2-repimg-Reports-Patient List",
+            "cb-child2-repimg-Reports-Patient List By Referrer",
+            "cb-child2-repimg-Reports-Prescriptions and Dispensations",
+            "cb-child2-repimg-Reports-Patient List Creation",
+            "cb-child2-repimg-Reports-Clinical",
+            "cb-child2-repimg-Reports-Immunization Registry",
+            "cb-child1-repimg-Visits",
+            "cb-child2-repimg-Reports-Appointments",
+            "cb-child2-repimg-Reports-Patient Flow Board",
+            "cb-child2-repimg-Reports-Encounters",
+            "cb-child2-repimg-Reports-Patient Billing Encounter by Carrier",
+            "cb-child2-repimg-Reports-Appointments and Encounters",
+            "cb-child2-repimg-Reports-Superbill",
+            "cb-child2-repimg-Reports-Eligibility",
+            "cb-child2-repimg-Reports-Eligibility Response",
+            "cb-child2-repimg-Reports-Claim Status Request",
+            "cb-child2-repimg-Reports-Chart Location Activity",
+            "cb-child2-repimg-Reports-Charts Checked Out",
+            "cb-child2-repimg-Reports-Services by Category",
+            "cb-child2-repimg-Reports-Syndromic Surveillance",
+            "cb-child1-repimg-Financial",
+            "cb-child2-repimg-Reports-Sales by Item",
+            "cb-child2-repimg-Reports-Cash Receipts by Provider",
+            "cb-child2-repimg-Reports-Front Office Receipts",
+            "cb-child2-repimg-Reports-Receipts Summary",
+            "cb-child2-repimg-Reports-Collections",
+            "cb-child2-repimg-Reports-Patient Ledger by Date",
+            "cb-child2-repimg-Reports-Adjustments",
+            "cb-child2-repimg-Reports-Financial Summary by Service Code",
+            "cb-child1-repimg-Inventory",
+            "cb-child2-repimg-Reports-List",
+            "cb-child2-repimg-Reports-Activity",
+            "cb-child2-repimg-Reports-Transactions",
+            "cb-child1-repimg-Procedures",
+            "cb-child2-repimg-Reports-Pending Orders",
+            "cb-child2-repimg-Reports-Procedure Statistics",
+            "cb-child1-repimg-Insurance",
+            "cb-child2-repimg-Reports-Patient Insurance Distribution",
+            "cb-child2-repimg-Reports-Indigent Patients",
+            "cb-child2-repimg-Reports-Unique Seen Patients",
+            "cb-child1-repimg-Blank Forms",
+            "cb-child2-repimg-Reports-Demographics",
+            "cb-child2-repimg-Reports-Superbill/Fee Sheet",
+            "cb-child2-repimg-Reports-Referral",
+            "cb-child1-repimg-Services",
+            "cb-child2-repimg-Reports-Background Services",
+            "cb-child2-repimg-Reports-Direct Message Log",
+            "cb-parent-misimg-Miscellaneous",
+            "cb-child1-misimg-Patient Education",
+            "cb-child1-misimg-Portal Dashboard",
+            "cb-child1-misimg-Authorizations",
+            "cb-child1-misimg-Addr Book",
+            "cb-child1-misimg-Order Catalog",
+            "cb-child1-misimg-Chart Tracker",
+            "cb-child1-misimg-BatchCom",
+            "cb-child1-misimg-Pass Phrase",
+            "cb-child1-misimg-Preferences",
+            "cb-child1-misimg-Utilities",
+            "cb-child1-misimg-New Documents",
+            "cb-child2-misimg-Miscellaneous-Validate Attached Documents",
+            "cb-child1-misimg-Document Templates",
+            "cb-parent-popup-Popups",
+            "cb-child1-popup-Issues",
+            "cb-child1-popup-Export",
+            "cb-child1-popup-Import",
+            "cb-child1-popup-Appts",
+            "cb-child1-popup-Superbill",
+            "cb-child1-popup-Payment",
+            "cb-child1-popup-Letter",
+            "cb-child1-popup-Chart Label",
+            "cb-child1-popup-Barcode Label",
+            "cb-child1-popup-Address Label",
+            "cb-parent-mips-QA Measures",
+            "cb-child1-mips-View Reports",
+            "cb-child1-mips-Create MIPS Report",
+            "cb-child1-mips-Select Measures",
+            "cb-child1-mips-Delete Old Reports",
+            "cb-child1-mips-Report Database Import",
+            "cb-child1-mips-Remove_Provider_Assignments",
+            "cb-child1-mips-Provider Encounter Counts",
+            "cb-child1-mips-Upload Claim Files",
+            "cb-child1-mips-Change Demo Database",
+            "cb-child1-mips-XML Editor",
+            "cb-child1-mips-Alerts Log",
+            "cb-parent-modimg-Help",
+            "cb-child1-modimg-About",
+            "cb-parent-pfb0-Flow Board",
+            "cb-child1-patimg-Recycle bin"
+        ]
+    },
+    {
+        "title": "Front Desk",
+        "menu_data": [
+            {
+                "label": "Calendar",
+                "menu_id": "cal0",
+                "target": "cal",
+                "url": "/interface/main/main_info.php",
+                "children": [],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Flow Board",
+                "menu_id": "pfb0",
+                "target": "flb",
+                "url": "/interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1",
+                "children": [],
+                "requirement": 0,
+                "global_req": "!disable_pat_trkr",
+                "parent": null,
+                "mainParent": null
+            },
+            {
+                "label": "Patient/Client",
+                "menu_id": "patimg",
+                "target": null,
+                "url": null,
+                "children": [
+                    {
+                        "label": "Finder",
+                        "menu_id": "fin0",
+                        "target": "fin",
+                        "url": "/interface/main/finder/dynamic_finder.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    },
+                    {
+                        "label": "Add New/Search",
+                        "menu_id": "new0",
+                        "target": "pat",
+                        "url": "/interface/new/new.php",
+                        "children": [],
+                        "requirement": 0,
+                        "mainParent": null,
+                        "parent": "patimg",
+                        "global_req": null
+                    }
+                ],
+                "requirement": 0,
+                "global_req": null,
+                "parent": null,
+                "mainParent": null
+            }
+        ],
+        "item_list": [
+            "cb-parent-cal0-Calendar",
+            "cb-parent-patimg-Patient/Client",
+            "cb-child1-patimg-Finder",
+            "cb-child1-patimg-Add New/Search",
+            "cb-parent-pfb0-Flow Board"
+        ]
+    }
+]
\ No newline at end of file
diff --git a/sql/1_0_1-to-2_0_0_upgrade.sql b/sql/1_0_1-to-2_0_0_upgrade.sql
index b846778ca..d65f1ac65 100644
--- a/sql/1_0_1-to-2_0_0_upgrade.sql
+++ b/sql/1_0_1-to-2_0_0_upgrade.sql
@@ -946,3 +946,13 @@ ALTER TABLE users ADD COLUMN fullscreen_page text NOT NULL;
 ALTER TABLE users ADD COLUMN fullscreen_enable int(11) NOT NULL default 0;
 #EndIf
 
+#IfNotTable lims_analysisrequests
+CREATE TABLE `lims_analysisrequests` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `procedure_order_id` int(11) NOT NULL COMMENT 'references procedure_order.procedure_order_id ',
+ `analysisrequest_id` varchar(80) NOT NULL COMMENT 'refers to analysis request id in the lims',
+ `status` text NOT NULL COMMENT 'received, processing, complete',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
+#EndIf
\ No newline at end of file
diff --git a/sql/2_0_0-to-2_0_1_upgrade.sql b/sql/2_0_0-to-2_0_1_upgrade.sql
index 9921ee948..eb0a44de1 100644
--- a/sql/2_0_0-to-2_0_1_upgrade.sql
+++ b/sql/2_0_0-to-2_0_1_upgrade.sql
@@ -188,3 +188,14 @@ INSERT INTO `list_options` (`list_id`, `option_id`, `title`, `seq`, `is_default`
   ALTER TABLE `libreehr_postcalendar_events` ADD `cancel_reason` text NOT NULL ;
 #EndIf
 
+#IfNotTable lims_analysisrequests
+CREATE TABLE `lims_analysisrequests` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `procedure_order_id` int(11) NOT NULL COMMENT 'references procedure_order.procedure_order_id ',
+ `analysisrequest_id` varchar(80) NOT NULL COMMENT 'refers to analysis request id in the lims',
+ `status` text NOT NULL COMMENT 'received, processing, complete',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
+#EndIf
+
diff --git a/sql/database.sql b/sql/database.sql
index bfb09143e..708f40cbb 100644
--- a/sql/database.sql
+++ b/sql/database.sql
@@ -7696,3 +7696,16 @@ CREATE TABLE `updater_user_mode_backup_entry` (
   `original_name` varchar(255) NOT NULL,
   `old_name` varchar(255) NOT NULL
 ) ENGINE=InnoDB;
+
+--
+-- Table structure for table `lims_analysisrequests` 
+-- 
+
+CREATE TABLE IF NOT EXISTS `lims_analysisrequests` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `procedure_order_id` int(11) NOT NULL COMMENT 'references procedure_order.procedure_order_id ',
+ `analysisrequest_id` varchar(80) NOT NULL COMMENT 'refers to analysis request id in the lims',
+ `status` text NOT NULL COMMENT 'received, processing, complete',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8