Compare commits

...
500 Commits
Author SHA1 Message Date
BLasanandMichael Vorburger ⛑️ 1f5d240ddb Add init-container to check MYSQL server deployment (FINERACT-1300)
Validate Gradle Wrapper / Validation (push) Canceled after 0s
2021-01-23 17:01:23 +01:00
Renovate BotandMichael Vorburger ⛑️ 8aa416671c chore(deps): update dependency com.google.truth:truth to v1.1.1 2021-01-23 16:18:24 +01:00
BLasanandMichael Vorburger ⛑️ 9ffadb248d Fix MySQL Access Denied Issue (FINERACT-1294) 2021-01-23 15:49:22 +01:00
Michael Vorburger f63e9d42b4 Remove ErrorProne JdkObsolete exclusion (FINERACT-1075) 2021-01-23 15:12:08 +01:00
Michael Vorburger 8bff783c5d Upgrade ErrorProne from 2.4.0 to 2.5.1 (FINERACT-1297) 2021-01-23 15:11:40 +01:00
Michael Vorburger 6be352fc74 Fix OperatorWrap violation required by Checkstyle 8.38 to 8.39 upgrade 2021-01-23 15:06:33 +01:00
Renovate BotandMichael Vorburger ⛑️ 9e7a0fb6ea chore(deps): update dependency com.puppycrawl.tools:checkstyle to v8.39 2021-01-23 15:06:33 +01:00
Michael Vorburger c67959b60c remove un-used class Tenant 2021-01-23 15:06:14 +01:00
Renovate BotandMichael Vorburger ⛑️ 2859ab1ba5 chore(deps): update dependency com.google.truth.extensions:truth-java8-extension to v1.1.1 2021-01-23 15:05:50 +01:00
Renovate BotandMichael Vorburger ⛑️ d4f90a7223 chore(deps): update dependency gradle to v6.8.1 2021-01-23 15:05:42 +01:00
Renovate BotandMichael Vorburger ⛑️ fc0f8c0257 chore(deps): update dependency org.apache.activemq:activemq-broker to v5.16.1 2021-01-21 21:23:06 +01:00
Avik GangulyandGitHub 505c351cd6 FIN-1290 (#1586) 2021-01-21 05:07:18 +05:30
Wandji CollinsandMichael Vorburger ⛑️ ce825c912d FINERACT-1157:UnsupportedOperationException at InteropServiceImpl 2021-01-17 22:42:12 +01:00
Wandji CollinsandMichael Vorburger ⛑️ e43be716ae FINERACT-1157:UnsupportedOperationException at InteropServiceImpl 2021-01-17 22:42:12 +01:00
Michael Vorburger 8c52097094 clean up (mechanical) SchedulerJobsTestResults (re. FINERACT-924; but not fixing that) 2021-01-17 13:08:57 +01:00
Renovate BotandMichael Vorburger ⛑️ c543e78988 chore(deps): update dependency org.webjars.npm:swagger-ui-dist to v3.40.0 2021-01-17 12:41:48 +01:00
BLasanandMichael Vorburger ⛑️ ff48bfab79 Fix volume mounting issue in MySQL image (FINERACT-1294) 2021-01-17 11:26:46 +01:00
Renovate BotandMichael Vorburger ⛑️ ff52192f66 chore(deps): update dependency com.github.spotbugs:spotbugs to v4.2.0 2021-01-17 10:56:15 +01:00
Michael Vorburger 8d16c8d8c3 use @TestMethodOrder(MethodName.class) in SchedulerJobsTestResults (re. FINERACT-1293, but doesn't help) 2021-01-17 10:42:18 +01:00
Michael Vorburger 12b15cdf2b Improve assertion in SchedulerJobsTestResults (FINERACT-924) 2021-01-17 10:33:45 +01:00
Renovate BotandMichael Vorburger ⛑️ cfd0e95c47 chore(deps): update dependency io.spring.dependency-management:io.spring.dependency-management.gradle.plugin to v1.0.11.release 2021-01-15 19:26:49 +01:00
BLasanandYemdjih Kaze Nasser 2ec4803252 Fix kubernetes startup & shutdown commands issue (FINERACT-1288) 2021-01-14 21:26:08 +01:00
Renovate BotandMichael Vorburger ⛑️ 8622888052 chore(deps): update dependency org.springframework:spring-framework-bom to v5.3.3 2021-01-12 20:04:32 +01:00
David YahalomiandPetri Tuomola d4aa01cf4b Avoid NullPointerException on calc schedule for floating rate (FINERACT-1286) 2021-01-12 05:39:06 +08:00
Renovate BotandPetri Tuomola ac0ea12467 chore(deps): update dependency com.diffplug.spotless:com.diffplug.spotless.gradle.plugin to v5.9.0 2021-01-11 06:51:01 +08:00
Renovate BotandPetri Tuomola 800bd10ceb chore(deps): update dependency com.amazonaws:aws-java-sdk-s3 to v1.11.934 2021-01-11 06:50:27 +08:00
Renovate BotandPetri Tuomola cde770a675 chore(deps): update dependency org.webjars.npm:swagger-ui-dist to v3.39.0 2021-01-11 06:34:39 +08:00
Renovate BotandPetri Tuomola 7f8f3fa8ca chore(deps): update dependency gradle to v6.8 2021-01-11 06:34:07 +08:00
Michael VorburgerandPetri Tuomola 65f54a719a Accept maturityAmount that is in FixedDepositTest (FINERACT-887) 2021-01-10 22:00:17 +08:00
Cedric KhinandMichael Vorburger ⛑️ 30d04ce34e Add an interop release transfer command handler (FINERACT-1281) 2021-01-10 14:28:19 +01:00
rrpawar96andMichael Vorburger ⛑️ db32e569d5 CreditBureau-Integration-Api-documentation 2021-01-04 18:42:13 +01:00
rrpawar96andMichael Vorburger ⛑️ 85e3c4dcb2 Credit_Bureau_Phase3 (FINERACT-734) 2021-01-04 18:42:13 +01:00
Renovate BotandMichael Vorburger ⛑️ b6127368ca chore(deps): update dependency org.webjars.npm:swagger-ui-dist to v3.38.0 2020-12-30 15:23:32 +01:00
Renovate BotandAwasum Yannick 3a922fd2ce chore(deps): update dependency com.google.guava:guava to v30.1-jre 2020-12-30 12:41:13 +01:00
Renovate BotandAwasum Yannick 695c4954c6 chore(deps): update dependency com.github.librepdf:openpdf to v1.3.24 2020-12-30 12:40:01 +01:00
Renovate BotandAwasum Yannick 2707250ba4 chore(deps): update dependency com.bmuschko:gradle-cargo-plugin to v2.8.0 2020-12-30 12:39:48 +01:00
Renovate BotandAwasum Yannick d0aad4c7f8 chore(deps): update dependency org.springframework:spring-framework-bom to v5.3.2 2020-12-30 11:37:16 +01:00
Renovate BotandAwasum Yannick fd02796c4b chore(deps): update dependency org.mnode.ical4j:ical4j to v3.0.21 2020-12-30 09:31:39 +01:00
Manthan SurkarandGitHub 828f07078f Merge pull request #1546 from vorburger/FINERACT-1070_error.msg.user.email.invalid
Improve error logging for failed user creation (FINERACT-1070)
2020-12-14 01:52:28 +05:30
Michael Vorburger ⛑️andAleksandar Vidakovic 6abbaafd80 Minor performance optimization to Gradle build in Dockerfile 2020-12-13 13:27:25 +01:00
Michael Vorburger 2b4ee620d1 Improve error logging for failed user creation (FINERACT-1070) 2020-12-13 12:54:25 +01:00
Manthan SurkarandGitHub 7e1d6da4e2 Merge pull request #1539 from renovate-bot/renovate/io.swagger.core.v3.swagger-gradle-plugin-io.swagger.core.v3.swagger-gradle-plugin.gradle.plugin-2.x
chore(deps): update dependency io.swagger.core.v3.swagger-gradle-plugin:io.swagger.core.v3.swagger-gradle-plugin.gradle.plugin to v2.1.6
2020-12-13 04:08:51 +05:30
Manthan SurkarandGitHub d45eb1bf81 Merge pull request #1542 from renovate-bot/renovate/com.jayway.jsonpath-json-path-2.x
chore(deps): update dependency com.jayway.jsonpath:json-path to v2.5.0
2020-12-13 04:06:50 +05:30
Manthan SurkarandGitHub fc1e864d10 Merge pull request #1543 from renovate-bot/renovate/org.apache.tomcat-tomcat-9.x
chore(deps): update dependency org.apache.tomcat:tomcat to v9.0.41
2020-12-13 04:06:27 +05:30
Manthan SurkarandGitHub 98d2857ac1 Merge pull request #1541 from apache/FINERACT-1070_take-two
Better fix for SMTP Server Port (FINERACT-1070)
2020-12-13 03:43:16 +05:30
Renovate Bot c2f375925d chore(deps): update dependency org.apache.tomcat:tomcat to v9.0.41 2020-12-12 21:43:23 +00:00
Renovate Bot f9d52677bb chore(deps): update dependency com.jayway.jsonpath:json-path to v2.5.0 2020-12-12 21:43:13 +00:00
Manthan SurkarandGitHub 16bd18c538 Merge pull request #1540 from renovate-bot/renovate/io.swagger.core.v3-swagger-annotations-2.x
chore(deps): update dependency io.swagger.core.v3:swagger-annotations to v2.1.6
2020-12-13 03:08:38 +05:30
Michael Vorburger d189fe8385 Better fix for SMTP Server Port (FINERACT-1070) 2020-12-11 23:37:05 +01:00
Renovate Bot 2f1b6d1c36 chore(deps): update dependency io.swagger.core.v3:swagger-annotations to v2.1.6 2020-12-10 13:55:55 +00:00
Renovate Bot fb3a56d7c9 chore(deps): update dependency io.swagger.core.v3.swagger-gradle-plugin:io.swagger.core.v3.swagger-gradle-plugin.gradle.plugin to v2.1.6 2020-12-10 13:55:47 +00:00
Michael Vorburger eabb7b0809 Fix missing SMTP Server Port in GmailBackedPlatformEmailService (FINERACT-1070) 2020-12-03 16:14:39 +01:00
Renovate BotandPetri Tuomola fafb992a9b chore(deps): update dependency org.springframework:spring-framework-bom to v5.3.1 2020-12-02 19:46:34 +08:00
Renovate BotandPetri Tuomola 3433a62ec8 chore(deps): update dependency org.webjars.npm:swagger-ui-dist to v3.37.2 2020-12-02 19:46:06 +08:00
Renovate BotandPetri Tuomola 18ee9b313b chore(deps): update dependency com.puppycrawl.tools:checkstyle to v8.38 2020-12-02 15:28:37 +08:00
Renovate BotandPetri Tuomola 04d255aa01 chore(deps): update dependency org.apache.tika:tika-core to v1.25 2020-12-02 15:28:01 +08:00
Renovate BotandMichael Vorburger ⛑️ 80e498188e chore(deps): update dependency org.asciidoctor.jvm.pdf:org.asciidoctor.jvm.pdf.gradle.plugin to v3.3.0 2020-12-02 07:36:03 +01:00
Renovate BotandMichael Vorburger ⛑️ b47ce359f9 chore(deps): update dependency org.asciidoctor.jvm.revealjs:org.asciidoctor.jvm.revealjs.gradle.plugin to v3.3.0 2020-12-02 07:35:57 +01:00
Renovate BotandMichael Vorburger ⛑️ 535571d127 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v5.11.2 2020-12-02 07:35:49 +01:00
rrpawar96andMichael Vorburger ⛑️ 16dec03968 fix-creditBureau-configuration (FINERACT-1169) 2020-12-02 07:28:13 +01:00
Renovate BotandPetri Tuomola c5b01e12c0 chore(deps): update dependency org.asciidoctor.jvm.gems:org.asciidoctor.jvm.gems.gradle.plugin to v3.3.0 2020-11-29 15:10:10 +08:00
Renovate BotandPetri Tuomola f3e45bc456 chore(deps): update dependency org.asciidoctor.jvm.convert:org.asciidoctor.jvm.convert.gradle.plugin to v3.3.0 2020-11-29 14:25:39 +08:00
Renovate BotandPetri Tuomola 95f4443455 chore(deps): update dependency org.asciidoctor.jvm.epub:org.asciidoctor.jvm.epub.gradle.plugin to v3.3.0 2020-11-29 14:25:19 +08:00
Renovate BotandPetri Tuomola 1bd2612647 chore(deps): update dependency org.apache.bval:org.apache.bval.bundle to v2.0.5 2020-11-29 12:34:11 +08:00
Renovate BotandPetri Tuomola 842bc05d44 chore(deps): update dependency org.apache.tomcat:tomcat to v9.0.40 2020-11-29 12:33:29 +08:00
Renovate BotandPetri Tuomola 6fe2fc650b chore(deps): update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.6.0 2020-11-29 09:47:04 +08:00
Renovate BotandPetri Tuomola 4729445043 chore(deps): update dependency io.gsonfire:gson-fire to v1.8.5 2020-11-29 09:46:36 +08:00
Renovate BotandPetri Tuomola fe03ae9d8a chore(deps): update dependency com.github.spotbugs:spotbugs-annotations to v4.2.0 2020-11-29 06:29:09 +08:00
Renovate BotandPetri Tuomola 9072de71b1 chore(deps): update dependency com.google.cloud.sql:mysql-socket-factory-connector-j-8 to v1.2.0 2020-11-29 06:28:35 +08:00
Renovate BotandPetri Tuomola d1e4bf7a38 chore(deps): update dependency gradle to v6.7.1 2020-11-29 06:26:36 +08:00
Renovate BotandAwasum Yannick d7e3f9659a chore(deps): update dependency com.github.sevntu-checkstyle:sevntu-checks to v1.38.0 2020-11-28 21:55:02 +01:00
Renovate BotandAwasum Yannick 37ca5bd831 chore(deps): update dependency com.github.librepdf:openpdf to v1.3.23 2020-11-28 21:54:39 +01:00
Michael Vorburger ⛑️andAwasum Yannick 4cda858851 chore: Switch GitHub rebase action checkout@master to @v2
Using a fixed version here is more stable (otherwise future changes in actions/checkout@v3 could theoretically break this for us), and in line with https://github.com/cirrus-actions/rebase/commit/51854755db80c104a3f4be4b617988933209b5a1, which I've stumbled upon from #1509. This is also consistent with our other GitHub actions.
2020-11-28 21:49:25 +01:00
Renovate BotandMichael Vorburger ⛑️ 34a044ac3b chore(deps): update cirrus-actions/rebase action to v1.4 2020-11-28 18:30:24 +01:00
Renovate BotandMichael Vorburger ⛑️ 2387b57727 chore(deps): update dependency com.diffplug.spotless:com.diffplug.spotless.gradle.plugin to v5.8.2 2020-11-28 18:26:24 +01:00
Michael VorburgerandAwasum Yannick a399dcb162 docs: HTTPS how-to (FINERACT-1262) 2020-11-28 17:37:23 +01:00
Yemdjih Kaze NasserandAwasum Yannick 161d518455 FINERACT-27 - Extend holiday period to 30 days 2020-11-28 17:33:33 +01:00
Yemdjih Kaze NasserandPetri Tuomola 6a55a80c7d FINERACT-1198 - Revert spotlessApply and use only spotlessCheck 2020-11-26 16:09:37 +08:00
Michael VorburgerandPetri Tuomola b96061613b Improve error handling if reporting service implementation is missing [FINERACT-1173] 2020-11-26 06:13:15 +08:00
Michael VorburgerandAleksandar Vidakovic a3ab467278 Fix flaky GET {entity}/{entityId}/images Content-Type bug (FINERACT-1265) 2020-11-21 18:40:54 +01:00
Michael VorburgerandAleksandar Vidakovic 834d8550fb Add missing ReportsTest Swagger IT (see FINERACT-1173 & FINERACT-1263) 2020-11-21 14:20:49 +01:00
Vincent FUCHSandMichael Vorburger ⛑️ b29558062c Remove hard coded Mockito versions : they are managed by Spring already, so no need to define them ourselves and create potential conflicts. 2020-11-21 11:39:19 +01:00
Michael VorburgerandPercy Enoabane 6c853a6cc7 ContentRepository.fetchImage() FileData not ImageData (FINERACT-1201)
This is more consistent with fetchFile(), and allows to re-use code.
2020-11-19 10:25:32 +01:00
Michael VorburgerandPercy Enoabane 3e1444a6e4 Remove unused fileName and resourceId from ContentRepository deleteFile() & deleteImage() (FINERACT-1201) 2020-11-19 10:25:32 +01:00
Michael VorburgerandAleksandar Vidakovic bf0c7e240f docs: Fix broken build 2020-11-19 02:37:46 +01:00
Yemdjih Kaze NasserandMichael Vorburger ⛑️ bef01a19a2 Update test execution in readme 2020-11-18 22:22:48 +01:00
Vincent FuchsandMichael Vorburger ⛑️ a9020d7136 Align Spring Boot versions to 2.3.5 2020-11-18 21:33:36 +01:00
ManojandGitHub 169b01d72b FINERACT-1241-elastic-web-hook-update (#1488) 2020-11-10 03:44:27 +05:30
Michael VorburgerandAleksandar Vidakovic ef3e2e3c92 Fix Bulk Import failing for office names containing hyphens (FINERACT-1256) 2020-11-07 22:29:49 +01:00
Michael VorburgerandAleksandar Vidakovic 73e330a58e Move all SDK client tests into integrationtests (FINERACT-1209)
And run the against localhost instead of https://fineract.dev
2020-11-07 22:29:49 +01:00
Percy EnoabaneandGitHub 6f2fdaefdf Merge pull request #1496 from apache/vorburger-rm-modernizer-joda
Remove Joda exclusion from Modernizer (FINERACT-826)
2020-11-07 10:59:33 +01:00
Percy EnoabaneandGitHub 56fc5476a6 Merge pull request #1497 from apache/vorburger-JavaTimeDefaultTimeZone
Enable JavaTimeDefaultTimeZone rule in ErrorProne (FINERACT-1112)
2020-11-07 10:55:33 +01:00
Michael Vorburger ⛑️andGitHub 525bcbd4e5 Enable JavaTimeDefaultTimeZone rule in ErrorProne (FINERACT-1112) 2020-11-07 02:27:04 +01:00
Michael Vorburger ⛑️andGitHub f81d0c6c10 Remove Joda exclusion from Modernizer 2020-11-07 02:21:59 +01:00
Michael VorburgerandPetri Tuomola 140c55b7f2 Replace use of InputStream by ByteSource in ImageData (FINERACT-1201) 2020-11-06 05:27:17 +02:00
Michael VorburgerandPetri Tuomola 465623d5ae Factor out ImageData.resize into ImageResizer (FINERACT-1201) 2020-11-06 05:27:17 +02:00
Michael VorburgerandPetri Tuomola 716ba79671 Simplify ImageData.resizeImage (FINERACT-1201) 2020-11-06 05:27:17 +02:00
Michael VorburgerandPetri Tuomola 0af9aa3d0c Clean up ImageData (FINERACT-1201) 2020-11-06 05:27:17 +02:00
percy ashuandPetri Tuomola 814455769b FINERACT-1112 Replace ZoneId.systemDefault() with tenant's timezone 2020-11-06 05:19:44 +02:00
Michael Vorburger ⛑️andGitHub 7b34e83843 Bump ancient OkHTTP & Retrofit in Hooks (FINERACT-1252) (#1486) 2020-11-03 14:16:01 +05:30
Michael VorburgerandAleksandar Vidakovic 26cd903301 Test downloaded file name (FINERACT-1218) 2020-11-02 22:44:37 +01:00
Aleksandar VidakovicandMichael Vorburger ⛑️ e380df187d FINERACT-1191: Finceract Documentation in Asciidoc 2020-11-02 21:25:36 +01:00
Michael VorburgerandAleksandar Vidakovic db53a422b2 Remove un-used code & testImplementation dependencies from provider (FINERACT-1209) 2020-11-02 12:23:31 +01:00
Michael VorburgerandAleksandar Vidakovic a1687d974b Remove redundant testLogging etc. (FINERACT-1209)
because https://github.com/apache/fineract/pull/1477/files
moved this from fineract-provider/build.gradle to the root ./build.gradle
so it's inherited.
2020-11-02 12:09:49 +01:00
Michael VorburgerandAleksandar Vidakovic 2a2b4b59a1 Simplify Gradle invocation in Travis YAML (FINERACT-1250) 2020-11-02 12:02:32 +01:00
Aleksandar VidakovicandMichael Vorburger ⛑️ 578e098670 FINERACT-1209: Integration Tests using new Swagger Client API 2020-11-02 10:00:50 +01:00
Michael VorburgerandPetri Tuomola 1e7f1f5847 Disable frequently failing SchedulerJobsTest.testFlippingSchedulerStatus (FINERACT-1167) 2020-11-01 19:13:30 +02:00
Renovate BotandMichael Vorburger ⛑️ accf7cde83 chore(deps): update actions/stale action to v3 2020-11-01 11:32:11 +01:00
Renovate BotandPetri Tuomola 6a82894439 chore(deps): update dependency com.google.truth.extensions:truth-java8-extension to v1.1 2020-11-01 09:19:10 +02:00
Renovate BotandPetri Tuomola d3fe9fa916 chore(deps): update dependency org.webjars.npm:swagger-ui-dist to v3.36.1 2020-11-01 09:18:34 +02:00
Michael Vorburger ⛑️andPetri Tuomola 892a6ee551 Add Swagger "badge" to README, currently showing INVALID (FINERACT-1249) 2020-11-01 06:26:23 +02:00
Renovate BotandPetri Tuomola 477da9d8c9 chore(deps): update dependency org.springframework.boot:org.springframework.boot.gradle.plugin to v2.3.5.release 2020-11-01 06:24:50 +02:00
Renovate BotandPetri Tuomola 5c36032528 chore(deps): update dependency org.springframework:spring-framework-bom to v5.3.0 2020-11-01 06:24:09 +02:00
Renovate BotandMichael Vorburger ⛑️ 39d3bc4572 chore(deps): update dependency org.mockito:mockito-junit-jupiter to v3.6.0 2020-10-31 22:25:59 +01:00
Renovate BotandMichael Vorburger ⛑️ 99fa23e794 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v8.37 2020-10-31 22:25:24 +01:00
Renovate BotandAleksandar Vidakovic 997ec7df36 chore(deps): update dependency com.google.truth:truth to v1.1 2020-10-31 21:26:55 +01:00
Renovate BotandAleksandar Vidakovic ad4c8dc39a chore(deps): update dependency org.mockito:mockito-core to v3.6.0 2020-10-31 21:26:36 +01:00
Renovate BotandAleksandar Vidakovic 256117bfec chore(deps): update dependency com.diffplug.spotless:com.diffplug.spotless.gradle.plugin to v5.7.0 2020-10-31 21:25:34 +01:00
Michael VorburgerandAleksandar Vidakovic 349415917f Move Gradle test exceptionFormat up (FINERACT-1247) 2020-10-31 21:19:21 +01:00
Michael Vorburger 3583975bc6 Disable failing testRecurringDepositAccountWithClosureTypeTransferToSavings_WITH_HOLD_TAX (FINERACT-1248) 2020-10-31 16:26:44 +01:00
Michael Vorburger f08df636d3 Disable failing ImageTest (FINERACT-1247) 2020-10-31 16:26:44 +01:00
Michael Vorburger f4ada274ba Revert "FINERACT-1241-elastic-web-hook (#1466)"
This reverts commit 0a41cdc9d9.
2020-10-31 16:26:44 +01:00
Aleksandar VidakovicandPetri Tuomola 7d2df13e88 FINERACT-1210: Swagger TypeScript client 2020-10-30 07:59:56 +02:00
ManojandGitHub 0a41cdc9d9 FINERACT-1241-elastic-web-hook (#1466) 2020-10-27 23:45:31 +05:30
Michael VorburgerandPetri Tuomola 91e77f5fe0 Add new ImageTest (FINERACT-1218) 2020-10-27 05:13:16 +02:00
Michael VorburgerandAleksandar Vidakovic 8a26685d79 client: Fix bad dateFormat in FineractClient (FINERACT-1242) 2020-10-26 11:27:31 +01:00
Michael VorburgerandAleksandar Vidakovic 420d26a679 Minor: CallSubject.hasHttpStatus() throws unchecked CallFailedRuntimeException 2020-10-24 23:36:03 +02:00
percyashuandAwasum Yannick 43ef6e1983 FINERACT-826 Migrate to java.time from Joda API 2020-10-24 22:27:00 +01:00
Michael VorburgerandPetri Tuomola 5f42112278 client: Fix mediaType MIME code (FINERACT-1218) 2020-10-24 21:01:32 +03:00
Michael VorburgerandPetri Tuomola 20daf59a3e Add new DocumentTest (FINERACT-1218) 2020-10-23 20:50:00 +03:00
jagadeeshaknandMichael Vorburger ⛑️ 6992102035 FINERACT-1165 2020-10-23 18:15:04 +02:00
Michael VorburgerandPetri Tuomola ff0db483cd client: serialize LocalDate as 2009-01-01 (FINERACT-1234) 2020-10-23 06:47:04 +03:00
Michael VorburgerandAleksandar Vidakovic af1509abee client: Skip generating generated utilities which are broken (FINERACT-1231) 2020-10-22 12:25:00 +02:00
Michael VorburgerandPetri Tuomola 6d22549373 Fix possible NPE when uploading Documents & Images (FINERACT-1036) 2020-10-22 06:06:37 +03:00
Michael VorburgerandPetri Tuomola cb3260b61f Minor: Return bad Image MIME type to API client 2020-10-22 06:04:02 +03:00
Michael VorburgerandAleksandar Vidakovic 64d0b1fe58 client: Improve quick build doc 2020-10-21 18:41:17 +02:00
Aleksandar VidakovicandMichael Vorburger ⛑️ e2aa84a802 FINERACT-1231: SDK Swagger Java Client generated utilities are broken and should be removed from JAR 2020-10-21 17:27:45 +02:00
Michael VorburgerandAleksandar Vidakovic b75ced50df client: GSON TypeAdapter<LocalDate> Fineract API Format [2009,1,1] (FINERACT-1220) 2020-10-21 14:42:08 +02:00
Michael VorburgerandPetri Tuomola e2eec3924f Build all modules on Travis (FINERACT-1226) 2020-10-21 06:08:27 +03:00
Michael Vorburger 1af69db132 Introduce CallFailedRuntimeException in client 2020-10-20 23:58:16 +02:00
Michael Vorburger 27bebff4ac Do not expose getApiClient() in FineractClient (FINERACT-1220)
Because FineractClient is about to not use Swagger's ApiClient anymore.
2020-10-20 23:18:07 +02:00
Aleksandar VidakovicandAleksandar Vidakovic 800b7e07ad FINERACT-1219: Add insecure() support to FineractClient SDK API (fix JDK8 syntax) 2020-10-20 16:50:33 +02:00
Michael Vorburger.chandAleksandar Vidakovic c98cef85f6 Minor: Improve ApplicationExitUtil
It's currently actually un-used, but it could be used again
in the future, when we re-integrate MariaDB4j. (I had this
patch on a branch for months and wanted to get it upstream.)
2020-10-20 03:37:11 +02:00
Michael VorburgerandAleksandar Vidakovic bb64d3f1a5 Add insecure() support to FineractClient SDK API (FINERACT-1219) 2020-10-20 03:35:10 +02:00
Aleksandar VidakovicandAleksandar Vidakovic 354acf309e Apply Checkstyle, Errorprone etc. for all Java modules (FINERACT-1171) 2020-10-20 03:00:33 +02:00
Renovate BotandAleksandar Vidakovic 4b5a4cb4b0 Update dependency org.mockito:mockito-junit-jupiter to v3.5.15 2020-10-20 01:01:27 +02:00
Michael VorburgerandAleksandar Vidakovic 0897f172ee Limit fineract-client to Java 8 not 11 (FINERACT-1214) 2020-10-20 00:57:53 +02:00
Michael Vorburger ⛑️andAleksandar Vidakovic a1e9bc0899 Add initial Fineract SDK Java API Client documentation (FINERACT-1216) 2020-10-20 00:56:39 +02:00
Michael VorburgerandAleksandar Vidakovic 81552b41a0 Reduce fineract-client dependencies (FINERACT-1216) 2020-10-19 23:05:37 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 1afc3f1330 FINERACT-1138: Make localhost default server for Swagger UI 2020-10-19 22:36:10 +02:00
Michael VorburgerandPetri Tuomola 9b2d95f9bb add logging support to SDK API client (FINERACT-1216) 2020-10-19 21:19:55 +03:00
Renovate BotandPetri Tuomola 9cf89d7193 Update dependency org.mockito:mockito-core to v3.5.15 2020-10-19 21:18:50 +03:00
Renovate BotandPetri Tuomola 451a24e093 Update dependency gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties to v2.2.4 2020-10-19 21:18:24 +03:00
Aleksandar VidakovicandPetri Tuomola f192b7315b FINERACT-1207: Clean up fineract-provider/config/swagger following introduction of fineract-client/ 2020-10-19 21:15:50 +03:00
Michael Vorburger db4d2ae006 Add FineractClientTest.testInvalidOperations (FINERACT-1221) 2020-10-19 17:58:43 +02:00
Michael Vorburger ⛑️andPetri Tuomola c8324a90b9 Create CONTRIBUTING.md 2020-10-19 16:19:35 +03:00
Michael Vorburger ⛑️andPetri Tuomola bd38655f88 Create CODE_OF_CONDUCT.md 2020-10-19 16:18:13 +03:00
Renovate BotandMichael Vorburger ⛑️ 90527bd3b0 Update dependency net.ltgt.gradle:gradle-errorprone-plugin to v1.3.0 2020-10-19 14:44:43 +02:00
Michael VorburgerandAleksandar Vidakovic 55b1d4f531 Simplify FineractClient SDK API (FINERACT-1216) 2020-10-19 14:40:43 +02:00
Aleksandar VidakovicandMichael Vorburger ⛑️ 6b28c0e047 FINERACT-1102: Swagger Codegen Client JAR should be available on a Maven repo 2020-10-19 12:30:57 +02:00
Michael VorburgerandAleksandar Vidakovic 19f2a38095 Add FineractClientTest for Fineract SDK REST Client (FINERACT-1216)
and introduce handy Calls utilitiy
2020-10-18 22:04:08 +02:00
Michael VorburgerandPetri Tuomola 00166d4543 remove weird ImageData.available (FINERACT-1201)
I don't understand what this really does, or how to test it.
It seems to have been original introduced for FINERACT-288
in PR #259, but the description there doesn't clearly enough
explain the problem.

Much related code is about to be substantially refactored, and
whatever problem this originally worked around may no longer be
present when the ongoing refactoring is fully completed.  If it
still is, then there will likely be a better way to address it.
2020-10-18 21:30:19 +03:00
Michael VorburgerandPetri Tuomola e054a6f0a2 Improve ProcessorHelper (FINERACT-1211) 2020-10-18 20:55:04 +03:00
Michael VorburgerandPetri Tuomola d83bdc4166 Add missing test coverage for Image 404 (FINERACT-1201) 2020-10-18 20:50:53 +03:00
Michael Vorburger 6c9f4efa9a rm org.threeten:threetenbp dependency 2020-10-18 18:05:51 +02:00
Aleksandar VidakovicandMichael Vorburger ⛑️ 03ffc1d013 FINERACT-1214: SDK Swagger Client Java API methods returning Rx Observable are not intuitive for Java developers 2020-10-18 12:23:21 +02:00
Aleksandar VidakovicandMichael Vorburger ⛑️ 88765f135b FINERACT-1208: -Werror javac compilerArg lost during move to multi modules 2020-10-18 03:08:40 +02:00
Renovate BotandPetri Tuomola 18f1060d05 Update dependency com.github.spullara.mustache.java:compiler to v0.9.7 2020-10-18 01:47:56 +03:00
Renovate BotandPetri Tuomola 2e7ff4a2aa Update dependency io.swagger:swagger-annotations to v1.6.2 2020-10-18 01:46:32 +03:00
Michael VorburgerandPetri Tuomola 4bbc0ee3a7 add .mailmap 2020-10-17 19:50:51 +03:00
Renovate BotandPetri Tuomola aeecaf012f Update dependency io.swagger:swagger-core to v1.6.2 2020-10-17 19:48:50 +03:00
Renovate BotandMichael Vorburger ⛑️ e623ad2367 Update dependency io.gsonfire:gson-fire to v1.8.4 2020-10-17 17:28:21 +02:00
Renovate BotandMichael Vorburger ⛑️ d00941e16c Update dependency commons-codec:commons-codec to v1.15 2020-10-17 17:27:53 +02:00
Aleksandar VidakovicandMichael Vorburger ⛑️ ca80ecb46e FINERACT-1189: fineract client as a separate module 2020-10-17 16:24:53 +02:00
Renovate BotandPetri Tuomola 9c67117f3d Update dependency com.google.guava:guava to v30 2020-10-17 09:24:37 +03:00
Renovate BotandPetri Tuomola 66bafd66f8 Update dependency org.webjars.npm:swagger-ui-dist to v3.35.2 2020-10-16 09:12:44 +03:00
Renovate BotandMichael Vorburger ⛑️ 79d4d7659a Update dependency com.github.spotbugs:spotbugs-annotations to v4.1.4 2020-10-15 14:01:53 +02:00
Renovate BotandMichael Vorburger ⛑️ da73e62522 Update dependency com.github.spotbugs:spotbugs to v4.1.4 2020-10-15 14:01:29 +02:00
Aleksandar VidakovicandPetri Tuomola ee9f428f28 FINERACT-1203: Fix broken Executable WAR 2020-10-15 12:42:05 +03:00
Renovate BotandPetri Tuomola cd688a5ce1 Update dependency gradle to v6.7 2020-10-15 06:36:01 +03:00
Michael VorburgerandPetri Tuomola 2af09708f1 Prepare FileSystemContentRepository for code re-use with S3ContentRepository (FINERACT-1201) 2020-10-14 10:34:02 +03:00
Michael VorburgerandPetri Tuomola 0146f518bc Improve exception handling and error logging in S3ContentRepository (FINERACT-1202) 2020-10-14 10:32:31 +03:00
Michael VorburgerandPetri Tuomola 75da7d9e29 Minor/Clean-up: remove un-used ContentRepository.type 2020-10-14 10:29:38 +03:00
Aleksandar VidakovicandPetri Tuomola 5520bb3c2d FINERACT-1188: README and other files are not covered by Spotless 2020-10-14 10:29:05 +03:00
Michael VorburgerandPetri Tuomola 8c342a7d88 Minor: Re-use Random in ContentRepositoryUtils instead of creating new one 2020-10-14 10:28:36 +03:00
Michael VorburgerandPetri Tuomola 6125cccef0 Minor improvements to ContentManagementException (FINERACT-1202) 2020-10-14 10:26:01 +03:00
e57b7daad1 Added a SQL schema connection parameter field (#1373)
Co-authored-by: Cedric Khin <c.khin@opensense.fr>
2020-10-13 21:14:22 +02:00
Vincent FUCHSandMichael Vorburger ⛑️ a4a2334536 dummy commit to trigger the build again 2020-10-13 21:12:58 +02:00
Vincent FUCHSandMichael Vorburger ⛑️ 704d73dd3e Enable messaging through Spring profile as "activeMqEnabled" (FINERACT-1193) 2020-10-13 21:12:58 +02:00
Michael VorburgerandPetri Tuomola 02408f9165 Make ./gradlew bootRun have colors, like java -jar *.jar (FINERACT-1078) 2020-10-12 07:00:50 +03:00
Michael Vorburger ad87660f73 Remove jul-to-slf4j exclusion (FINERACT-1199) 2020-10-11 23:16:10 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 490ad438a5 FINERACT-1200: Route OpenJPA logging to slf4j 2020-10-11 23:15:43 +02:00
Aleksandar VidakovicandPetri Tuomola 26c1c17151 FINERACT-1194: Move Gradle wrapper to root folder 2020-10-11 22:17:35 +03:00
Michael VorburgerandPetri Tuomola 6a6c0301b6 Simplify appContext.xml, mv all *Repository into .domain. packages, rm spmContext.xml (FINERACT-1175) 2020-10-11 22:07:00 +03:00
Petri TuomolaandGitHub 5365da4d24 Merge pull request #1390 from vorburger/FINERACT-1154_merge-1.4.0
Merge git tag '1.4.0' into branch 'develop' (FINERACT-1154)
2020-10-11 18:50:16 +03:00
Michael VorburgerandPetri Tuomola e978971c67 Remove license header from .dockerignore (FINERACT-1195) 2020-10-11 18:42:44 +03:00
Michael Vorburger 09e08fdc71 Merge git tag '1.4.0' into branch 'develop' (FINERACT-1154)
git checkout develop
    git checkout -b FINERACT-1154_merge-1.4.0
    git merge -s recursive -Xignore-all-space 1.4.0

see discussion in https://issues.apache.org/jira/browse/FINERACT-1154
for the full background about why we are doing this; the TL;DR is that
this makes `git describe` work correctly, which is important for automation.
2020-10-11 14:50:44 +02:00
Renovate BotandPetri Tuomola 3ee46b040b Update dependency org.springframework:spring-framework-bom to v5.2.9.RELEASE 2020-10-11 05:57:59 +03:00
Sergio ZharinovandPetri Tuomola e985597492 Make Renovate Bot propose bumps to update spring-framework-bom (FINERACT-1192)
All credit for this magic ;) goes https://github.com/zharinov.

See https://github.com/apache/fineract/pull/1372.
2020-10-10 18:56:16 +03:00
Michael Vorburger 768ffecd90 Remove mavenCentral(), because jcenter() includes it 2020-10-10 15:56:28 +02:00
Aleksandar VidakovicandGitHub f66a5c71ba Merge pull request #1384 from vorburger/FINERACT-1188_whitespace-only
Clean up whitespace issues, only (FINERACT-1188) but WITHOUT any build script changes, yet
2020-10-10 13:46:45 +02:00
Michael Vorburger 504eeed431 Clean up whitespace issues, only (FINERACT-1188) 2020-10-10 11:33:09 +02:00
Renovate BotandPetri Tuomola d98b23a86d Update dependency org.mnode.ical4j:ical4j to v3.0.20 2020-10-10 08:59:44 +03:00
Petri TuomolaandMichael Vorburger ⛑️ da3868f5c3 FINERACT-1187: Stop appending version number to filenames 2020-10-10 00:03:46 +02:00
Renovate BotandPetri Tuomola 620bde88c0 Update dependency org.apache.tomcat:tomcat to v9.0.39 2020-10-09 21:55:32 +03:00
Renovate BotandPetri Tuomola d15520d55a Update dependency org.webjars.npm:swagger-ui-dist to v3.35.1 2020-10-09 21:55:04 +03:00
Vincent FUCHSandMichael Vorburger ⛑️ dddb988876 Use https (instead of http) for XSDs - to avoid issues during "gradlew bootRun" in some conditions (FINERACT-1180) 2020-10-09 18:46:15 +02:00
Renovate BotandPetri Tuomola 85acb5bc20 Update dependency org.apache.httpcomponents:httpclient to v4.5.13 2020-10-06 14:18:19 +03:00
ebouvardandMichael Vorburger ⛑️ b1251286a6 Updated Dockerfile to fix build error. 2020-10-05 20:44:46 +02:00
Renovate BotandPetri Tuomola c7b779f343 Update dependency io.swagger.codegen.v3:swagger-codegen-cli to v3.0.22 2020-10-05 16:27:41 +03:00
Michael VorburgerandPetri Tuomola 66e26beae1 exclude awssdk:s3 from flyway-core dependency [FINERACT-1172]
see https://github.com/apache/fineract/pull/1355
2020-10-04 18:33:41 +03:00
Renovate BotandPetri Tuomola e4f0493aa5 Update dependency org.flywaydb:flyway-core to v7 2020-10-04 18:33:41 +03:00
ab2acb8ad2 fixed typo : listner -> listener (#1365)
Also breaks up BusinessEventNotificationConstants enum to one per line

Co-authored-by: Vincent FUCHS <vincent.fuchs@gefa.de>
2020-10-03 16:46:41 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 20bf4d6939 FINERACT-1166: Fix build to work outside git repository 2020-10-03 16:24:47 +02:00
Renovate BotandPetri Tuomola 0bc246b6b3 Update dependency io.swagger.core.v3:swagger-gradle-plugin to v2.1.5 2020-10-03 06:10:53 +03:00
Renovate BotandPetri Tuomola 102f4fdefa Update dependency io.swagger.core.v3:swagger-annotations to v2.1.5 2020-10-03 06:10:04 +03:00
Renovate BotandPetri Tuomola bef57e0708 Update dependency com.amazonaws:aws-java-sdk-s3 to v1.11.874 2020-10-02 21:23:48 +03:00
Renovate BotandPetri Tuomola 24a928e4b4 Update dependency org.webjars.npm:swagger-ui-dist to v3.35.0 2020-10-02 21:22:28 +03:00
Renovate BotandPetri Tuomola 3407b06095 Update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.5.1 2020-09-30 13:12:13 +03:00
e5f3e8720d Interop KYC and Interop Loan Disbursement (#1330)
* Interop get account KYC

* loan interop disbursement

* checkstyle fix

Co-authored-by: Subham Pramanik <subhampramanik@google.com>
2020-09-29 23:22:18 +05:30
3479e44b40 Add validation error for recovery repayments (FINERACT-1113)
per FINERACT-1113 and community-app issue #2225, add a validation error when a user attempts
a recovery repayment which is greater than the total written off for the loan.

Return an error if the recovery repayment amount is greater than the written off amount.

Co-authored-by: tonic889 <tonic889@github.com>
2020-09-29 18:11:11 +02:00
Michael Vorburger ⛑️andPetri Tuomola e8344e23fa clarify DB config in README 2020-09-29 06:35:55 +03:00
Manthan SurkarandMichael Vorburger ⛑️ 2086332d26 Updated Report-name Regex 2020-09-28 19:37:55 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 915193785e FINERACT-1158: Fixing validation for interop action 2020-09-28 19:32:22 +02:00
Petri TuomolaandMichael Vorburger ⛑️ d9ff0f1317 FINERACT-1161: Fixing update and delete note operations 2020-09-28 19:24:33 +02:00
Renovate BotandPetri Tuomola f3d25d1320 Update dependency com.puppycrawl.tools:checkstyle to v8.36.2 2020-09-27 20:41:36 +03:00
Manthan SurkarandAwasum Yannick 0667806088 Added Swagger-UI video link to online demos (FINERACT-834) 2020-09-25 14:18:11 +01:00
Avik GangulyandGitHub 34a9051fae Merge pull request #1346 from fynmanoj/FINERACT-1151-fix
FINERACT-1151-fix
2020-09-25 13:58:09 +05:30
Renovate BotandPetri Tuomola 0c88ea7223 Update dependency org.mockito:mockito-junit-jupiter to v3.5.13 2020-09-25 05:21:54 +03:00
Renovate BotandPetri Tuomola 6b8d25a945 Update dependency com.github.spotbugs:spotbugs to v4.1.3 2020-09-25 05:19:36 +03:00
Renovate BotandPetri Tuomola 711002038d Update dependency com.github.spotbugs:spotbugs-annotations to v4.1.3 2020-09-25 05:18:57 +03:00
Renovate BotandMichael Vorburger ⛑️ a547a62d67 Update dependency org.mockito:mockito-core to v3.5.13 2020-09-24 21:16:34 +02:00
Manoj 639de48317 FINERACT-1151-fix 2020-09-24 10:14:32 +05:30
Renovate BotandMichael Vorburger ⛑️ 2024bd760a Update dependency com.github.librepdf:openpdf to v1.3.22 2020-09-23 19:31:40 +02:00
Michael Vorburger f73f5ef50f Change OAuth doc in apiLive.htm (FINERACT-629) 2020-09-22 19:52:18 +02:00
Renovate BotandMichael Vorburger ⛑️ c2698438cc Update dependency org.mock-server:mockserver-junit-jupiter to v5.11.1 2020-09-22 19:51:27 +02:00
Renovate BotandMichael Vorburger ⛑️ 961435ed2f Update dependency org.flywaydb:flyway-core to v6.5.7 2020-09-22 19:49:58 +02:00
Renovate BotandPetri Tuomola b4bcb2c00e Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.6.1 2020-09-22 02:40:37 +03:00
Renovate BotandPetri Tuomola 70b3b24367 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.6.0 2020-09-21 18:05:55 +03:00
Renovate BotandMichael Vorburger ⛑️ 754ce8803b Update dependency org.webjars.npm:swagger-ui-dist to v3.34.0 2020-09-20 09:23:27 +02:00
Michael VorburgerandAwasum Yannick ece9c0338b add OAuth documentation (FINERACT-1145) 2020-09-19 09:54:32 +01:00
Renovate BotandPetri Tuomola 487ec8278d Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.5.2 2020-09-19 06:30:41 +03:00
Renovate BotandPetri Tuomola f185c5828b Update dependency com.github.librepdf:openpdf to v1.3.21 2020-09-19 06:30:10 +03:00
Renovate BotandAwasum Yannick e3766ed0c7 Update dependency org.mockito:mockito-junit-jupiter to v3.5.11 2020-09-18 13:42:05 +01:00
Renovate BotandMichael Vorburger ⛑️ 896ea1cf63 Update dependency org.mockito:mockito-core to v3.5.11 2020-09-18 10:47:25 +02:00
Renovate BotandPetri Tuomola ca3d96ba48 Update dependency org.springframework.boot:spring-boot-gradle-plugin to v2.3.4.RELEASE 2020-09-17 22:17:11 +03:00
Renovate BotandAwasum Yannick f9fb48e4d0 Update dependency org.flywaydb:flyway-core to v6.5.6 2020-09-17 01:27:09 +01:00
Renovate BotandPetri Tuomola 128e6eac21 Update dependency org.apache.tomcat:tomcat to v9.0.38 2020-09-15 16:07:49 +03:00
Avik GangulyandGitHub 21bfd1f102 Merge pull request #1328 from fynmanoj/FINERACT-1106-rework
FINERACT-1106-rework-skip-holiday-for-first-reschedule-date
2020-09-14 19:56:51 +05:30
Avik GangulyandGitHub 44bc6e6c13 Merge pull request #1327 from fynmanoj/FINERACT-1109-rework
FINERACT-1109-rework-with-fixed-emi
2020-09-14 19:56:12 +05:30
Manoj 2db6e6d8b7 FINERACT-1106-rework-skip-holiday-for-first-reschedule-date 2020-09-14 00:09:58 +05:30
Manoj 10dd1fa2b9 FINERACT-1109-rework-with-fixed-emi 2020-09-13 22:18:20 +05:30
Renovate BotandMichael Vorburger ⛑️ cdf3c76856 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.5.1 2020-09-13 11:28:16 +02:00
Renovate BotandMichael Vorburger ⛑️ 9e88d8f98a Update dependency com.puppycrawl.tools:checkstyle to v8.36.1 2020-09-12 17:04:48 +02:00
Michael Vorburger ⛑️andPetri Tuomola 6ac3eea0bc Fix SQLBuilder IAE from StaffReadPlatformServiceImpl (FINERACT-1149) 2020-09-12 06:36:16 +03:00
Renovate BotandPetri Tuomola 49dc585a7c Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.5.0 2020-09-12 01:46:15 +03:00
Renovate BotandMichael Vorburger ⛑️ 7a0418984d Update dependency org.webjars.npm:swagger-ui-dist to v3.33.0 2020-09-11 13:01:08 +02:00
Renovate BotandPetri Tuomola d82584faaa Update dependency io.github.classgraph:classgraph to v4.8.90 2020-09-10 04:58:47 +03:00
Renovate BotandPetri Tuomola be247f8a55 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.4.0 2020-09-09 20:43:33 +03:00
Renovate BotandPetri Tuomola f034b1ea58 Update dependency commons-io:commons-io to v2.8.0 2020-09-09 20:43:12 +03:00
Michael Vorburger ⛑️andGitHub 4b435c712b add Merge Strategy section to README (#1284)
includes improved PR Template (and move commit message blurb in README)
2020-09-06 19:10:07 +02:00
Renovate BotandPetri Tuomola 349367a25c Update dependency org.mockito:mockito-junit-jupiter to v3.5.10 2020-09-06 03:50:53 +03:00
Manthan SurkarandPetri Tuomola e74204e740 Removed string concatenated SQL & sqlSearch from Staff (Fineract-854) 2020-09-06 03:50:25 +03:00
Renovate BotandPetri Tuomola dc092d7e18 Update dependency org.mockito:mockito-core to v3.5.10 2020-09-04 20:30:29 +03:00
edcableandGitHub ee99f30e53 Merge pull request #1314 from vidakovic/feature/FINERACT-1141
FINERACT-1141: Backport FINERACT-1135 to 1.4.0 Error at Loan Repaymen…
2020-09-04 08:53:29 -07:00
tonic889andPetri Tuomola 9f7ffe48b1 add total_recovered_derived field to LoanSummaryData object as fix for FINERACT-1113 2020-09-04 12:39:01 +03:00
Aleksandar Vidakovic f5757a7b11 FINERACT-1141: Backport FINERACT-1135 to 1.4.0 Error at Loan Repayments - SQLSyntaxErrorException 2020-09-03 09:16:35 +02:00
Renovate BotandPetri Tuomola 90b81c3458 Update dependency org.mockito:mockito-junit-jupiter to v3.5.9 2020-09-02 06:50:30 +03:00
Renovate BotandPetri Tuomola fc59e8f665 Update dependency org.mockito:mockito-core to v3.5.9 2020-09-02 04:57:52 +03:00
francisguchieandPetri Tuomola 2e720e361a Fineract-1135 error at loan repayment 2020-09-01 16:12:15 +03:00
Manthan SurkarandPetri Tuomola 665fde4f55 Added swagger-UI section to Readme(FINERACT-834) 2020-09-01 05:34:24 +03:00
Renovate BotandPetri Tuomola f321649b66 Update dependency com.amazonaws:aws-java-sdk-s3 to v1.11.852 2020-09-01 05:06:28 +03:00
Renovate BotandPetri Tuomola 4147c4e992 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.3.0 2020-08-30 09:05:31 +03:00
Renovate BotandPetri Tuomola e3fde6ebf4 Update dependency com.puppycrawl.tools:checkstyle to v8.36 2020-08-29 04:54:52 +03:00
Renovate BotandPetri Tuomola 07ea504f26 Update dependency org.webjars.npm:swagger-ui-dist to v3.32.5 2020-08-28 13:34:03 +03:00
Aleksandar VidakovicandGitHub 11676d17c4 FINERACT-1134: Backport FINERACT-1129 fix to release branch 1.4.0 2020-08-28 06:01:12 +02:00
Aleksandar Vidakovic bcfbd6d9ab FINERACT-1134: Backport FINERACT-1129 fix to release branch 1.4.0 2020-08-28 04:20:01 +02:00
Aleksandar VidakovicandGitHub 300a02b6b0 FINERACT-1129: create Gradle release task - fix source distribution 2020-08-28 04:05:58 +02:00
Aleksandar Vidakovic 89e4e54ad3 FINERACT-1129: create Gradle release task - fix source distribution 2020-08-28 02:39:43 +02:00
Aleksandar VidakovicandGitHub 11e4ce92ed FINERACT-1120: TFA authentication issue fix 2020-08-27 23:24:42 +02:00
Manoj 7650897ab5 FINERACT-1120-TFA-authentication-issue-fix 2020-08-28 04:39:49 +05:30
Aleksandar VidakovicandGitHub 64b86732e4 Merge pull request #1298 from vidakovic/feature/FINERACT-1134
FINERACT-1134: Backport FINERACT-1129 to release branch 1.4.0
2020-08-27 23:08:00 +02:00
Aleksandar VidakovicandGitHub 23bb2b194f Merge pull request #1295 from Grandolf49/fineract-1133-backport
FINERACT-1133 [Backport PR] Added Mustache templates
2020-08-27 22:49:30 +02:00
Petri TuomolaandAwasum Yannick 9ef10c9838 FINERACT-1088: Fixing error message from SMS campaigns 2020-08-27 21:37:07 +01:00
Aleksandar Vidakovic 78816d3391 FINERACT-1134: Backport FINERACT-1129 to release branch 1.4.0 2020-08-27 21:56:44 +02:00
Aleksandar VidakovicandGitHub e6d09d6c3b FINERACT-1129: Gradle task to create release package (#1292) 2020-08-27 21:38:55 +02:00
Manthan SurkarandPetri Tuomola a52526b9cc Added and Enforced RedundantModifier Checkstyle(2)(Fineract-821) 2020-08-27 20:51:41 +03:00
Petri TuomolaandYemdjih Kaze Nasser 946bff46c1 FINERACT-1128: Switching build script from httpie to curl to allow retries 2020-08-27 14:13:27 +01:00
Chinmay Kulkarni 09bd45988f FINERACT-1133 Added Mustache templates 2020-08-27 17:57:42 +05:30
Manthan SurkarandPetri Tuomola 5276ca6722 Removed sqlEncodeString function (FINERACT-854) 2020-08-27 05:09:32 +03:00
Chinmay KulkarniandPetri Tuomola 1d0d7c1bd8 FINERACT-1133 Added Mustache templates for documentation of generated library 2020-08-27 04:49:21 +03:00
Renovate BotandPetri Tuomola aab9b06f1d Update dependency io.github.classgraph:classgraph to v4.8.89 2020-08-27 04:45:55 +03:00
Aleksandar VidakovicandGitHub bb10ee94e9 Merge pull request #1285 from Grandolf49/fineract-1101-backport
FINERACT-1101 [Backport PR] Added Mustache templates to Swagger Codegen
2020-08-26 23:30:26 +02:00
Manthan SurkarandMichael Vorburger ⛑️ b22d4b64ba FINERACT-854 Removed string concatenated SQL from CenterReadPlatform 2020-08-26 12:44:28 +02:00
Chinmay Kulkarni b217982ea0 FINERACT-1101 Added Mustache templates to Swagger Codegen 2020-08-26 15:41:20 +05:30
Aleksandar VidakovicandGitHub e4c22f65a7 Merge pull request #1278 from vorburger/1.4.0_gradle-v6.6.1
Cherry-pick "Update dependency gradle to v6.6.1" to 1.4.0 also
2020-08-26 11:21:38 +02:00
Renovate BotandMichael Vorburger ⛑️ 7f1178ff23 Update dependency org.mockito:mockito-junit-jupiter to v3.5.7 2020-08-26 11:19:29 +02:00
atharwa_24andGitHub a8910366f0 add Docker logo ("whale") to badge in README (#1234) 2020-08-26 04:09:15 +02:00
Renovate BotandMichael Vorburger ⛑️ 8cd74558e3 Update dependency org.ehcache:ehcache to v3.9.0 2020-08-26 03:33:27 +02:00
Renovate BotandMichael Vorburger ⛑️ 99627f5b3e Update dependency org.mockito:mockito-core to v3.5.7 2020-08-26 02:58:15 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 7950ca3e58 FINERACT-854 Removed string concatenated SQL in GroupReadPlatform 2020-08-26 02:01:14 +02:00
Renovate BotandMichael Vorburger 574a00ae34 Update dependency gradle to v6.6.1 2020-08-26 00:34:33 +02:00
Chinmay KulkarniandMichael Vorburger ⛑️ 5d95a18c32 Update docs/developers/swagger/client.md
Co-authored-by: Michael Vorburger ⛑️ <mike@vorburger.ch>
2020-08-25 23:52:57 +02:00
Chinmay KulkarniandMichael Vorburger ⛑️ bd4f7ae4f8 Update fineract-provider/config/swagger/config.json.template
Co-authored-by: Michael Vorburger ⛑️ <mike@vorburger.ch>
2020-08-25 23:52:57 +02:00
Chinmay KulkarniandMichael Vorburger ⛑️ 79db886107 FINERACT-1101 Excluded Mustache templates from rat 2020-08-25 23:52:57 +02:00
Chinmay KulkarniandMichael Vorburger ⛑️ a86c5cfde1 FINERACT-1101 Swagger Codegen build using Gradle 2020-08-25 23:52:57 +02:00
Grandolf49andMichael Vorburger ⛑️ 3f0b2ae8c4 FINERACT-1105 Valid Spec File generated
FINERACT-1105 Added description to response 200

FINERACT-1105 Valid Spec File generated

FINERACT-1105 Valid Open API Spec File generated

FINERACT-1105 Added description to response 200

FINERACT-1105 Valid Spec File generated
2020-08-25 23:50:02 +02:00
Petri TuomolaandMichael Vorburger ⛑️ b98b7893eb Add generated files to gitignore 2020-08-25 23:50:02 +02:00
Renovate BotandMichael Vorburger ⛑️ e70e8e9367 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.1.2 2020-08-25 23:50:02 +02:00
Renovate BotandMichael Vorburger ⛑️ e0f81f00fe Update dependency gradle to v6.6.1 2020-08-25 23:49:21 +02:00
Renovate BotandPetri Tuomola e20ebbc691 Update dependency org.mockito:mockito-core to v3.5.6 2020-08-25 20:43:29 +03:00
Renovate BotandPetri Tuomola 414b406d08 Update dependency org.mockito:mockito-junit-jupiter to v3.5.6 2020-08-25 16:02:59 +03:00
Renovate BotandPetri Tuomola efd2d6dd64 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.2.0 2020-08-25 15:59:10 +03:00
Renovate BotandPetri Tuomola b3b10c0d88 Update dependency io.github.classgraph:classgraph to v4.8.88 2020-08-25 03:26:23 +03:00
Grandolf49andYemdjih Kaze Nasser 217e34ba9e FINERACT-1105 Valid Spec File generated
FINERACT-1105 Added description to response 200

FINERACT-1105 Valid Spec File generated

FINERACT-1105 Valid Open API Spec File generated

FINERACT-1105 Added description to response 200

FINERACT-1105 Valid Spec File generated
2020-08-23 14:17:32 +01:00
Renovate BotandPetri Tuomola 24fbbc3ffd Update dependency org.mockito:mockito-junit-jupiter to v3.5.5 2020-08-23 04:56:53 +03:00
Renovate BotandPetri Tuomola 0c241401ac Update dependency org.mockito:mockito-core to v3.5.5 2020-08-23 01:43:39 +03:00
Petri TuomolaandYemdjih Kaze Nasser 416d0a6ff8 Add generated files to gitignore 2020-08-22 07:00:20 +01:00
Renovate BotandYemdjih Kaze Nasser 64a4ac464c Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.1.2 2020-08-22 06:59:21 +01:00
Renovate BotandPetri Tuomola 1044274a1a Update dependency org.webjars.npm:swagger-ui-dist to v3.32.4 2020-08-21 16:38:26 +03:00
Petri TuomolaandYemdjih Kaze Nasser 9bad487c0c FINERACT-1118: Do not run Swagger code generation if previous build steps fail 2020-08-20 07:50:33 +01:00
xurrorandPetri Tuomola 153e7d07c1 enable harmless pentaho support 2020-08-20 09:47:11 +03:00
Manthan SurkarandPetri Tuomola 8a3c1903a4 FINERACT-821 Added and Enforced HideUtilityClassConstructor checkstyle 2020-08-20 07:33:12 +03:00
Manthan SurkarandPetri Tuomola 774fcd9265 Added and Enforced Membername Checkstyle(2) 2020-08-20 07:29:09 +03:00
Renovate BotandPetri Tuomola bfcd74aeb3 Update dependency org.webjars.npm:swagger-ui-dist to v3.32.3 2020-08-20 04:14:29 +03:00
Petri TuomolaandMichael Vorburger ⛑️ 39290a0ae5 FINERACT-1082: Changing version from hardcoded to autogenerated for Swagger 2020-08-19 17:51:29 +02:00
Avik GangulyandGitHub 899eab8ebc Merge pull request #1220 from fynmanoj/AL-14
FINERACT-1109 appropriate-interest-larger-than-emi
2020-08-19 20:20:26 +05:30
Renovate BotandPetri Tuomola fe7984fde1 Update dependency com.github.spotbugs:spotbugs to v4.1.2 2020-08-19 10:06:54 +03:00
Renovate BotandPetri Tuomola f1d39bc514 Update dependency com.github.spotbugs:spotbugs-annotations to v4.1.2 2020-08-19 10:06:34 +03:00
Renovate BotandPetri Tuomola 3b28c2b3aa Update dependency org.mockito:mockito-junit-jupiter to v3.5.2 2020-08-19 05:41:44 +03:00
Renovate BotandPetri Tuomola 1ba87abb13 Update dependency org.mockito:mockito-core to v3.5.2 2020-08-19 03:29:47 +03:00
Manoj db980236ad FINERACT-1109 appropriate-interest-larger-than-emi 2020-08-18 23:23:06 +05:30
Renovate BotandPetri Tuomola 618af19ca3 Update dependency org.flywaydb:flyway-core to v6.5.5 2020-08-18 15:32:36 +03:00
Manthan SurkarandPetri Tuomola 056f120fba Removed MissingSwitchDefault Checkstyle from todo 2020-08-18 11:21:42 +03:00
Renovate BotandPetri Tuomola 8261470639 Update dependency org.webjars.npm:swagger-ui-dist to v3.32.1 2020-08-16 08:19:24 +03:00
Renovate BotandPetri Tuomola 7f1eae97e8 Update dependency org.mockito:mockito-junit-jupiter to v3.5.0 2020-08-16 08:18:58 +03:00
Renovate BotandPetri Tuomola 475ab571bf Update dependency org.mockito:mockito-core to v3.5.0 2020-08-16 04:19:11 +03:00
Petri TuomolaandPetri Tuomola 92c6b38089 Fix Swagger UI 2020-08-15 05:04:26 +03:00
Manthan SurkarandPetri Tuomola d00d978c46 Removed duplicate status values to check status parameter validity 2020-08-15 04:58:51 +03:00
Manthan SurkarandPetri Tuomola db232c6088 FINERACT-1095 Added status parameter in Clients API 2020-08-15 04:58:51 +03:00
Avik GangulyandGitHub bd9119e35f Merge pull request #1211 from fynmanoj/AL-9
FINERACT-1108 Custom-installment-in-reshedule
2020-08-14 21:48:30 +05:30
Manoj 9752366c70 FINERACT-1108-Custom-installment-in-reshedule 2020-08-14 21:44:50 +05:30
Steve ConradandGitHub 94dd2dc7e6 Merge pull request #1103 from ezolnbl/develop
FINERACT-1116 add release onhold interop transaction
2020-08-14 08:46:15 -05:00
Steve ConradandGitHub aa09759855 Update V352__interop_init.sql
Add backticks for consistency
2020-08-14 08:07:45 -05:00
Manthan SurkarandPetri Tuomola 4585978a40 FINERACT-821 Enforces(1) RedundantModifier Checkstyle 2020-08-14 04:53:11 +03:00
Renovate BotandPetri Tuomola 3434fd07c0 Update dependency org.springframework.boot:spring-boot-gradle-plugin to v2.3.3.RELEASE 2020-08-14 04:48:51 +03:00
Avik GangulyandGitHub cc142c5146 Merge pull request #1209 from fynmanoj/AL-2
FINERACT-1106 reschedule-loan-first-pay-day-holiday-fix
2020-08-14 00:35:52 +05:30
Avik GangulyandGitHub 2e6a7e9a82 Merge pull request #1210 from fynmanoj/AL-12
FINERACT-1107 month-end-dates-reschedule-issue-fix
2020-08-14 00:28:06 +05:30
Zoltan Nebli 721af79661 Merge remote-tracking branch 'upstream/develop' into develop 2020-08-12 21:35:50 +02:00
Renovate BotandPetri Tuomola f67a6a31cc Update dependency org.flywaydb:flyway-core to v6.5.4 2020-08-12 18:27:11 +03:00
Renovate BotandPetri Tuomola aab5061476 Update dependency io.spring.gradle:dependency-management-plugin to v1.0.10.RELEASE 2020-08-11 15:23:21 +03:00
Renovate BotandPetri Tuomola 8f441e6f03 Update dependency gradle to v6.6 2020-08-11 13:58:44 +03:00
Renovate BotandMichael Vorburger ⛑️ 7b72bbea5b Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5.1.1 2020-08-06 09:17:45 +02:00
Manthan SurkarandMichael Vorburger ⛑️ d306bcf9aa FINERACT-971 Added AvoidDoubleBraceInitialization Checkstyle 2020-08-06 09:02:19 +02:00
xurror e7b2163914 FINERACT-1098 - Catch JpaSystemException in jpa transactions 2020-08-04 15:29:34 +01:00
Renovate BotandPetri Tuomola a31d29f1f0 Update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.5.0 2020-08-03 21:35:20 +03:00
xurror 0e72642146 FINERACT-1104 - adjust JPQL query @likelihoodRepository 2020-08-03 14:09:56 +01:00
xurror 98fd8d24c9 FINERACT-1103 - Resolve org.eclipse.persistence.exceptions.EntityManagerSetupException @creditBurea 2020-08-03 14:06:07 +01:00
Renovate BotandMichael Vorburger ⛑️ 435c5ebbcd Update dependency gradle.plugin.org.hidetake:gradle-swagger-generator-plugin to v2.18.2 2020-08-03 00:16:22 +02:00
Michael Vorburger ⛑️ bc60bc379a Update fineract-provider/config/swagger/fineract-input.yaml 2020-08-02 17:48:43 +02:00
Chinmay KulkarniandMichael Vorburger ⛑️ 4a569d8c02 FINERACT-838 Updated .travis.yml 2020-08-02 17:48:43 +02:00
Grandolf49andMichael Vorburger ⛑️ a7ddf7f728 FINERACT-838 Travis CI setup for Swagger Codegen 2020-08-02 17:48:43 +02:00
Grandolf49andMichael Vorburger ⛑️ 6151c20528 FINERACT-838 Fixed Base URL for Swagger Codegen 2020-08-02 17:48:43 +02:00
Grandolf49andMichael Vorburger ⛑️ a86dcaf104 FINERACT-838 Updated swagger-codegen-cli version 2020-08-02 17:48:43 +02:00
Michael Vorburger ⛑️ 98645840a5 minor Swagger clean-up in README 2020-08-02 16:59:09 +02:00
Michael Vorburger ⛑️andPetri Tuomola c5c62de491 Use java8 instead of joda as dateLibrary in Swagger Client (FINERACT-838) 2020-08-02 06:23:25 +03:00
xurrorandMichael Vorburger ⛑️ c91dc2a2eb add ignore comment for FixedDepositTest 2020-08-01 15:08:59 +02:00
Manthan SurkarandMichael Vorburger ⛑️ bcd42b9cb9 FINERACT-971 Added and enforced AvoidNoArgumentSuperConstructorCall Checkstyle 2020-08-01 15:08:46 +02:00
Chinmay KulkarniandGitHub 1f462613fb FINERACT-838 Added Swagger Codegen Support (#1206)
incl. doc in README and new docs/developers/swagger/client.md
2020-08-01 15:08:10 +02:00
Renovate BotandYemdjih Kaze Nasser a58ec277bf Update dependency org.webjars.npm:swagger-ui-dist to v3.31.1 2020-08-01 04:33:29 +01:00
Renovate BotandYemdjih Kaze Nasser cb3e0c3b96 Update dependency com.github.spotbugs:spotbugs to v4.1.1 2020-08-01 04:33:04 +01:00
Renovate BotandYemdjih Kaze Nasser 785eef3109 Update dependency com.github.spotbugs:spotbugs-annotations to v4.1.1 2020-08-01 04:32:33 +01:00
Renovate BotandYemdjih Kaze Nasser c35234cf1e Update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.4.5 2020-08-01 04:31:55 +01:00
Renovate BotandYemdjih Kaze Nasser cae4ec4b91 Update dependency org.mockito:mockito-core to v3.4.6 2020-08-01 04:31:28 +01:00
Renovate BotandYemdjih Kaze Nasser 24bae47271 Update dependency com.amazonaws:aws-java-sdk-s3 to v1.11.832 2020-08-01 03:47:15 +01:00
xurror 0bcdfbe2da Disable FixedDepositTest > testFixedDepositAccountClosureTypeWithdrawal_WITH_HOLD_TAX 2020-08-01 03:35:17 +01:00
Renovate BotandPetri Tuomola ee1b3cde9a Update dependency com.github.spotbugs:spotbugs to v4.1.0 2020-07-30 23:01:03 +03:00
admin ed718909bd AL-2-reschedule-loan-first-pay-day-holiday-fix 2020-07-30 18:40:46 +05:30
Renovate BotandPetri Tuomola 68e31975d4 Update dependency org.mockito:mockito-junit-jupiter to v3.4.6 2020-07-29 21:07:43 +03:00
admin 2a941047a2 AL-12-month-end-dates-reschedule-issue-fix 2020-07-29 20:23:53 +05:30
Renovate BotandPetri Tuomola f5a6368d2f Update dependency org.flywaydb:flyway-core to v6.5.3 2020-07-29 17:33:10 +03:00
Manthan SurkarandMichael Vorburger ⛑️ bd75a6c79b FINERACT-821 Enforced Membername checkstyle(1) 2020-07-27 10:24:19 +02:00
Renovate BotandPetri Tuomola 1b8962fc81 Update dependency com.puppycrawl.tools:checkstyle to v8.35 2020-07-26 19:07:54 +03:00
Renovate BotandPetri Tuomola 3aa7fab110 Update dependency gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties to v2.2.3 2020-07-26 06:31:54 +03:00
Renovate BotandPetri Tuomola b5eaabbf4d Update dependency io.swagger.core.v3:swagger-gradle-plugin to v2.1.4 2020-07-25 16:25:16 +03:00
Renovate BotandPetri Tuomola 5ef3ddd52e Update dependency io.swagger.core.v3:swagger-annotations to v2.1.4 2020-07-25 12:39:30 +03:00
Renovate BotandPetri Tuomola af7b80888e Update dependency jakarta.validation:jakarta.validation-api to v3 2020-07-25 07:28:16 +03:00
Renovate BotandPetri Tuomola 52313793a5 Update dependency org.springframework.boot:spring-boot-gradle-plugin to v2.3.2.RELEASE 2020-07-25 06:26:33 +03:00
Petri TuomolaandGitHub f9df03553c Merge pull request #1198 from renovate-bot/renovate/org.webjars.npm-swagger-ui-dist-3.x
Update dependency org.webjars.npm:swagger-ui-dist to v3.30.2
2020-07-24 09:54:56 +03:00
Renovate Bot 86d037c87a Update dependency org.webjars.npm:swagger-ui-dist to v3.30.2 2020-07-23 08:21:53 +00:00
Renovate BotandMichael Vorburger ⛑️ 21b14b4008 Update dependency org.mockito:mockito-core to v3.4.4 2020-07-23 02:12:12 +02:00
Renovate BotandMichael Vorburger ⛑️ df004bdf34 Update dependency org.webjars.npm:swagger-ui-dist to v3.30.1 2020-07-23 02:12:01 +02:00
Renovate BotandMichael Vorburger ⛑️ 2a4451d4e9 Update dependency org.flywaydb:flyway-core to v6.5.2 2020-07-23 02:11:51 +02:00
nnatarajanandMichael Vorburger ⛑️ b7b63985d9 Update dependency org.mock-server:mockserver-junit-jupiter from v5.10.0 to v5.11.0 2020-07-22 23:06:43 +02:00
Manthan SurkarandMichael Vorburger ⛑️ a84edce73b FINERACT-842 Made TRY-IT swagger button work 2020-07-20 11:53:23 +02:00
francisguchieandMichael Vorburger ⛑️ b4621b2a71 FINERACT-1054 fixed sql grammar at loan repayment 2020-07-20 11:49:43 +02:00
Petri TuomolaandMichael Vorburger ⛑️ e06b3447b9 FINERACT-1087: Fixing date issues with bulk import templates 2020-07-20 11:42:33 +02:00
Renovate BotandMichael Vorburger ⛑️ 563d294938 Update dependency org.mockito:mockito-core to v3.4.3 2020-07-20 11:35:01 +02:00
Michael Vorburger 9534e7e0a3 fix broken build 2020-07-19 16:43:41 +02:00
6ee3ff2452 FINERACT-1091: Adding validation for constitution ID (#1189)
Co-authored-by: Michael Vorburger ⛑️ <mike@vorburger.ch>
2020-07-19 15:49:32 +02:00
Manthan SurkarandMichael Vorburger ⛑️ ec9513c3c7 FINERACT-821 Added and Enforced LocalVariableName Checkstyle 2020-07-19 15:47:35 +02:00
Michael Vorburger ⛑️ 55b44dbf12 Update openjpa to v3.1.2 also in dependencyManagement not just buildscript 2020-07-19 15:45:54 +02:00
Renovate BotandMichael Vorburger ⛑️ c623ddb842 Update dependency org.mockito:mockito-junit-jupiter to v3.4.4 2020-07-19 15:45:26 +02:00
Renovate BotandMichael Vorburger ⛑️ 5c1c6a6d73 Update dependency org.webjars.npm:swagger-ui-dist to v3.30.0 2020-07-19 15:45:05 +02:00
Renovate BotandMichael Vorburger ⛑️ 9d6a2ee9dd Update dependency org.webjars.npm:swagger-ui-dist to v3.29.0 2020-07-17 20:02:17 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 9048d416f5 FINERACT-836 Integration test for swagger-ui 2020-07-17 20:00:37 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 9eff82d85b FINERACT-836 Integration test for swagger-ui 2020-07-17 20:00:37 +02:00
Renovate BotandAwasum Yannick 7ef3a74530 Update dependency org.apache.openjpa:openjpa to v3.1.2 2020-07-16 18:08:38 +01:00
Manthan SurkarandMichael Vorburger ⛑️ 271401cd6b FINERACT-821 Added and Enforced LocalVariableName Checkstyle 2020-07-16 18:41:39 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 737d1f1911 FINERACT-821 Added and enforced ParameterName checkstyle 2020-07-15 23:33:37 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 5506f68766 FINERACT-1090 Removed top bar and Added Search (swagger) 2020-07-15 23:24:51 +02:00
Renovate BotandMichael Vorburger ⛑️ cbad22d57a Update dependency org.apache.bval:org.apache.bval.bundle to v2.0.4 2020-07-15 23:20:03 +02:00
percyashuandAwasum Yannick bbb3aad506 FINERACT-822 add MissingCasesInEnumSwitch 2020-07-15 09:35:27 +01:00
Manthan SurkarandMichael Vorburger ⛑️ b3fb7984f3 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v5 2020-07-14 02:06:38 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 37b8219a03 FINERACT-1006 Fixes: NullPointerException at SQLInjectionValidator 2020-07-14 01:09:30 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 44650034b1 FINERACT-1047 Added integration test for limit param (audit trails) 2020-07-14 01:02:20 +02:00
Petri TuomolaandMichael Vorburger ⛑️ acca72f83d FINERACT-835: Complete work on automatically generating Swagger docs 2020-07-14 00:54:44 +02:00
Manthan SurkarandMichael Vorburger ⛑️ a440d56392 FINERACT-1044 Added redirects in swagger-ui 2020-07-14 00:12:01 +02:00
Renovate BotandMichael Vorburger ⛑️ 6a8a993670 Update dependency org.mockito:mockito-junit-jupiter to v3.4.0 2020-07-13 23:56:31 +02:00
Renovate BotandMichael Vorburger ⛑️ d24e0c57f5 Update dependency org.flywaydb:flyway-core to v6.5.1 2020-07-13 23:55:36 +02:00
Renovate BotandAwasum Yannick 33dedd06f4 Update dependency org.mockito:mockito-core to v3.4.0 2020-07-11 01:44:08 +01:00
Petri TuomolaandYemdjih Kaze Nasser 333759f2aa FINERACT-1079: Run spotlessCheck for automated builds, spotlessApply for manual ones 2020-07-07 08:43:07 +01:00
Awasum Yannick d62f9ecc8a Revert "FINERACT-1079: Run spotlessApply before compileJava task"
This reverts commit 457b0544d3.
2020-07-06 07:31:14 +01:00
Awasum YannickandYemdjih Kaze Nasser 457b0544d3 FINERACT-1079: Run spotlessApply before compileJava task 2020-07-06 04:03:24 +01:00
Renovate BotandAwasum Yannick b45b4eb667 Update dependency org.apache.tomcat:tomcat to v9.0.37 2020-07-05 23:00:38 +01:00
Petri TuomolaandYemdjih Kaze Nasser e4d6cc543e FINERACT-1074: Sorting out plugin configurations 2020-07-05 14:56:38 +01:00
Manthan SurkarandYemdjih Kaze Nasser 06ab553d92 FINERACT-821 Added ClassTypeParameterName Checkstyle 2020-07-05 06:00:37 +01:00
percyashuandYemdjih Kaze Nasser c20329cd07 FINERACT-1023 Update spring boot gradle plugin from v2.2.7 to v2.3.1 2020-07-05 05:42:19 +01:00
Renovate BotandYemdjih Kaze Nasser 750024ba7a Update dependency com.diffplug.spotless:spotless-plugin-gradle to v4.5.1 2020-07-05 05:41:34 +01:00
Petri TuomolaandAwasum Yannick 3f444e2710 FINERACT-1072: Implementing Spotless for Gradle files 2020-07-04 11:25:23 +01:00
percyashuandMichael Vorburger ⛑️ 1102d5b58a FINERACT-822 Enable StaticAssignmentInConstructor check 2020-07-03 16:25:03 +02:00
percyashuandMichael Vorburger ⛑️ 5a16d19564 FINERACT-822 Enable ProtectedMembersInFinalClass check 2020-07-03 16:25:03 +02:00
percyashuandMichael Vorburger ⛑️ 3f1673ea97 FINERACT-822 Enforce StaticAssignmentInConstructor check 2020-07-03 16:25:03 +02:00
Petri TuomolaandMichael Vorburger ⛑️ b61957acb2 FINERACT-1065: Fixing integration test issues 2020-07-03 16:07:58 +02:00
WhiteSource RenovateandGitHub 1da8060805 Update dependency org.apache.activemq:activemq-broker to v5.16.0 (#1134) 2020-07-03 14:52:07 +01:00
Petri TuomolaandMichael Vorburger ⛑️ 551819ee18 FINERACT-1060: Stop delete / update of system user 2020-07-03 15:35:33 +02:00
WhiteSource RenovateandGitHub c92e926d6c Update dependency com.google.guava:guava to v29 (#1142) 2020-07-03 14:29:46 +01:00
WhiteSource RenovateandGitHub fdf9e2c6f0 Update dependency gradle to v6.5.1 (#1130) 2020-07-03 13:05:58 +01:00
WhiteSource RenovateandGitHub 82d100ec54 Update dependency com.amazonaws:aws-java-sdk-s3 to v1.11.816 (#1133) 2020-07-03 12:52:13 +01:00
WhiteSource RenovateandGitHub f3b4a66ff8 Update dependency com.diffplug.spotless:spotless-plugin-gradle to v4.5.0 (#1137) 2020-07-03 12:45:01 +01:00
Petri TuomolaandMichael Vorburger ⛑️ c7c76f3ffa FINERACT-1016: Removing partial fix to 1st month issue 2020-07-03 11:31:06 +02:00
Renovate BotandMichael Vorburger ⛑️ ce9a8c90aa Update dependency org.webjars.npm:swagger-ui-dist to v3.28.0 2020-07-02 21:50:50 +02:00
Michael Vorburger 1623e80a7f make ApiParameterError (almost) immutable
by making (most of) its fields final, because Immutable is Good

Only "almost" / "most" because of the of the remaining use of setParameterName() in
EntityDatatableChecksWritePlatformServiceImpl.saveDatatables() which unfortunately looks
a lot less trivial to get rid of, so that's for another time/someone else, later (or never).
2020-07-02 21:47:02 +02:00
Michael Vorburger 10536c0f91 make SimpleDateFormat use in ApiParameterError thread-safe [FINERACT-1063] 2020-07-02 21:46:10 +02:00
Michael Vorburger 2e32166079 Make Google's Guava library an explicit dependency
Instead of only transitively inheriting it through activemq-broker,
so that the upcoming next major upgrade of activemq-broker doesn't break the build.

Note that Fineract code already extensively uses Guava, this just makes it explicit.
2020-07-02 21:45:40 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 0a01419cd3 FINERACT-1016: Fixing rounding issues in integration tests 2020-07-02 12:07:43 +02:00
Nikhil PawarandMichael Vorburger ⛑️ 9c3f1addd7 Fineract-1043 Removed street field from address 2020-07-01 22:31:52 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 6e279619a5 FINERACT-1061: Removing call to rs.beforeFirst() 2020-07-01 22:31:33 +02:00
Michael Vorburger 9ed9153cba use AbstractPlatformException's defaultUserMessage as RuntimeException's message [FINERACT-1062] 2020-06-30 21:28:20 +02:00
Michael Vorburger bcfbe65d56 use new AbstractPlatformException in AbstractPlatformException
only indirectly related to FINERACT-942, but makes sense to do so now
2020-06-30 21:28:20 +02:00
Michael Vorburger 56cad56848 use AbstractPlatformException as superclass for various exceptions
related to FINERACT-942 and as per code review discussion in PR #1079.
2020-06-30 21:28:20 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 7a88f14eec FINERACT-885: Fixing dates in ClientLoanIntegrationTest to avoid failures end of month 2020-06-30 15:46:37 +02:00
Petri TuomolaandYemdjih Kaze Nasser 7d2c3ec417 FINERACT-1022: Fixing ehcache 3 2020-06-30 03:10:11 +01:00
Renovate BotandMichael Vorburger ⛑️ da978a37aa Update dependency com.puppycrawl.tools:checkstyle to v8.34 2020-06-30 01:08:34 +02:00
thesmallstarandMichael Vorburger ⛑️ 022f214ad5 FINERACT-942 Added and Enforced AvoidHidingCauseException Checkstyle 2020-06-29 23:16:53 +02:00
percyashuandMichael Vorburger ⛑️ 649eb4f843 FINERACT-822 Enforce MutablePublicArray check 2020-06-29 22:28:17 +02:00
percyashuandMichael Vorburger ⛑️ 63c72ee53c FINERACT-822 Enforce InvalidInlineTag check 2020-06-29 22:28:17 +02:00
percyashuandMichael Vorburger ⛑️ fde3d9f83e FINERACT-822 Enforce NonCanonicalType check 2020-06-29 22:28:17 +02:00
Renovate BotandMichael Vorburger ⛑️ e1e230d660 Update dependency io.swagger.core.v3:swagger-gradle-plugin to v2.1.3 2020-06-29 22:22:27 +02:00
Renovate BotandMichael Vorburger ⛑️ 5e9b4cafa8 Update dependency io.swagger.core.v3:swagger-annotations to v2.1.3 2020-06-29 22:22:16 +02:00
Renovate BotandMichael Vorburger ⛑️ 4fd176ba66 Update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.4.4 2020-06-29 22:21:35 +02:00
WhiteSource RenovateandGitHub 570a18a206 Update dependency org.flywaydb:flyway-core to v6.5.0 (#1116) 2020-06-26 19:07:22 +02:00
d9df7fe245 FINERACT-835: Upgrade Swagger Annotations to Annotations 2.0 (#1101)
Co-authored-by: Michael Vorburger ⛑️ <mike@vorburger.ch>
2020-06-26 13:32:14 +02:00
percyashuandMichael Vorburger ⛑️ dff6109c81 FINERACT-822 Enforce ModifyCollectionInEnhancedForLoop check 2020-06-26 12:43:45 +02:00
percyashuandMichael Vorburger ⛑️ 4ede116861 FINERACT-822 Enforce UnescapedEntity check 2020-06-26 12:43:45 +02:00
percyashuandMichael Vorburger ⛑️ 66c3bfdd4f FINERACT-822 Enforce PublicConstructorForAbstractClass check 2020-06-26 12:43:45 +02:00
kiran-vsmandMichael Vorburger ⛑️ d9911bd771 FINERACT-1043: Unable to create client due to invalid error message about required address field 2020-06-26 12:42:07 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 885d2e9a57 Fixes Invalid Regex in Exception Messege(SQL builder) 2020-06-26 12:38:40 +02:00
Renovate BotandMichael Vorburger ⛑️ 6c6839a70f Update dependency com.github.librepdf:openpdf to v1.3.20 2020-06-26 12:37:38 +02:00
Manthan SurkarandMichael Vorburger ⛑️ a5afb0b833 FINERACT-1047 Integration test for Audit trails(Create) 2020-06-26 12:37:09 +02:00
Percy Ayuk AshuandGitHub 8884e61103 FINERACT-822 Enforce SameNameButDifferent check (#1083) 2020-06-26 12:34:44 +02:00
Zoltan Nebli 81358416cb FINERACT add release onhold interop transaction 2020-06-25 14:28:19 +02:00
Michael VorburgerandYemdjih Kaze Nasser 24d4c45d9a introduce Throwable cause to AbstractPlatformResourceNotFoundException (re. FINERACT-942) 2020-06-24 16:03:10 +01:00
Michael VorburgerandAwasum Yannick eb2b39f160 add @Disabled to 2 old unit tests (which perhaps should be removed)
This saves a few seconds ;) in the build, and (more importantly)
makes it easier to find all the project's @Disabled (formerly @Ignore) tests.
2020-06-24 10:39:20 +01:00
Percy Ayuk AshuandGitHub f1a06b42d7 FINERACT-822 Enforce UndefinedEquals check (#1099) 2020-06-23 22:36:52 +02:00
Renovate BotandMichael Vorburger ⛑️ d70af43f13 Update dependency io.github.classgraph:classgraph to v4.8.87 2020-06-23 20:59:38 +02:00
Renovate BotandMichael Vorburger ⛑️ 8bc37be7cc Update dependency org.mock-server:mockserver-junit-jupiter to v5.10.0 2020-06-23 11:16:25 +02:00
Renovate BotandMichael Vorburger ⛑️ a9030171da Update dependency com.github.spotbugs:spotbugs to v4.0.6 2020-06-23 11:15:46 +02:00
Renovate BotandMichael Vorburger ⛑️ c983e27161 Update dependency com.github.spotbugs:spotbugs-annotations to v4.0.6 2020-06-23 11:15:18 +02:00
Renovate BotandMichael Vorburger ⛑️ e8442a3db9 Update dependency gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin to v4.4.3 2020-06-23 11:15:02 +02:00
Michael Vorburger c529fdf58c increase auto formatting comment line length from 80 to 120 2020-06-23 10:01:12 +02:00
percyashuandMichael Vorburger ⛑️ 9542e35702 FINERACT-822 Enforce ModifiedButNotUsed check 2020-06-23 10:00:49 +02:00
percyashuandMichael Vorburger ⛑️ a7fdafd407 FINERACT-822 Enforce UnusedMethod check 2020-06-23 10:00:49 +02:00
percyashuandMichael Vorburger ⛑️ f05239c35b FINERACT-822 Enforce UnusedNestedClass check 2020-06-23 10:00:49 +02:00
percyashuandMichael Vorburger ⛑️ dde631a019 FINERACT-822 enable UnnecessaryDefaultInEnumSwitch error 2020-06-21 18:42:26 +02:00
thesmallstarandMichael Vorburger ⛑️ b0043d8e85 FINERACT-799 Fixes Sorting for certain columns is not supported in Audit 2020-06-20 23:10:45 +02:00
Petri TuomolaandMichael Vorburger ⛑️ 6438063a7f FINERACT-995: Rewriting logic to remove call to rs.previous() 2020-06-20 22:32:06 +02:00
Petri TuomolaandMichael Vorburger ⛑️ f3862bca8b FINERACT-1040 Re-enabling and fixing CampaignTests 2020-06-20 22:29:50 +02:00
Renovate BotandMichael Vorburger ⛑️ 3c2f178180 Update dependency org.webjars.npm:swagger-ui-dist to v3.27.0 2020-06-20 19:23:08 +02:00
7ec5229e23 FINERACT-835: Upgrade Swagger and automatically generate the JSON spec (#1069)
Co-authored-by: Michael Vorburger ⛑️ <mike@vorburger.ch>
2020-06-20 13:21:46 +02:00
percyashuandMichael Vorburger ⛑️ e234980cd3 FINERACT-822 Editing Checks list 2020-06-20 12:19:10 +02:00
Renovate BotandMichael Vorburger ⛑️ 0982f0904a Update dependency com.diffplug.spotless:spotless-plugin-gradle to v4.4.0 2020-06-20 10:19:52 +02:00
thesmallstarandMichael Vorburger ⛑️ 2f04f6a3e7 Fixes broken build due to spotless and error-prone 2020-06-20 08:28:08 +02:00
Manthan SurkarandMichael Vorburger ⛑️ 2323450e71 FINERACT-821 Added and Enforced ModifierOrder Checkstyle 2020-06-20 00:11:17 +02:00
percyashuandMichael Vorburger ⛑️ 9a487a060b FINERACT-822 Enforce StringSplitter check 2020-06-20 00:08:10 +02:00
thesmallstarandMichael Vorburger ⛑️ d8f87ba265 FINERACT-821 Added MultipleVariableDeclarations Checkstyle 2020-06-20 00:04:54 +02:00
thesmallstarandMichael Vorburger ⛑️ b20de7bced FINERACT-942 Added and enforced MutableException Checkstyle 2020-06-20 00:04:31 +02:00
rrpawar96andMichael Vorburger ⛑️ 00a8feea8f modification in glim_approval in apiLive.htm 2020-06-20 00:04:06 +02:00
rrpawar96andMichael Vorburger ⛑️ 1c88ad0bd8 modified glim-approval test-case 2020-06-20 00:04:06 +02:00
rrpawar96andMichael Vorburger ⛑️ bcac0c0e7e fixed bug 2020-06-20 00:04:06 +02:00
2061 changed files with 31573 additions and 103548 deletions
+4 -19
View File
@@ -1,22 +1,7 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
build/*
.gradle/*
# NB No ASF ASL header here due to FINERACT-1195
**/build/*
**/.gradle/*
**/bin/*
*.jar
*.war
+13 -8
View File
@@ -1,19 +1,24 @@
## Description
Describe the changes made and why they were made. Ignore if these details are present on the associated Jira ticket
Describe the changes made and why they were made.
Ignore if these details are present on the associated [Apache Fineract JIRA ticket](https://github.com/apache/fineract/pull/1284).
## Checklist
Please make sure these boxes are checked before submitting your pull request - thanks!
- [ ] Commit message starts with the issue number from https://issues.apache.org/jira/projects/FINERACT/. Ex: FINERACT-646 Pockets API.
- [ ] Write the commit message as per https://github.com/apache/fineract/#pull-requests
- [ ] Coding conventions at https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions have been followed.
- [ ] Acknowledge that we will not review PRs that are not passing the build _("green")_ - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
- [ ] API documentation at fineract-provider/src/main/resources/static/api-docs/apiLive.htm has been updated with details of any API changes.
- [ ] Create/update unit or integration tests for verifying the changes made.
- [ ] Integration tests have been created/updated for verifying the changes made.
- [ ] Follow coding conventions at https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions.
- [ ] All Integrations tests are passing with the new commits.
- [ ] Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/api-docs/apiLive.htm with details of any API changes
- [ ] Submission is not a "code dump". (Large changes can be made "in repository" via a branch. Ask on the list.)
- [ ] Submission is not a "code dump". (Large changes can be made "in repository" via a branch. Ask on the developer mailing list for guidance, if required.)
Our guidelines for code reviews is at https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide
FYI our guidelines for code reviews are at https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide.
+2 -2
View File
@@ -9,10 +9,10 @@ jobs:
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Automatic Rebase
uses: cirrus-actions/rebase@1.3
uses: cirrus-actions/rebase@1.4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v1
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# stale-issue-message: 'Stale issue message'
+3
View File
@@ -12,9 +12,12 @@ build
*.iws
*.DS_Store
.idea
.vscode
catalina.base_IS_UNDEFINED/
keystore.jks
bin/
fineract-provider/src/main/resources/application.properties
.lock
fineract-provider/out/
fineract-provider/config/swagger/config.json
fineract-provider/config/swagger/fineract-input.yaml
+22
View File
@@ -0,0 +1,22 @@
# .mailmap unifies differences in commit names and emails, and shortens committers' names.
# .mailmap format is a bit weird, e.g. https://github.com/sympy/sympy/wiki/Using-.mailmap explains it.
# .mailmap official doc is on https://git-scm.com/docs/git-shortlog#_mapping_authors
#
# Running `git log --format='%an <%ae>' | sort -u` -VS- `git log --format='%aN <%aE>' | sort -u` best illustrates what this does.
# It's useful e.g. in `git log` or `git shortlog --numbered --email --no-merges 1.4.0..HEAD` et al.
Michael <mike@vorburger.ch>
Michael <mike@vorburger.ch> Michael Vorburger ⛑️ <vorburger@apache.org>
Petri <petri@tuomola.org>
Petri <petri@tuomola.org> Petri Tuomola <ptuomola@users.noreply.github.com>
Renovate <bot@renovateapp.com>
Aleks <aleks@apache.org>
Aleks <aleks@apache.org> Aleksandar Vidakovic <vidakovic@users.noreply.github.com>
Aleks <aleks@apache.org> Aleksandar Vidakovic <cheetah@monkeysintown.com>
Manthan <manthan.surkar@gmail.com>
Manthan <manthan.surkar@gmail.com> Manthan Surkar <42006277+thesmallstar@users.noreply.github.com>
Chinmay <chinmaykulkarni8@gmail.com>
Chinmay <chinmaykulkarni8@gmail.com> Grandolf49 <chinmaykulkarni8@gmail.com>
Chinmay <chinmaykulkarni8@gmail.com> Chinmay Kulkarni <30969403+Grandolf49@users.noreply.github.com>
Vincent Fuchs <vincent.fuchs@gefa.de>
Vincent Fuchs <vincent.fuchs@gefa.de> Vincent Fuchs <vincent.fuchs@gmail.com>
+1 -1
View File
@@ -5,4 +5,4 @@
"**/.settings": true,
"**/.factorypath": true
}
}
}
+5 -4
View File
@@ -30,8 +30,9 @@ services:
addons:
apt:
packages:
# https://httpie.org is used by the docker-compose test below
- httpie
- curl
- graphviz
- gv
# See https://issues.apache.org/jira/browse/FINERACT-937 for background re. what below is all about..
# We basically remove the outdated OpenJDK 11.0.2 which Travis image grabbed from java.net in
@@ -73,6 +74,6 @@ script:
# using "&&" instead of several "-" means that integrationTest does not run if test fails,
# and Docker test does not run if integration test fails, which makes PR failure easier to understand.
# @see https://docs.travis-ci.com/user/job-lifecycle/#customizing-the-build-phase
- ./gradlew --console=plain licenseMain licenseTest licenseIntegrationTest check && ./gradlew --console=plain integrationTest --fail-fast && sudo service mysql stop && docker-compose build && docker-compose up -d && sleep 30s && http --verify=no --timeout 240 --check-status get https://localhost:8443/fineract-provider/actuator/health && (( $(http --verify=no --timeout 30 --check-status --body get https://localhost:8443/fineract-provider/actuator/info | wc --chars) > 100 ))
- ./gradlew --no-daemon --console=plain licenseMain licenseTest check build test --fail-fast doc && sudo service mysql stop && docker-compose build && docker-compose up -d && sleep 60s && curl -f -k --retry 5 --retry-connrefused --connect-timeout 30 --retry-delay 30 https://localhost:8443/fineract-provider/actuator/health && (( $(curl -f -k --retry 5 --retry-connrefused --connect-timeout 30 --retry-delay 30 https://localhost:8443/fineract-provider/actuator/info | wc --chars) > 100 ))
# We stop the mysql system service when running the Docker test to avoid port 3306 conflicts (unless we run the mysql in docker-compose on another port; req. FINERACT-773)
# The fany /actuator/info test makes sure that has more than 100 characters of JSON to test that the git.properties worked (see FINERACT-983)
# The fancy /actuator/info test makes sure that has more than 100 characters of JSON to test that the git.properties worked (see FINERACT-983)
+1 -1
View File
@@ -13,4 +13,4 @@ software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
under the License.
+5
View File
@@ -0,0 +1,5 @@
This project follows
[the Apache Software Foundation (ASF) Code of Conduct](https://www.apache.org/foundation/policies/conduct.html).
Violations of the code of conduct may be reported directly the to ASF or
the Apache Fineract's Project Management Committee at private@fineract.apache.org.
+16
View File
@@ -0,0 +1,16 @@
Hello there!
First of all, **Thank You** for contributing to Apache Fineract, we're grateful for your interest in our project.
Please do [join our developer mailing list](https://fineract.apache.org/#contribute), as it's where discussions about this project take place - say _Hi_ there!
Our [JIRA Dashboard](https://issues.apache.org/jira/secure/Dashboard.jspa?selectPageId=12335824) is another good way to see what's going on (do create a Login).
Here are a few additional useful pointers:
* https://github.com/apache/fineract/#pull-requests
* https://github.com/apache/fineract/#checkstyle-and-spotless
* https://github.com/apache/fineract/#logging-guidelines
* https://github.com/apache/fineract/#error-handling-guidelines
Note also [our Code of Conduct](CODE_OF_CONDUCT.md).
+3 -3
View File
@@ -22,10 +22,10 @@ RUN apt-get update -qq && apt-get install -y wget
COPY . fineract
WORKDIR /fineract
RUN ./gradlew --no-daemon -x rat -x test bootJar
RUN ./gradlew --no-daemon -q -x rat -x compileTestJava -x test -x spotlessJavaCheck -x spotlessJava bootJar
WORKDIR /fineract/target
RUN jar -xf /fineract/build/libs/fineract-provider.jar
RUN jar -xf /fineract/fineract-provider/build/libs/fineract-provider*.jar
# https://issues.apache.org/jira/browse/LEGAL-462
# https://issues.apache.org/jira/browse/FINERACT-762
@@ -33,7 +33,7 @@ RUN jar -xf /fineract/build/libs/fineract-provider.jar
# allowing implementations to switch the driver used by changing start-up parameters (for both tenants and each tenant DB)
# The commented out lines in the docker-compose.yml illustrate how to do this.
WORKDIR /fineract/target/BOOT-INF/lib
RUN wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
RUN wget -q https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
# =========================================
+109 -22
View File
@@ -1,4 +1,4 @@
Apache Fineract: A Platform for Microfinance [![Build Status](https://travis-ci.org/apache/fineract.svg?branch=develop)](https://travis-ci.org/apache/fineract) [![Docker Hub](https://img.shields.io/docker/pulls/apache/fineract.svg)](https://hub.docker.com/r/apache/fineract) [![Docker Build](https://img.shields.io/docker/cloud/build/apache/fineract.svg)](https://hub.docker.com/r/apache/fineract/builds)
Apache Fineract: A Platform for Microfinance [![Build Status](https://travis-ci.org/apache/fineract.svg?branch=develop)](https://travis-ci.org/apache/fineract) [![Swagger Validation](https://validator.swagger.io/validator?url=https://demo.fineract.dev/fineract-provider/swagger-ui/fineract.yaml)](https://validator.swagger.io/validator/debug?url=https://demo.fineract.dev/fineract-provider/swagger-ui/fineract.yaml) [![Docker Hub](https://img.shields.io/docker/pulls/apache/fineract.svg?logo=Docker)](https://hub.docker.com/r/apache/fineract) [![Docker Build](https://img.shields.io/docker/cloud/build/apache/fineract.svg?logo=Docker)](https://hub.docker.com/r/apache/fineract/builds)
============
Fineract is a mature platform with open APIs that provides a reliable, robust, and affordable core banking solution for financial institutions offering services to the world’s 2 billion underbanked and unbanked.
@@ -49,15 +49,23 @@ Instructions to build the JAR file
2. Run `./gradlew clean bootJar` to build a modern cloud native fully self contained JAR file which will be created at `build/libs` directory.
3. Start it using `java -jar build/libs/fineract-provider.jar` (does not require external Tomcat)
The tenants database connection details are configured [via environment variables (as with Docker container)](#instructions-to-run-using-docker-and-docker-compose), e.g. like this:
export fineract_tenants_pwd=verysecret
...
java -jar fineract-provider.jar
Instructions to build a WAR file
============
1. Clone the repository or download and extract the archive file to your local directory.
2. Run `./gradlew clean bootWar` to build a traditional WAR file which will be created at `build/libs` directory.
2. Run `./gradlew clean war` to build a traditional WAR file which will be created at `build/libs` directory.
3. Deploy this WAR to your Tomcat v9 Servlet Container.
We recommend using the JAR instead of the WAR file deployment, because it's much easier.
Note that with the 1.4 release the tenants database pool configuration changed from Tomcat DBCP in XML to an embedded Hikari, configured by environment variables, see above.
Instructions to execute Integration Tests
============
@@ -66,25 +74,22 @@ Instructions to execute Integration Tests
Run the following commands, very similarly to how [.travis.yml](.travis.yml) does:
1. `./gradlew createDB -PdbName=fineract_tenants`
1. `./gradlew createDB -PdbName=fineract_default`
1. `./gradlew clean integrationTest`
1. `./gradlew clean test`
Instructions to run and debug in Eclipse IDE
============
It is possible to run Fineract in Eclipse IDE and also to debug Fineract using Eclipse's debugging facilities.
It is possible to run Fineract in Eclipse IDE and also to debug Fineract using Eclipse's debugging facilities.
To do this, you need to create the Eclipse project files and import the project into an Eclipse workspace:
1. Create Eclipse project files into the Fineract project by running `./gradlew cleanEclipse eclipse`
2. Import the fineract-provider project into your Eclipse workspace (File->Import->General->Existing Projects into Workspace, choose root directory fineract/fineract-provider)
3. Do a clean build of the project in Eclipse (Project->Clean...)
3. Run / debug Fineract by right clicking on org.apache.fineract.ServerApplication class and choosing Run As / Debug As -> Java Application. All normal Eclipse debugging features (breakpoints, watchpoints etc) should work as expected.
If you change the project settings (dependencies etc) in Gradle, you should redo step 1 and refresh the project in Eclipse.
1. Import the fineract-provider project into your Eclipse workspace (File->Import->Gradle->Existing Gradle Project into Workspace, choose root directory fineract/fineract-provider)
2. Do a clean build of the project in Eclipse (Project->Clean...)
3. Run / debug Fineract by right clicking on org.apache.fineract.ServerApplication class and choosing Run As / Debug As -> Java Application. All normal Eclipse debugging features (breakpoints, watchpoints etc) should work as expected.
You can also use Eclipse Junit support to run tests in Eclipse (Run As->Junit Test)
Finally, modifying source code in Eclipse automatically triggers hot code replace to a running instance, allowing you to immediately test your changes
Finally, modifying source code in Eclipse automatically triggers hot code replace to a running instance, allowing you to immediately test your changes
Instructions to run using Docker and docker-compose
@@ -138,11 +143,11 @@ You can follow [this](https://cwiki.apache.org/confluence/display/FINERACT/Insta
Now e.g. from your Google Cloud shell, run the following commands:
1. `git clone https://github.com/apache/fineract.git ; cd fineract/kubernetes`
1. `./kubectl-startup`
1. `./kubectl-startup.sh`
To shutdown and reset your Cluster, run:
./kubectl-shutdown
./kubectl-shutdown.sh
Using Minikube
--------------
@@ -171,22 +176,28 @@ You can check Fineract logs using:
To shutdown and reset your cluster, run:
./kubectl-shutdown
./kubectl-shutdown.sh
To shutdown and reset your cluster, run:
minikube ssh
sudo rm -rf /mnt/data/
We have [some open issues in JIRA with Kubernetes related enhancement ideas](https://jira.apache.org/jira/browse/FINERACT-783?jql=labels%20%3D%20kubernetes%20AND%20project%20%3D%20%22Apache%20Fineract%22%20) which you are welcome to contribute to.
Instructions to download Gradle wrapper
============
The file fineract-provider/gradle/wrapper/gradle-wrapper.jar binary is checked into this projects Git source repository,
The file gradle/wrapper/gradle-wrapper.jar binary is checked into this projects Git source repository,
but won't exist in your copy of the Fineract codebase if you downloaded a released source archive from apache.org.
In that case, you need to download it using the commands below:
wget --no-check-certificate -P fineract-provider/gradle/wrapper https://github.com/apache/fineract/raw/develop/fineract-provider/gradle/wrapper/gradle-wrapper.jar
wget --no-check-certificate -P gradle/wrapper https://github.com/apache/fineract/raw/develop/gradle/wrapper/gradle-wrapper.jar
(or)
curl --insecure -L https://github.com/apache/fineract/raw/develop/fineract-provider/gradle/wrapper/gradle-wrapper.jar > fineract-provider/gradle/wrapper/gradle-wrapper.jar
curl --insecure -L https://github.com/apache/fineract/raw/develop/gradle/wrapper/gradle-wrapper.jar > gradle/wrapper/gradle-wrapper.jar
Instructions to run Apache RAT (Release Audit Tool)
@@ -195,10 +206,15 @@ Instructions to run Apache RAT (Release Audit Tool)
2. Run `./gradlew rat`. A report will be generated under build/reports/rat/rat-report.txt
Instructions to enable ActiveMQ
============
Messaging configuration is disabled by default. If you want to enable it and register some message listeners, application needs to be started with the proper Spring profile, ie `-Dspring.profiles.active=activeMqEnabled` (or one of the other Spring ways to configure it).
Checkstyle and Spotless
============
This project enforces its code conventions using [checkstyle.xml](fineract-provider/config/checkstyle/checkstyle.xml) through Checkstyle and [fineract-formatting-preferences.xml](config/fineract-formatting-preferences.xml) through Spotless. They are configured to run automatically during the normal Gradle build, and fail if there are any violations detected. You can run the following command to automatically fix spotless violations:
This project enforces its code conventions using [checkstyle.xml](config/checkstyle/checkstyle.xml) through Checkstyle and [fineract-formatting-preferences.xml](config/fineract-formatting-preferences.xml) through Spotless. They are configured to run automatically during the normal Gradle build, and fail if there are any violations detected. You can run the following command to automatically fix spotless violations:
`./gradlew spotlessApply`
@@ -208,8 +224,8 @@ You can also check for Spotless violations (only; but normally don't have to, be
`./gradlew spotlessCheck`
We recommend that you configure your favourite Java IDE to match those conventions. For Eclipse, you can go to
Window > Java > Code Style and import our [config/fineractdev-formatter.xml](config/fineractdev-formatter.xml) under formatter section and [config/fineractdev-cleanup.xml](config/fineractdev-cleanup.xml) under Clean up section. The same fineractdev-formatter.xml configuration file (that can be used in Eclipse IDE) is also used by Spotless to both check for violations and autoformat code on the CLI.
We recommend that you configure your favourite Java IDE to match those conventions. For Eclipse, you can go to
Window > Java > Code Style and import our [config/fineractdev-formatter.xml](config/fineractdev-formatter.xml) under formatter section and [config/fineractdev-cleanup.xml](config/fineractdev-cleanup.xml) under Clean up section. The same fineractdev-formatter.xml configuration file (that can be used in Eclipse IDE) is also used by Spotless to both check for violations and autoformat code on the CLI.
You could also use Checkstyle directly in your IDE (but you don't neccesarily have to, it may just be more convenient for you). For Eclipse, use https://checkstyle.org/eclipse-cs/ and load our checkstyle.xml into it, for IntelliJ you can use [CheckStyle-IDEA](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea).
@@ -249,7 +265,11 @@ complies with the [Apache Software Foundation third-party license policy](https:
Apache Fineract Platform API
============
The API for the Fineract-platform (project named 'Apache Fineract') is documented in the API-docs under <b><i>Full API Matrix</i></b> and can be viewed [here](https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm "API Documentation").
The API for Fineract is documented in [apiLive.htm](fineract-provider/src/main/resources/static/api-docs/apiLive.htm), and the [apiLive.htm can be viewed on Fineract.dev](https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm "API Documentation"). If you have your own Fineract instance running, you can find this documentation under [/fineract-provider/api-docs/apiLive.htm](https://localhost:8443/fineract-provider/api-docs/apiLive.htm).
The Swagger documentation (work in progress; see [FINERACT-733](https://issues.apache.org/jira/browse/FINERACT-733)) can be accessed under [/fineract-provider/swagger-ui/index.html](https://localhost:8443/fineract-provider/swagger-ui/index.html) and [live Swagger UI here on Fineract.dev](https://demo.fineract.dev/fineract-provider/swagger-ui/index.html).
Apache Fineract supports client code generation using [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) based on the [OpenAPI Specification](https://swagger.io/specification/). For more instructions on how to generate the client code, check [docs/developers/swagger/client.md](docs/developers/swagger/client.md).
API clients (Web UIs, Mobile, etc.)
@@ -266,6 +286,8 @@ Online Demos
* [fineract.dev](https://www.fineract.dev) always runs the latest version of this code
* [demo.mifos.io](https://demo.mifos.io) A demo account is provided for users to experience the functionality of the Community App. Users can use "mifos" for USERNAME and "password" for PASSWORD (without quotation marks).
* [Swagger-UI Demo video](https://www.youtube.com/watch?v=FlVd-0YAo6c) This is a demo video for Swagger-UI documentation, more information [here](https://github.com/apache/fineract#swagger-ui-documentation).
Developers
@@ -284,6 +306,11 @@ Video Demonstration
Apache Fineract / Mifos X Demo (November 2016) - <https://www.youtube.com/watch?v=h61g9TptMBo>
Swagger-UI Documentation
============
We use Swagger-UI to generate and maintain our API documentation, you can see the demo video [here](https://www.youtube.com/watch?v=FlVd-0YAo6c) or a live version
[here](https://demo.fineract.dev/fineract-provider/swagger-ui/index.html). If you interested to know more about Swagger-UI you can check their [website](https://swagger.io/).
Governance and Policies
=======================
@@ -314,6 +341,8 @@ Logging Guidelines
Pull Requests
-------------
We request that your commit message include a FINERACT JIRA issue, recommended to be put in parenthesis add the end of the first line. Start with an upper case imperative verb (not past form), and a short but concise clear description. (E.g. _Add enforced HideUtilityClassConstructor checkstyle (FINERACT-821)_ or _Fix inability to reschedule when interest accrued larger than EMI (FINERACT-1109)_ etc.).
If your PR is failing to pass our CI build due to a test failure, then:
1. Understand if the failure is due to your PR or an unrelated unstable test.
@@ -334,6 +363,17 @@ them in different commits. This helps review to review your code faster.
We have an automated Bot which marks pull requests as "stale" after a while, and ultimately automatically closes them.
Merge Strategy
--------------
This project's committers typically prefer to bring your Pull Requests in through _Rebase and Merge_ instead of _Create a Merge Commit_. (If you are unfamiliar with GitHub's UI re. this, note the somewhat hidden little triangle drop-down at the bottom of PR, visible only to committers, not contributors.) This avoids the "merge commits" which we consider to be somewhat "polluting" the projects commits log history view. We understand this doesn't give an easy automatic reference to the original PR (which GitHub automatically adds to the Merge Commit message it generates), but we consider this an only very minor inconvenience; it's typically relatively easy to find the original PR even just from the commit message, and JIRA.
We expect most proposed PRs to typically consist of a single commit. Committers may use _Squash and merge_ to combine your commits at merge time, and if they do so will rewrite your commit message as they see fit.
Neither of these two are hard absolute rules, but mere conventions. Multiple commits in single PR make sense in certain cases (e.g. branch backports).
Dependency Upgrades
-------------------
@@ -347,8 +387,55 @@ Our `ClasspathHellDuplicatesCheckRuleTest` detects classes that appear in more t
Releasing
---------
[How to Release Apache Fineract](https://cwiki.apache.org/confluence/x/DRwIB) documents the process how we make the source code that is available here in this Git repository into a binary release ZIP available on http://fineract.apache.org.
[How to Release Apache Fineract](https://cwiki.apache.org/confluence/x/DRwIB) documents the process how we make the source code that is available here in this Git repository into a binary release tar.gz available on http://fineract.apache.org.
Before you use Gradle to create a release you need to make sure that you provide the proper GPG parameters. You have to options:
1. Provide the parameters via ~/gradle/gradle.properties in your home folder:
```
signing.gnupg.keyName=7890ABCD
signing.gnupg.passphrase=secret
```
IMPORTANT: Do not set your GPG secrets in one of the project gradle.properties and double check that you are not accidentally committing them to Git.
The release command would look then look like this:
```
./gradlew -Pfineract.release clean build
```
2. Another way to provide these parameters are via project parameters on the command line. A release command would then look like this:
```
./gradlew -Pfineract.release -Psigning.gnupg.keyName=7890ABCD -Psigning.gnupg.passphrase=secret clean build
```
NOTE: Let's assume your GPG key ID would be "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD" then you have to use the last 8 characters (i. e. "7890ABCD") for the signing plugin property "signing.gnupg.keyName".
Above tasks will create the following files in folder build/distributions:
- binary distribution file: apache-fineract-1.4.0-binary.tar.gz
- ASCII armored signature for binary distribution: apache-fineract-1.4.0-binary.tar.gz.asc
- SHA512 checksum for binary distribution: apache-fineract-1.4.0-binary.tar.gz.sha512
- source distribution file: apache-fineract-1.4.0-src.tar.gz
- ASCII armored signature for source distribution: apache-fineract-1.4.0-src.tar.gz.asc
- SHA512 checksum for source distribution: apache-fineract-1.4.0-src.tar.gz.sha512
The signatures are automatically verified by the build script. It will throw an exception if the verification fails.
Additionally, you can verify the validity of the release distribution files e. g. with:
```
gpg --verify build/distributions/apache-fineract-1.4.0-binary.tar.gz.asc
```
The output should look somewhat like this:
```
gpg: assuming signed data in 'build/distributions/apache-fineract-1.4.0-binary.tgz'
gpg: Signature made Mi 26 Aug 2020 17:17:45 CEST
gpg: using RSA key ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD
gpg: Good signature from "Aleksandar Vidakovic (Apache Fineract Release Manager) <aleks@apache.org>" [ultimate]
```
NOTE: All commands shown above are assuming that the current working directory is the project root folder.
More Information
============
+685
View File
@@ -0,0 +1,685 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// TODO: this is work in progress, please follow FINERACT-1171
buildscript {
ext {
jacocoVersion = '0.8.6'
retrofitVersion = '2.9.0'
okhttpVersion = '4.9.0'
oltuVersion = '1.0.1'
fineractJavaProjects = subprojects.findAll{
[
'fineract-api',
'fineract-provider',
'integration-tests',
'fineract-client'
].contains(it.name)
}
fineractPublishProjects = subprojects.findAll{
[
'fineract-client'
].contains(it.name)
}
}
repositories {
jcenter()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.8.0'
classpath 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated in fineract-provider/build.gradle!
classpath 'com.radcortez.gradle:openjpa-gradle-plugin:3.1.0'
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.6.0'
classpath 'gradle.plugin.com.github.andygoossens:gradle-modernizer-plugin:1.3.0'
}
}
plugins {
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'com.diffplug.spotless' version '5.9.0' apply false
id 'org.nosphere.apache.rat' version '0.7.0' apply false
id 'com.github.hierynomus.license' version '0.15.0' apply false
id 'org.openapi.generator' version '4.3.1' apply false
id 'org.zeroturnaround.gradle.jrebel' version '1.1.10' apply false
id 'org.springframework.boot' version '2.3.5.RELEASE' apply false
id 'net.ltgt.errorprone' version '1.3.0' apply false
id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.1.6' apply false
id 'com.gorylenko.gradle-git-properties' version '2.2.4' apply false
id 'org.asciidoctor.jvm.convert' version '3.3.0' apply false
id 'org.asciidoctor.jvm.pdf' version '3.3.0' apply false
id 'org.asciidoctor.jvm.epub' version '3.3.0' apply false
id 'org.asciidoctor.jvm.revealjs' version '3.3.0' apply false
id 'org.asciidoctor.jvm.gems' version '3.3.0' apply false
id 'org.asciidoctor.kindlegen.base' version '3.2.0' apply false
}
description = '''\
Run as:
gradle clean bootRun'''
project.ext.jerseyVersion = '1.19.4'
ext['groovy.version'] = '3.0.6'
ext['swaggerFile'] = "$rootDir/fineract-provider/build/classes/java/main/static/swagger-ui/fineract.yaml".toString()
allprojects {
group = 'org.apache.fineract'
repositories {
jcenter()
}
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.diffplug.spotless'
apply plugin: 'com.github.hierynomus.license'
apply plugin: 'org.nosphere.apache.rat'
apply plugin: 'project-report'
// Configuration for the dependency management plugin
// https://github.com/spring-gradle-plugins/dependency-management-plugin
dependencyManagement {
imports {
mavenBom 'org.springframework:spring-framework-bom:5.3.3'
mavenBom 'org.springframework.boot:spring-boot-dependencies:2.3.5.RELEASE'
mavenBom 'org.junit:junit-bom:5.7.0'
}
dependencies {
// We use fixed versions, instead of inheriting them from the Spring BOM, to be able to be on more recent ones.
// We do not use :+ to get the latest available version available on Maven Central, as that could suddenly break things.
// We use the Renovate Bot to automatically propose Pull Requests (PRs) when upgrades for all of these versions are available.
dependency 'org.springframework.security.oauth:spring-security-oauth2:2.5.0.RELEASE'
dependency 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated above in buildscript!
dependency 'com.google.guava:guava:30.1-jre'
dependency 'com.google.code.gson:gson:2.8.6'
dependency 'org.apache.commons:commons-email:1.5'
dependency 'commons-io:commons-io:2.8.0'
dependency 'org.drizzle.jdbc:drizzle-jdbc:1.4'
dependency 'com.github.librepdf:openpdf:1.3.24'
dependency 'org.mnode.ical4j:ical4j:3.0.21'
dependency 'org.quartz-scheduler:quartz:2.3.2'
dependency 'com.amazonaws:aws-java-sdk-s3:1.11.934'
dependency 'org.ehcache:ehcache:3.9.0'
dependency 'com.github.spullara.mustache.java:compiler:0.9.7'
dependency 'com.jayway.jsonpath:json-path:2.5.0'
dependency 'org.apache.tika:tika-core:1.25'
dependency 'org.apache.httpcomponents:httpclient:4.5.13'
dependency 'io.swagger.core.v3:swagger-annotations:2.1.6'
dependency 'jakarta.management.j2ee:jakarta.management.j2ee-api:1.1.4'
dependency 'jakarta.jms:jakarta.jms-api:2.0.3'
dependency 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.3'
dependency 'jakarta.validation:jakarta.validation-api:3.0.0'
dependency 'org.apache.activemq:activemq-broker:5.16.1'
dependency 'org.apache.bval:org.apache.bval.bundle:2.0.5'
dependency 'io.github.classgraph:classgraph:4.8.90'
dependency 'org.awaitility:awaitility:4.0.3'
dependency 'com.github.spotbugs:spotbugs-annotations:4.2.0'
dependency 'javax.cache:cache-api:1.1.1'
dependency 'org.mock-server:mockserver-junit-jupiter:5.11.2'
dependency 'org.webjars.npm:swagger-ui-dist:3.40.0'
dependency 'org.webjars:webjars-locator-core:0.46'
// fineract client dependencies
dependency "com.squareup.retrofit2:retrofit:$retrofitVersion"
dependency "com.squareup.retrofit2:retrofit-mock:$retrofitVersion"
dependency "com.squareup.retrofit2:adapter-java8:$retrofitVersion"
dependency "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"
dependency "com.squareup.retrofit2:adapter-rxjava3:$retrofitVersion"
dependency "com.squareup.retrofit2:adapter-guava:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-wire:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-jackson:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-simplexml:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-jaxb:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-java8:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-scalars:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-gson:$retrofitVersion"
dependency "com.squareup.retrofit2:converter-protobuf:$retrofitVersion"
dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.common:$oltuVersion"
dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltuVersion"
dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.httpclient4:$oltuVersion"
dependency "com.squareup.okhttp3:okhttp:$okhttpVersion"
dependency "com.squareup.okhttp3:okcurl:$okhttpVersion"
dependency "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
dependency "com.squareup.okhttp3:okhttp-apache:$okhttpVersion"
dependency "com.squareup.okhttp3:okhttp-android-support:$okhttpVersion"
dependency "com.squareup.okhttp3:okhttp-urlconnection:$okhttpVersion"
dependency "com.squareup.okhttp3:okhttp-sse:$okhttpVersion"
dependency "io.gsonfire:gson-fire:1.8.5"
dependency "io.swagger:swagger-core:1.6.2"
dependency "io.swagger:swagger-annotations:1.6.2"
dependency "javax.annotation:javax.annotation-api:1.3.2"
dependency "com.google.code.findbugs:jsr305:3.0.2"
dependency "commons-codec:commons-codec:1.15"
dependency ('org.flywaydb:flyway-core:7.0.0') {
// https://issues.apache.org/jira/browse/FINERACT-1172
// https://github.com/apache/fineract/pull/1355
// https://github.com/flyway/flyway/issues/2957
// exclude conflicting non-<optional> dependencies from https://github.com/flyway/flyway/blob/master/flyway-core/pom.xml
exclude 'software.amazon.awssdk:s3'
}
dependency ('org.dom4j:dom4j:2.1.3') {
exclude 'relaxngDatatype:relaxngDatatype' // already in com.sun.xml.bind:jaxb-osgi:2.3.0.1
// FINERACT-940 && FINERACT-966 https://github.com/spotbugs/spotbugs/issues/1128
exclude 'xpp3:xpp3'
exclude 'pull-parser:pull-parser'
}
dependencySet(group: 'com.sun.jersey', version: jerseyVersion) {
entry 'jersey-core'
entry 'jersey-servlet'
entry 'jersey-server'
entry 'jersey-json'
}
dependencySet(group: 'com.sun.jersey.contribs', version: jerseyVersion) {
entry 'jersey-spring'
entry 'jersey-multipart'
}
dependencySet(group: 'org.apache.poi', version: '4.1.2') {
entry 'poi'
entry 'poi-ooxml'
entry 'poi-ooxml-schemas'
}
dependencySet(group: 'io.rest-assured', version: '4.3.0')
{
entry 'rest-assured'
entry 'json-path'
entry 'xml-path'
}
}
}
// Configuration for the spotless plugin
// https://github.com/diffplug/spotless/tree/main/plugin-gradle
spotless {
format 'misc', {
target '**/*.md', '**/*.properties', '**/.gitignore', '**/.openapi-generator-ignore', '**/*.yml', '**/*.xml', '**/**.json', '**/*.sql'
targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat'
indentWithSpaces(4)
endWithNewline()
trimTrailingWhitespace()
}
groovyGradle {
target '*.gradle', '**/*.gradle'
targetExclude '**/build/**'
greclipse()
indentWithSpaces(4)
endWithNewline()
trimTrailingWhitespace()
}
lineEndings 'UNIX'
}
// Configuration for Gradle license plug-in
// https://github.com/hierynomus/license-gradle-plugin
license {
header rootProject.file("$rootDir/APACHE_LICENSETEXT.md")
excludes([
"**/gradlew*",
"**/git.properties",
"**/*.html",
"**/*.mustache",
"**/package-info.java",
"**/keystore.jks",
"**/static/swagger-ui/**",
"**/api-docs/**",
])
strictCheck true
}
task licenseFormatBuildScripts (type:nl.javadude.gradle.plugins.license.License) {
source = fileTree(dir: "$rootDir/", includes: [
'**/*.bat',
'**/*.sh',
'**/*.sql'
], excludes: [
'**/gradlew*'
])
}
licenseFormat.dependsOn licenseFormatBuildScripts
// Configuration for Apache Release Audit Tool task
// https://github.com/eskatos/creadur-rat-gradle
rat {
verbose = false
reportDir = file("$buildDir/reports/rat")
excludes = [
'**/src/main/templates/**/*.mustache',
'**/.dockerignore',
'**/*.launch',
'**/licenses/**',
'**/*.md',
'**/*.adoc',
'**/.asciidoctorconfig',
'**/*.puml',
'**/*.github/**',
'**/MANIFEST.MF',
'**/*.json',
'**/*.json.template',
'**/*.txt',
'**/*.log',
'**/fineractdev-eclipse-preferences.epf',
'**/template-expected.html',
'**/template.mustache',
'**/.classpath',
'**/.project',
'**/.idea/**',
'**/*.ipr',
'**/*.iws',
'**/.settings/**',
'**/bin/**',
'**/.git/**',
'**/.gitignore',
'**/.openapi-generator-ignore',
'**/.gitkeep',
'**/*.iml',
'**/config/swagger/templates/**',
// Notice files
'**/NOTICE_RELEASE',
'**/NOTICE_SOURCE',
// Swagger License
'**/src/main/resources/static/swagger-ui/**',
// gradle
'**/.gradle/**',
'**/gradlew',
'**/gradlew.bat',
'**/gradle/wrapper/gradle-wrapper.properties',
'**/caches/**',
'**/daemon/**',
'**/native/**',
'**/wrapper/**',
'**/build/**',
// Api Docs
'**/api-docs/*.*',
'**/docs/system-architecture/.htaccess',
'**/docs/system-architecture/404.html',
'**/docs/system-architecture/index.html',
'**/docs/system-architecture/**/*.xml',
'**/bootstrap-3.0.0/assets/application.js',
'**/system-architecture/js/plugins.js',
// Apache License
'**/bootstrap-3.0.0/assets/less.js',
'**/css/bootstrap-3.0.0/**/*.*',
// Public Domain See http://www.JSON.org/js.html
'**/bootstrap-3.0.0/assets/json2.js.htm',
// MIT License
'**/modernizr-2.6.2.min.js',
'**/css/normalize.css',
'**/assets/filesaver.js',
'**/css/fonts/glyphicons-halflings-regular.svg',
'**/assets/jszip.js',
'**/assets/jquery.js',
'**/api-docs/jquery-1.7.min.js',
'**/css/toc-0.1.2/**/*.*',
'**/docs/system-architecture/css/main.css',
'**/system-architecture/js/vendor/jquery-1.9.1.min.js',
'**/system-architecture/js/vendor/toc-0.1.2/jquery.toc.min.js',
'**/assets/respond.min.js',
'**/assets/html5shiv.js',
// BSD License
'**/assets/uglify.js',
// Ignore out folder
'**/out/**',
// Git build info
"**/git.properties",
".mailmap",
]
}
}
configure(project.fineractJavaProjects) {
// NOTE: order matters!
apply plugin: 'java-library'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'checkstyle'
apply plugin: 'jacoco'
apply plugin: "net.ltgt.errorprone"
apply plugin: "com.github.spotbugs"
apply plugin: 'com.github.andygoossens.gradle-modernizer-plugin'
/* define the valid syntax level for source files */
sourceCompatibility = JavaVersion.VERSION_11
/* define binary compatibility version */
targetCompatibility = JavaVersion.VERSION_11
/* http://stackoverflow.com/questions/19653311/jpa-repository-works-in-idea-and-production-but-not-in-gradle */
sourceSets.main.output.resourcesDir = sourceSets.main.java.outputDir
sourceSets.test.output.resourcesDir = sourceSets.test.java.outputDir
configurations {
implementation.setCanBeResolved(true)
api.setCanBeResolved(true)
}
tasks.withType(JavaCompile) {
options.compilerArgs += [
"-Xlint:unchecked",
"-Xlint:cast",
"-Xlint:auxiliaryclass",
"-Xlint:deprecation",
"-Xlint:dep-ann",
"-Xlint:divzero",
"-Xlint:empty",
"-Xlint:exports",
"-Xlint:fallthrough",
"-Xlint:finally",
"-Xlint:module",
"-Xlint:opens",
"-Xlint:options",
"-Xlint:overloads",
"-Xlint:overrides",
"-Xlint:path",
"-Xlint:processing",
"-Xlint:removal",
"-Xlint:requires-automatic",
"-Xlint:requires-transitive-automatic",
"-Xlint:try",
"-Xlint:varargs",
"-Xlint:preview",
"-Xlint:static",
"-Werror"
]
// TODO FINERACT-959 (gradually) enable -Xlint:all (see "javac -help -X")
options.deprecation = true
options.compilerArgs +=[
"-Xmaxwarns",
1500,
"-Xmaxerrs",
1500
]
}
// Configuration for the spotless plugin
// https://github.com/diffplug/spotless/tree/main/plugin-gradle
dependencies {
spotbugsPlugins 'jp.skypencil.findbugs.slf4j:bug-pattern:1.5.0@jar'
spotbugs 'com.github.spotbugs:spotbugs:4.2.0'
}
spotless {
java {
targetExclude '**/build/**', '**/bin/**', '**/out/**'
importOrder() //sort imports alphabetically
removeUnusedImports()
eclipse().configFile "$rootDir/config/fineractdev-formatter.xml"
endWithNewline()
trimTrailingWhitespace()
// Enforce style modifier order
custom 'Modifier ordering', {
def modifierRanking = [
public : 1,
protected : 2,
private : 3,
abstract : 4,
default : 5,
static : 6,
final : 7,
transient : 8,
volatile : 9,
synchronized: 10,
native : 11,
strictfp : 12]
// Find any instance of multiple modifiers. Lead with a non-word character to avoid
// accidental matching against for instance, "an alternative default value"
it.replaceAll(/\W(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
// Do not replace the leading non-word character. Identify the modifiers
it.replaceAll(/(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
// Sort the modifiers according to the ranking above
it.split().sort({ modifierRanking[it] }).join(' ') + ' '
}
)
}
)
}
}
lineEndings 'UNIX'
}
compileJava.dependsOn spotlessCheck
// If we are running Gradle within Eclipse to enhance classes with OpenJPA,
// set the classes directory to point to Eclipse's default build directory
if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') {
sourceSets.main.java.outputDir = file("$projectDir/bin/main")
}
// Configuration for the Checkstyle plugin
// https://docs.gradle.org/current/userguide/checkstyle_plugin.html
dependencies {
checkstyle 'com.puppycrawl.tools:checkstyle:8.39'
checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.38.0'
}
// Configuration for JaCoCo code coverage task
// https://www.eclemma.org/jacoco/
jacoco {
toolVersion = jacocoVersion
reportsDir = file("$buildDir/reports/jacoco")
}
jacocoTestReport {
reports {
html.enabled=true
xml.enabled=true
html.destination file("${buildDir}/code-coverage")
}
}
// Configuration for the errorprone plugin
// https://github.com/tbroyer/gradle-errorprone-plugin
dependencies {
errorprone "com.google.errorprone:error_prone_core:2.5.1"
}
tasks.withType(JavaCompile) {
options.errorprone {
disableWarningsInGeneratedCode = true
excludedPaths = ".*/build/.*"
disable(
// TODO Remove disabled checks from this list, by fixing remaining usages
"UnusedVariable",
"TypeParameterUnusedInFormals",
"EmptyBlockTag",
"MissingSummary",
"InvalidParam",
"ReturnFromVoid",
"AlmostJavadoc",
"InvalidBlockTag",
"JavaUtilDate", // TODO FINERACT-1298
)
error(
"DefaultCharset",
"RemoveUnusedImports",
"WaitNotInLoop",
"ThreeLetterTimeZoneID",
"VariableNameSameAsType",
"UnnecessaryParentheses",
"MultipleTopLevelClasses",
"MixedMutabilityReturnType",
"MultiVariableDeclaration",
"AssertEqualsArgumentOrderChecker",
"EmptySetMultibindingContributions",
"BigDecimalEquals",
"MixedArrayDimensions",
"PackageLocation",
"UseBinds",
"BadImport",
"IntLongMath",
"FloatCast",
"ReachabilityFenceUsage",
"StreamResourceLeak",
"TruthIncompatibleType",
"ByteBufferBackingArray",
"SameNameButDifferent",
"OrphanedFormatString",
"CatchAndPrintStackTrace",
"ObjectToString",
"StringSplitter",
"AssertThrowsMultipleStatements",
"BoxedPrimitiveConstructor",
"EmptyCatch",
"BoxedPrimitiveEquality",
"SynchronizeOnNonFinalField",
"WildcardImport",
"FutureReturnValueIgnored",
"PrivateConstructorForNoninstantiableModule",
"ClassCanBeStatic",
"ClassNewInstance",
"UnnecessaryStaticImport",
"UnsafeFinalization",
"JavaTimeDefaultTimeZone",
"JodaPlusMinusLong",
"MutableMethodReturnType",
"SwitchDefault",
"VarTypeName",
"ArgumentSelectionDefectChecker",
"CompareToZero",
"InjectOnConstructorOfAbstractClass",
"ImmutableEnumChecker",
"NarrowingCompoundAssignment",
"MissingCasesInEnumSwitch",
"ReferenceEquality",
"UndefinedEquals",
"PublicConstructorForAbstractClass",
"UnescapedEntity",
"ModifyCollectionInEnhancedForLoop",
"NonCanonicalType",
"InvalidInlineTag",
"MutablePublicArray",
"StaticAssignmentInConstructor",
"ProtectedMembersInFinalClass",
"OperatorPrecedence",
"EqualsGetClass",
"EqualsUnsafeCast",
"DoubleBraceInitialization",
"UnnecessaryDefaultInEnumSwitch",
"UnusedNestedClass",
"UnusedMethod",
"ModifiedButNotUsed",
"InconsistentCapitalization",
"MissingOverride",
// TODO enable these remaining checks (one by one)
// "InvalidBlockTag",
// "InconsistentOverloads",
// "MethodCanBeStatic",
// "Var",
// "ConstantField",
// "UnnecessaryDefaultInEnumSwitch",
// "FieldCanBeFinal"
)
}
}
test {
useJUnitPlatform()
testLogging {
// FINERACT-927
events "skipped", "failed"
showStandardStreams = false
exceptionFormat "full"
}
}
// Configuration for spotbugs plugin
// https://github.com/spotbugs/spotbugs-gradle-plugin
// To generate an HTML report instead of XML
spotbugs {
reportLevel = 'high'
showProgress = true
}
// https://github.com/spotbugs/spotbugs-gradle-plugin/issues/242
spotbugsMain {
reports {
html {
enabled = true
stylesheet = 'fancy-hist.xsl'
}
}
}
spotbugsTest {
reports {
html {
enabled = true
stylesheet = 'fancy-hist.xsl'
}
}
}
// Configuration for https://github.com/andygoossens/gradle-modernizer-plugin
modernizer {
includeTestClasses = true
failOnViolations = true
violationLogLevel="error"
javaVersion = project.targetCompatibility
ignoreGeneratedClasses = true
}
}
configure(project.fineractPublishProjects) {
apply plugin: 'maven'
apply plugin: 'maven-publish'
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
versionMapping {
usage('java-api') {
fromResolutionOf('runtimeClasspath')
}
usage('java-runtime') {
fromResolutionResult()
}
}
pom {
name = 'Fineract'
description = 'A secure, multi-tenanted microfinance platform'
url = 'https://fineract.apache.org'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.html'
}
}
scm {
connection = 'scm:git:https://github.com/apache/fineract.git'
developerConnection = 'scm:git:git://github.com:apache/fineract.git'
url = 'https://fineract.apache.org/'
}
}
}
}
// TODO FINERACT-1102: Actually use this to deploy to ASF (Apache Software Foundation) Nexus Maven Repository
}
}
@@ -29,8 +29,12 @@
<!--
You can learn more about individual checkstyles at: https://checkstyle.sourceforge.io/
Checks related to LineLength and Indentation are only handled by Spotless
Checks included in MissingSwitchDefault are handled by ErrorProne
-->
<module name="SuppressionFilter">
<property name="file" value="${config_loc}/suppressions.xml"/>
</module>
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
@@ -46,10 +50,16 @@
<module name="TreeWalker">
<module name="ParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$|[a-z]"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidHidingCauseExceptionCheck" />
<module name="SuppressWarningsHolder" />
<module name="RegexpSinglelineJava">
<property name="format" value="System\.(out)|(err)\.print(ln)?\("/>
@@ -115,6 +125,7 @@
<!-- No PACKAGE_DEF token, as we like our license header to be glue to "package" statement, to save 1 line screen space -->
<property name="tokens" value="IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<module name="MultipleVariableDeclarations"/>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9_]*)*$"/>
<message key="name.invalidPattern"
@@ -154,12 +165,19 @@
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module>
<module name="HideUtilityClassConstructor"/>
<module name="OneTopLevelClass"/>
<module name="MethodName">
<property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MutableException"/>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
@@ -170,7 +188,23 @@
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="RedundantModifier"/>
<module name="ParenPad" />
<module name="ModifierOrder"/>
<module name="LocalVariableName">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$|[a-z]"/>
<property name="allowOneCharVarInForLoop" value="true"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="AvoidNoArgumentSuperConstructorCall"/>
<module name="AvoidDoubleBraceInitialization"/>
<!-- TODO Enable many more checks (go about this one by one, step by step, raise separate PRs fixing and then enforcing):
<module name="HiddenField">
@@ -180,13 +214,10 @@
<property name="setterCanReturnItsClass" value="true" />
</module>
<module name="HideUtilityClassConstructor"/>
< ! - - TODO Checks for Exception Handling Anti-Patterns - - >
<module name="IllegalCatch"/>
<module name="MutableException"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidHidingCauseExceptionCheck" />
@@ -199,36 +230,19 @@
<module name="MultipleVariableDeclarations"/>
<module name="MissingSwitchDefault"/>
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<property name="allowOneCharVarInForLoop" value="true"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ConstantName" />
+32
View File
@@ -0,0 +1,32 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<!--
This file contains suppression rules for Checkstyle checks.
Ideally only files that cannot be modified (e.g. third-party code)
should be added here. All other violations should be fixed.
-->
<suppressions>
<suppress files="[/\\]build[/\\]generated[/\\]" checks=".*"/>
<!-- TODO: fix integration test formatting -->
<suppress files="[/\\]integration-tests[/\\]src[/\\]test[/\\]main[/\\]" checks=".*"/>
</suppressions>
+20
View File
@@ -1,4 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<profiles version="2">
<profile kind="CleanUpProfile" name="fineractdevprofile" version="2">
<setting id="cleanup.use_autoboxing" value="false"/>
+21 -1
View File
@@ -1,4 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<profiles version="18">
<profile kind="CodeFormatterProfile" name="fineractdevprojectformatter" version="18">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
@@ -79,7 +99,7 @@
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_if_empty"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+3 -2
View File
@@ -38,7 +38,7 @@ services:
build:
context: .
target: fineract
ports:
ports:
- 8443:8443
depends_on:
- fineractmysql
@@ -49,11 +49,12 @@ services:
- fineract_tenants_driver=org.drizzle.jdbc.DrizzleDriver
- fineract_tenants_url=jdbc:mysql:thin://fineractmysql:3306/fineract_tenants
- fineract_tenants_uid=root
- fineract_tenants_pwd=skdcnwauicn2ucnaecasdsajdnizucawencascdca
- fineract_tenants_pwd=skdcnwauicn2ucnaecasdsajdnizucawencascdca
- FINERACT_DEFAULT_TENANTDB_HOSTNAME=fineractmysql
- FINERACT_DEFAULT_TENANTDB_PORT=3306
- FINERACT_DEFAULT_TENANTDB_UID=root
- FINERACT_DEFAULT_TENANTDB_PWD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
- FINERACT_DEFAULT_TENANTDB_CONN_PARAMS=
# Frontend service
community-app:
+2 -2
View File
@@ -70,7 +70,7 @@
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200" scheme="https"
secure="true" SSLEnabled="true"
keystoreFile="/opt/bitnami/tomcat/tomcat.keystore"
@@ -83,7 +83,7 @@
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-1
View File
@@ -1 +0,0 @@
* text=auto
-2
View File
@@ -1,2 +0,0 @@
# Include your project-specific ignores in this file
# Read about how to use .gitignore: https://help.github.com/articles/ignoring-files
-544
View File
@@ -1,544 +0,0 @@
# Apache Configuration File
# (!) Using `.htaccess` files slows down Apache, therefore, if you have access
# to the main server config file (usually called `httpd.conf`), you should add
# this logic there: http://httpd.apache.org/docs/current/howto/htaccess.html.
# ##############################################################################
# # CROSS-ORIGIN RESOURCE SHARING (CORS) #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Cross-domain AJAX requests |
# ------------------------------------------------------------------------------
# Enable cross-origin AJAX requests.
# http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
# http://enable-cors.org/
# <IfModule mod_headers.c>
# Header set Access-Control-Allow-Origin "*"
# </IfModule>
# ------------------------------------------------------------------------------
# | CORS-enabled images |
# ------------------------------------------------------------------------------
# Send the CORS header for images when browsers request it.
# https://developer.mozilla.org/en/CORS_Enabled_Image
# http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
# http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(gif|ico|jpe?g|png|svg|svgz|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
# ------------------------------------------------------------------------------
# | Web fonts access |
# ------------------------------------------------------------------------------
# Allow access from all domains for web fonts
<IfModule mod_headers.c>
<FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
# ##############################################################################
# # ERRORS #
# ##############################################################################
# ------------------------------------------------------------------------------
# | 404 error prevention for non-existing redirected folders |
# ------------------------------------------------------------------------------
# Prevent Apache from returning a 404 error for a rewrite if a directory
# with the same name does not exist.
# http://httpd.apache.org/docs/current/content-negotiation.html#multiviews
# http://www.webmasterworld.com/apache/3808792.htm
Options -MultiViews
# ------------------------------------------------------------------------------
# | Custom error messages / pages |
# ------------------------------------------------------------------------------
# You can customize what Apache returns to the client in case of an error (see
# http://httpd.apache.org/docs/current/mod/core.html#errordocument), e.g.:
ErrorDocument 404 /404.html
# ##############################################################################
# # INTERNET EXPLORER #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Better website experience |
# ------------------------------------------------------------------------------
# Force IE to render pages in the highest available mode in the various
# cases when it may not: http://hsivonen.iki.fi/doctype/ie-mode.pdf.
# Use, if installed, Google Chrome Frame.
<IfModule mod_headers.c>
Header set X-UA-Compatible "IE=edge,chrome=1"
# `mod_headers` can't match based on the content-type, however, we only
# want to send this header for HTML pages and not for the other resources
<FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svg|svgz|ttf|vcf|webapp|webm|webp|woff|xml|xpi)$">
Header unset X-UA-Compatible
</FilesMatch>
</IfModule>
# ------------------------------------------------------------------------------
# | Cookie setting from iframes |
# ------------------------------------------------------------------------------
# Allow cookies to be set from iframes in IE.
# <IfModule mod_headers.c>
# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
# </IfModule>
# ------------------------------------------------------------------------------
# | Screen flicker |
# ------------------------------------------------------------------------------
# Stop screen flicker in IE on CSS rollovers (this only works in
# combination with the `ExpiresByType` directives for images from below).
# BrowserMatch "MSIE" brokenvary=1
# BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1
# BrowserMatch "Opera" !brokenvary
# SetEnvIf brokenvary 1 force-no-vary
# ##############################################################################
# # MIME TYPES AND ENCODING #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Proper MIME types for all files |
# ------------------------------------------------------------------------------
<IfModule mod_mime.c>
# Audio
AddType audio/mp4 m4a f4a f4b
AddType audio/ogg oga ogg
# JavaScript
# Normalize to standard type (it's sniffed in IE anyways):
# http://tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript js jsonp
AddType application/json json
# Video
AddType video/mp4 mp4 m4v f4v f4p
AddType video/ogg ogv
AddType video/webm webm
AddType video/x-flv flv
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot
# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf
# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# Other
AddType application/octet-stream safariextz
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-shockwave-flash swf
AddType application/x-web-app-manifest+json webapp
AddType application/x-xpinstall xpi
AddType application/xml atom rdf rss xml
AddType image/webp webp
AddType image/x-icon ico
AddType text/cache-manifest appcache manifest
AddType text/vtt vtt
AddType text/x-component htc
AddType text/x-vcard vcf
</IfModule>
# ------------------------------------------------------------------------------
# | UTF-8 encoding |
# ------------------------------------------------------------------------------
# Use UTF-8 encoding for anything served as `text/html` or `text/plain`.
AddDefaultCharset utf-8
# Force UTF-8 for certain file formats.
<IfModule mod_mime.c>
AddCharset utf-8 .atom .css .js .json .rss .vtt .webapp .xml
</IfModule>
# ##############################################################################
# # URL REWRITES #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Rewrite engine |
# ------------------------------------------------------------------------------
# Turning on the rewrite engine and enabling the `FollowSymLinks` option is
# necessary for the following directives to work.
# If your web host doesn't allow the `FollowSymlinks` option, you may need to
# comment it out and use `Options +SymLinksIfOwnerMatch` but, be aware of the
# performance impact: http://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks
# Also, some cloud hosting services require `RewriteBase` to be set:
# http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-mod-rewrite-not-working-on-my-site
<IfModule mod_rewrite.c>
Options +FollowSymlinks
# Options +SymLinksIfOwnerMatch
RewriteEngine On
# RewriteBase /
</IfModule>
# ------------------------------------------------------------------------------
# | Suppressing / Forcing the "www." at the beginning of URLs |
# ------------------------------------------------------------------------------
# The same content should never be available under two different URLs especially
# not with and without "www." at the beginning. This can cause SEO problems
# (duplicate content), therefore, you should choose one of the alternatives and
# redirect the other one.
# By default option 1 (no "www.") is activated:
# http://no-www.org/faq.php?q=class_b
# If you'd prefer to use option 2, just comment out all the lines from option 1
# and uncomment the ones from option 2.
# IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME!
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Option 1: rewrite www.example.com → example.com
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Option 2: rewrite example.com → www.example.com
# Be aware that the following might not be a good idea if you use "real"
# subdomains for certain parts of your website.
# <IfModule mod_rewrite.c>
# RewriteCond %{HTTPS} !=on
# RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# </IfModule>
# ##############################################################################
# # SECURITY #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Content Security Policy (CSP) |
# ------------------------------------------------------------------------------
# You can mitigate the risk of cross-site scripting and other content-injection
# attacks by setting a Content Security Policy which whitelists trusted sources
# of content for your site.
# The example header below allows ONLY scripts that are loaded from the current
# site's origin (no inline scripts, no CDN, etc). This almost certainly won't
# work as-is for your site!
# To get all the details you'll need to craft a reasonable policy for your site,
# read: http://html5rocks.com/en/tutorials/security/content-security-policy (or
# see the specification: http://w3.org/TR/CSP).
# <IfModule mod_headers.c>
# Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
# <FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svg|svgz|ttf|vcf|webapp|webm|webp|woff|xml|xpi)$">
# Header unset Content-Security-Policy
# </FilesMatch>
# </IfModule>
# ------------------------------------------------------------------------------
# | File access |
# ------------------------------------------------------------------------------
# Block access to directories without a default document.
# Usually you should leave this uncommented because you shouldn't allow anyone
# to surf through every directory on your server (which may includes rather
# private places like the CMS's directories).
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Block access to hidden files and directories.
# This includes directories used by version control systems such as Git and SVN.
<IfModule mod_rewrite.c>
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
</IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Block access to backup and source files.
# These files may be left by some text editors and can pose a great security
# danger when anyone has access to them.
<FilesMatch "(^#.*#|\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|sw[op])|~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
# ------------------------------------------------------------------------------
# | Secure Sockets Layer (SSL) |
# ------------------------------------------------------------------------------
# Rewrite secure requests properly to prevent SSL certificate warnings, e.g.:
# prevent `https://www.example.com` when your certificate only allows
# `https://secure.example.com`.
# <IfModule mod_rewrite.c>
# RewriteCond %{SERVER_PORT} !^443
# RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L]
# </IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Force client-side SSL redirection.
# If a user types "example.com" in his browser, the above rule will redirect him
# to the secure version of the site. That still leaves a window of opportunity
# (the initial HTTP connection) for an attacker to downgrade or redirect the
# request. The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the address bar.
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# <IfModule mod_headers.c>
# Header set Strict-Transport-Security max-age=16070400;
# </IfModule>
# ------------------------------------------------------------------------------
# | Server software information |
# ------------------------------------------------------------------------------
# Avoid displaying the exact Apache version number, the description of the
# generic OS-type and the information about Apache's compiled-in modules.
# ADD THIS DIRECTIVE IN THE `httpd.conf` AS IT WILL NOT WORK IN THE `.htaccess`!
# ServerTokens Prod
# ##############################################################################
# # WEB PERFORMANCE #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Compression |
# ------------------------------------------------------------------------------
<IfModule mod_deflate.c>
# Force compression for mangled headers.
# http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Compress all output labeled with one of the following MIME-types
# (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
# and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
# as `AddOutputFilterByType` is still in the core directives).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
</IfModule>
</IfModule>
# ------------------------------------------------------------------------------
# | Content transformations |
# ------------------------------------------------------------------------------
# Prevent some of the mobile network providers from modifying the content of
# your site: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5.
# <IfModule mod_headers.c>
# Header set Cache-Control "no-transform"
# </IfModule>
# ------------------------------------------------------------------------------
# | ETag removal |
# ------------------------------------------------------------------------------
# Since we're sending far-future expires headers (see below), ETags can
# be removed: http://developer.yahoo.com/performance/rules.html#etags.
# `FileETag None` is not enough for every server.
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
# ------------------------------------------------------------------------------
# | Expires headers (for better cache control) |
# ------------------------------------------------------------------------------
# The following expires headers are set pretty far in the future. If you don't
# control versioning with filename-based cache busting, consider lowering the
# cache time for resources like CSS and JS to something like 1 week.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!)
ExpiresByType image/x-icon "access plus 1 week"
# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web fonts
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
# ------------------------------------------------------------------------------
# | Filename-based cache busting |
# ------------------------------------------------------------------------------
# If you're not using a build process to manage your filename version revving,
# you might want to consider enabling the following directives to route all
# requests such as `/css/style.12345.css` to `/css/style.css`.
# To understand why this is important and a better idea than `*.css?v231`, read:
# http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring
# <IfModule mod_rewrite.c>
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
# </IfModule>
# ------------------------------------------------------------------------------
# | File concatenation |
# ------------------------------------------------------------------------------
# Allow concatenation from within specific CSS and JS files, e.g.:
# Inside of `script.combined.js` you could have
# <!--#include file="libs/jquery.js" -->
# <!--#include file="plugins/jquery.idletimer.js" -->
# and they would be included into this single file.
# <IfModule mod_include.c>
# <FilesMatch "\.combined\.js$">
# Options +Includes
# AddOutputFilterByType INCLUDES application/javascript application/json
# SetOutputFilter INCLUDES
# </FilesMatch>
# <FilesMatch "\.combined\.css$">
# Options +Includes
# AddOutputFilterByType INCLUDES text/css
# SetOutputFilter INCLUDES
# </FilesMatch>
# </IfModule>
# ------------------------------------------------------------------------------
# | Persistent connections |
# ------------------------------------------------------------------------------
# Allow multiple requests to be sent over the same TCP connection:
# http://httpd.apache.org/docs/current/en/mod/core.html#keepalive.
# Enable if you serve a lot of static content but, be aware of the
# possible disadvantages!
# <IfModule mod_headers.c>
# Header set Connection Keep-Alive
# </IfModule>
-154
View File
@@ -1,154 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
<style>
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
html {
padding: 30px 10px;
font-size: 20px;
line-height: 1.4;
color: #737373;
background: #f0f0f0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
html,
input {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body {
max-width: 500px;
_width: 500px;
padding: 30px 20px 50px;
border: 1px solid #b3b3b3;
border-radius: 4px;
margin: 0 auto;
box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
background: #fcfcfc;
}
h1 {
margin: 0 10px;
font-size: 50px;
text-align: center;
}
h1 span {
color: #bbb;
}
h3 {
margin: 1.5em 0 0.5em;
}
p {
margin: 1em 0;
}
ul {
padding: 0 0 0 40px;
margin: 1em 0;
}
.container {
max-width: 380px;
_width: 380px;
margin: 0 auto;
}
/* google search */
#goog-fixurl ul {
list-style: none;
padding: 0;
margin: 0;
}
#goog-fixurl form {
margin: 0;
}
#goog-wm-qt,
#goog-wm-sb {
border: 1px solid #bbb;
font-size: 16px;
line-height: normal;
vertical-align: top;
color: #444;
border-radius: 2px;
}
#goog-wm-qt {
width: 220px;
height: 20px;
padding: 5px;
margin: 5px 10px 0 0;
box-shadow: inset 0 1px 1px #ccc;
}
#goog-wm-sb {
display: inline-block;
height: 32px;
padding: 0 10px;
margin: 5px 0 0;
white-space: nowrap;
cursor: pointer;
background-color: #f5f5f5;
background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1);
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
*overflow: visible;
*display: inline;
*zoom: 1;
}
#goog-wm-sb:hover,
#goog-wm-sb:focus {
border-color: #aaa;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
background-color: #f8f8f8;
}
#goog-wm-qt:hover,
#goog-wm-qt:focus {
border-color: #105cb6;
outline: 0;
color: #222;
}
input::-moz-focus-inner {
padding: 0;
border: 0;
}
</style>
-33
View File
@@ -1,33 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Page Not Found :(</title>
<link rel="stylesheet" href="404.css">
</head>
<body>
<div class="container">
<h1>Not found <span>:(</span></h1>
<p>Sorry, but the page you were trying to view does not exist.</p>
<p>It looks like this was the result of either:</p>
<ul>
<li>a mistyped address</li>
<li>an out-of-date link</li>
</ul>
<script>
var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
</script>
<script src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
</div>
</body>
</html>
-122
View File
@@ -1,122 +0,0 @@
### HEAD
### 4.2.0 (April 8, 2013)
* Remove Google Analytics protocol check ([#1319](https://github.com/h5bp/html5-boilerplate/pull/1319)).
* Update to Normalize.css 1.1.1.
* Update Apache configurations to include the latest changes in the canonical
[`.htaccess`](https://github.com/h5bp/server-configs/blob/master/apache/.htaccess)
file.
* Use a protocol relative URL for the 404 template script.
* Update to jQuery 1.9.1.
### 4.1.0 (January 21, 2013)
* Update to Normalize.css 1.1.0.
* Update to jQuery 1.9.0.
### 4.0.3 (January 12, 2013)
* Use 32x32 favicon.ico ([#1286](https://github.com/h5bp/html5-boilerplate/pull/1286)).
* Remove named function expression in plugins.js ([#1280](https://github.com/h5bp/html5-boilerplate/pull/1280)).
* Adjust CSS image-replacement code ([#1239](https://github.com/h5bp/html5-boilerplate/issues/1239)).
* Update HiDPI example media query ([#1127](https://github.com/h5bp/html5-boilerplate/issues/1127)).
### 4.0.2 (December 9, 2012)
* Update placeholder icons.
* Update to Normalize.css 1.0.2.
* Update to jQuery 1.8.3.
### 4.0.1 (October 20, 2012)
* Further improvements to `console` method stubbing ([#1206](https://github.com/h5bp/html5-boilerplate/issues/1206), [#1229](https://github.com/h5bp/html5-boilerplate/pull/1229)).
* Update to jQuery 1.8.2.
* Update to Modernizr 2.6.2.
* Minor additions to the documentation.
### 4.0.0 (August 28, 2012)
* Improve the Apache compression configuration ([#1012](https://github.com/h5bp/html5-boilerplate/issues/1012), [#1173](https://github.com/h5bp/html5-boilerplate/issues/1173)).
* Add a HiDPI example media query ([#1127](https://github.com/h5bp/html5-boilerplate/issues/1127)).
* Add bundled docs ([#1154](https://github.com/h5bp/html5-boilerplate/issues/1154)).
* Add MIT license ([#1139](https://github.com/h5bp/html5-boilerplate/issues/1139)).
* Update to Normalize.css 1.0.1.
* Separate Normalize.css from the rest of the CSS ([#1160](https://github.com/h5bp/html5-boilerplate/issues/1160)).
* Improve `console.log` protection ([#1107](https://github.com/h5bp/html5-boilerplate/issues/1107)).
* Replace hot pink text selection color with a neutral color.
* Change image replacement technique ([#1149](https://github.com/h5bp/html5-boilerplate/issues/1149)).
* Code format and consistency changes ([#1112](https://github.com/h5bp/html5-boilerplate/issues/1112)).
* Rename CSS file and rename JS files and subdirectories.
* Update to jQuery 1.8 ([#1161](https://github.com/h5bp/html5-boilerplate/issues/1161)).
* Update to Modernizr 2.6.1 ([#1086](https://github.com/h5bp/html5-boilerplate/issues/1086)).
* Remove uncompressed jQuery ([#1153](https://github.com/h5bp/html5-boilerplate/issues/1153)).
* Remove superfluous inline comments ([#1150](https://github.com/h5bp/html5-boilerplate/issues/1150)).
### 3.0.2 (February 19, 2012)
* Update to Modernizr 2.5.3.
### 3.0.1 (February 08, 2012).
* Update to Modernizr 2.5.2 (includes html5shiv 3.3).
### 3.0.0 (February 06, 2012)
* Improvements to `.htaccess`.
* Improve 404 design.
* Simplify JS folder structure.
* Change `html` IE class names changed to target ranges rather than specific versions of IE.
* Update CSS to include latest normalize.css changes and better typographic defaults ([#825](https://github.com/h5bp/html5-boilerplate/issues/825)).
* Update to Modernizr 2.5 (includes yepnope 1.5 and html5shiv 3.2).
* Update to jQuery 1.7.1.
* Revert to async snippet for the Google Analytics script.
* Remove the ant build script ([#826](https://github.com/h5bp/html5-boilerplate/issues/826)).
* Remove Respond.js ([#816](https://github.com/h5bp/html5-boilerplate/issues/816)).
* Remove the `demo/` directory ([#808](https://github.com/h5bp/html5-boilerplate/issues/808)).
* Remove the `test/` directory ([#808](https://github.com/h5bp/html5-boilerplate/issues/808)).
* Remove Google Chrome Frame script for IE6 users; replace with links to Chrome Frame and options for alternative browsers.
* Remove `initial-scale=1` from the viewport `meta` ([#824](https://github.com/h5bp/html5-boilerplate/issues/824)).
* Remove `defer` from all scripts to avoid legacy IE bugs.
* Remove explicit Site Speed tracking for Google Analytics. It's now enabled by default.
### 2.0.0 (August 10, 2011)
* Change starting CSS to be based on normalize.css instead of reset.css ([#500](https://github.com/h5bp/html5-boilerplate/issues/500)).
* Add Respond.js media query polyfill.
* Add Google Chrome Frame script prompt for IE6 users.
* Simplify the `html` conditional comments for modern browsers and add an `oldie` class.
* Update clearfix to use "micro clearfix".
* Add placeholder CSS MQs for mobile-first approach.
* Add `textarea { resize: vertical; }` to only allow vertical resizing.
* Add `img { max-width: 100%; }` to the print styles; prevents images being truncated.
* Add Site Speed tracking for Google Analytics.
* Update to jQuery 1.6.2 (and use minified by default).
* Update to Modernizr 2.0 Complete, Production minified (includes yepnope, html5shiv, and Respond.js).
* Use `Modernizr.load()` to load the Google Analytics script.
* Much faster build process.
* Add build script options for CSSLint, JSLint, JSHint tools.
* Build script now compresses all images in subfolders.
* Build script now versions files by SHA hash.
* Many `.htaccess` improvements including: disable directory browsing, improved support for all versions of Apache, more robust and extensive HTTP compression rules.
* Remove `handheld.css` as it has very poor device support.
* Remove touch-icon `link` elements from the HTML and include improved touch-icon support.
* Remove the cache-busting query paramaters from files references in the HTML.
* Remove IE6 PNGFix.
### 1.0.0 (March 21, 2011)
* Rewrite build script to make it more customizable and flexible.
* Add a humans.txt.
* Numerous `.htaccess` improvements (including inline documentation).
* Move the alternative server configurations to the H5BP server configs repo.
* Use a protocol-relative url to reference jQuery and prevent mixed content warnings.
* Optimize the Google Analytics snippet.
* Use Eric Meyer's recent CSS reset update and the HTML5 Doctor reset.
* More robust `sub`/`sup` CSS styles.
* Add keyboard `.focusable` helper class that extends `.visuallyhidden`.
* Print styles no longer print hash or JavaScript links.
* Add a print reset for IE's proprietary filters.
* Remove IE9-specific conditional class on the `html` element.
* Remove margins from lists within `nav` elements.
* Remove YUI profiling.
-118
View File
@@ -1,118 +0,0 @@
# Contributing to HTML5 Boilerplate
♥ [HTML5 Boilerplate](http://html5boilerplate.com) and want to get involved?
Thanks! There are plenty of ways you can help!
## Bugs
A bug is a _demonstrable problem_ that is caused by the code in the
repository. Good bug reports are extremely helpful - thank you!
Guidelines for bug reports:
1. **Use the GitHub issue search** &mdash; check if the issue has already been
reported.
2. **Check if the issue has been fixed** &mdash; try to reproduce it using the
latest `master` branch in the repository.
3. **Isolate the problem** &mdash; ideally create a [reduced test
case](http://css-tricks.com/6263-reduced-test-cases/) and a live example.
A good bug report shouldn't leave others needing to chase you up for more
information. Please try to be as detailed as possible in your report. What is
your environment? What steps will reproduce the issue? What browser(s) and OS
experience the problem? What would you expect to be the outcome? All these
details will help people to fix any potential bugs.
Example:
> Short and descriptive example bug report title
>
> A summary of the issue and the browser/OS environment in which it occurs. If
> suitable, include the steps required to reproduce the bug.
>
> 1. This is the first step
> 2. This is the second step
> 3. Further steps, etc.
>
> `<url>` (a link to the reduced test case)
>
> Any other information you want to share that is relevant to the issue being
> reported. This might include the lines of code that you have identified as
> causing the bug, and potential solutions (and your opinions on their
> merits).
**[File a bug report](https://github.com/h5bp/html5-boilerplate/issues/)**
## Pull requests
Good pull requests - patches, improvements, new features - are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits. If your contribution involves a significant amount of work or substantial
changes to any part of the project, please open an issue to discuss it first.
Make sure to adhere to the coding conventions used throughout a project
(indentation, accurate comments, etc.). Please update any documentation that is
relevant to the change you're making.
Please follow this process; it's the best way to get your work included in the
project:
1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
and configure the remotes:
```bash
# Clones your fork of the repo into the current directory in terminal
git clone https://github.com/<your-username>/html5-boilerplate.git
# Navigate to the newly cloned directory
cd html5-boilerplate
# Assigns the original repo to a remote called "upstream"
git remote add upstream https://github.com/h5bp/html5-boilerplate.git
```
2. If you cloned a while ago, get the latest changes from upstream:
```bash
git checkout master
git pull upstream master
```
3. Create a new topic branch to contain your feature, change, or fix:
```bash
git checkout -b <topic-branch-name>
```
4. Commit your changes in logical chunks. Please adhere to these [git commit
message
guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
or your pull request is unlikely be merged into the main project. Use git's
[interactive rebase](https://help.github.com/articles/interactive-rebase)
feature to tidy up your commits before making them public.
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
git pull [--rebase] upstream master
```
6. Push your topic branch up to your fork:
```bash
git push origin <topic-branch-name>
```
10. [Open a Pull Request](https://help.github.com/articles/using-pull-requests) with a
clear title and description.
## Do not…
Please **do not** use the issue tracker for personal support requests (use
[StackOverflow](http://stackoverflow.com/questions/tagged/html5boilerplate) or IRC).
Please **do not** derail or troll issues. Keep the
discussion on topic and respect the opinions of others.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

-15
View File
@@ -1,15 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>
<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>
@@ -1,384 +0,0 @@
.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:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%);
background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%);
background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%);
background-repeat: repeat-x;
border-color: #e0e0e0;
border-color: #ccc;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
}
.btn-default:active,
.btn-default.active {
background-color: #e6e6e6;
border-color: #e0e0e0;
}
.btn-primary {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9));
background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%);
background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
background-repeat: repeat-x;
border-color: #2d6ca2;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
}
.btn-primary:active,
.btn-primary.active {
background-color: #3071a9;
border-color: #2d6ca2;
}
.btn-success {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44));
background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%);
background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
background-repeat: repeat-x;
border-color: #419641;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
}
.btn-success:active,
.btn-success.active {
background-color: #449d44;
border-color: #419641;
}
.btn-warning {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f));
background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%);
background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
background-repeat: repeat-x;
border-color: #eb9316;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
}
.btn-warning:active,
.btn-warning.active {
background-color: #ec971f;
border-color: #eb9316;
}
.btn-danger {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c));
background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%);
background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
background-repeat: repeat-x;
border-color: #c12e2a;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
}
.btn-danger:active,
.btn-danger.active {
background-color: #c9302c;
border-color: #c12e2a;
}
.btn-info {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5));
background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%);
background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
background-repeat: repeat-x;
border-color: #2aabd2;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
}
.btn-info:active,
.btn-info.active {
background-color: #31b0d5;
border-color: #2aabd2;
}
.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,
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #357ebd;
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));
background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%);
background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
}
.navbar {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8));
background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%);
background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
background-repeat: repeat-x;
border-radius: 4px;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
-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 .navbar-nav > .active > a {
background-color: #f8f8f8;
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
}
.navbar-inverse {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222));
background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%);
background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%);
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);
}
.navbar-inverse .navbar-nav > .active > a {
background-color: #222222;
}
.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;
}
.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-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc));
background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%);
background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
background-repeat: repeat-x;
border-color: #b2dba1;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
}
.alert-info {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0));
background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%);
background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
background-repeat: repeat-x;
border-color: #9acfea;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
}
.alert-warning {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0));
background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%);
background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
background-repeat: repeat-x;
border-color: #f5e79e;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
}
.alert-danger {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3));
background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%);
background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
background-repeat: repeat-x;
border-color: #dca7a7;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
}
.progress {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5));
background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%);
background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
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-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9));
background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%);
background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
}
.progress-bar-success {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44));
background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%);
background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%);
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-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5));
background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%);
background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
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-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f));
background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%);
background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
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-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c));
background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%);
background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%);
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);
}
.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 #3071a9;
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3));
background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%);
background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%);
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
background-repeat: repeat-x;
border-color: #3278b3;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
}
.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-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8));
background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%);
background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
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-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));
background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%);
background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
}
.panel-success > .panel-heading {
background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6));
background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%);
background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
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-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3));
background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%);
background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
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-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc));
background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%);
background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
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-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc));
background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%);
background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
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-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5));
background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%);
background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
background-repeat: repeat-x;
border-color: #dcdcdc;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
-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);
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -1,228 +0,0 @@
<?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 />
<glyph />
<glyph unicode=" " />
<glyph unicode="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" />
<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="652" />
<glyph unicode="&#x2001;" horiz-adv-x="1304" />
<glyph unicode="&#x2002;" horiz-adv-x="652" />
<glyph unicode="&#x2003;" horiz-adv-x="1304" />
<glyph unicode="&#x2004;" horiz-adv-x="434" />
<glyph unicode="&#x2005;" horiz-adv-x="326" />
<glyph unicode="&#x2006;" horiz-adv-x="217" />
<glyph unicode="&#x2007;" horiz-adv-x="217" />
<glyph unicode="&#x2008;" horiz-adv-x="163" />
<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="326" />
<glyph unicode="&#x20ac;" d="M800 500h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406z" />
<glyph unicode="&#x2212;" d="M1100 700h-900v-300h900v300z" />
<glyph unicode="&#x2601;" d="M178 300h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57z" />
<glyph unicode="&#x2709;" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" />
<glyph unicode="&#x270f;" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#xe001;" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" />
<glyph unicode="&#xe002;" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" />
<glyph unicode="&#xe003;" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
<glyph unicode="&#xe005;" d="M649 949q48 69 109.5 105t121.5 38t118.5 -20.5t102.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-149.5 152.5t-126.5 127.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" />
<glyph unicode="&#xe006;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" />
<glyph unicode="&#xe008;" d="M1200 143v-143h-1200v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100z" />
<glyph unicode="&#xe009;" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe010;" d="M500 1050v-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.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-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.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-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.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-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.5h400q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe011;" d="M300 1050v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-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.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-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.5h200q21 0 35.5 -14.5 t14.5 -35.5z" />
<glyph unicode="&#xe012;" d="M300 1050v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -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.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-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.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-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.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-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.5h700q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe013;" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" />
<glyph unicode="&#xe014;" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" />
<glyph unicode="&#xe015;" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" />
<glyph unicode="&#xe016;" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" />
<glyph unicode="&#xe017;" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" />
<glyph unicode="&#xe018;" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" />
<glyph unicode="&#xe019;" d="M488 183l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5 q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" />
<glyph unicode="&#xe020;" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" />
<glyph unicode="&#xe022;" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" />
<glyph unicode="&#xe023;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" />
<glyph unicode="&#xe024;" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" />
<glyph unicode="&#xe025;" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" />
<glyph unicode="&#xe026;" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" />
<glyph unicode="&#xe027;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" />
<glyph unicode="&#xe028;" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" />
<glyph unicode="&#xe029;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" />
<glyph unicode="&#xe030;" d="M1177 600h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" />
<glyph unicode="&#xe031;" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122l-145 -145v400h400z" />
<glyph unicode="&#xe032;" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" />
<glyph unicode="&#xe034;" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" />
<glyph unicode="&#xe035;" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" />
<glyph unicode="&#xe036;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" />
<glyph unicode="&#xe037;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" />
<glyph unicode="&#xe039;" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" />
<glyph unicode="&#xe040;" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " />
<glyph unicode="&#xe041;" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" />
<glyph unicode="&#xe042;" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" />
<glyph unicode="&#xe043;" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" />
<glyph unicode="&#xe045;" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" />
<glyph unicode="&#xe047;" d="M1200 0v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" />
<glyph unicode="&#xe048;" d="M100 1199h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" />
<glyph unicode="&#xe049;" d="M877 1200l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" />
<glyph unicode="&#xe050;" d="M1150 1200h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" />
<glyph unicode="&#xe051;" d="M950 1201h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" />
<glyph unicode="&#xe052;" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe053;" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe058;" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe059;" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" />
<glyph unicode="&#xe060;" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" />
<glyph unicode="&#xe062;" d="M600 1213q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" />
<glyph unicode="&#xe063;" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " />
<glyph unicode="&#xe064;" d="M554 1295q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" />
<glyph unicode="&#xe065;" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" />
<glyph unicode="&#xe066;" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-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.5z M813 431l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" />
<glyph unicode="&#xe067;" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 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.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" />
<glyph unicode="&#xe068;" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" />
<glyph unicode="&#xe069;" d="M900 0l-500 488v-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.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" />
<glyph unicode="&#xe070;" d="M1200 0l-500 488v-488l-500 488v-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.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" />
<glyph unicode="&#xe071;" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" />
<glyph unicode="&#xe072;" d="M1100 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" />
<glyph unicode="&#xe074;" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe075;" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" />
<glyph unicode="&#xe076;" d="M1050 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-500 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 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-500 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe078;" d="M650 1064l-550 -564h1100zM1200 350v-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="&#xe079;" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" />
<glyph unicode="&#xe080;" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" />
<glyph unicode="&#xe081;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" />
<glyph unicode="&#xe082;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" />
<glyph unicode="&#xe083;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" />
<glyph unicode="&#xe084;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" />
<glyph unicode="&#xe085;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" />
<glyph unicode="&#xe086;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" />
<glyph unicode="&#xe087;" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" />
<glyph unicode="&#xe088;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" />
<glyph unicode="&#xe089;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" />
<glyph unicode="&#xe090;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" />
<glyph unicode="&#xe092;" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" />
<glyph unicode="&#xe093;" d="M1098 600h-298v-600h-300v600h-296l450 600z" />
<glyph unicode="&#xe094;" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" />
<glyph unicode="&#xe095;" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" />
<glyph unicode="&#xe096;" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" />
<glyph unicode="&#xe097;" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" />
<glyph unicode="&#xe101;" d="M600 1177q118 0 224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" />
<glyph unicode="&#xe102;" d="M1200 900h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" />
<glyph unicode="&#xe103;" d="M0 121l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55l-201 -202 v143zM692 611q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5t86.5 76.5q55 66 367 234z" />
<glyph unicode="&#xe105;" d="M1261 600l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" />
<glyph unicode="&#xe106;" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" />
<glyph unicode="&#xe107;" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" />
<glyph unicode="&#xe108;" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" />
<glyph unicode="&#xe110;" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" />
<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="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" />
<glyph unicode="&#xe113;" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" />
<glyph unicode="&#xe114;" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" />
<glyph unicode="&#xe115;" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" />
<glyph unicode="&#xe116;" d="M1050 1200h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.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="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" />
<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
<glyph unicode="&#xe120;" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" />
<glyph unicode="&#xe121;" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 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.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe122;" d="M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" />
<glyph unicode="&#xe124;" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" />
<glyph unicode="&#xe125;" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" />
<glyph unicode="&#xe126;" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" />
<glyph unicode="&#xe127;" d="M364 873l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83zM208 200h-200v600h200v-600z" />
<glyph unicode="&#xe128;" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" />
<glyph unicode="&#xe129;" d="M1100 473v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" />
<glyph unicode="&#xe130;" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146l-83 86l237 339h503z" />
<glyph unicode="&#xe131;" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" />
<glyph unicode="&#xe132;" d="M597 1195q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" />
<glyph unicode="&#xe133;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" />
<glyph unicode="&#xe135;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7 q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.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="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe140;" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" />
<glyph unicode="&#xe141;" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" />
<glyph unicode="&#xe143;" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" />
<glyph unicode="&#xe144;" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" />
<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" />
<glyph unicode="&#xe148;" d="M700 1029v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" />
<glyph unicode="&#xe149;" d="M866 300l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" />
<glyph unicode="&#xe150;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" />
<glyph unicode="&#xe152;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" />
<glyph unicode="&#xe154;" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" />
<glyph unicode="&#xe155;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
<glyph unicode="&#xe156;" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
<glyph unicode="&#xe157;" d="M400 1100h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.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.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" />
<glyph unicode="&#xe158;" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.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.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" />
<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" />
<glyph unicode="&#xe160;" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" />
<glyph unicode="&#xe161;" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" />
<glyph unicode="&#xe162;" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" />
<glyph unicode="&#xe163;" d="M800 200h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" />
<glyph unicode="&#xe164;" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" />
<glyph unicode="&#xe165;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
<glyph unicode="&#xe166;" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe167;" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe168;" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe169;" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe170;" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe171;" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" />
<glyph unicode="&#xe173;" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" />
<glyph unicode="&#xe174;" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" />
<glyph unicode="&#xe175;" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" />
<glyph unicode="&#xe176;" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" />
<glyph unicode="&#xe177;" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" />
<glyph unicode="&#xe178;" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" />
<glyph unicode="&#xe179;" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" />
<glyph unicode="&#xe180;" d="M1100 106v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" />
<glyph unicode="&#xe181;" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" />
<glyph unicode="&#xe182;" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" />
<glyph unicode="&#xe183;" d="M1200 712v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" />
<glyph unicode="&#xe184;" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" />
<glyph unicode="&#xe185;" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" />
<glyph unicode="&#xe186;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe187;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe188;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" />
<glyph unicode="&#xe189;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" />
<glyph unicode="&#xe191;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" />
<glyph unicode="&#xe192;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-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 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" />
<glyph unicode="&#xe194;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
<glyph unicode="&#xe195;" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" />
<glyph unicode="&#xe197;" d="M800 300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" />
<glyph unicode="&#xe198;" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" />
<glyph unicode="&#xe199;" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" />
<glyph unicode="&#xe200;" d="M700 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" />
<glyph unicode="&#x1f4bc;" d="M800 1000h300q41 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.5h200q41 0 70.5 -29.5t29.5 -70.5v-100zM500 1000h200v100h-200v-100zM1200 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="&#x1f4c5;" d="M1100 900v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" />
<glyph unicode="&#x1f4cc;" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" />
<glyph unicode="&#x1f4ce;" d="M518 119l69 -60l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348 q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256z" />
<glyph unicode="&#x1f4f7;" d="M1200 200v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" />
<glyph unicode="&#x1f512;" d="M900 800h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
<glyph unicode="&#x1f514;" d="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" />
<glyph unicode="&#x1f516;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#x1f525;" d="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5z" />
<glyph unicode="&#x1f527;" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 62 KiB

-300
View File
@@ -1,300 +0,0 @@
/*
* HTML5 Boilerplate
*
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
* Kroc Camen, and the H5BP dev community and team.
*/
/* ==========================================================================
Base styles: opinionated defaults
========================================================================== */
html,
button,
input,
select,
textarea {
color: #222;
}
body {
font-size: 1em;
line-height: 1.4;
}
/*
* Remove text-shadow in selection highlight: h5bp.com/i
* These selection rule sets have to be separate.
* Customize the background color to match your design.
*/
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
/*
* A better looking default horizontal rule
*/
hr {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #ccc;
margin: 1em 0;
padding: 0;
}
/*
* Remove the gap between images and the bottom of their containers: h5bp.com/i/440
*/
img {
vertical-align: middle;
}
/*
* Remove default fieldset styles.
*/
fieldset {
border: 0;
margin: 0;
padding: 0;
}
/*
* Allow only vertical resizing of textareas.
*/
textarea {
resize: vertical;
}
/* ==========================================================================
Chrome Frame prompt
========================================================================== */
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
/* ==========================================================================
Author's custom styles
========================================================================== */
/* ==========================================================================
Helper classes
========================================================================== */
/*
* Image replacement
*/
.ir {
background-color: transparent;
border: 0;
overflow: hidden;
/* IE 6/7 fallback */
*text-indent: -9999px;
}
.ir:before {
content: "";
display: block;
width: 0;
height: 150%;
}
/*
* Hide from both screenreaders and browsers: h5bp.com/u
*/
.hidden {
display: none !important;
visibility: hidden;
}
/*
* Hide only visually, but have it available for screenreaders: h5bp.com/v
*/
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/*
* Extends the .visuallyhidden class to allow the element to be focusable
* when navigated to via the keyboard: h5bp.com/p
*/
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
/*
* Hide visually and from screenreaders, but maintain layout
*/
.invisible {
visibility: hidden;
}
/*
* Clearfix: contain floats
*
* For modern browsers
* 1. The space content is one way to avoid an Opera bug when the
* `contenteditable` attribute is included anywhere else in the document.
* Otherwise it causes space to appear at the top and bottom of elements
* that receive the `clearfix` class.
* 2. The use of `table` rather than `block` is only necessary if using
* `:before` to contain the top-margins of child elements.
*/
.clearfix:before,
.clearfix:after {
content: " "; /* 1 */
display: table; /* 2 */
}
.clearfix:after {
clear: both;
}
/*
* For IE 6/7 only
* Include this rule to trigger hasLayout and contain floats.
*/
.clearfix {
*zoom: 1;
}
/* ==========================================================================
EXAMPLE Media Queries for Responsive Design.
These examples override the primary ('mobile first') styles.
Modify as content requires.
========================================================================== */
@media only screen and (min-width: 35em) {
/* Style adjustments for viewports that meet the condition */
}
@media print,
(-o-min-device-pixel-ratio: 5/4),
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 120dpi) {
/* Style adjustments for high resolution devices */
}
/* ==========================================================================
Print styles.
Inlined to avoid required HTTP connection: h5bp.com/r
========================================================================== */
@media print {
* {
background: transparent !important;
color: #000 !important; /* Black prints faster: h5bp.com/s */
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) ")";
}
/*
* Don't show links for images, or javascript/internal links
*/
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group; /* h5bp.com/t */
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
-533
View File
@@ -1,533 +0,0 @@
/*! normalize.css v1.1.1 | MIT License | git.io/normalize */
/* ==========================================================================
HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
*/
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
* Known issue: no IE 6 support.
*/
[hidden] {
display: none;
}
/* ==========================================================================
Base
========================================================================== */
/**
* 1. Prevent system color scheme's background color being used in Firefox, IE,
* and Opera.
* 2. Prevent system color scheme's text color being used in Firefox, IE, and
* Opera.
* 3. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
* `em` units.
* 4. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
background: #fff; /* 1 */
color: #000; /* 2 */
font-size: 100%; /* 3 */
-webkit-text-size-adjust: 100%; /* 4 */
-ms-text-size-adjust: 100%; /* 4 */
}
/**
* Address `font-family` inconsistency between `textarea` and other form
* elements.
*/
html,
button,
input,
select,
textarea {
font-family: sans-serif;
}
/**
* Address margins handled incorrectly in IE 6/7.
*/
body {
margin: 0;
}
/* ==========================================================================
Links
========================================================================== */
/**
* Address `outline` inconsistency between Chrome and other browsers.
*/
a:focus {
outline: thin dotted;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* ==========================================================================
Typography
========================================================================== */
/**
* Address font sizes and margins set differently in IE 6/7.
* Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
* and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
h2 {
font-size: 1.5em;
margin: 0.83em 0;
}
h3 {
font-size: 1.17em;
margin: 1em 0;
}
h4 {
font-size: 1em;
margin: 1.33em 0;
}
h5 {
font-size: 0.83em;
margin: 1.67em 0;
}
h6 {
font-size: 0.67em;
margin: 2.33em 0;
}
/**
* Address styling not present in IE 7/8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
blockquote {
margin: 1em 40px;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address differences between Firefox and other browsers.
* Known issue: no IE 6/7 normalization.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Address styling not present in IE 6/7/8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address margins set differently in IE 6/7.
*/
p,
pre {
margin: 1em 0;
}
/**
* Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
*/
code,
kbd,
pre,
samp {
font-family: monospace, serif;
_font-family: 'courier new', monospace;
font-size: 1em;
}
/**
* Improve readability of pre-formatted text in all browsers.
*/
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
/**
* Address CSS quotes not supported in IE 6/7.
*/
q {
quotes: none;
}
/**
* Address `quotes` property not supported in Safari 4.
*/
q:before,
q:after {
content: '';
content: none;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* ==========================================================================
Lists
========================================================================== */
/**
* Address margins set differently in IE 6/7.
*/
dl,
menu,
ol,
ul {
margin: 1em 0;
}
dd {
margin: 0 0 0 40px;
}
/**
* Address paddings set differently in IE 6/7.
*/
menu,
ol,
ul {
padding: 0 0 0 40px;
}
/**
* Correct list images handled incorrectly in IE 7.
*/
nav ul,
nav ol {
list-style: none;
list-style-image: none;
}
/* ==========================================================================
Embedded content
========================================================================== */
/**
* 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
* 2. Improve image quality when scaled in IE 7.
*/
img {
border: 0; /* 1 */
-ms-interpolation-mode: bicubic; /* 2 */
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* ==========================================================================
Figures
========================================================================== */
/**
* Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
*/
figure {
margin: 0;
}
/* ==========================================================================
Forms
========================================================================== */
/**
* Correct margin displayed oddly in IE 6/7.
*/
form {
margin: 0;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct color not being inherited in IE 6/7/8/9.
* 2. Correct text not wrapping in Firefox 3.
* 3. Correct alignment displayed oddly in IE 6/7.
*/
legend {
border: 0; /* 1 */
padding: 0;
white-space: normal; /* 2 */
*margin-left: -7px; /* 3 */
}
/**
* 1. Correct font size not being inherited in all browsers.
* 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
* and Chrome.
* 3. Improve appearance and consistency in all browsers.
*/
button,
input,
select,
textarea {
font-size: 100%; /* 1 */
margin: 0; /* 2 */
vertical-align: baseline; /* 3 */
*vertical-align: middle; /* 3 */
}
/**
* Address Firefox 3+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
button,
input {
line-height: normal;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
* Correct `select` style inheritance in Firefox 4+ and Opera.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
* 4. Remove inner spacing in IE 7 without affecting normal text inputs.
* Known issue: inner spacing remains in IE 6.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
*overflow: visible; /* 4 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* 1. Address box sizing set to content-box in IE 8/9.
* 2. Remove excess padding in IE 8/9.
* 3. Remove excess padding in IE 7.
* Known issue: excess padding remains in IE 6.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
*height: 13px; /* 3 */
*width: 13px; /* 3 */
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari 5 and Chrome
* on OS X.
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Remove inner padding and border in Firefox 3+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* 1. Remove default vertical scrollbar in IE 6/7/8/9.
* 2. Improve readability and alignment in all browsers.
*/
textarea {
overflow: auto; /* 1 */
vertical-align: top; /* 2 */
}
/* ==========================================================================
Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
@@ -1,4 +0,0 @@
.DS_Store
node_modules
components
reports
@@ -1,100 +0,0 @@
module.exports = function(grunt) {
grunt.initConfig({
info: grunt.file.readJSON('component.json'),
meta: {
banner: '/*!\n'+
' * <%= info.name %> - <%= info.description %>\n'+
' * v<%= info.version %>\n'+
' * <%= info.homepage %>\n'+
' * copyright <%= info.copyright %> <%= grunt.template.today("yyyy") %>\n'+
' * <%= info.license %> License\n'+
'*/\n'
},
jshint: {
main: [
'grunt.js',
'component.json',
'lib/**/*.js',
'test/*.js'
]
},
concat: {
options: {
banner: '<%= meta.banner %>'
},
dist: {
src: 'lib/toc.js',
dest: 'dist/jquery.toc.js'
}
},
uglify: {
options: {
banner: '<%= meta.banner %>'
},
dist: {
src: 'dist/jquery.toc.js',
dest: 'dist/jquery.toc.min.js'
}
},
watch: {
main: {
files: '<%= jshint.main %>',
tasks: 'default'
},
ci: {
files: [
'<%= jshint.main %>',
'test/index.html'
],
tasks: ['default', 'mocha']
}
},
mocha: {
all: {
src: 'test/index.html',
options: {
run: true
}
}
},
plato: {
main: {
files: {
'reports': ['lib/*.js']
}
}
},
reloadr: {
test: [
'example/*',
'test/*',
'dist/*'
]
},
connect: {
server:{
port: 8000,
base: '.'
},
plato: {
port: 8000,
base: 'reports',
options: {
keepalive: true
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-mocha');
grunt.loadNpmTasks('grunt-reloadr');
grunt.loadNpmTasks('grunt-plato');
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
grunt.registerTask('dev', ['connect:server', 'reloadr', 'watch:main']);
grunt.registerTask('ci', ['connect:server', 'watch:ci']);
grunt.registerTask('reports', ['plato', 'connect:plato']);
};
@@ -1,46 +0,0 @@
0.1.2 / 2013-04-08
==================
* optimized scroll function. fixes #15
* migrated to grunt for building
* fixed tabs on docs/index
0.1.1 / 2012-10-05
==================
* updated example
* code cleanup, fixed onHighlight, removed console.log
* Add headerText and itemClass options
0.1.0 / 2012-07-05
==================
* added smoosh to Makefile
* updated docs
* removed site submodule
* Added callback for when a new section is highlighted
* selected event
* adds another option to customize the header link text
* updated site
0.0.3 / 2012-04-06
==================
* fixed smooth scrolling in firefox
* fixed copyright typo
0.0.2 / 2012-03-09
==================
* Issue [#2](https://github.com/jgallen23/toc/issues/2 "Issue #2")
* updated site
* 0.0.2 - updated docs
0.0.1 / 2012-02-25
==================
* updated docs/site
* added readme
* got everything working
* initial commit
@@ -1,22 +0,0 @@
(The MIT License)
Copyright (c) 2013 Greg Allen
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.
@@ -1,5 +0,0 @@
#TOC
[TOC](http://projects.jga.me/toc/) is a jQuery plugin for automatically generating a table of contents.
For more information, check out the [documentation](http://projects.jga.me/toc/).
@@ -1,14 +0,0 @@
{
"name": "toc",
"description": "jQuery Table of Contents Plugin",
"version": "0.1.2",
"homepage": "http://projects.jga.me/toc/",
"license": "MIT",
"copyright": "Greg Allen",
"main": "dist/toc.js",
"dependencies": {
},
"devDependencies": {
"assert": "*"
}
}
@@ -1,107 +0,0 @@
/*!
* toc - jQuery Table of Contents Plugin
* v0.1.2
* http://projects.jga.me/toc/
* copyright Greg Allen 2013
* MIT License
*/
(function($) {
$.fn.toc = function(options) {
var self = this;
var opts = $.extend({}, jQuery.fn.toc.defaults, options);
var container = $(opts.container);
var headings = $(opts.selectors, container);
var headingOffsets = [];
var activeClassName = opts.prefix+'-active';
var scrollTo = function(e) {
if (opts.smoothScrolling) {
e.preventDefault();
var elScrollTo = $(e.target).attr('href');
var $el = $(elScrollTo);
$('body,html').animate({ scrollTop: $el.offset().top }, 400, 'swing', function() {
location.hash = elScrollTo;
});
}
$('li', self).removeClass(activeClassName);
$(e.target).parent().addClass(activeClassName);
};
//highlight on scroll
var timeout;
var highlightOnScroll = function(e) {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(function() {
var top = $(window).scrollTop(),
highlighted;
for (var i = 0, c = headingOffsets.length; i < c; i++) {
if (headingOffsets[i] >= top) {
$('li', self).removeClass(activeClassName);
highlighted = $('li:eq('+(i-1)+')', self).addClass(activeClassName);
opts.onHighlight(highlighted);
break;
}
}
}, 50);
};
if (opts.highlightOnScroll) {
$(window).bind('scroll', highlightOnScroll);
highlightOnScroll();
}
return this.each(function() {
//build TOC
var el = $(this);
var ul = $('<ul/>');
headings.each(function(i, heading) {
var $h = $(heading);
headingOffsets.push($h.offset().top - opts.highlightOffset);
//add anchor
var anchor = $('<span/>').attr('id', opts.anchorName(i, heading, opts.prefix)).insertBefore($h);
//build TOC item
var a = $('<a/>')
.text(opts.headerText(i, heading, $h))
.attr('href', '#' + opts.anchorName(i, heading, opts.prefix))
.bind('click', function(e) {
scrollTo(e);
el.trigger('selected', $(this).attr('href'));
});
var li = $('<li/>')
.addClass(opts.itemClass(i, heading, $h, opts.prefix))
.append(a);
ul.append(li);
});
el.html(ul);
});
};
jQuery.fn.toc.defaults = {
container: 'body',
selectors: 'h1,h2,h3',
smoothScrolling: true,
prefix: 'toc',
onHighlight: function() {},
highlightOnScroll: true,
highlightOffset: 100,
anchorName: function(i, heading, prefix) {
return prefix+i;
},
headerText: function(i, heading, $heading) {
return $heading.text();
},
itemClass: function(i, heading, $heading, prefix) {
return prefix + '-' + $heading[0].tagName.toLowerCase();
}
};
})(jQuery);
@@ -1,8 +0,0 @@
/*!
* toc - jQuery Table of Contents Plugin
* v0.1.2
* http://projects.jga.me/toc/
* copyright Greg Allen 2013
* MIT License
*/
(function(t){t.fn.toc=function(e){var n,i=this,r=t.extend({},jQuery.fn.toc.defaults,e),o=t(r.container),a=t(r.selectors,o),l=[],h=r.prefix+"-active",s=function(e){if(r.smoothScrolling){e.preventDefault();var n=t(e.target).attr("href"),o=t(n);t("body,html").animate({scrollTop:o.offset().top},400,"swing",function(){location.hash=n})}t("li",i).removeClass(h),t(e.target).parent().addClass(h)},c=function(){n&&clearTimeout(n),n=setTimeout(function(){for(var e,n=t(window).scrollTop(),o=0,a=l.length;a>o;o++)if(l[o]>=n){t("li",i).removeClass(h),e=t("li:eq("+(o-1)+")",i).addClass(h),r.onHighlight(e);break}},50)};return r.highlightOnScroll&&(t(window).bind("scroll",c),c()),this.each(function(){var e=t(this),n=t("<ul/>");a.each(function(i,o){var a=t(o);l.push(a.offset().top-r.highlightOffset),t("<span/>").attr("id",r.anchorName(i,o,r.prefix)).insertBefore(a);var h=t("<a/>").text(r.headerText(i,o,a)).attr("href","#"+r.anchorName(i,o,r.prefix)).bind("click",function(n){s(n),e.trigger("selected",t(this).attr("href"))}),c=t("<li/>").addClass(r.itemClass(i,o,a,r.prefix)).append(h);n.append(c)}),e.html(n)})},jQuery.fn.toc.defaults={container:"body",selectors:"h1,h2,h3",smoothScrolling:!0,prefix:"toc",onHighlight:function(){},highlightOnScroll:!0,highlightOffset:100,anchorName:function(t,e,n){return n+t},headerText:function(t,e,n){return n.text()},itemClass:function(t,e,n,i){return i+"-"+n[0].tagName.toLowerCase()}}})(jQuery);
@@ -1,101 +0,0 @@
#TOC
TOC is a jQuery plugin that will automatically generate a table of contents for your page. You can see an example of it on the left side of the page.
##Features
- Completely customizable
- Click to smooth scroll to that spot on the page
- Automatically highlight the current section
- Extremely lightweight (744 bytes gzipped)
- Can have multiple on a page
##Download
- [Production](https://raw.github.com/jgallen23/toc/master/dist/jquery.toc.min.js)
- [Development](https://raw.github.com/jgallen23/toc/master/dist/jquery.toc.js)
- [Source](http://github.com/jgallen23/toc)
##Usage
`javascript
$('#toc').toc();
###Options
Defaults shown below
`javascript
$('#toc').toc({
'selectors': 'h1,h2,h3', //elements to use as headings
'container': 'body', //element to find all selectors in
'smoothScrolling': true, //enable or disable smooth scrolling on click
'prefix': 'toc', //prefix for anchor tags and class names
'onHighlight': function(el) {}, //called when a new section is highlighted
'highlightOnScroll': true, //add class to heading that is currently in focus
'highlightOffset': 100, //offset to trigger the next headline
'anchorName': function(i, heading, prefix) { //custom function for anchor name
return prefix+i;
},
'headerText': function(i, heading, $heading) { //custom function building the header-item text
return $heading.text();
},
'itemClass': function(i, heading, $heading, prefix) { // custom function for item class
return $heading[0].tagName.toLowerCase();
}
});
##Example CSS
`css
#toc {
top: 0px;
left: 0px;
height: 100%;
position: fixed;
background: #333;
box-shadow: inset -5px 0 5px 0px #000;
width: 150px;
padding-top: 20px;
color: #fff;
}
#toc ul {
margin: 0;
padding: 0;
list-style: none;
}
#toc li {
padding: 5px 10px;
}
#toc a {
color: #fff;
text-decoration: none;
display: block;
}
#toc .toc-h2 {
padding-left: 10px;
}
#toc .toc-h3 {
padding-left: 20px;
}
#toc .toc-active {
background: #336699;
box-shadow: inset -5px 0px 10px -5px #000;
}
##History
[View](https://raw.github.com/jgallen23/toc/master/History.md)
##Future
- Figure out how to handle headlines on bottom of page
- Zepto.js support (should work, need to verify)
- Ender support
##Contributors
- Greg Allen ([@jgaui](http://twitter.com/jgaui)) [jga.me](http://jga.me)
@@ -1,10 +0,0 @@
#jQuery Dependencies
- $.extend
- bind
- addClass
- removeClass
- animate
- attr
- text
- append
- createElement
@@ -1,69 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<title></title>
<script src="live.js"></script>
<style>
body {
font-family: Helvetica, Arial;
}
#wrapper {
width: 980px;
margin: 0 auto;
margin-bottom: 300px;
}
.toc {
background: #fefefe;
width: 200px;
position: fixed;
border: 1px solid #ddd;
color: #333;
}
.toc a {
color: #333;
}
.toc .tocH2 {
margin-left: 10px
}
.toc .tocH3 {
margin-left: 20px
}
.toc-active {
color: #000;
font-weight: bold;
}
.toc.right {
right: 0
}
</style>
</head>
<body>
<div class="toc">
</div>
<div class="toc right">
</div>
<div id="wrapper">
<h1>Page Title</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<h2>Sub Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<h2>Sub Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<h3>SubSub Heading</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ligula a augue sollicitudin a tincidunt felis tincidunt. Donec et urna augue, sed consectetur lacus. Maecenas tincidunt volutpat lorem. Suspendisse turpis tellus, sodales ac commodo id, rhoncus vel augue. Vestibulum nisl nibh, rutrum eu bibendum vitae, bibendum et libero. Suspendisse vel odio vitae leo commodo lacinia. Sed non lacinia nulla. Pellentesque faucibus euismod dictum. Suspendisse potenti.</p>
</div>
<script src="jquery.js"></script>
<script src="../lib/toc.js"></script>
<script>
$('.toc').toc({
});
</script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -1,233 +0,0 @@
/*
Live.js - One script closer to Designing in the Browser
Written for Handcraft.com by Martin Kool (@mrtnkl).
Version 4.
Recent change: Made stylesheet and mimetype checks case insensitive.
http://livejs.com
http://livejs.com/license (MIT)
@livejs
Include live.js#css to monitor css changes only.
Include live.js#js to monitor js changes only.
Include live.js#html to monitor html changes only.
Mix and match to monitor a preferred combination such as live.js#html,css
By default, just include live.js to monitor all css, js and html changes.
Live.js can also be loaded as a bookmarklet. It is best to only use it for CSS then,
as a page reload due to a change in html or css would not re-include the bookmarklet.
To monitor CSS and be notified that it has loaded, include it as: live.js#css,notify
*/
(function () {
var headers = { "Etag": 1, "Last-Modified": 1, "Content-Length": 1, "Content-Type": 1 },
resources = {},
pendingRequests = {},
currentLinkElements = {},
oldLinkElements = {},
interval = 1000,
loaded = false,
active = { "html": 1, "css": 1, "js": 1 };
var Live = {
// performs a cycle per interval
heartbeat: function () {
if (document.body) {
// make sure all resources are loaded on first activation
if (!loaded) Live.loadresources();
Live.checkForChanges();
}
setTimeout(Live.heartbeat, interval);
},
// loads all local css and js resources upon first activation
loadresources: function () {
// helper method to assert if a given url is local
function isLocal(url) {
var loc = document.location,
reg = new RegExp("^\\.|^\/(?!\/)|^[\\w]((?!://).)*$|" + loc.protocol + "//" + loc.host);
return url.match(reg);
}
// gather all resources
var scripts = document.getElementsByTagName("script"),
links = document.getElementsByTagName("link"),
uris = [];
// track local js urls
for (var i = 0; i < scripts.length; i++) {
var script = scripts[i], src = script.getAttribute("src");
if (src && isLocal(src))
uris.push(src);
if (src && src.match(/\blive.js#/)) {
for (var type in active)
active[type] = src.match("[#,|]" + type) != null
if (src.match("notify"))
alert("Live.js is loaded.");
}
}
if (!active.js) uris = [];
if (active.html) uris.push(document.location.href);
// track local css urls
for (var i = 0; i < links.length && active.css; i++) {
var link = links[i], rel = link.getAttribute("rel"), href = link.getAttribute("href", 2);
if (href && rel && rel.match(new RegExp("stylesheet", "i")) && isLocal(href)) {
uris.push(href);
currentLinkElements[href] = link;
}
}
// initialize the resources info
for (var i = 0; i < uris.length; i++) {
var url = uris[i];
Live.getHead(url, function (url, info) {
resources[url] = info;
});
}
// add rule for morphing between old and new css files
var head = document.getElementsByTagName("head")[0],
style = document.createElement("style"),
rule = "transition: all .3s ease-out;"
css = [".livejs-loading * { ", rule, " -webkit-", rule, "-moz-", rule, "-o-", rule, "}"].join('');
style.setAttribute("type", "text/css");
head.appendChild(style);
style.styleSheet ? style.styleSheet.cssText = css : style.appendChild(document.createTextNode(css));
// yep
loaded = true;
},
// check all tracking resources for changes
checkForChanges: function () {
for (var url in resources) {
if (pendingRequests[url])
continue;
Live.getHead(url, function (url, newInfo) {
var oldInfo = resources[url],
hasChanged = false;
resources[url] = newInfo;
for (var header in oldInfo) {
// do verification based on the header type
var oldValue = oldInfo[header],
newValue = newInfo[header],
contentType = newInfo["Content-Type"];
switch (header.toLowerCase()) {
case "etag":
if (!newValue) break;
// fall through to default
default:
hasChanged = oldValue != newValue;
break;
}
// if changed, act
if (hasChanged) {
Live.refreshResource(url, contentType);
break;
}
}
});
}
},
// act upon a changed url of certain content type
refreshResource: function (url, type) {
switch (type.toLowerCase()) {
// css files can be reloaded dynamically by replacing the link element
case "text/css":
var link = currentLinkElements[url],
html = document.body.parentNode,
head = link.parentNode,
next = link.nextSibling,
newLink = document.createElement("link");
html.className = html.className.replace(/\s*livejs\-loading/gi, '') + ' livejs-loading';
newLink.setAttribute("type", "text/css");
newLink.setAttribute("rel", "stylesheet");
newLink.setAttribute("href", url + "?now=" + new Date() * 1);
next ? head.insertBefore(newLink, next) : head.appendChild(newLink);
currentLinkElements[url] = newLink;
oldLinkElements[url] = link;
// schedule removal of the old link
Live.removeoldLinkElements();
break;
// check if an html resource is our current url, then reload
case "text/html":
if (url != document.location.href)
return;
// local javascript changes cause a reload as well
case "text/javascript":
case "application/javascript":
case "application/x-javascript":
document.location.reload();
}
},
// removes the old stylesheet rules only once the new one has finished loading
removeoldLinkElements: function () {
var pending = 0;
for (var url in oldLinkElements) {
// if this sheet has any cssRules, delete the old link
try {
var link = currentLinkElements[url],
oldLink = oldLinkElements[url],
html = document.body.parentNode,
sheet = link.sheet || link.styleSheet,
rules = sheet.rules || sheet.cssRules;
if (rules.length >= 0) {
oldLink.parentNode.removeChild(oldLink);
delete oldLinkElements[url];
setTimeout(function () {
html.className = html.className.replace(/\s*livejs\-loading/gi, '');
}, 100);
}
} catch (e) {
pending++;
}
if (pending) setTimeout(Live.removeoldLinkElements, 50);
}
},
// performs a HEAD request and passes the header info to the given callback
getHead: function (url, callback) {
pendingRequests[url] = true;
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XmlHttp");
xhr.open("HEAD", url, true);
xhr.onreadystatechange = function () {
delete pendingRequests[url];
if (xhr.readyState == 4 && xhr.status != 304) {
xhr.getAllResponseHeaders();
var info = {};
for (var h in headers) {
var value = xhr.getResponseHeader(h);
// adjust the simple Etag variant to match on its significant part
if (h.toLowerCase() == "etag" && value) value = value.replace(/^W\//, '');
if (h.toLowerCase() == "content-type" && value) value = value.replace(/^(.*?);.*?$/i, "$1");
info[h] = value;
}
callback(url, info);
}
}
xhr.send();
}
};
// start listening
if (document.location.protocol != "file:") {
if (!window.liveJsLoaded)
Live.heartbeat();
window.liveJsLoaded = true;
}
else if (window.console)
console.log("Live.js doesn't support the file protocol. It needs http.");
})();
@@ -1,7 +0,0 @@
/*!
* jquery.toc.js - A jQuery plugin that will automatically generate a table of contents.
* v0.1.1
* https://github.com/jgallen23/toc
* copyright JGA 2012
* MIT License
*/
@@ -1,100 +0,0 @@
(function($) {
$.fn.toc = function(options) {
var self = this;
var opts = $.extend({}, jQuery.fn.toc.defaults, options);
var container = $(opts.container);
var headings = $(opts.selectors, container);
var headingOffsets = [];
var activeClassName = opts.prefix+'-active';
var scrollTo = function(e) {
if (opts.smoothScrolling) {
e.preventDefault();
var elScrollTo = $(e.target).attr('href');
var $el = $(elScrollTo);
$('body,html').animate({ scrollTop: $el.offset().top }, 400, 'swing', function() {
location.hash = elScrollTo;
});
}
$('li', self).removeClass(activeClassName);
$(e.target).parent().addClass(activeClassName);
};
//highlight on scroll
var timeout;
var highlightOnScroll = function(e) {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(function() {
var top = $(window).scrollTop(),
highlighted;
for (var i = 0, c = headingOffsets.length; i < c; i++) {
if (headingOffsets[i] >= top) {
$('li', self).removeClass(activeClassName);
highlighted = $('li:eq('+(i-1)+')', self).addClass(activeClassName);
opts.onHighlight(highlighted);
break;
}
}
}, 50);
};
if (opts.highlightOnScroll) {
$(window).bind('scroll', highlightOnScroll);
highlightOnScroll();
}
return this.each(function() {
//build TOC
var el = $(this);
var ul = $('<ul/>');
headings.each(function(i, heading) {
var $h = $(heading);
headingOffsets.push($h.offset().top - opts.highlightOffset);
//add anchor
var anchor = $('<span/>').attr('id', opts.anchorName(i, heading, opts.prefix)).insertBefore($h);
//build TOC item
var a = $('<a/>')
.text(opts.headerText(i, heading, $h))
.attr('href', '#' + opts.anchorName(i, heading, opts.prefix))
.bind('click', function(e) {
scrollTo(e);
el.trigger('selected', $(this).attr('href'));
});
var li = $('<li/>')
.addClass(opts.itemClass(i, heading, $h, opts.prefix))
.append(a);
ul.append(li);
});
el.html(ul);
});
};
jQuery.fn.toc.defaults = {
container: 'body',
selectors: 'h1,h2,h3',
smoothScrolling: true,
prefix: 'toc',
onHighlight: function() {},
highlightOnScroll: true,
highlightOffset: 100,
anchorName: function(i, heading, prefix) {
return prefix+i;
},
headerText: function(i, heading, $heading) {
return $heading.text();
},
itemClass: function(i, heading, $heading, prefix) {
return prefix + '-' + $heading[0].tagName.toLowerCase();
}
};
})(jQuery);
@@ -1,17 +0,0 @@
{
"name": "toc",
"version": "0.0.0",
"private": true,
"devDependencies": {
"mocha": "~1.8.2",
"grunt": "~0.4.1",
"grunt-reloadr": "~0.1.2",
"grunt-mocha": "~0.3.0",
"grunt-contrib-concat": "~0.1.3",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-jshint": "~0.3.0",
"grunt-contrib-connect": "~0.2.0",
"grunt-contrib-watch": "~0.3.1",
"grunt-plato": "~0.1.5"
}
}
@@ -1,25 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>toc Tests</title>
<link rel="stylesheet" href="../node_modules/mocha/mocha.css" />
<script src="../components/assert/assert.js"></script>
<script src="../node_modules/mocha/mocha.js"></script>
<!--<script src="../components/blanket/dist/qunit/blanket.min.js" data-cover-adapter="../components/blanket/src/adapters/mocha-blanket.js"></script>-->
<script>mocha.setup('tdd')</script>
</head>
<body>
<div id="mocha"></div>
<div id="fixture" style="display: none">
</div>
<script src="../dist/toc.js" data-cover></script>
<script src="toc.test.js"></script>
<script>
if (navigator.userAgent.indexOf('PhantomJS') < 0) {
mocha.run().globals(['LiveReload']);
}
</script>
</body>
</html>
@@ -1,4 +0,0 @@
suite('toc', function() {
});
@@ -1 +0,0 @@
<mxGraphModel dx="800" dy="800" grid="1" guides="1" tooltips="1" connect="1" fold="1" page="1" pageScale="1" pageWidth="826" pageHeight="1169" style="default-style2"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="47" value="Mifos X Platform &amp; API" style="verticalAlign=top;align=left;spacingTop=8;spacingLeft=2;spacingRight=12;shape=cube;size=10;direction=south;fontStyle=4;fillColor=#CCCCCC" parent="1" vertex="1"><mxGeometry x="120" y="60" width="590" height="440" as="geometry"/></mxCell><mxCell id="93" value="Oracle Mysql RDMS" style="shape=cylinder;whiteSpace=wrap" parent="1" vertex="1"><mxGeometry x="730" y="59.5" width="60" height="450.5" as="geometry"/></mxCell><mxCell id="95" value="Command" style="shape=message;whiteSpace=wrap" parent="1" vertex="1"><mxGeometry x="20" y="370" width="60" height="40" as="geometry"/></mxCell><mxCell id="96" value="Query" style="shape=message;whiteSpace=wrap" parent="1" vertex="1"><mxGeometry x="20" y="140" width="60" height="40" as="geometry"/></mxCell><mxCell id="97" value="" style="edgeStyle=none;exitX=1;exitY=0.5" parent="1" edge="1"><mxGeometry width="100" height="100" relative="1" as="geometry"><mxPoint x="80" y="384" as="sourcePoint"/><mxPoint x="120" y="384" as="targetPoint"/></mxGeometry></mxCell><mxCell id="98" value="" style="edgeStyle=none;exitX=1;exitY=0.5" parent="1" edge="1"><mxGeometry width="100" height="100" relative="1" as="geometry"><mxPoint x="80" y="150" as="sourcePoint"/><mxPoint x="120" y="150" as="targetPoint"/></mxGeometry></mxCell><mxCell id="99" value="" style="edgeStyle=none;exitX=1;exitY=0.5" parent="1" edge="1"><mxGeometry width="100" height="100" relative="1" as="geometry"><mxPoint x="120" y="400" as="sourcePoint"/><mxPoint x="80" y="400" as="targetPoint"/></mxGeometry></mxCell><mxCell id="100" value="" style="edgeStyle=none;exitX=1;exitY=0.5" parent="1" edge="1"><mxGeometry width="100" height="100" relative="1" as="geometry"><mxPoint x="120" y="170" as="sourcePoint"/><mxPoint x="80" y="170" as="targetPoint"/></mxGeometry></mxCell><mxCell id="106" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;" vertex="1" parent="1"><mxGeometry x="134" y="280" width="546" height="205" as="geometry"/></mxCell><mxCell id="109" value="HTTPS API" style="rounded=1;whiteSpace=wrap;fillColor=#007FFF;rotation=-90" vertex="1" parent="1"><mxGeometry x="100" y="390" width="124" height="30" as="geometry"/></mxCell><mxCell id="108" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;" vertex="1" parent="1"><mxGeometry x="130" y="92.5" width="550" height="175" as="geometry"/></mxCell><mxCell id="52" value="HTTPS API" style="rounded=1;whiteSpace=wrap;fillColor=#007FFF;rotation=-90" parent="1" vertex="1"><mxGeometry x="100" y="165" width="124" height="30" as="geometry"/></mxCell><mxCell id="112" value="1. Check Permissions" style="" vertex="1" parent="1"><mxGeometry x="210" y="120" width="170" height="30" as="geometry"/></mxCell><mxCell id="113" value="2. Fetch Data (SQL Query)" style="" vertex="1" parent="1"><mxGeometry x="240" y="165" width="170" height="30" as="geometry"/></mxCell><mxCell id="114" value="3. Covert To JSON response" style="" vertex="1" parent="1"><mxGeometry x="210" y="205" width="183" height="30" as="geometry"/></mxCell><mxCell id="115" value="1. Check Permissions" style="" vertex="1" parent="1"><mxGeometry x="200" y="310" width="170" height="30" as="geometry"/></mxCell><mxCell id="116" value="2. Locate Command Handler" style="" vertex="1" parent="1"><mxGeometry x="216.5" y="352.5" width="170" height="30" as="geometry"/></mxCell><mxCell id="117" value="3. Command Handler&#xa;Uses Domain Services&#xa;Model + ORM to perist changes&#xa;All changes passed back" style="" vertex="1" parent="1"><mxGeometry x="410" y="345" width="250" height="125" as="geometry"/></mxCell><mxCell id="118" value="4.Updated with &#xa;changes for Audit" style="" vertex="1" parent="1"><mxGeometry x="200" y="405" width="170" height="30" as="geometry"/></mxCell><mxCell id="119" value="5. Covert To JSON response" style="" vertex="1" parent="1"><mxGeometry x="200" y="440" width="183" height="30" as="geometry"/></mxCell></root></mxGraphModel>
@@ -1 +0,0 @@
<mxGraphModel dx="800" dy="800" grid="1" guides="1" tooltips="1" connect="1" fold="1" page="1" pageScale="1" pageWidth="826" pageHeight="1169" style="default-style2"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="47" value="Mifos X Platform &amp; API" style="verticalAlign=top;align=left;spacingTop=8;spacingLeft=2;spacingRight=12;shape=cube;size=10;direction=south;fontStyle=4;fillColor=#CCCCCC" vertex="1" parent="1"><mxGeometry x="30" y="59.5" width="780" height="260.5" as="geometry"/></mxCell><mxCell id="48" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="118.5" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="49" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="46" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="50" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="757.5" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="51" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="675" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="52" value="HTTPS API" style="rounded=1;whiteSpace=wrap;fillColor=#007FFF" vertex="1" parent="1"><mxGeometry x="46" y="99.5" width="744" height="30" as="geometry"/></mxCell><mxCell id="77" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="191" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="78" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="252.5" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="79" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="382.5" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="80" value="" style="shape=lollipop;direction=south;rotation=-90" vertex="1" parent="1"><mxGeometry x="487.5" y="22" width="25" height="42" as="geometry"/></mxCell><mxCell id="86" value="Infrastructure" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="46" y="150" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="87" value="User Administration" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="46" y="230" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="88" value="Organisation Modelling" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="231" y="230" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="89" value="Product Configuration" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="231" y="150" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="90" value="Client Data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="440" y="150" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="91" value="Portfolio Management" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="624.25" y="150" width="151.5" height="70" as="geometry"/></mxCell><mxCell id="92" value="GL Account Management" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;rotation=0" vertex="1" parent="1"><mxGeometry x="523.5" y="230" width="151.5" height="70" as="geometry"/></mxCell></root></mxGraphModel>
File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

-15
View File
@@ -1,15 +0,0 @@
# humanstxt.org/
# The humans responsible & technology colophon
# TEAM
<name> -- <role> -- <twitter>
# THANKS
<name>
# TECHNOLOGY COLOPHON
HTML5, CSS3
Normalize.css, jQuery, Modernizr
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

-587
View File
@@ -1,587 +0,0 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Mifos Platform Docs: System Architecture</title>
<meta name="description" content="mifos platform documentation">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/bootstrap-3.0.0/bootstrap.min.css">
<link href="css/bootstrap-3.0.0/bootstrap-theme.min.css" rel="stylesheet">
<style>
#wrapper {
margin: 0 20px 0 220px;
}
a {
color: #336699;
}
body {
font-family: Helvetica Neue,Helvetica,Arial,sans-serif;
font-size: 16px;
line-height: 24px;
margin: 0;
padding: 0;
}
h1, h2, h3, #toc a {
font-family: 'Voces',sans-serif;
}
p, ul {
margin-bottom: 24px;
margin-top: 0;
}
small {
font-size: 10px;
}
code {
word-wrap: break-word;
}
.repo-stats iframe {
float: right;
margin-left: 5px;
}
#toc {
background: none repeat scroll 0 0 #333333;
box-shadow: -5px 0 5px 0 #000000 inset;
color: #FFFFFF;
height: 100%;
left: 0;
position: fixed;
top: 0;
width: 215px;
}
#toc ul {
list-style: none outside none;
margin: 0;
padding: 0;
}
#toc li {
padding: 5px 10px;
}
#toc a {
color: #FFFFFF;
display: block;
text-decoration: none;
}
#toc .toc-h2 {
padding-left: 10px;
}
#toc .toc-h3 {
padding-left: 20px;
}
#toc .toc-active {
background: none repeat scroll 0 0 #336699;
box-shadow: -5px 0 10px -5px #000000 inset;
}
pre {
background: none repeat scroll 0 0 #333333;
color: #F8F8F8;
display: block;
padding: 0.5em;
}
pre .shebang, pre .comment, pre .template_comment, pre .javadoc {
color: #7C7C7C;
}
pre .keyword, pre .tag, pre .ruby .function .keyword, pre .tex .command {
color: #96CBFE;
}
pre .function .keyword, pre .sub .keyword, pre .method, pre .list .title {
color: #FFFFB6;
}
pre .string, pre .tag .value, pre .cdata, pre .filter .argument, pre .attr_selector, pre .apache .cbracket, pre .date {
color: #A8FF60;
}
pre .subst {
color: #DAEFA3;
}
pre .regexp {
color: #E9C062;
}
pre .function .title, pre .sub .identifier, pre .pi, pre .decorator, pre .ini .title, pre .tex .special {
color: #FFFFB6;
}
pre .class .title, pre .haskell .label, pre .constant, pre .smalltalk .class, pre .javadoctag, pre .yardoctag, pre .phpdoc, pre .nginx .built_in {
color: #FFFFB6;
}
pre .symbol, pre .ruby .symbol .string, pre .ruby .symbol .keyword, pre .ruby .symbol .keymethods, pre .number, pre .variable, pre .vbscript, pre .literal {
color: #C6C5FE;
}
pre .css .tag {
color: #96CBFE;
}
pre .css .rules .property, pre .css .id {
color: #FFFFB6;
}
pre .css .class {
color: #FFFFFF;
}
pre .hexcolor {
color: #C6C5FE;
}
pre .number {
color: #FF73FD;
}
pre .tex .formula {
opacity: 0.7;
}
.github-repo {
background: url("images/Octocat.png") no-repeat scroll right bottom rgba(0, 0, 0, 0);
border: 1px solid #CCCCCC;
border-radius: 5px;
box-shadow: 0 0 3px #333333;
font-family: Helvetica,Arial,sans-serif;
font-size: 14px;
letter-spacing: 1px;
position: relative;
}
.github-repo a {
text-decoration: none;
}
.github-repo a:hover {
text-decoration: underline;
}
.github-repo .repo-header {
background: none repeat scroll 0 0 rgba(240, 240, 240, 0.7);
}
.github-repo .repo-header .repo-stats {
float: right;
font-size: 12px;
line-height: 20px;
margin: 5px 10px 0 0;
}
.github-repo .repo-header .repo-stats span, .github-repo .repo-header .repo-stats a {
color: #000000;
padding: 0 5px 0 25px;
}
.github-repo .repo-header .repo-stats .repo-watchers {
background: url("images/repostat.png") no-repeat scroll 5px -5px rgba(0, 0, 0, 0);
}
.github-repo .repo-header .repo-stats .repo-forks {
background: url("images/repostat.png") no-repeat scroll 5px -55px rgba(0, 0, 0, 0);
}
.github-repo .repo-header .repo-stats .repo-twitter {
float: right;
margin-left: 5px;
}
.github-repo .repo-header .repo-name {
display: block;
font-size: 18px;
letter-spacing: 2px;
padding: 5px 10px;
}
.github-repo .repo-commit {
padding: 10px;
}
.github-repo .repo-commit .repo-commit-message {
color: #000000;
}
.github-repo .repo-commit .repo-commit-date {
color: #333333;
display: block;
font-size: 12px;
font-style: italic;
letter-spacing: 0;
margin-top: 10px;
}
</style>
<script src="js/vendor/modernizr-2.6.2.min.js"></script>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="js/vendor/bootstrap-3.0.0/assets/html5shiv.js"></script>
<script src="js/vendor/bootstrap-3.0.0/assets/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!--[if lt IE 7]>
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
<![endif]-->
<div id="toc">
</div>
<div id="wrapper">
<aside>
<h1>Mifos Platform Software Architecture Document</h1>
<section>
<h2>Summary</h2>
<p>
This document captures the major architectural decisions in platform. The purpose of the document is to provide a guide to the overall structure of the platform; where it fits in the overall context of an MIS solution and its internals so that contributors can more effectively understand how changes that they are considering can be made, and the consequences of those changes.
</p>
<p>
The target audience for this report is both system integrators (who will use the document to gain an understanding of the structure of the platform and its design rationale) and platform contributors who will use the document to reason about future changes and who will update the document as the system evolves.
</p>
</section>
<section>
<h2>Introduction</h2>
<section>
<h4>The Idea</h4>
<p>Mifos was an idea born out of a wish to create and deploy technology that allows the microfinance industry to scale. The goal is to:
<ul>
<li>Produce a gold standard management information system suitable for microfinance operations</li>
<li>Acts as the basis of a <strong>platform for microfinance</strong></li>
<li>Open source, owned and driven by member organisations in the community</li>
<li>Enabling potential for eco-system of providers located near to MFIs</li>
</ul>
</p>
<h4>History</h4>
<p>
<ul>
<li>2006: Project intiated by <a href="http://www.grameenfoundation.org/" target="_blank">Grameen Foundation</a></li>
<li>Late 2011: Grameen Foundation handed over full responsibility to open source community.</li>
<li>2012: Mifos X platform started. Previous members of project come together under the name of Community for Open Source Microfinance (COSM / <a href="http://www.mifos.org" target="_blank">OpenMF</a>)</li>
<li>2013: COSM / OpenMF officially rebranded to <strong>Mifos Initiative</strong> and receive US 501c3 status.</li>
</ul>
</p>
<h4>Project Related</h4>
<p>
<ul>
<li>Project url is <a href="https://github.com/openMF/mifosx" target="_blank">https://github.com/openMF/mifosx</a>
</li>
<li>Download from <a href="https://sourceforge.net/projects/mifos/" target="_blank">https://sourceforge.net/projects/mifos/</a>
</li>
<li><a href="https://sourceforge.net/projects/mifos/files/Mifos%20X/stats/timeline?dates=2012-04-25+to+2013-11-16" target="_blank">Download stats</a>
</li>
</ul>
</p>
</section>
</section>
<section>
<h2>System Overview</h2>
<img src="diagrams/platform-systemview.png" alt="System view diagram" />
<p>
Financial institutions deliver their services to customers through a variety of means today.
<ul>
<li>Customers can call direct into branches (teller model)</li>
<li>Customers can organise into groups (or centers) and agree to meetup at a location and time with FI staff (traditional microfinance).</li>
<li>An FI might have a public facing information portal that customers can use for variety of reasons including account management (online banking).</li>
<li>An FI might be integrated into a ATM/POS/Card services network that the customer can use.</li>
<li>An FI might be integrated with a mobile money operator and support mobile money services for customer (present/future microfinance).</li>
<li>An FI might use third party agents to sell on products/services from other banks/FIs.</li>
</ul>
</p>
<p>
As illustrated in the above diagram, the various stakeholders leverage <strong>business apps</strong> to perform specific customer or FI related actions. The functionality contained in these business apps can be bundled up and packaged in any way. In the diagram, several of the apps may be combined into one app or any one of the blocks representing an app could be further broken up as needed.
</p>
<p>
The platform is the <strong>core engine of the MIS</strong>. It hides alot of the complexity that exists in the business and technical domains needed for an MIS in FIs behind a relatively simple API. It is this API that <strong>frees up app developers to innovate and produce apps</strong> that can be as general or as bespoke as FIs need them to be.
</p>
</section>
<section>
<h2>Functional Overview</h2>
<p>As ALL capabilities of the platform are exposed through an API, The API docs are the best place to view a detailed breakdown of what the platform does. See <a href="https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm" target="_blank">online API Documentation</a>.
</p>
<img src="diagrams/platform-categories.png"
alt="platform functionality view" />
<p>At a higher level though we see the capabilities fall into the following categories:
<ul>
<li>
Infrastructure
<ul>
<li>Codes</li>
<li>Extensible Data Tables</li>
<li>Reporting</li>
</ul>
</li>
<li>
User Administration
<ul>
<li>Users</li>
<li>Roles</li>
<li>Permissions</li>
</ul>
</li>
<li>Organisation Modelling
<ul>
<li>Offices</li>
<li>Staff</li>
<li>Currency</li>
</ul>
</li>
<li>Product Configuration
<ul>
<li>Charges</li>
<li>Loan Products</li>
<li>Deposit Products</li>
</ul>
</li>
<li>
Client Data
<ul>
<li>Know Your Client (KYC)</li>
</ul>
</li>
<li>Portfolio Management
<ul>
<li>Loan Accounts</li>
<li>Deposit Accounts</li>
<li>Client/Groups</li>
</ul>
</li>
<li>GL Account Management
<ul>
<li>Chart of Accounts</li>
<li>General Ledger</li>
</ul>
</li>
</ul>
</p>
</section>
<section>
<h2>Technology</h2>
<p>
<ul>
<li>Java 7: <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a></li>
<li>JAX-RS 1.0: <a href="https://wikis.oracle.com/display/Jersey/Overview+of+JAX-RS+1.0+Features" target="_blank">using Jersey (1.17.x)</a></li>
<li><a href="http://www.json.org/" target="_blank">JSON</a> using <a href="http://code.google.com/p/google-gson/" target="_blank">Google GSON</a></li>
<li>
Spring I/O Platform: <a href="http://spring.io/platform" target="_blank">http://spring.io/platform</a>
<ul>
<li><a href="http://projects.spring.io/spring-framework"
target="_blank">Spring Framework</a></li>
<li><a href="http://projects.spring.io/spring-security"
target="_blank">Spring Security</a></li>
<li><a href="http://projects.spring.io/spring-data/"
target="_blank">Spring Data (JPA) backed by Hibernate</a></li>
</ul>
</li>
<li>MySQL: <a href="http://www.oracle.com/us/products/mysql/overview/index.html" target="_blank">http://www.oracle.com/us/products/mysql/overview/index.html</a></li>
</ul>
</p>
</section>
<section>
<h2>Principals</h2>
<h3>RESTful API</h3>
<p>
The platform exposes all its functionality via a <strong>practically-RESTful API</strong>, that communicates using JSON.<p>
<p>
We use the term <strong>practically-RESTful</strong> in order to make it clear we are not trying to be <a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank">fully REST compliant</a> but still maintain important RESTful attributes like:
<ul>
<li>
Stateless: platform maintains no conversational or session-based state. The result of this is ability to scale horizontally with ease.
</li>
<li>
Resource-oriented: API is focussed around set of resources using HTTP vocabulary and conventions e.g GET, PUT, POST, DELETE, HTTP status codes. This results in a simple and consistent API for clients.
</li>
</ul>
See <a href="https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm" target="_blank">online API Documentation</a> for more detail.
</p>
<h3>Multi-tenanted</h3>
<p>
The mifos platform has been developed with support for multi-tenancy at the core of its design. This means that it is just as easy to use the platform for Software-as-a-Service (SaaS) type offerings as it is for local installations.
</p>
<p>
The platform uses an approach that isolates an FIs data per database/schema (<a href="http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_topic2" target="_blank">See Separate Databases and Shared Database, Separate Schemas</a>).
</p>
<h3>Extensible</h3>
<p>
Whilst each tenant will have a set of core tables, the platform tables can be extended in different ways for each tenant through the use of <a href="#datatables">Data tables</a> functionality.
</p>
<h3>Command Query Seperation</h3>
<p>We seperate <strong>commands</strong> (that change data) from <strong>queries</strong> (that read data).</p>
<p>Why? There are numerous reasons for choosing this approach which at present is not an attempt at full blown CQRS. The main advantages at present are:
<ul>
<li>State changing commands are persisted providing an audit of all state changes.</li>
<li>Used to support a general approach to <strong>maker-checker</strong>.</li>
<li>State changing commands use the Object-Oriented paradign (and hence ORM) whilst querys can stay in the data paradigm.</li>
</ul>
</p>
<h3>Maker-Checker</h3>
<p>Also known as <strong>four-eyes principal</strong>. Enables apps to support a maker-checker style workflow process. Commands that pass validation will be persisted. Maker-checker can be enabled/disabled at fine-grained level for any state changing API.</p>
<h3>Fine grained access control</h3>
<p>A fine grained permission is associated with each API. Administrators have fine grained control over what roles or users have access to.</p>
</section>
<section>
<h2>Code Packaging</h2>
<p>
The intention is for platform code to be packaged in a vertical slice way (as opposed to layers).<br>
Source code starts from <a href="https://github.com/openMF/mifosx/tree/master/mifosng-provider/src/main/java/org/mifosplatform">mifosng-provider/src/main/java/org/mifosplatform</a><br>
<ul><strong>org.mifosplatform.</strong>
<li>accounting</li>
<li>useradministration</li>
<li>infrastructure</li>
<li>portfolio
<ul>
<li>charge</li>
<li>client</li>
<li>fund</li>
<li>loanaccount</li>
</ul>
</li>
<li>accounting</li>
</ul>
Within each vertical slice is some common packaging structure:
<ul><strong>org.mifosplatform.useradministration.</strong>
<li>api - XXXApiResource.java - REST api implementation files</li>
<li>handler - XXXCommandHandler.java - specific handlers invoked</li>
<li>service - contains read + write services for functional area</li>
<li>domain - OO concepts for the functional area</li>
<li>data - Data concepts for the area</li>
<li>serialization - ability to convert from/to API JSON for functional area</li>
</ul>
</p>
</section>
<section>
<h2>Design Overview</h2>
<p><strong>Note</strong>: The implementation of the platform code to process commands through handlers whilst supporting maker-checker and authorisation checks is a little bit convoluted at present and is an area pin-pointed for clean up to make it easier to on board new platform developers. In the mean time below content is used to explain its workings at present.</p>
<img src="diagrams/command-query.png" alt="Command-Query Overview" />
<p>
Taking into account example shown above for the <strong>users</strong> resource.
<ol>
<li>Query: GET /users</li>
<li>HTTPS API: retrieveAll method on org.mifosplatform.useradministration.api.UsersApiResource invoked</li>
<li>UsersApiResource.retrieveAll: Check user has permission to access this resources data.</li>
<li>UsersApiResource.retrieveAll: Use 'read service' to fetch all users data ('read services' execute simple SQL queries against Database using JDBC)</li>
<li>UsersApiResource.retrieveAll: Data returned to coverted into JSON response</li>
</ol>
<ol>
<li>Command: POST /users (Note: data passed in request body)</li>
<li>HTTPS API: <strong>create</strong> method on <strong>org.mifosplatform.useradministration.api.UsersApiResource</strong> invoked</li>
</ol>
<pre><code>@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String create(final String apiRequestBodyAsJson) {
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.createUser() //
.withJson(apiRequestBodyAsJson) //
.build();
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
}
</code></pre>
<p><em>Description:</em> Create a CommandWrapper object that represents this create user command and JSON request body. Pass off responsiblity for processing to <strong>PortfolioCommandSourceWritePlatformService.logCommandSource</strong>.</p>
<pre><code>
@Override
public CommandProcessingResult logCommandSource(final CommandWrapper wrapper) {
boolean isApprovedByChecker = false;
// check if is update of own account details
if (wrapper.isUpdateOfOwnUserDetails(this.context.authenticatedUser().getId())) {
// then allow this operation to proceed.
// maker checker doesnt mean anything here.
isApprovedByChecker = true; // set to true in case permissions have
// been maker-checker enabled by
// accident.
} else {
// if not user changing their own details - check user has
// permission to perform specific task.
this.context.authenticatedUser().validateHasPermissionTo(wrapper.getTaskPermissionName());
}
validateIsUpdateAllowed();
final String json = wrapper.getJson();
CommandProcessingResult result = null;
try {
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(json);
final JsonCommand command = JsonCommand.from(json, parsedCommand, this.fromApiJsonHelper, wrapper.getEntityName(),
wrapper.getEntityId(), wrapper.getSubentityId(), wrapper.getGroupId(), wrapper.getClientId(), wrapper.getLoanId(),
wrapper.getSavingsId(), wrapper.getCodeId(), wrapper.getSupportedEntityType(), wrapper.getSupportedEntityId(),
wrapper.getTransactionId(), wrapper.getHref(), wrapper.getProductId());
result = this.processAndLogCommandService.processAndLogCommand(wrapper, command, isApprovedByChecker);
} catch (final RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
result = this.processAndLogCommandService.logCommand(e.getCommandSourceResult());
}
return result;
}
</code></pre>
<p><em>Description:</em> check user has permission for this action. if ok, a) parse the json request body, b) create a JsonCommand object to wrap the command details, c) use <strong>CommandProcessingService</strong> to handle command.</p>
<p><strong>Note</strong>: if a RollbackTransactionAsCommandIsNotApprovedByCheckerException occurs at this point. The original transaction will of been aborted and we only log an entry for the command in the audit table setting its status as 'Pending'.</p>
<pre><code>@Transactional
@Override
public CommandProcessingResult processAndLogCommand(final CommandWrapper wrapper, final JsonCommand command, final boolean isApprovedByChecker) {
final boolean rollbackTransaction = this.configurationDomainService.isMakerCheckerEnabledForTask(wrapper.taskPermissionName())
&& !isApprovedByChecker;
final NewCommandSourceHandler handler = findCommandHandler(wrapper);
final CommandProcessingResult result = handler.processCommand(command);
final AppUser maker = this.context.authenticatedUser();
CommandSource commandSourceResult = null;
if (command.commandId() != null) {
commandSourceResult = this.commandSourceRepository.findOne(command.commandId());
commandSourceResult.markAsChecked(maker, DateTime.now());
} else {
commandSourceResult = CommandSource.fullEntryFrom(wrapper, command, maker);
}
commandSourceResult.updateResourceId(result.resourceId());
commandSourceResult.updateForAudit(result.getOfficeId(), result.getGroupId(), result.getClientId(), result.getLoanId(),
result.getSavingsId(), result.getProductId());
String changesOnlyJson = null;
if (result.hasChanges()) {
changesOnlyJson = this.toApiJsonSerializer.serializeResult(result.getChanges());
commandSourceResult.updateJsonTo(changesOnlyJson);
}
if (!result.hasChanges() && wrapper.isUpdateOperation() && !wrapper.isUpdateDatatable()) {
commandSourceResult.updateJsonTo(null);
}
if (commandSourceResult.hasJson()) {
this.commandSourceRepository.save(commandSourceResult);
}
if (rollbackTransaction) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(commandSourceResult); }
return result;
}
</code></pre>
<ol>
<li>Check that if maker-checker configuration enabled for this action. If yes and this is not a 'checker' approving the command - rollback at the end. We rollback at the end in order to test if the command will pass 'domain validation' which requires commit to database for full check.</li>
<li>findCommandHandler - Find the correct <strong>Hanlder</strong> to process this command.</li>
<li>Process command using handler (In transactional scope).</li>
<li>CommandSource object created/updated with all details for logging to 'm_portfolio_command_source' table.</li>
<li>In update scenario, we check to see if there where really any changes/updates. If so only JSON for changes is stored in audit log.</li>
</ol>
</p>
</section>
</aside>
<!-- end of wrapper -->
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.9.1.min.js"><\/script>')</script>
<script src="js/plugins.js"></script>
<script src="js/vendor/bootstrap-3.0.0/bootstrap.min.js"></script>
<script src="js/vendor/toc-0.1.2/jquery.toc.min.js"></script>
<script>
$('#toc').toc();
</script>
</body>
</html>
-23
View File
@@ -1,23 +0,0 @@
// Avoid `console` errors in browsers that lack a console.
(function() {
var method;
var noop = function () {};
var methods = [
'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
'timeStamp', 'trace', 'warn'
];
var length = methods.length;
var console = (window.console = window.console || {});
while (length--) {
method = methods[length];
// Only stub undefined methods.
if (!console[method]) {
console[method] = noop;
}
}
}());
// Place any jQuery/helper plugins in here.
@@ -1,83 +0,0 @@
// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
// IT'S ALL JUST JUNK FOR OUR DOCS!
// ++++++++++++++++++++++++++++++++++++++++++
!function ($) {
$(function(){
var $window = $(window)
var $body = $(document.body)
var navHeight = $('.navbar').outerHeight(true) + 10
$body.scrollspy({
target: '.bs-sidebar',
offset: navHeight
})
$window.on('load', function () {
$body.scrollspy('refresh')
})
$('.bs-docs-container [href=#]').click(function (e) {
e.preventDefault()
})
// back to top
setTimeout(function () {
var $sideBar = $('.bs-sidebar')
$sideBar.affix({
offset: {
top: function () {
var offsetTop = $sideBar.offset().top
var sideBarMargin = parseInt($sideBar.children(0).css('margin-top'), 10)
var navOuterHeight = $('.bs-docs-nav').height()
return (this.top = offsetTop - navOuterHeight - sideBarMargin)
}
, bottom: function () {
return (this.bottom = $('.bs-footer').outerHeight(true))
}
}
})
}, 100)
setTimeout(function () {
$('.bs-top').affix()
}, 100)
// tooltip demo
$('.tooltip-demo').tooltip({
selector: "[data-toggle=tooltip]",
container: "body"
})
$('.tooltip-test').tooltip()
$('.popover-test').popover()
$('.bs-docs-navbar').tooltip({
selector: "a[data-toggle=tooltip]",
container: ".bs-docs-navbar .nav"
})
// popover demo
$("[data-toggle=popover]")
.popover()
// button state demo
$('#fat-btn')
.click(function () {
var btn = $(this)
btn.button('loading')
setTimeout(function () {
btn.button('reset')
}, 3000)
})
// carousel demo
$('.bs-docs-carousel-example').carousel()
})
}(window.jQuery)
@@ -1,290 +0,0 @@
window.onload = function () { // wait for load in a dumb way because B-0
var cw = '/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n'
function showError(msg, err) {
$('<div id="bsCustomizerAlert" class="bs-customizer-alert">\
<div class="container">\
<a href="#bsCustomizerAlert" data-dismiss="alert" class="close pull-right">&times;</a>\
<p class="bs-customizer-alert-text"><span class="glyphicon glyphicon-warning-sign"></span>' + msg + '</p>' +
(err.extract ? '<pre class="bs-customizer-alert-extract">' + err.extract.join('\n') + '</pre>' : '') + '\
</div>\
</div>').appendTo('body').alert()
throw err
}
function showCallout(msg, showUpTop) {
var callout = $('<div class="bs-callout bs-callout-danger">\
<h4>Attention!</h4>\
<p>' + msg + '</p>\
</div>')
if (showUpTop) {
callout.appendTo('.bs-docs-container')
} else {
callout.insertAfter('.bs-customize-download')
}
}
function getQueryParam(key) {
key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}
function createGist(configData) {
var data = {
"description": "Bootstrap Customizer Config",
"public": true,
"files": {
"config.json": {
"content": JSON.stringify(configData, null, 2)
}
}
}
$.ajax({
url: 'https://api.github.com/gists',
type: 'POST',
dataType: 'json',
data: JSON.stringify(data)
})
.success(function(result) {
history.replaceState(false, document.title, window.location.origin + window.location.pathname + '?id=' + result.id)
})
.error(function(err) {
showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err)
})
}
function getCustomizerData() {
var vars = {}
$('#less-variables-section input')
.each(function () {
$(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
})
var data = {
vars: vars,
css: $('#less-section input:checked') .map(function () { return this.value }).toArray(),
js: $('#plugin-section input:checked').map(function () { return this.value }).toArray()
}
if ($.isEmptyObject(data.vars) && !data.css.length && !data.js.length) return
return data
}
function parseUrl() {
var id = getQueryParam('id')
if (!id) return
$.ajax({
url: 'https://api.github.com/gists/' + id,
type: 'GET',
dataType: 'json'
})
.success(function(result) {
var data = JSON.parse(result.files['config.json'].content)
if (data.js) {
$('#plugin-section input').each(function () {
$(this).prop('checked', ~$.inArray(this.value, data.js))
})
}
if (data.css) {
$('#less-section input').each(function () {
$(this).prop('checked', ~$.inArray(this.value, data.css))
})
}
if (data.vars) {
for (var i in data.vars) {
$('input[data-var="' + i + '"]').val(data.vars[i])
}
}
})
.error(function(err) {
showError('Error fetching bootstrap config file', err)
})
}
function generateZip(css, js, fonts, complete) {
if (!css && !js) return showError('<strong>Ruh roh!</strong> No Bootstrap files selected.', new Error('no Bootstrap'))
var zip = new JSZip()
if (css) {
var cssFolder = zip.folder('css')
for (var fileName in css) {
cssFolder.file(fileName, css[fileName])
}
}
if (js) {
var jsFolder = zip.folder('js')
for (var fileName in js) {
jsFolder.file(fileName, js[fileName])
}
}
if (fonts) {
var fontsFolder = zip.folder('fonts')
for (var fileName in fonts) {
fontsFolder.file(fileName, fonts[fileName])
}
}
var content = zip.generate({type:"blob"})
complete(content)
}
function generateCustomCSS(vars) {
var result = ''
for (var key in vars) {
result += key + ': ' + vars[key] + ';\n'
}
return result + '\n\n'
}
function generateFonts() {
var glyphicons = $('#less-section [value="glyphicons.less"]:checked')
if (glyphicons.length) {
return __fonts
}
}
function generateCSS() {
var $checked = $('#less-section input:checked')
if (!$checked.length) return false
var result = {}
var vars = {}
var css = ''
$('#less-variables-section input')
.each(function () {
$(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
})
css += __less['variables.less']
if (vars) css += generateCustomCSS(vars)
css += __less['mixins.less']
css += __less['normalize.less']
css += __less['scaffolding.less']
css += $checked
.map(function () { return __less[this.value] })
.toArray()
.join('\n')
css = css.replace(/@import[^\n]*/gi, '') //strip any imports
try {
var parser = new less.Parser({
paths: ['variables.less', 'mixins.less']
, optimization: 0
, filename: 'bootstrap.css'
}).parse(css, function (err, tree) {
if (err) {
return showError('<strong>Ruh roh!</strong> Could not parse less files.', err)
}
result = {
'bootstrap.css' : cw + tree.toCSS(),
'bootstrap.min.css' : cw + tree.toCSS({ compress: true })
}
})
} catch (err) {
return showError('<strong>Ruh roh!</strong> Could not parse less files.', err)
}
return result
}
function generateJavascript() {
var $checked = $('#plugin-section input:checked')
if (!$checked.length) return false
var js = $checked
.map(function () { return __js[this.value] })
.toArray()
.join('\n')
return {
'bootstrap.js': js,
'bootstrap.min.js': cw + uglify(js)
}
}
var inputsComponent = $('#less-section input')
var inputsPlugin = $('#plugin-section input')
var inputsVariables = $('#less-variables-section input')
$('#less-section .toggle').on('click', function (e) {
e.preventDefault()
inputsComponent.prop('checked', !inputsComponent.is(':checked'))
})
$('#plugin-section .toggle').on('click', function (e) {
e.preventDefault()
inputsPlugin.prop('checked', !inputsPlugin.is(':checked'))
})
$('#less-variables-section .toggle').on('click', function (e) {
e.preventDefault()
inputsVariables.val('')
})
$('[data-dependencies]').on('click', function () {
if (!$(this).is(':checked')) return
var dependencies = this.getAttribute('data-dependencies')
if (!dependencies) return
dependencies = dependencies.split(',')
for (var i = 0; i < dependencies.length; i++) {
var dependency = $('[value="' + dependencies[i] + '"]')
dependency && dependency.prop('checked', true)
}
})
$('[data-dependents]').on('click', function () {
if ($(this).is(':checked')) return
var dependents = this.getAttribute('data-dependents')
if (!dependents) return
dependents = dependents.split(',')
for (var i = 0; i < dependents.length; i++) {
var dependent = $('[value="' + dependents[i] + '"]')
dependent && dependent.prop('checked', false)
}
})
var $compileBtn = $('#btn-compile')
var $downloadBtn = $('#btn-download')
$compileBtn.on('click', function (e) {
e.preventDefault()
$compileBtn.attr('disabled', 'disabled')
generateZip(generateCSS(), generateJavascript(), generateFonts(), function (blob) {
$compileBtn.removeAttr('disabled')
saveAs(blob, "bootstrap.zip")
createGist(getCustomizerData())
})
})
// browser support alerts
if (!window.URL && navigator.userAgent.toLowerCase().indexOf('safari') != -1) {
showCallout("Looks like you're using safari, which sadly doesn't have the best support\
for HTML5 blobs. Because of this your file will be downloaded with the name <code>\"untitled\"</code>.\
However, if you check your downloads folder, just rename this <code>\"untitled\"</code> file\
to <code>\"bootstrap.zip\"</code> and you should be good to go!")
} else if (!window.URL && !window.webkitURL) {
$('.bs-docs-section, .bs-sidebar').css('display', 'none')
showCallout("Looks like your current browser doesn't support the Bootstrap Customizer. Please take a second\
to <a href=\"https://www.google.com/intl/en/chrome/browser/\"> upgrade to a more modern browser</a>.", true)
}
parseUrl()
}
@@ -1,169 +0,0 @@
/* Blob.js
* A Blob implementation.
* 2013-06-20
*
* By Eli Grey, http://eligrey.com
* By Devin Samarin, https://github.com/eboyjr
* License: X11/MIT
* See LICENSE.md
*/
/*global self, unescape */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
plusplus: true */
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
if (typeof Blob !== "function" || typeof URL === "undefined")
if (typeof Blob === "function" && typeof webkitURL !== "undefined") self.URL = webkitURL;
else var Blob = (function (view) {
"use strict";
var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || view.MSBlobBuilder || (function(view) {
var
get_class = function(object) {
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
}
, FakeBlobBuilder = function BlobBuilder() {
this.data = [];
}
, FakeBlob = function Blob(data, type, encoding) {
this.data = data;
this.size = data.length;
this.type = type;
this.encoding = encoding;
}
, FBB_proto = FakeBlobBuilder.prototype
, FB_proto = FakeBlob.prototype
, FileReaderSync = view.FileReaderSync
, FileException = function(type) {
this.code = this[this.name = type];
}
, file_ex_codes = (
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
).split(" ")
, file_ex_code = file_ex_codes.length
, real_URL = view.URL || view.webkitURL || view
, real_create_object_URL = real_URL.createObjectURL
, real_revoke_object_URL = real_URL.revokeObjectURL
, URL = real_URL
, btoa = view.btoa
, atob = view.atob
, ArrayBuffer = view.ArrayBuffer
, Uint8Array = view.Uint8Array
;
FakeBlob.fake = FB_proto.fake = true;
while (file_ex_code--) {
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
}
if (!real_URL.createObjectURL) {
URL = view.URL = {};
}
URL.createObjectURL = function(blob) {
var
type = blob.type
, data_URI_header
;
if (type === null) {
type = "application/octet-stream";
}
if (blob instanceof FakeBlob) {
data_URI_header = "data:" + type;
if (blob.encoding === "base64") {
return data_URI_header + ";base64," + blob.data;
} else if (blob.encoding === "URI") {
return data_URI_header + "," + decodeURIComponent(blob.data);
} if (btoa) {
return data_URI_header + ";base64," + btoa(blob.data);
} else {
return data_URI_header + "," + encodeURIComponent(blob.data);
}
} else if (real_create_object_URL) {
return real_create_object_URL.call(real_URL, blob);
}
};
URL.revokeObjectURL = function(object_URL) {
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
real_revoke_object_URL.call(real_URL, object_URL);
}
};
FBB_proto.append = function(data/*, endings*/) {
var bb = this.data;
// decode data to a binary string
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
var
str = ""
, buf = new Uint8Array(data)
, i = 0
, buf_len = buf.length
;
for (; i < buf_len; i++) {
str += String.fromCharCode(buf[i]);
}
bb.push(str);
} else if (get_class(data) === "Blob" || get_class(data) === "File") {
if (FileReaderSync) {
var fr = new FileReaderSync;
bb.push(fr.readAsBinaryString(data));
} else {
// async FileReader won't work as BlobBuilder is sync
throw new FileException("NOT_READABLE_ERR");
}
} else if (data instanceof FakeBlob) {
if (data.encoding === "base64" && atob) {
bb.push(atob(data.data));
} else if (data.encoding === "URI") {
bb.push(decodeURIComponent(data.data));
} else if (data.encoding === "raw") {
bb.push(data.data);
}
} else {
if (typeof data !== "string") {
data += ""; // convert unsupported types to strings
}
// decode UTF-16 to binary string
bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob = function(type) {
if (!arguments.length) {
type = null;
}
return new FakeBlob(this.data.join(""), type, "raw");
};
FBB_proto.toString = function() {
return "[object BlobBuilder]";
};
FB_proto.slice = function(start, end, type) {
var args = arguments.length;
if (args < 3) {
type = null;
}
return new FakeBlob(
this.data.slice(start, args > 1 ? end : this.data.length)
, type
, this.encoding
);
};
FB_proto.toString = function() {
return "[object Blob]";
};
return FakeBlobBuilder;
}(view));
return function Blob(blobParts, options) {
var type = options ? (options.type || "") : "";
var builder = new BlobBuilder();
if (blobParts) {
for (var i = 0, len = blobParts.length; i < len; i++) {
builder.append(blobParts[i]);
}
}
return builder.getBlob(type);
};
}(self));
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs=saveAs||(navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator))||(function(h){"use strict";var r=h.document,l=function(){return h.URL||h.webkitURL||h},e=h.URL||h.webkitURL||h,n=r.createElementNS("http://www.w3.org/1999/xhtml","a"),g=!h.externalHost&&"download" in n,j=function(t){var s=r.createEvent("MouseEvents");s.initMouseEvent("click",true,false,h,0,0,0,0,0,false,false,false,false,0,null);t.dispatchEvent(s)},o=h.webkitRequestFileSystem,p=h.requestFileSystem||o||h.mozRequestFileSystem,m=function(s){(h.setImmediate||h.setTimeout)(function(){throw s},0)},c="application/octet-stream",k=0,b=[],i=function(){var t=b.length;while(t--){var s=b[t];if(typeof s==="string"){e.revokeObjectURL(s)}else{s.remove()}}b.length=0},q=function(t,s,w){s=[].concat(s);var v=s.length;while(v--){var x=t["on"+s[v]];if(typeof x==="function"){try{x.call(t,w||t)}catch(u){m(u)}}}},f=function(t,u){var v=this,B=t.type,E=false,x,w,s=function(){var F=l().createObjectURL(t);b.push(F);return F},A=function(){q(v,"writestart progress write writeend".split(" "))},D=function(){if(E||!x){x=s(t)}if(w){w.location.href=x}else{window.open(x,"_blank")}v.readyState=v.DONE;A()},z=function(F){return function(){if(v.readyState!==v.DONE){return F.apply(this,arguments)}}},y={create:true,exclusive:false},C;v.readyState=v.INIT;if(!u){u="download"}if(g){x=s(t);n.href=x;n.download=u;j(n);v.readyState=v.DONE;A();return}if(h.chrome&&B&&B!==c){C=t.slice||t.webkitSlice;t=C.call(t,0,t.size,c);E=true}if(o&&u!=="download"){u+=".download"}if(B===c||o){w=h}if(!p){D();return}k+=t.size;p(h.TEMPORARY,k,z(function(F){F.root.getDirectory("saved",y,z(function(G){var H=function(){G.getFile(u,y,z(function(I){I.createWriter(z(function(J){J.onwriteend=function(K){w.location.href=I.toURL();b.push(I);v.readyState=v.DONE;q(v,"writeend",K)};J.onerror=function(){var K=J.error;if(K.code!==K.ABORT_ERR){D()}};"writestart progress write abort".split(" ").forEach(function(K){J["on"+K]=v["on"+K]});J.write(t);v.abort=function(){J.abort();v.readyState=v.DONE};v.readyState=v.WRITING}),D)}),D)};G.getFile(u,{create:false},z(function(I){I.remove();H()}),z(function(I){if(I.code===I.NOT_FOUND_ERR){H()}else{D()}}))}),D)}),D)},d=f.prototype,a=function(s,t){return new f(s,t)};d.abort=function(){var s=this;s.readyState=s.DONE;q(s,"abort")};d.readyState=d.INIT=0;d.WRITING=1;d.DONE=2;d.error=d.onwritestart=d.onprogress=d.onwrite=d.onabort=d.onerror=d.onwriteend=null;h.addEventListener("unload",i,false);return a}(self));
@@ -1,419 +0,0 @@
/*
Holder - 2.0 - client side image placeholders
(c) 2012-2013 Ivan Malopinsky / http://imsky.co
Provided under the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
Commercial use requires attribution.
*/
var Holder = Holder || {};
(function (app, win) {
var preempted = false,
fallback = false,
canvas = document.createElement('canvas');
//getElementsByClassName polyfill
document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
//getComputedStyle polyfill
window.getComputedStyle||(window.getComputedStyle=function(e,t){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}};
//https://gist.github.com/991057 by Jed Schmidt with modifications
function selector(a){
a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]);
var ret=[]; b!=null&&(b.length?ret=b:b.length==0?ret=b:ret=[b]); return ret;
}
//shallow object property extend
function extend(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];return c}
//hasOwnProperty polyfill
if (!Object.prototype.hasOwnProperty)
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
}
function text_size(width, height, template) {
height = parseInt(height,10);
width = parseInt(width,10);
var bigSide = Math.max(height, width)
var smallSide = Math.min(height, width)
var scale = 1 / 12;
var newHeight = Math.min(smallSide * 0.75, 0.75 * bigSide * scale);
return {
height: Math.round(Math.max(template.size, newHeight))
}
}
function draw(ctx, dimensions, template, ratio) {
var ts = text_size(dimensions.width, dimensions.height, template);
var text_height = ts.height;
var width = dimensions.width * ratio,
height = dimensions.height * ratio;
var font = template.font ? template.font : "sans-serif";
canvas.width = width;
canvas.height = height;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillStyle = template.background;
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = template.foreground;
ctx.font = "bold " + text_height + "px " + font;
var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
var text_width = ctx.measureText(text).width;
if (text_width / width >= 0.75) {
text_height = Math.floor(text_height * 0.75 * (width/text_width));
}
//Resetting font size if necessary
ctx.font = "bold " + (text_height * ratio) + "px " + font;
ctx.fillText(text, (width / 2), (height / 2), width);
return canvas.toDataURL("image/png");
}
function render(mode, el, holder, src) {
var dimensions = holder.dimensions,
theme = holder.theme,
text = holder.text ? decodeURIComponent(holder.text) : holder.text;
var dimensions_caption = dimensions.width + "x" + dimensions.height;
theme = (text ? extend(theme, {
text: text
}) : theme);
theme = (holder.font ? extend(theme, {
font: holder.font
}) : theme);
if (mode == "image") {
el.setAttribute("data-src", src);
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
if (fallback || !holder.auto) {
el.style.width = dimensions.width + "px";
el.style.height = dimensions.height + "px";
}
if (fallback) {
el.style.backgroundColor = theme.background;
} else {
el.setAttribute("src", draw(ctx, dimensions, theme, ratio));
}
} else if (mode == "background") {
if (!fallback) {
el.style.backgroundImage = "url(" + draw(ctx, dimensions, theme, ratio) + ")";
el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px";
}
} else if (mode == "fluid") {
el.setAttribute("data-src", src);
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
if (dimensions.height.substr(-1) == "%") {
el.style.height = dimensions.height
} else {
el.style.height = dimensions.height + "px"
}
if (dimensions.width.substr(-1) == "%") {
el.style.width = dimensions.width
} else {
el.style.width = dimensions.width + "px"
}
if (el.style.display == "inline" || el.style.display == "") {
el.style.display = "block";
}
if (fallback) {
el.style.backgroundColor = theme.background;
} else {
el.holderData = holder;
fluid_images.push(el);
fluid_update(el);
}
}
};
function fluid_update(element) {
var images;
if (element.nodeType == null) {
images = fluid_images;
} else {
images = [element]
}
for (i in images) {
var el = images[i]
if (el.holderData) {
var holder = el.holderData;
el.setAttribute("src", draw(ctx, {
height: el.clientHeight,
width: el.clientWidth
}, holder.theme, ratio));
}
}
}
function parse_flags(flags, options) {
var ret = {
theme: settings.themes.gray
}, render = false;
for (sl = flags.length, j = 0; j < sl; j++) {
var flag = flags[j];
if (app.flags.dimensions.match(flag)) {
render = true;
ret.dimensions = app.flags.dimensions.output(flag);
} else if (app.flags.fluid.match(flag)) {
render = true;
ret.dimensions = app.flags.fluid.output(flag);
ret.fluid = true;
} else if (app.flags.colors.match(flag)) {
ret.theme = app.flags.colors.output(flag);
} else if (options.themes[flag]) {
//If a theme is specified, it will override custom colors
ret.theme = options.themes[flag];
} else if (app.flags.text.match(flag)) {
ret.text = app.flags.text.output(flag);
} else if (app.flags.font.match(flag)) {
ret.font = app.flags.font.output(flag);
} else if (app.flags.auto.match(flag)) {
ret.auto = true;
}
}
return render ? ret : false;
};
if (!canvas.getContext) {
fallback = true;
} else {
if (canvas.toDataURL("image/png")
.indexOf("data:image/png") < 0) {
//Android doesn't support data URI
fallback = true;
} else {
var ctx = canvas.getContext("2d");
}
}
var dpr = 1, bsr = 1;
if(!fallback){
dpr = window.devicePixelRatio || 1,
bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
}
var ratio = dpr / bsr;
var fluid_images = [];
var settings = {
domain: "holder.js",
images: "img",
bgnodes: ".holderjs",
themes: {
"gray": {
background: "#eee",
foreground: "#aaa",
size: 12
},
"social": {
background: "#3a5a97",
foreground: "#fff",
size: 12
},
"industrial": {
background: "#434A52",
foreground: "#C2F200",
size: 12
}
},
stylesheet: ".holderjs-fluid {font-size:16px;font-weight:bold;text-align:center;font-family:sans-serif;margin:0}"
};
app.flags = {
dimensions: {
regex: /^(\d+)x(\d+)$/,
output: function (val) {
var exec = this.regex.exec(val);
return {
width: +exec[1],
height: +exec[2]
}
}
},
fluid: {
regex: /^([0-9%]+)x([0-9%]+)$/,
output: function (val) {
var exec = this.regex.exec(val);
return {
width: exec[1],
height: exec[2]
}
}
},
colors: {
regex: /#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i,
output: function (val) {
var exec = this.regex.exec(val);
return {
size: settings.themes.gray.size,
foreground: "#" + exec[2],
background: "#" + exec[1]
}
}
},
text: {
regex: /text\:(.*)/,
output: function (val) {
return this.regex.exec(val)[1];
}
},
font: {
regex: /font\:(.*)/,
output: function (val) {
return this.regex.exec(val)[1];
}
},
auto: {
regex: /^auto$/
}
}
for (var flag in app.flags) {
if (!app.flags.hasOwnProperty(flag)) continue;
app.flags[flag].match = function (val) {
return val.match(this.regex)
}
}
app.add_theme = function (name, theme) {
name != null && theme != null && (settings.themes[name] = theme);
return app;
};
app.add_image = function (src, el) {
var node = selector(el);
if (node.length) {
for (var i = 0, l = node.length; i < l; i++) {
var img = document.createElement("img")
img.setAttribute("data-src", src);
node[i].appendChild(img);
}
}
return app;
};
app.run = function (o) {
var options = extend(settings, o),
images = [], imageNodes = [], bgnodes = [];
if(typeof(options.images) == "string"){
imageNodes = selector(options.images);
}
else if (window.NodeList && options.images instanceof window.NodeList) {
imageNodes = options.images;
} else if (window.Node && options.images instanceof window.Node) {
imageNodes = [options.images];
}
if(typeof(options.bgnodes) == "string"){
bgnodes = selector(options.bgnodes);
} else if (window.NodeList && options.elements instanceof window.NodeList) {
bgnodes = options.bgnodes;
} else if (window.Node && options.bgnodes instanceof window.Node) {
bgnodes = [options.bgnodes];
}
preempted = true;
for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]);
var holdercss = document.getElementById("holderjs-style");
if (!holdercss) {
holdercss = document.createElement("style");
holdercss.setAttribute("id", "holderjs-style");
holdercss.type = "text/css";
document.getElementsByTagName("head")[0].appendChild(holdercss);
}
if (!options.nocss) {
if (holdercss.styleSheet) {
holdercss.styleSheet.cssText += options.stylesheet;
} else {
holdercss.appendChild(document.createTextNode(options.stylesheet));
}
}
var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)");
for (var l = bgnodes.length, i = 0; i < l; i++) {
var src = window.getComputedStyle(bgnodes[i], null)
.getPropertyValue("background-image");
var flags = src.match(cssregex);
var bgsrc = bgnodes[i].getAttribute("data-background-src");
if (flags) {
var holder = parse_flags(flags[1].split("/"), options);
if (holder) {
render("background", bgnodes[i], holder, src);
}
}
else if(bgsrc != null){
var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1)
.split("/"), options);
if(holder){
render("background", bgnodes[i], holder, src);
}
}
}
for (l = images.length, i = 0; i < l; i++) {
var attr_src = attr_data_src = src = null;
try{
attr_src = images[i].getAttribute("src");
attr_datasrc = images[i].getAttribute("data-src");
}catch(e){}
if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) {
src = attr_src;
} else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) {
src = attr_datasrc;
}
if (src) {
var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1)
.split("/"), options);
if (holder) {
if (holder.fluid) {
render("fluid", images[i], holder, src)
} else {
render("image", images[i], holder, src);
}
}
}
}
return app;
};
contentLoaded(win, function () {
if (window.addEventListener) {
window.addEventListener("resize", fluid_update, false);
window.addEventListener("orientationchange", fluid_update, false);
} else {
window.attachEvent("onresize", fluid_update)
}
preempted || app.run();
});
if (typeof define === "function" && define.amd) {
define("Holder", [], function () {
return app;
});
}
})(Holder, window);
@@ -1,8 +0,0 @@
/*
HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,6 +0,0 @@
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
window.matchMedia=window.matchMedia||function(a){"use strict";var c,d=a.documentElement,e=d.firstElementChild||d.firstChild,f=a.createElement("body"),g=a.createElement("div");return g.id="mq-test-1",g.style.cssText="position:absolute;top:-100em",f.style.background="none",f.appendChild(g),function(a){return g.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document);
/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
(function(a){"use strict";function x(){u(!0)}var b={};a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,b.mediaQueriesSupported;var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var a=m.shift();v(a.href,function(b){p(b,a.href,a.media),h[a.href]=!0,setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(a){var b="clientWidth",h=d[b],k="CSS1Compat"===c.compatMode&&h||c.body[b]||h,m={},n=l[l.length-1],o=(new Date).getTime();if(a&&q&&i>o-q)return clearTimeout(r),r=setTimeout(u,i),void 0;q=o;for(var p in e)if(e.hasOwnProperty(p)){var v=e[p],w=v.minw,x=v.maxw,y=null===w,z=null===x,A="em";w&&(w=parseFloat(w)*(w.indexOf(A)>-1?t||s():1)),x&&(x=parseFloat(x)*(x.indexOf(A)>-1?t||s():1)),v.hasquery&&(y&&z||!(y||k>=w)||!(z||x>=k))||(m[v.media]||(m[v.media]=[]),m[v.media].push(f[v.rules]))}for(var B in g)g.hasOwnProperty(B)&&g[B]&&g[B].parentNode===j&&j.removeChild(g[B]);for(var C in m)if(m.hasOwnProperty(C)){var D=c.createElement("style"),E=m[C].join("\n");D.type="text/css",D.media=C,j.insertBefore(D,n.nextSibling),D.styleSheet?D.styleSheet.cssText=E:D.appendChild(c.createTextNode(E)),g.push(D)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)})(this);
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
/*!
* toc - jQuery Table of Contents Plugin
* v0.1.2
* http://projects.jga.me/toc/
* copyright Greg Allen 2013
* MIT License
*/
(function(t){t.fn.toc=function(e){var n,i=this,r=t.extend({},jQuery.fn.toc.defaults,e),o=t(r.container),a=t(r.selectors,o),l=[],h=r.prefix+"-active",s=function(e){if(r.smoothScrolling){e.preventDefault();var n=t(e.target).attr("href"),o=t(n);t("body,html").animate({scrollTop:o.offset().top},400,"swing",function(){location.hash=n})}t("li",i).removeClass(h),t(e.target).parent().addClass(h)},c=function(){n&&clearTimeout(n),n=setTimeout(function(){for(var e,n=t(window).scrollTop(),o=0,a=l.length;a>o;o++)if(l[o]>=n){t("li",i).removeClass(h),e=t("li:eq("+(o-1)+")",i).addClass(h),r.onHighlight(e);break}},50)};return r.highlightOnScroll&&(t(window).bind("scroll",c),c()),this.each(function(){var e=t(this),n=t("<ul/>");a.each(function(i,o){var a=t(o);l.push(a.offset().top-r.highlightOffset),t("<span/>").attr("id",r.anchorName(i,o,r.prefix)).insertBefore(a);var h=t("<a/>").text(r.headerText(i,o,a)).attr("href","#"+r.anchorName(i,o,r.prefix)).bind("click",function(n){s(n),e.trigger("selected",t(this).attr("href"))}),c=t("<li/>").addClass(r.itemClass(i,o,a,r.prefix)).append(h);n.append(c)}),e.html(n)})},jQuery.fn.toc.defaults={container:"body",selectors:"h1,h2,h3",smoothScrolling:!0,prefix:"toc",onHighlight:function(){},highlightOnScroll:!0,highlightOffset:100,anchorName:function(t,e,n){return n+t},headerText:function(t,e,n){return n.text()},itemClass:function(t,e,n,i){return i+"-"+n[0].tagName.toLowerCase()}}})(jQuery);
-3
View File
@@ -1,3 +0,0 @@
# robotstxt.org/
User-agent: *
+19
View File
@@ -0,0 +1,19 @@
**/README.md
**/pom.xml
**/build.sbt
**/*.gradle
**/.travis.yml
**/.gitignore
**/git_push.sh
**/api/*
**/gradle*
**/gradle
**/src/main/AndroidManifest.xml
# https://issues.apache.org/jira/browse/FINERACT-1231
**/client/*.java
!**/client/CollectionFormats.java
!**/client/StringUtil.java
# https://issues.apache.org/jira/browse/FINERACT-1263
**/services/RunReportsApi.java
+121
View File
@@ -0,0 +1,121 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
description = 'Fineract Client'
apply plugin: 'org.openapi.generator'
apply from: 'dependencies.gradle'
// TODO: @vidakovic we should publish this lib to Maven Central; do in separate PR
openApiMeta {
generatorName = 'Fineract'
packageName = 'org.apache.fineract.client'
outputFolder = "$buildDir/meta".toString()
}
openApiValidate {
inputSpec = "$swaggerFile"
recommend = true
}
task buildJavaSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
generatorName = 'java'
verbose = false
validateSpec = false
skipValidateSpec = true
inputSpec = "$swaggerFile"
outputDir = "$buildDir/generated/java".toString()
groupId = 'org.apache.fineract'
apiPackage = 'org.apache.fineract.client.services'
invokerPackage = 'org.apache.fineract.client'
modelPackage = 'org.apache.fineract.client.models'
configOptions = [
dateLibrary: 'java8',
useRxJava2: 'false',
library: 'retrofit2',
hideGenerationTimestamp: 'true',
]
generateModelTests = false
generateApiTests = false
ignoreFileOverride = "$projectDir/.openapi-generator-ignore"
// trick to make sure fineract.yaml is generated first
dependsOn = [
':fineract-provider:compileJava'
]
finalizedBy = [licenseFormat]
}
task buildTypescriptAngularSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
generatorName = 'typescript-angular'
verbose = false
validateSpec = false
skipValidateSpec = true
inputSpec = "$swaggerFile"
outputDir = "$buildDir/generated/typescript".toString()
apiPackage = 'org.apache.fineract.client.services'
invokerPackage = 'org.apache.fineract.client'
modelPackage = 'org.apache.fineract.client.models'
configOptions = [
apiModulePrefix: 'fineract',
configurationPrefix: 'fineract',
ngVersion: '10.0.0',
npmName: 'apache-fineract-client'
]
finalizedBy = [licenseFormat]
}
// TODO: @vidakovic we could provide even more client libs in different languages (Go, Ruby, Swift etc.)
compileJava.dependsOn buildJavaSdk, spotlessJavaApply, buildTypescriptAngularSdk, spotlessMiscApply
sourceSets {
generated {
java {
srcDir "$buildDir/generated/java/src/main/java"
}
}
}
java {
// keep this at Java 8, not 11; see https://issues.apache.org/jira/browse/FINERACT-1214
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
compileJava {
source += sourceSets.generated.java
}
tasks.withType(JavaCompile) {
// the generated code in build/generated/java/src/main/java/org/apache/fineract/client/auth/OAuthOkHttpClient.java#L71 currently uses deprecated RequestBody.create(MediaType,String)
// TODO FINERACT-1247 why does this not work:
// options.compilerArgs -= ["-Xlint:deprecation"]
// options.compilerArgs += ["-Xlint:-deprecation"]
// So we just have to use:
options.compilerArgs -= ["-Werror"]
}
configurations {
generatedCompile.extendsFrom implementation
generatedRuntime.extendsFrom runtime
}
test {
useJUnitPlatform()
}
+46
View File
@@ -0,0 +1,46 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
dependencies {
// project(':fineract-provider')
implementation(
'io.swagger:swagger-annotations',
'com.squareup.retrofit2:retrofit',
'com.squareup.retrofit2:adapter-java8',
'com.squareup.retrofit2:adapter-rxjava2', // TODO https://github.com/OpenAPITools/openapi-generator/issues/7758
'com.squareup.retrofit2:converter-scalars',
'com.squareup.retrofit2:converter-gson',
'io.gsonfire:gson-fire',
'com.google.code.findbugs:jsr305',
'com.squareup.okhttp3:logging-interceptor',
)
// org.apache.oltu.oauth2 is used in org.apache.fineract.client.auth.OAuthOkHttpClient (only; can be excluded by consumers not requiring OAuth)
implementation('org.apache.oltu.oauth2:org.apache.oltu.oauth2.client') {
exclude group: 'org.apache.oltu.oauth2', module: 'org.apache.oltu.oauth2.common'
exclude group: 'org.slf4j'
}
testImplementation(
'org.junit.jupiter:junit-jupiter-api:5.7.0',
'com.google.truth:truth:1.1.1',
'com.google.truth.extensions:truth-java8-extension:1.1.1'
)
testRuntimeOnly(
'org.junit.jupiter:junit-jupiter-engine:5.7.0'
)
}
@@ -0,0 +1,147 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.services;
import java.util.List;
import okhttp3.ResponseBody;
import org.apache.fineract.client.models.DeleteEntityTypeEntityIdDocumentsResponse;
import org.apache.fineract.client.models.GetEntityTypeEntityIdDocumentsResponse;
import org.apache.fineract.client.models.PostEntityTypeEntityIdDocumentsResponse;
import org.apache.fineract.client.models.PutEntityTypeEntityIdDocumentsResponse;
import retrofit2.Call;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
// This class was originally generated by OpenAPI Generator (https://openapi-generator.tech),
// but then had to be manually edited by Michael Vorburger.ch to manually fix https://issues.apache.org/jira/browse/FINERACT-1227.
// If we could fix our OpenAPI / Swagger YAML generation from the JAX RS and OpenAPI annotation to have the correct notation for binary document files and images, then this could be removed again.
public interface DocumentsApiFixed {
/**
* Create a Document Note: A document is created using a Multi-part form upload Body Parts name : Name or summary of
* the document description : Description of the document file : The file to be uploaded Mandatory Fields : file and
* description
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @param file
* (required)
* @param name
* name (optional)
* @param description
* description (optional)
* @return Call&lt;PostEntityTypeEntityIdDocumentsResponse&gt;
*/
@retrofit2.http.Multipart
@POST("{entityType}/{entityId}/documents")
Call<PostEntityTypeEntityIdDocumentsResponse> createDocument(@retrofit2.http.Path("entityType") String entityType,
@retrofit2.http.Path("entityId") Long entityId, @retrofit2.http.Part okhttp3.MultipartBody.Part file,
@retrofit2.http.Part("name") String name, @retrofit2.http.Part("description") String description);
/**
* Remove a Document
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @param documentId
* documentId (required)
* @return Call&lt;DeleteEntityTypeEntityIdDocumentsResponse&gt;
*/
@DELETE("{entityType}/{entityId}/documents/{documentId}")
Call<DeleteEntityTypeEntityIdDocumentsResponse> deleteDocument(@retrofit2.http.Path("entityType") String entityType,
@retrofit2.http.Path("entityId") Long entityId, @retrofit2.http.Path("documentId") Long documentId);
/**
* Retrieve Binary File associated with Document Request used to download the file associated with the document
* Example Requests: clients/1/documents/1/attachment loans/1/documents/1/attachment
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @param documentId
* documentId (required)
* @return Call&lt;Void&gt;
*/
@GET("{entityType}/{entityId}/documents/{documentId}/attachment")
Call<ResponseBody> downloadFile(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Path("documentId") Long documentId);
/**
* Retrieve a Document Example Requests: clients/1/documents/1 loans/1/documents/1
* client_identifiers/1/documents/1?fields&#x3D;name,description
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @param documentId
* documentId (required)
* @return Call&lt;GetEntityTypeEntityIdDocumentsResponse&gt;
*/
@GET("{entityType}/{entityId}/documents/{documentId}")
Call<GetEntityTypeEntityIdDocumentsResponse> getDocument(@retrofit2.http.Path("entityType") String entityType,
@retrofit2.http.Path("entityId") Long entityId, @retrofit2.http.Path("documentId") Long documentId);
/**
* List documents Example Requests: clients/1/documents client_identifiers/1/documents
* loans/1/documents?fields&#x3D;name,description
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @return Call&lt;List&lt;GetEntityTypeEntityIdDocumentsResponse&gt;&gt;
*/
@GET("{entityType}/{entityId}/documents")
Call<List<GetEntityTypeEntityIdDocumentsResponse>> retrieveAllDocuments(@retrofit2.http.Path("entityType") String entityType,
@retrofit2.http.Path("entityId") Long entityId);
/**
* Update a Document Note: A document is updated using a Multi-part form upload Body Parts name Name or summary of
* the document description Description of the document file The file to be uploaded
*
* @param entityType
* entityType (required)
* @param entityId
* entityId (required)
* @param documentId
* documentId (required)
* @param file
* (optional)
* @param name
* name (optional)
* @param description
* description (optional)
* @return Call&lt;PutEntityTypeEntityIdDocumentsResponse&gt;
*/
@retrofit2.http.Multipart
@PUT("{entityType}/{entityId}/documents/{documentId}")
Call<PutEntityTypeEntityIdDocumentsResponse> updateDocument(@retrofit2.http.Path("entityType") String entityType,
@retrofit2.http.Path("entityId") Long entityId, @retrofit2.http.Path("documentId") Long documentId,
@retrofit2.http.Part okhttp3.MultipartBody.Part file, @retrofit2.http.Part("name") String name,
@retrofit2.http.Part("description") String description);
}
@@ -0,0 +1,56 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.services;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
/**
* Client API (Retrofit) for /images.
*
* This class entirely hand-written, inspired by DocumentsApiFixed, and from /images methods which currently end up in
* DefaultApi (see <a href="https://issues.apache.org/jira/browse/FINERACT-1222">FINERACT-1222</a>), but fixed for bugs
* in the code generation (see <a href="https://issues.apache.org/jira/browse/FINERACT-1227">FINERACT-1227</a>).
*
* @author Michael Vorburger.ch
*/
public interface ImagesApi {
@POST("{entityType}/{entityId}/images")
@retrofit2.http.Multipart
Call<Void> create(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Part okhttp3.MultipartBody.Part file);
@GET("{entityType}/{entityId}/images")
Call<ResponseBody> get(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Query("maxWidth") Integer maxWidth, @retrofit2.http.Query("maxHeight") Integer maxHeight,
@retrofit2.http.Query("output") String output);
@PUT("{entityType}/{entityId}/images")
@retrofit2.http.Multipart
Call<Void> update(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Part okhttp3.MultipartBody.Part file);
@DELETE("{entityType}/{entityId}/images")
Call<Void> delete(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId);
}
@@ -0,0 +1,65 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.services;
import java.util.Map;
import okhttp3.ResponseBody;
import org.apache.fineract.client.models.RunReportsResponse;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.QueryMap;
// https://issues.apache.org/jira/browse/FINERACT-1263
public interface RunReportsApi {
/**
* Running a Report This resource allows you to run and receive output from pre-defined Apache Fineract reports.
* Reports can also be used to provide data for searching and workflow functionality. The default output is a JSON
* formatted \&quot;Generic Resultset\&quot;. The Generic Resultset contains Column Heading as well as Data
* information. However, you can export to CSV format by simply adding \&quot;&amp;exportCSV&#x3D;true\&quot; to the
* end of your URL. If Pentaho reports have been pre-defined, they can also be run through this resource. Pentaho
* reports can return HTML, PDF or CSV formats. The Apache Fineract reference application uses a JQuery plugin
* called stretchy reporting which, itself, uses this reports resource to provide a pretty flexible reporting User
* Interface (UI). Example Requests: runreports/Client%20Listing?R_officeId&#x3D;1
* runreports/Client%20Listing?R_officeId&#x3D;1&amp;exportCSV&#x3D;true
* runreports/OfficeIdSelectOne?R_officeId&#x3D;1&amp;parameterType&#x3D;true
* runreports/OfficeIdSelectOne?R_officeId&#x3D;1&amp;parameterType&#x3D;true&amp;exportCSV&#x3D;true
* runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate&#x3D;2013-04-30&amp;R_loanOfficerId&#x3D;-1&amp;R_officeId&#x3D;1&amp;R_startDate&#x3D;2013-04-16&amp;output-type&#x3D;HTML&amp;R_officeId&#x3D;1
* runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate&#x3D;2013-04-30&amp;R_loanOfficerId&#x3D;-1&amp;R_officeId&#x3D;1&amp;R_startDate&#x3D;2013-04-16&amp;output-type&#x3D;XLS&amp;R_officeId&#x3D;1
* runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate&#x3D;2013-04-30&amp;R_loanOfficerId&#x3D;-1&amp;R_officeId&#x3D;1&amp;R_startDate&#x3D;2013-04-16&amp;output-type&#x3D;CSV&amp;R_officeId&#x3D;1
* runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate&#x3D;2013-04-30&amp;R_loanOfficerId&#x3D;-1&amp;R_officeId&#x3D;1&amp;R_startDate&#x3D;2013-04-16&amp;output-type&#x3D;PDF&amp;R_officeId&#x3D;1
*
* @param reportName
* reportName (required)
* @param isSelfServiceUserReport
* isSelfServiceUserReport (optional, default to false)
* @return Call&lt;GetReportNameResponse&gt;
*/
@GET("runreports/{reportName}")
Call<RunReportsResponse> runReportGetData(@retrofit2.http.Path("reportName") String reportName,
@QueryMap Map<String, String> parameters, @retrofit2.http.Query("isSelfServiceUserReport") Boolean isSelfServiceUserReport);
/**
* Run Report which returns a response such as a PDF, CSV, XLS or XSLX file.
*/
@GET("runreports/{reportName}")
Call<ResponseBody> runReportGetFile(@retrofit2.http.Path("reportName") String reportName, @QueryMap Map<String, String> parameters,
@retrofit2.http.Query("isSelfServiceUserReport") Boolean isSelfServiceUserReport);
}
@@ -0,0 +1,73 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.util;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Response;
/**
* Exception thrown by {@link Calls} utility when {@link Call}s fail.
*
* @author Michael Vorburger.ch
*/
public class CallFailedRuntimeException extends RuntimeException {
private final Call<?> call;
private final Response<?> response;
public <T> CallFailedRuntimeException(Call<T> call, Throwable t) {
super("HTTP failed: " + call.request().toString(), t);
this.call = call;
this.response = null;
}
public <T> CallFailedRuntimeException(Call<T> call, Response<T> response) {
super(message(call, response));
this.call = call;
this.response = response;
}
private static String message(Call<?> call, Response<?> response) {
StringBuilder sb = new StringBuilder("HTTP failed: " + call.request() + "; " + response);
if (response.message() != null && !response.message().isEmpty()) {
sb.append("; message: " + response.message());
}
String errorBody;
try {
errorBody = response.errorBody().string();
if (errorBody != null) {
sb.append("; errorBody: " + errorBody);
}
} catch (IOException e) {
// Ignore.
}
return sb.toString();
}
@SuppressWarnings("unchecked")
public <T> Call<T> getCall() {
return (Call<T>) call;
}
@SuppressWarnings("unchecked")
public <T> Response<T> getResponse() {
return (Response<T>) response;
}
}
@@ -0,0 +1,85 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.util;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Response;
/**
* Extension methods for {@link Call}. This class is recommended to be statically imported.
*
* @author Michael Vorburger.ch
*/
public final class Calls {
private Calls() {}
/**
* Execute a Call, expecting success, returning strongly typed body. This covers the most typical use and is thus
* most used.
*
* @param call
* the Call to execute
* @return the body of the successful call (never null)
* @throws CallFailedRuntimeException
* thrown either if a problem occurred talking to the server, or the HTTP response code was not
* [200..300) successful
*/
public static <T> T ok(Call<T> call) throws CallFailedRuntimeException {
return okR(call).body();
}
/**
* Execute a Call, expecting success, returning Response. This is rarely used, and only useful if you need access to
* e.g. the headers of the response.
*
* @param call
* the Call to execute
* @return the Response of the successful call (never null)
* @throws CallFailedRuntimeException
* thrown either if a problem occurred talking to the server, or the HTTP response code was not
* [200..300) successful
*/
public static <T> Response<T> okR(Call<T> call) throws CallFailedRuntimeException {
Response<T> response = executeU(call);
if (response.isSuccessful()) {
return response;
}
throw new CallFailedRuntimeException(call, response);
}
/**
* {@link Call#execute()} mapping {@link IOException} to {@link CallFailedRuntimeException}. This can be useful for
* code which would like to handle non-success HTTP responses, notably tests asserting non-200 results.
*
* @param call
* the Call to execute
* @return the Response, which may or may not have been successful.
* @throws CallFailedRuntimeException
* thrown if a problem occurred talking to the server
*/
public static <T> Response<T> executeU(Call<T> call) throws CallFailedRuntimeException {
try {
return call.execute();
} catch (IOException e) {
throw new CallFailedRuntimeException(call, e);
}
}
}
@@ -0,0 +1,515 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.util;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import org.apache.fineract.client.auth.ApiKeyAuth;
import org.apache.fineract.client.auth.HttpBasicAuth;
import org.apache.fineract.client.services.AccountNumberFormatApi;
import org.apache.fineract.client.services.AccountTransfersApi;
import org.apache.fineract.client.services.AccountingClosureApi;
import org.apache.fineract.client.services.AccountingRulesApi;
import org.apache.fineract.client.services.AdhocQueryApiApi;
import org.apache.fineract.client.services.AuditsApi;
import org.apache.fineract.client.services.AuthenticationHttpBasicApi;
import org.apache.fineract.client.services.BatchApiApi;
import org.apache.fineract.client.services.CacheApi;
import org.apache.fineract.client.services.CashierJournalsApi;
import org.apache.fineract.client.services.CashiersApi;
import org.apache.fineract.client.services.CentersApi;
import org.apache.fineract.client.services.ChargesApi;
import org.apache.fineract.client.services.ClientApi;
import org.apache.fineract.client.services.ClientChargesApi;
import org.apache.fineract.client.services.ClientIdentifierApi;
import org.apache.fineract.client.services.ClientTransactionApi;
import org.apache.fineract.client.services.ClientsAddressApi;
import org.apache.fineract.client.services.CodeValuesApi;
import org.apache.fineract.client.services.CodesApi;
import org.apache.fineract.client.services.CurrencyApi;
import org.apache.fineract.client.services.DataTablesApi;
import org.apache.fineract.client.services.DefaultApi;
import org.apache.fineract.client.services.DocumentsApiFixed;
import org.apache.fineract.client.services.EntityDataTableApi;
import org.apache.fineract.client.services.EntityFieldConfigurationApi;
import org.apache.fineract.client.services.ExternalServicesApi;
import org.apache.fineract.client.services.FetchAuthenticatedUserDetailsApi;
import org.apache.fineract.client.services.FixedDepositAccountApi;
import org.apache.fineract.client.services.FixedDepositProductApi;
import org.apache.fineract.client.services.FloatingRatesApi;
import org.apache.fineract.client.services.GeneralLedgerAccountApi;
import org.apache.fineract.client.services.GlobalConfigurationApi;
import org.apache.fineract.client.services.GroupsApi;
import org.apache.fineract.client.services.HolidaysApi;
import org.apache.fineract.client.services.HooksApi;
import org.apache.fineract.client.services.ImagesApi;
import org.apache.fineract.client.services.InterestRateChartApi;
import org.apache.fineract.client.services.InterestRateSlabAKAInterestBandsApi;
import org.apache.fineract.client.services.JournalEntriesApi;
import org.apache.fineract.client.services.ListReportMailingJobHistoryApi;
import org.apache.fineract.client.services.LoanChargesApi;
import org.apache.fineract.client.services.LoanCollateralApi;
import org.apache.fineract.client.services.LoanProductsApi;
import org.apache.fineract.client.services.LoanReschedulingApi;
import org.apache.fineract.client.services.LoanTransactionsApi;
import org.apache.fineract.client.services.LoansApi;
import org.apache.fineract.client.services.MakerCheckerOr4EyeFunctionalityApi;
import org.apache.fineract.client.services.MappingFinancialActivitiesToAccountsApi;
import org.apache.fineract.client.services.MifosxBatchJobsApi;
import org.apache.fineract.client.services.MixMappingApi;
import org.apache.fineract.client.services.MixReportApi;
import org.apache.fineract.client.services.MixTaxonomyApi;
import org.apache.fineract.client.services.NotesApi;
import org.apache.fineract.client.services.NotificationApi;
import org.apache.fineract.client.services.OfficesApi;
import org.apache.fineract.client.services.PasswordPreferencesApi;
import org.apache.fineract.client.services.PaymentTypeApi;
import org.apache.fineract.client.services.PeriodicAccrualAccountingApi;
import org.apache.fineract.client.services.PermissionsApi;
import org.apache.fineract.client.services.PocketApi;
import org.apache.fineract.client.services.ProvisioningCategoryApi;
import org.apache.fineract.client.services.ProvisioningCriteriaApi;
import org.apache.fineract.client.services.ProvisioningEntriesApi;
import org.apache.fineract.client.services.RecurringDepositAccountApi;
import org.apache.fineract.client.services.RecurringDepositAccountTransactionsApi;
import org.apache.fineract.client.services.RecurringDepositProductApi;
import org.apache.fineract.client.services.ReportMailingJobsApi;
import org.apache.fineract.client.services.ReportsApi;
import org.apache.fineract.client.services.RolesApi;
import org.apache.fineract.client.services.RunReportsApi;
import org.apache.fineract.client.services.SavingsAccountApi;
import org.apache.fineract.client.services.SavingsChargesApi;
import org.apache.fineract.client.services.SavingsProductApi;
import org.apache.fineract.client.services.SchedulerApi;
import org.apache.fineract.client.services.ScoreCardApi;
import org.apache.fineract.client.services.SearchApiApi;
import org.apache.fineract.client.services.SelfAccountTransferApi;
import org.apache.fineract.client.services.SelfAuthenticationApi;
import org.apache.fineract.client.services.SelfClientApi;
import org.apache.fineract.client.services.SelfDividendApi;
import org.apache.fineract.client.services.SelfLoanProductsApi;
import org.apache.fineract.client.services.SelfLoansApi;
import org.apache.fineract.client.services.SelfRunReportApi;
import org.apache.fineract.client.services.SelfSavingsAccountApi;
import org.apache.fineract.client.services.SelfScoreCardApi;
import org.apache.fineract.client.services.SelfServiceRegistrationApi;
import org.apache.fineract.client.services.SelfShareAccountsApi;
import org.apache.fineract.client.services.SelfSpmApi;
import org.apache.fineract.client.services.SelfThirdPartyTransferApi;
import org.apache.fineract.client.services.SelfUserApi;
import org.apache.fineract.client.services.SelfUserDetailsApi;
import org.apache.fineract.client.services.ShareAccountApi;
import org.apache.fineract.client.services.SpmApiLookUpTableApi;
import org.apache.fineract.client.services.SpmSurveysApi;
import org.apache.fineract.client.services.StaffApi;
import org.apache.fineract.client.services.StandingInstructionsApi;
import org.apache.fineract.client.services.StandingInstructionsHistoryApi;
import org.apache.fineract.client.services.TaxComponentsApi;
import org.apache.fineract.client.services.TaxGroupApi;
import org.apache.fineract.client.services.TellerCashManagementApi;
import org.apache.fineract.client.services.UserGeneratedDocumentsApi;
import org.apache.fineract.client.services.UsersApi;
import org.apache.fineract.client.services.WorkingDaysApi;
import org.apache.fineract.client.util.JSON.GsonCustomConverterFactory;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
/**
* Fineract Client Java SDK API entry point. Use this instead of the {@link ApiClient}.
*
* @author Michael Vorburger.ch
*/
public final class FineractClient {
/**
* Constant to be used in requests where Fineract's API requires a dateFormat to be given. This matches the format
* in which LocalDate instances are serialized. (BTW: In a Java client API, it seems weird to have strong LocalDate
* (not String) instances, and then have to specify its format, see
* https://issues.apache.org/jira/browse/FINERACT-1233.)
*/
// Matching org.apache.fineract.client.util.JSON.LocalDateTypeAdapter.formatter
public static final String DATE_FORMAT = "yyyy-MM-dd";
private final Retrofit retrofit;
public final AccountingClosureApi glClosures;
public final AccountingRulesApi accountingRules;
public final AccountNumberFormatApi accountNumberFormats;
public final AccountTransfersApi accountTransfers;
public final AdhocQueryApiApi adhocQuery;
public final AuditsApi audits;
public final AuthenticationHttpBasicApi authentication;
public final BatchApiApi batches;
public final CacheApi caches;
public final CashierJournalsApi cashiersJournal;
public final CashiersApi cashiers;
public final CentersApi centers;
public final ChargesApi charges;
public final ClientApi clients;
public final ClientChargesApi clientCharges;
public final ClientIdentifierApi clientIdentifiers;
public final ClientsAddressApi clientAddresses;
public final ClientTransactionApi clientTransactions;
public final CodesApi codes;
public final CodeValuesApi codeValues;
public final CurrencyApi currencies;
public final DataTablesApi dataTables;
public final @Deprecated DefaultApi legacy; // TODO FINERACT-1222
public final DocumentsApiFixed documents;
public final EntityDataTableApi entityDatatableChecks;
public final EntityFieldConfigurationApi entityFieldConfigurations;
public final ExternalServicesApi externalServices;
public final FetchAuthenticatedUserDetailsApi userDetails;
public final FixedDepositAccountApi fixedDepositAccounts;
public final FixedDepositProductApi fixedDepositProducts;
public final FloatingRatesApi floatingRates;
public final GeneralLedgerAccountApi glAccounts;
public final GlobalConfigurationApi globalConfigurations;
public final GroupsApi groups;
public final HolidaysApi holidays;
public final HooksApi hooks;
public final ImagesApi images;
public final InterestRateChartApi interestRateCharts;
public final InterestRateSlabAKAInterestBandsApi interestRateChartLabs;
public final JournalEntriesApi journalEntries;
public final ListReportMailingJobHistoryApi reportMailings;
public final LoanChargesApi loanCharges;
public final LoanCollateralApi loanCollaterals;
public final LoanProductsApi loanProducts;
public final LoanReschedulingApi loanSchedules;
public final LoansApi loans;
public final LoanTransactionsApi loanTransactions;
public final MakerCheckerOr4EyeFunctionalityApi makerCheckers;
public final MappingFinancialActivitiesToAccountsApi financialActivyAccountMappings;
public final MifosxBatchJobsApi jobs;
public final MixMappingApi mixMappings;
public final MixReportApi mixReports;
public final MixTaxonomyApi mixTaxonomies;
public final NotesApi notes;
public final NotificationApi notifications;
public final OfficesApi offices;
public final PasswordPreferencesApi passwordPreferences;
public final PaymentTypeApi paymentTypes;
public final PeriodicAccrualAccountingApi periodicAccrualAccounting;
public final PermissionsApi permissions;
public final PocketApi selfPockets;
public final ProvisioningCategoryApi provisioningCategories;
public final ProvisioningCriteriaApi provisioningCriterias;
public final ProvisioningEntriesApi provisioningEntries;
public final RecurringDepositAccountApi recurringDepositAccounts;
public final RecurringDepositAccountTransactionsApi recurringDepositAccountTransactions;
public final RecurringDepositProductApi recurringDepositProducts;
public final ReportMailingJobsApi reportMailingJobs;
public final ReportsApi reports;
public final RolesApi roles;
public final RunReportsApi reportsRun;
public final SavingsAccountApi savingsAccounts;
public final SavingsChargesApi savingsAccountCharges;
public final SavingsProductApi savingsProducts;
public final SchedulerApi jobsScheduler;
public final ScoreCardApi surveyScorecards;
public final SearchApiApi search;
public final SelfAccountTransferApi selfAccountTransfers;
public final SelfAuthenticationApi selfAuthentication;
public final SelfClientApi selfClients;
public final SelfDividendApi selfShareProducts;
public final SelfLoanProductsApi selfLoanProducts;
public final SelfLoansApi selfLoans;
public final SelfRunReportApi selfReportsRun;
public final SelfSavingsAccountApi selfSavingsAccounts;
public final SelfScoreCardApi selfSurveyScorecards;
public final SelfServiceRegistrationApi selfRegistration;
public final SelfShareAccountsApi selfShareAccounts;
public final SelfSpmApi selfSurveys;
public final SelfThirdPartyTransferApi selfThirdPartyBeneficiaries;
public final SelfUserApi selfUser;
public final SelfUserDetailsApi selfUserDetails;
public final ShareAccountApi shareAccounts;
public final SpmApiLookUpTableApi surveyLookupTables;
public final SpmSurveysApi surveys;
public final StaffApi staff;
public final StandingInstructionsApi standingInstructions;
public final StandingInstructionsHistoryApi standingInstructionsHistory;
public final TaxComponentsApi taxComponents;
public final TaxGroupApi taxGroups;
public final TellerCashManagementApi tellers;
public final UserGeneratedDocumentsApi templates;
public final UsersApi users;
public final WorkingDaysApi workingDays;
private FineractClient(Retrofit retrofit) {
this.retrofit = retrofit;
glClosures = retrofit.create(AccountingClosureApi.class);
accountingRules = retrofit.create(AccountingRulesApi.class);
accountNumberFormats = retrofit.create(AccountNumberFormatApi.class);
accountTransfers = retrofit.create(AccountTransfersApi.class);
adhocQuery = retrofit.create(AdhocQueryApiApi.class);
audits = retrofit.create(AuditsApi.class);
authentication = retrofit.create(AuthenticationHttpBasicApi.class);
batches = retrofit.create(BatchApiApi.class);
caches = retrofit.create(CacheApi.class);
cashiersJournal = retrofit.create(CashierJournalsApi.class);
cashiers = retrofit.create(CashiersApi.class);
centers = retrofit.create(CentersApi.class);
charges = retrofit.create(ChargesApi.class);
clients = retrofit.create(ClientApi.class);
clientCharges = retrofit.create(ClientChargesApi.class);
clientIdentifiers = retrofit.create(ClientIdentifierApi.class);
clientAddresses = retrofit.create(ClientsAddressApi.class);
clientTransactions = retrofit.create(ClientTransactionApi.class);
codes = retrofit.create(CodesApi.class);
codeValues = retrofit.create(CodeValuesApi.class);
currencies = retrofit.create(CurrencyApi.class);
dataTables = retrofit.create(DataTablesApi.class);
legacy = retrofit.create(DefaultApi.class);
documents = retrofit.create(DocumentsApiFixed.class);
entityDatatableChecks = retrofit.create(EntityDataTableApi.class);
entityFieldConfigurations = retrofit.create(EntityFieldConfigurationApi.class);
externalServices = retrofit.create(ExternalServicesApi.class);
userDetails = retrofit.create(FetchAuthenticatedUserDetailsApi.class);
fixedDepositAccounts = retrofit.create(FixedDepositAccountApi.class);
fixedDepositProducts = retrofit.create(FixedDepositProductApi.class);
floatingRates = retrofit.create(FloatingRatesApi.class);
glAccounts = retrofit.create(GeneralLedgerAccountApi.class);
globalConfigurations = retrofit.create(GlobalConfigurationApi.class);
groups = retrofit.create(GroupsApi.class);
holidays = retrofit.create(HolidaysApi.class);
hooks = retrofit.create(HooksApi.class);
images = retrofit.create(ImagesApi.class);
interestRateCharts = retrofit.create(InterestRateChartApi.class);
interestRateChartLabs = retrofit.create(InterestRateSlabAKAInterestBandsApi.class);
journalEntries = retrofit.create(JournalEntriesApi.class);
reportMailings = retrofit.create(ListReportMailingJobHistoryApi.class);
loanCharges = retrofit.create(LoanChargesApi.class);
loanCollaterals = retrofit.create(LoanCollateralApi.class);
loanProducts = retrofit.create(LoanProductsApi.class);
loanSchedules = retrofit.create(LoanReschedulingApi.class);
loans = retrofit.create(LoansApi.class);
loanTransactions = retrofit.create(LoanTransactionsApi.class);
makerCheckers = retrofit.create(MakerCheckerOr4EyeFunctionalityApi.class);
financialActivyAccountMappings = retrofit.create(MappingFinancialActivitiesToAccountsApi.class);
jobs = retrofit.create(MifosxBatchJobsApi.class);
mixMappings = retrofit.create(MixMappingApi.class);
mixReports = retrofit.create(MixReportApi.class);
mixTaxonomies = retrofit.create(MixTaxonomyApi.class);
notes = retrofit.create(NotesApi.class);
notifications = retrofit.create(NotificationApi.class);
offices = retrofit.create(OfficesApi.class);
passwordPreferences = retrofit.create(PasswordPreferencesApi.class);
paymentTypes = retrofit.create(PaymentTypeApi.class);
periodicAccrualAccounting = retrofit.create(PeriodicAccrualAccountingApi.class);
permissions = retrofit.create(PermissionsApi.class);
selfPockets = retrofit.create(PocketApi.class);
provisioningCategories = retrofit.create(ProvisioningCategoryApi.class);
provisioningCriterias = retrofit.create(ProvisioningCriteriaApi.class);
provisioningEntries = retrofit.create(ProvisioningEntriesApi.class);
recurringDepositAccounts = retrofit.create(RecurringDepositAccountApi.class);
recurringDepositAccountTransactions = retrofit.create(RecurringDepositAccountTransactionsApi.class);
recurringDepositProducts = retrofit.create(RecurringDepositProductApi.class);
reportMailingJobs = retrofit.create(ReportMailingJobsApi.class);
reports = retrofit.create(ReportsApi.class);
roles = retrofit.create(RolesApi.class);
reportsRun = retrofit.create(RunReportsApi.class);
savingsAccounts = retrofit.create(SavingsAccountApi.class);
savingsAccountCharges = retrofit.create(SavingsChargesApi.class);
savingsProducts = retrofit.create(SavingsProductApi.class);
jobsScheduler = retrofit.create(SchedulerApi.class);
surveyScorecards = retrofit.create(ScoreCardApi.class);
search = retrofit.create(SearchApiApi.class);
selfAccountTransfers = retrofit.create(SelfAccountTransferApi.class);
selfAuthentication = retrofit.create(SelfAuthenticationApi.class);
selfClients = retrofit.create(SelfClientApi.class);
selfShareProducts = retrofit.create(SelfDividendApi.class);
selfLoanProducts = retrofit.create(SelfLoanProductsApi.class);
selfLoans = retrofit.create(SelfLoansApi.class);
selfReportsRun = retrofit.create(SelfRunReportApi.class);
selfSavingsAccounts = retrofit.create(SelfSavingsAccountApi.class);
selfSurveyScorecards = retrofit.create(SelfScoreCardApi.class);
selfRegistration = retrofit.create(SelfServiceRegistrationApi.class);
selfShareAccounts = retrofit.create(SelfShareAccountsApi.class);
selfSurveys = retrofit.create(SelfSpmApi.class);
selfThirdPartyBeneficiaries = retrofit.create(SelfThirdPartyTransferApi.class);
selfUser = retrofit.create(SelfUserApi.class);
selfUserDetails = retrofit.create(SelfUserDetailsApi.class);
shareAccounts = retrofit.create(ShareAccountApi.class);
surveyLookupTables = retrofit.create(SpmApiLookUpTableApi.class);
surveys = retrofit.create(SpmSurveysApi.class);
staff = retrofit.create(StaffApi.class);
standingInstructions = retrofit.create(StandingInstructionsApi.class);
standingInstructionsHistory = retrofit.create(StandingInstructionsHistoryApi.class);
taxComponents = retrofit.create(TaxComponentsApi.class);
taxGroups = retrofit.create(TaxGroupApi.class);
tellers = retrofit.create(TellerCashManagementApi.class);
templates = retrofit.create(UserGeneratedDocumentsApi.class);
users = retrofit.create(UsersApi.class);
workingDays = retrofit.create(WorkingDaysApi.class);
}
public static Builder builder() {
return new Builder();
}
/**
* Create an implementation of the API endpoints defined by the {@code service} interface, using
* {@link Retrofit#create(Class)}. This method is typically not required to be invoked for standard API usage, but
* can be a handy back door for non-trivial advanced customizations of the API client if you have extended Fineract
* with your own REST APIs.
*/
public <S> S createService(Class<S> serviceClass) {
return retrofit.create(serviceClass);
}
public static final class Builder {
private final JSON json = new JSON();
private final OkHttpClient.Builder okBuilder = new OkHttpClient.Builder();
private final Retrofit.Builder retrofitBuilder = new Retrofit.Builder().addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonCustomConverterFactory.create(json.getGson()));
private String baseURL;
private String tenant;
private String username;
private String password;
private Builder() {}
public Builder baseURL(String baseURL) {
this.baseURL = baseURL;
return this;
}
public Builder tenant(String tenant) {
this.tenant = tenant;
return this;
}
public Builder basicAuth(String username, String password) {
this.username = username;
this.password = password;
return this;
}
public Builder logging(Level level) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(level);
okBuilder.addInterceptor(logging);
return this;
}
/**
* Skip Fineract API host SSL certificate verification. DO NOT USE THIS when invoking a production server's API!
* This is intended for https://localhost:8443/ testing of development servers with self-signed certificates,
* only. If you do not understand what this is, do not use it. You WILL cause a security issue in your
* application due to the possibility of a "man in the middle" attack when this is enabled.
*/
@SuppressWarnings("unused")
public Builder insecure(boolean insecure) {
// Nota bene: Similar code to this is also in Fineract Provider's
// org.apache.fineract.infrastructure.hooks.processor.ProcessorHelper
if (insecure) {
HostnameVerifier insecureHostnameVerifier = (hostname, session) -> true;
okBuilder.hostnameVerifier(insecureHostnameVerifier);
try {
X509TrustManager insecureX509TrustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
};
// TODO "SSL" or "TLS" as in hooks.processor.ProcessorHelper?
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[] { insecureX509TrustManager }, new SecureRandom());
SSLSocketFactory insecureSslSocketFactory = sslContext.getSocketFactory();
okBuilder.sslSocketFactory(insecureSslSocketFactory, insecureX509TrustManager);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
throw new IllegalStateException("insecure() SSL configuration failed", e);
}
}
return this;
}
public FineractClient build() {
// URL
retrofitBuilder.baseUrl(has("baseURL", baseURL));
// Tenant
ApiKeyAuth tenantAuth = new ApiKeyAuth("header", "fineract-platform-tenantid");
tenantAuth.setApiKey(has("tenant", tenant));
okBuilder.addInterceptor(tenantAuth);
// BASIC Auth
HttpBasicAuth basicAuth = new HttpBasicAuth();
basicAuth.setCredentials(has("username", username), has("password", password));
okBuilder.addInterceptor(basicAuth);
retrofitBuilder.client(okBuilder.build());
return new FineractClient(retrofitBuilder.build());
}
/**
* Obtain the internal Retrofit Builder. This method is typically not required to be invoked for simple API
* usages, but can be a handy back door for non-trivial advanced customizations of the API client.
*
* @return the {@link ApiClient} which {@link #build()} will use.
*/
public retrofit2.Retrofit.Builder getRetrofitBuilder() {
return retrofitBuilder;
}
/**
* Obtain the internal OkHttp Builder. This method is typically not required to be invoked for simple API
* usages, but can be a handy back door for non-trivial advanced customizations of the API client.
*
* @return the {@link ApiClient} which {@link #build()} will use.
*/
public okhttp3.OkHttpClient.Builder getOkBuilder() {
return okBuilder;
}
private <T> T has(String propertyName, T value) throws IllegalStateException {
if (value == null) {
throw new IllegalStateException("Must call " + propertyName + "(...) to create valid Builder");
}
return value;
}
}
}
@@ -0,0 +1,287 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.util;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.bind.util.ISO8601Utils;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.gsonfire.GsonFireBuilder;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
// This class was originally generated by OpenAPI Generator (https://openapi-generator.tech),
// but then had to be manually edited by Michael Vorburger.ch to fix https://issues.apache.org/jira/browse/FINERACT-1220.
// It is intentionally NOT public, as it's considered an "implementation detail".
// The original JSON class is deleted during the build (see FINERACT-1231).
class JSON {
private final Gson gson;
private final DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
private final SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
private final OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
private final LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
JSON() {
gson = new GsonFireBuilder().createGsonBuilder().registerTypeAdapter(Date.class, dateTypeAdapter)
.registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter)
.registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter)
.registerTypeAdapter(LocalDate.class, localDateTypeAdapter).create();
}
Gson getGson() {
return gson;
}
/**
* GSON TypeAdapter for JSR-310 OffsetDateTime type.
*/
public static class OffsetDateTimeTypeAdapter extends TypeAdapter<OffsetDateTime> {
private final DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
@Override
public void write(JsonWriter out, OffsetDateTime date) throws IOException {
if (date == null) {
out.nullValue();
} else {
out.value(formatter.format(date));
}
}
@Override
public OffsetDateTime read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
if (date.endsWith("+0000")) {
date = date.substring(0, date.length() - 5) + "Z";
}
return OffsetDateTime.parse(date, formatter);
}
}
}
/**
* GSON TypeAdapter for JSR-310 LocalDate type, which Fineract API's RETURNS as JSON array in the
* <tt>[2009,1,1]</tt> format, but EXPECTS as String not Array and with a locale and dateFormat. Weird, but so it is
* (see FINERACT-1220 & FINERACT-1233).
*/
public static class LocalDateTypeAdapter extends TypeAdapter<LocalDate> {
// NB this format is referenced from org.apache.fineract.client.util.FineractClient.DATE_FORMAT
private final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
@Override
public void write(JsonWriter out, LocalDate date) throws IOException {
if (date == null) {
out.nullValue();
} else {
out.value(formatter.format(date));
}
}
@Override
public LocalDate read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
case BEGIN_ARRAY:
in.beginArray();
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
in.endArray();
return LocalDate.of(year, month, day);
default:
throw new JsonParseException(
"Fineract's API normally always sends LocalDate as e.g. [2009,1,1].. or does it not?! (FINERACT-1220)");
}
}
}
/**
* GSON TypeAdapter for java.sql.Date type. If the dateFormat is null, a simple "yyyy-MM-dd" format will be used
* (more efficient than SimpleDateFormat).
*/
public static class SqlDateTypeAdapter extends TypeAdapter<java.sql.Date> {
private final DateFormat dateFormat = null; // TODO FINERACT-1220
@Override
public void write(JsonWriter out, java.sql.Date date) throws IOException {
if (date == null) {
out.nullValue();
} else {
String value;
if (dateFormat != null) {
value = dateFormat.format(date);
} else {
value = date.toString();
}
out.value(value);
}
}
@Override
public java.sql.Date read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
try {
if (dateFormat != null) {
return new java.sql.Date(dateFormat.parse(date).getTime());
}
return new java.sql.Date(ISO8601Utils.parse(date, new ParsePosition(0)).getTime());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
}
/**
* GSON TypeAdapter for java.util.Date type. If the dateFormat is null, ISO8601Utils will be used.
*/
public static class DateTypeAdapter extends TypeAdapter<Date> {
private final DateFormat dateFormat = null; // TODO FINERACT-1220
@Override
public void write(JsonWriter out, Date date) throws IOException {
if (date == null) {
out.nullValue();
} else {
String value;
if (dateFormat != null) {
value = dateFormat.format(date);
} else {
value = ISO8601Utils.format(date, true);
}
out.value(value);
}
}
@Override
public Date read(JsonReader in) throws IOException {
try {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
try {
if (dateFormat != null) {
return dateFormat.parse(date);
}
return ISO8601Utils.parse(date, new ParsePosition(0));
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
} catch (IllegalArgumentException e) {
throw new JsonParseException(e);
}
}
}
// The following is not from the generated JSON class, but from the original generated ApiClient.
// The original class ApiClass, just like the JSON class, is deleted during the build (see FINERACT-1231).
/**
* This wrapper is to take care of this case: when the deserialization fails due to JsonParseException and the
* expected type is String, then just return the body string.
*/
public static class GsonResponseBodyConverterToString<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final Type type;
GsonResponseBodyConverterToString(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}
@SuppressWarnings("unchecked")
@Override
public T convert(ResponseBody value) throws IOException {
String returned = value.string();
try {
return gson.fromJson(returned, type);
} catch (JsonParseException e) {
return (T) returned;
}
}
}
public static final class GsonCustomConverterFactory extends Converter.Factory {
private final Gson gson;
private final GsonConverterFactory gsonConverterFactory;
public static GsonCustomConverterFactory create(Gson gson) {
return new GsonCustomConverterFactory(gson);
}
private GsonCustomConverterFactory(Gson gson) {
if (gson == null) {
throw new NullPointerException("gson == null");
}
this.gson = gson;
this.gsonConverterFactory = GsonConverterFactory.create(gson);
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (type.equals(String.class)) {
return new GsonResponseBodyConverterToString<>(gson, type);
}
return gsonConverterFactory.responseBodyConverter(type, annotations, retrofit);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations,
Retrofit retrofit) {
return gsonConverterFactory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
}
}
}
@@ -0,0 +1,109 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.client.util;
import java.io.File;
import java.util.Optional;
import okhttp3.MediaType;
import okhttp3.MultipartBody.Part;
import okhttp3.RequestBody;
import org.apache.fineract.client.services.DocumentsApiFixed;
import org.apache.fineract.client.services.ImagesApi;
import retrofit2.Response;
/**
* Convenience Factory for {@link Part} (including {@link RequestBody}).
*
* {@link Part} is the argument of operations for binary uploads like
* {@link DocumentsApiFixed#createDocument(String, Long, Part, String, String)},
* {@link DocumentsApiFixed#updateDocument(String, Long, Long, Part, String, String)} and
* {@link ImagesApi#create(String, Long, Part)} and {@link ImagesApi#update(String, Long, Part)}.
*
* @author Michael Vorburger.ch
*/
public final class Parts {
private Parts() {}
public static Part fromFile(File file) {
RequestBody rb = RequestBody.create(file, mediaType(file.getName()));
return Part.createFormData("file", file.getName(), rb);
}
public static Part fromBytes(String fileName, byte[] bytes) {
RequestBody rb = RequestBody.create(bytes, mediaType(fileName));
return Part.createFormData("file", fileName, rb);
}
// package local, for unit testing
// TODO this logic should be on the Server, not have to be done by the client...
static MediaType mediaType(String fileName) {
if (fileName == null) {
return null;
}
int dotPos = fileName.lastIndexOf('.');
if (dotPos == -1) {
return null;
}
String ext = fileName.substring(dotPos + 1);
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
switch (ext) {
case "jpg":
case "jpeg":
return MediaType.get("image/jpeg");
case "png":
return MediaType.get("image/png");
case "tif":
case "tiff":
return MediaType.get("image/tiff");
case "gif":
return MediaType.get("image/gif");
case "pdf":
return MediaType.get("application/pdf");
case "docx":
return MediaType.get("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
case "doc":
return MediaType.get("application/msword");
case "xlsx":
return MediaType.get("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
case "xls":
return MediaType.get("application/vnd.ms-excel");
case "odt":
return MediaType.get("application/vnd.oasis.opendocument.text");
case "ods":
return MediaType.get("application/vnd.oasis.opendocument.spreadsheet");
case "txt":
return MediaType.get("text/plain");
default:
return null;
}
}
public static Optional<String> fileName(Response<?> response) {
String contentDisposition = response.headers().get("Content-Disposition");
if (contentDisposition == null) {
return Optional.empty();
}
int i = contentDisposition.indexOf("; filename=\"");
if (i == -1) {
return Optional.empty();
}
return Optional.of(contentDisposition.substring(i + "; filename=\"".length(), contentDisposition.length() - 1));
}
}

Some files were not shown because too many files have changed in this diff Show More