Apache Cordova
Copyright 2012 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).

--

This product includes binary fonts that are provided under SIL Open Font License, Version 1.1.

- ./www/static/fonts/raleway

Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".

This Font Software is licensed under the SIL Open Font License, Version 1.1 . This license is copied below, and is also available with a FAQ at: https://openfontlicense.org

SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
