* [CHD-3321] [UI/Usability] All tabs that load dynamic content from the server now show a loading "spinner" image while waiting for a response.  This gives workers a visual cue that something is happening in the background.  Previously, tabs that were loading were either blank or they showed their outdated content until the new content arrived.  This improvement is especially helpful on high latency connections.
* [CHD-3640] [UI/Search/Usability] When performing a quick search, clicking on one of the examples in the tooltip will now automatically place it into the text field.  This time-saving shortcut is particularly useful for fields like 'status' where a small number of discrete options no longer need to be typed.
* [CHD-2067] [Security/Logins] Added a unique "salt" to worker password hashes to make them much more difficult to crack if they are ever exposed.

* [Security/Logins] Password hash information is no longer included in the worker table, model objects, or caches.  There is no reason to reference a password hash outside of the login process; and that can involve the database directly, where the results can be discarded afterwards.  The more places that password hashes are stored, the more vulnerable they are.

* [Security/Logins] Fixed an issue where password hash comparisons were taking place in MySQL rather than in PHP.  This could unnecessarily leave password traces in MySQL log files and the process list.
* [Performance/Cache] Retrieving a worker record by email address now uses the existing worker cache.  Previously this was needlessly querying the database.
[Code Cleanup]
* [Security/Logins] All logins, successful or not, are now slightly delayed on purpose.  This adds an artificial cost to brute force attacks.  If successful logins weren't delayed, smart attackers could just abandon a login attempt if it was taking noticeably longer than a successful login would.  In the near future, this delay should be increased systematically for each consecutive login failure.
[Code Cleanup] Message headers are properly stored in lower case; fixed an issue with deleting search schema content (static vs instance methods).
* [Security/Mail/Relay] Improved the way that incoming email relay messages are authorized. Previously, the 'Message-ID:' header included the internal ticket ID, and the security hash used the worker's password to sign it.  This meant when a worker changed their password the could no longer reply to any pre-existing relay messages.

* [Mail/Relay] Incoming email relay replies are now associated with the message they were based on.  This allows features like response times to be calculated properly.  Previously, a relay reply was always associated with the latest message on a ticket.
[Code Cleanup] Removed code that converted a blank $prefix on contexts into NULL, since there is a distinction between the two.  Fixed the missing title string on snippet contexts.
* [Mail/HTML/Inline] Fixed an issue where attachments weren't included when sending multiple inline images on the same line (like emoticons in a sentence), or on consecutive lines without blanks between them. (Technical note: the regular expression was too 'greedy' and combined all the inline image tags into a single result with unusable content.)
Merge branch '6.6.5' into 6.7
* [CHD-2426] [CHD-1993] [Worklists/Export] The export feature on worklists now provides the ability to include all fields and linked records.  Previously, only a small subset of the fields were available.  For instance, exports can now include custom fields from the ticket's sender's organization.  Additionally, large text fields like 'message content' are now available as well.  This uses the same underlying functionality as the Web-API, but with the usability of the API.  This also fixes the issue where only IDs were available for some fields, which weren't human-readable.  A worker may now choose to export IDs, labels, or both.

* [CHD-2426] [Worklists/Export] Work exporting data from a worklist, human-readable labels are now provided for the fields.  In CSV format, these are the headings in the first row.  For XML and JSON, the labels are provided as a separate object next to the results.  Previously, only arcane property names were returned, like 'cf_123'.

* [CHD-2426] [Worklists/Export] When exporting data from a worklist, any number of fields can be selected now as a simple checklist.  Previously the limit was 15.  These fields can also be reordered by dragging them into place.
* [CHD-3337] [Snippets/Worklist/Export] Snippet records and their content are now exportable from worklists in CSV, XML, or JSON formats.
* [Worklists/Export] When exporting worklist results in JSON or XML format, field types are included along with the labels.  These are useful for interpreting the data; for instance, discerning between a timestamp, checkbox, or number.
[Code Cleanup]
[Code Cleanup]
* [Performance/VAs/Contexts] The message '_label' placeholder is now lazy loaded when first used.  This requires an extra lookup to use the ticket mask in the output, which is inefficient if the placeholder isn't used.  This was particularly inefficient in areas like the mobile plugin, API, and Virtual Attendants where there could be a hundred placeholder dictionaries open at the same time.
* [Performance/VAs/Snippets] Optimized the way placeholder dictionaries lazy-load content.  Previously, cycles were being wasted crawling through linked contexts in the dictionary every time a placeholder was loaded.  For instance, if requesting 'ticket_latest_message_sender_full_name' and 'ticket_latest_message_sender_address', data was being recomputed that could have been cached when the dictionary was created.  This only cost a few milliseconds, but in some areas that code can run many times (worklist export, API, VA, mobile).
[Performance] Added a $skip_labels parameter to CerberusContexts::getContext() and a $with_meta parameter to DevblocksDictionaryDelegate->getDictionary().  These provide a modest speedup when dealing with hundreds of concurrent dictionaries (e.g. VAs, mobile, API, export).
* [Performance/Platform/Contexts] Optimized the way multiple placeholder dictionaries retrieve their values.  The feature was originally designed to be used by Virtual Attendants for a single target, but it now powers the mobile UI, web API, Virtual Attendant list variables, and worklist exports.  Previously, each dictionary loaded its values independently, which created a lot of redundant database queries (e.g. multiple tickets loading the same organization or sender information).  Now the dictionaries are first analyzed to see what linked records they have in common, and only distinct records are loaded.  Duplicates records are served from a high-speed temporary cache.