Added creation of tablet configuration file to support the downloadable config

Added the creation of the CompetitionConfig.txt file that is being used
to allow the tablets to pull the competition configuration rather than
requiring it to be configured manually on each device.
Added get_attr_list() utility function to retrieve a list of all defined attributes

Added a utility function that is called from an HTML template file to
retrieve the list of all valid attributes from the attribute definitions
file. This attribute list is used by the template to present a select
dropdown to show rank data for a single attribute
Added some better spreadsheet formatting error handling

Made some changes to improve the error handling of the attribute
definitions spreadsheet parsing. Previously, the parser didn't
gracefully handle attribute definitions that were not capitalized, along
with some other minor improvements.
Fixed issue bluetooth file download

Added a content length header to the response to a request to pull a
file from the central server via bluetooth. This problem was exposed
when an attempt was made to synchronize a tablet with the server in both
directions.
Added support to download apk files from the central server

As a way to simplify the update of the scouting application on the
tablets, added the ability for the tablets to pull any APK files that
are present in a specific directory on the server.
Added support to pull FIRST match and event data from the FIRST site.

Referencing the way that the blue alliance scrapes the match and event
data from the FIRST site, added support to pull the competition data
using the BeautifulSoup.py utilities
Added support to modify the attribute weights via the website

Previously, the only way to update the attribute weights would be to
modify the attribute definitions spreadsheet and then have the web
server read in the new definitions and recalculate the weighted scoring.
Now, there is a menu option that presents a form with all valid
attributes and their current weights. Any changes are captured in an
overrides file that is then used to recalculate the weighted scoring
Modified to support the updated datafeed mechanism and other changes

Modified the event and match request processing to pass additional
information to the functions that are preparing the event and match data
pages. Also added a URL support for setting the attribute weights. And,
made some minor changes to attempt to eliminate the SQLite exception
messages complaining about accessing connections from multiple threads.
Made minor change to include an attribute if the weight is non-zero

Made a change to also display an attribute on the team data page if the
Weight is non-zero.