add contributor list + edition pane
authorymh <ymh.work@gmail.com>
Tue, 01 Dec 2015 13:33:08 +0100
changeset 20 a9b98b16b053
parent 19 eadaf0b8f02e
child 21 01e7e6a17317
add contributor list + edition pane
server/bo_client/app/adapters/application.js
server/bo_client/app/components/bo-doc-contributors.js
server/bo_client/app/helpers/add-one.js
server/bo_client/app/helpers/document-contributor-role-translation-tag.js
server/bo_client/app/index.html
server/bo_client/app/locales/en/translations.js
server/bo_client/app/locales/fr/translations.js
server/bo_client/app/models/document.js
server/bo_client/app/styles/app.scss
server/bo_client/app/templates/application.hbs
server/bo_client/app/templates/components/bo-doc-contributors.hbs
server/bo_client/app/templates/doc.hbs
server/bo_client/bower.json
server/bo_client/config/environment.js
server/bo_client/ember-cli-build.js
server/bo_client/package.json
server/bo_client/server/mocks/documents.js
server/bo_client/tests/integration/components/bo-doc-contributors-test.js
server/bo_client/tests/unit/helpers/add-one-test.js
server/bo_client/tests/unit/helpers/document-contributor-role-translation-tag-test.js
server/src/app/Http/Controllers/Api/DocumentController.php
server/src/app/Http/Controllers/Bo/DocumentListController.php
server/src/app/Http/routes.php
server/src/app/Libraries/CocoonUtils.php
server/src/app/Libraries/Utils.php
server/src/app/Models/Document.php
server/src/app/Repositories/RdfDocumentRepository.php
server/src/config/cache.php
server/src/gulpfile.js
server/src/package.json
server/src/public/css/app.css
server/src/resources/views/app.blade.php
server/src/resources/views/bo/docDetailClient.blade.php
server/src/resources/views/bo/docList.blade.php
server/src/tests/Models/DocumentTest.php
server/src/tests/libraries/UtilsTest.php
--- a/server/bo_client/app/adapters/application.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/adapters/application.js	Tue Dec 01 13:33:08 2015 +0100
@@ -1,5 +1,5 @@
 import DS from 'ember-data';
 
 export default DS.RESTAdapter.extend({
-  namespace: 'api',
+  namespace: 'api/v1',
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/app/components/bo-doc-contributors.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,21 @@
+import Ember from 'ember';
+import _ from 'lodash/lodash';
+
+export default Ember.Component.extend({
+
+  actions: {
+    toggleEditContributors : function() {
+      console.log("EDIT CONTRIBUTORS");
+      // var contributors = _.clone(this.get('document').get('contributors'));
+      // console.log("EDIT CONTRIBUTPRS", contributors);
+      // contributors.push({
+      //   name: "Hello world",
+      //   url: null,
+      //   role: 'http://www.language-archives.org/OLAC/1.1/annotator'
+      // });
+      // this.get('document').set('contributors', contributors);
+      Ember.$('#doc-contributors-table-pane').slideToggle();
+      Ember.$('#doc-contributors-list-pane').slideToggle();
+    }
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/app/helpers/add-one.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,7 @@
+import Ember from 'ember';
+
+export function addOne(params) {
+  return params[0] + 1;
+}
+
+export default Ember.Helper.helper(addOne);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/app/helpers/document-contributor-role-translation-tag.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,8 @@
+import Ember from 'ember';
+
+export function documentContributorRoleTranslationTag(params) {
+  let role  = params[0];
+  return role.replace('http://www.language-archives.org/OLAC/1.1/', 'bo.olac_role_');
+}
+
+export default Ember.Helper.helper(documentContributorRoleTranslationTag);
--- a/server/bo_client/app/index.html	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/index.html	Tue Dec 01 13:33:08 2015 +0100
@@ -18,7 +18,7 @@
       <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
 
     <![endif]-->
-    <link rel="stylesheet" href="assets/vendor.css">
+    <link rel="stylesheet" href="assets/bo-client-vendor.css">
     <link rel="stylesheet" href="assets/bo-client.css">
 
     {{content-for 'head-footer'}}
@@ -51,7 +51,7 @@
 
     {{content-for 'body'}}
 
-    <script src="assets/vendor.js"></script>
+    <script src="assets/bo-client-vendor.js"></script>
     <script src="assets/bo-client.js"></script>
 
   </body>
--- a/server/bo_client/app/locales/en/translations.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/locales/en/translations.js	Tue Dec 01 13:33:08 2015 +0100
@@ -12,7 +12,35 @@
     "document_audio": "Audio:",
     "document_content": "Content",
     "document_title": "Title:",
-    "document_editors": "Editor(s):"
+    "document_editors": "Editor(s):",
+    "document_contributors": "Contributor(s):",
+    "contributors_th_name": "Name",
+    "contributors_th_url": "URL",
+    "contributors_th_role": "Role",
+    "olac_role_annotator": "annotator",
+    "olac_role_author": "author",
+    "olac_role_compiler": "compiler",
+    "olac_role_consultant": "consultant",
+    "olac_role_data_inputter": "data inputter",
+    "olac_role_depositor": "depositor",
+    "olac_role_developer": "developer",
+    "olac_role_editor": "editor",
+    "olac_role_illustrator": "illustrator",
+    "olac_role_interpreter": "interpreter",
+    "olac_role_interviewer": "interviewer",
+    "olac_role_participant": "participant",
+    "olac_role_performer": "performer",
+    "olac_role_photographer": "photographer",
+    "olac_role_recorder": "recorder",
+    "olac_role_researcher": "researcher",
+    "olac_role_research_participant": "research participant",
+    "olac_role_responder": "responder",
+    "olac_role_signer": "signer",
+    "olac_role_singer": "singer",
+    "olac_role_speaker": "speaker",
+    "olac_role_sponsor": "sponsor",
+    "olac_role_transcriber": "transcriber",
+    "olac_role_translator": "translator",
   }
 
   // "some.translation.key": "Text for some.translation.key",
--- a/server/bo_client/app/locales/fr/translations.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/locales/fr/translations.js	Tue Dec 01 13:33:08 2015 +0100
@@ -11,7 +11,35 @@
     "document_audio": "Audio :",
     "document_content": "Contenu",
     "document_title": "Titre :",
-    "document_editors": "Editeur(s) :"
+    "document_editors": "Editeur(s) :",
+    "document_contributors": "Contributeur(s) :",
+    "contributors_th_name": "Nom",
+    "contributors_th_url": "URL",
+    "contributors_th_role": "Role",
+    "olac_role_annotator": "annotateur",
+    "olac_role_author": "auteur",
+    "olac_role_compiler": "compilateur",
+    "olac_role_consultant": "consultant",
+    "olac_role_data_inputter": "data inputter",
+    "olac_role_depositor": "depositeur",
+    "olac_role_developer": "developpeur",
+    "olac_role_editor": "editeur",
+    "olac_role_illustrator": "illustrateur",
+    "olac_role_interpreter": "interprète",
+    "olac_role_interviewer": "interviewer",
+    "olac_role_participant": "participant",
+    "olac_role_performer": "performer",
+    "olac_role_photographer": "photographe",
+    "olac_role_recorder": "recorder",
+    "olac_role_researcher": "chercheur",
+    "olac_role_research_participant": "research participant",
+    "olac_role_responder": "responder",
+    "olac_role_signer": "signataire",
+    "olac_role_singer": "chanteur",
+    "olac_role_speaker": "speaker",
+    "olac_role_sponsor": "sponsor",
+    "olac_role_transcriber": "transcripteur",
+    "olac_role_translator": "traducteur",
   },
   // "some.translation.key": "Text for some.translation.key",
   //
--- a/server/bo_client/app/models/document.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/models/document.js	Tue Dec 01 13:33:08 2015 +0100
@@ -1,9 +1,32 @@
 import DS from 'ember-data';
+import Ember from 'ember';
+import _ from 'lodash/lodash';
 
 export default DS.Model.extend({
   //id: DS.attr('string'),
   uri: DS.attr('string'),
+
   title: DS.attr('string'),
+
   publishers: DS.attr({defaultValue: []}),
-  mediaArray: DS.attr({defaultValue: []})
+
+  contributors: DS.attr({defaultValue: []}),
+
+  mediaArray: DS.attr({defaultValue: []}),
+
+  mediaList: Ember.computed('mediaArray', function() {
+    var res = [];
+    var mp3 = null;
+    _.forEach(this.get('mediaArray'), function(m) {
+      if(m.format === 'audio/mpeg') {
+        mp3 = m;
+      } else if (m.format.startsWith('audio/')) {
+        res.push(m);
+      }
+    });
+    if(mp3) {
+      res.unshift(mp3);
+    }
+    return res;
+  }),
 });
--- a/server/bo_client/app/styles/app.scss	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/styles/app.scss	Tue Dec 01 13:33:08 2015 +0100
@@ -1,1 +1,34 @@
-@import "app-core";
+@import 'bower_components/bootstrap-sass/assets/stylesheets/_bootstrap';
+@import 'bower_components/font-awesome/scss/font-awesome';
+
+$btn-font-weight: 300;
+$font-family-sans-serif: "Roboto", Helvetica, Arial, sans-serif;
+
+body, label, .checkbox label {
+	font-weight: 300;
+}
+
+.doc_details_title {
+	@extend .h3;
+	margin-top: 0;
+}
+.content-main-title {
+	@extend .h4;
+}
+
+.data-audio-title {
+	@extend .h4;
+}
+
+.content-title {
+	@extend .h5;
+}
+
+.bo-doc-edit-icons {
+  cursor: pointer;
+}
+
+#doc-contributors-table-pane {
+	display: none;
+	margin-top: 20px;
+}
--- a/server/bo_client/app/templates/application.hbs	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/templates/application.hbs	Tue Dec 01 13:33:08 2015 +0100
@@ -1,3 +1,1 @@
-<h2 id="title">Welcome to Ember application</h2>
-
 {{outlet}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/app/templates/components/bo-doc-contributors.hbs	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,36 @@
+<div class="col-md-1">
+    {{ fa-icon "pencil" class='bo-doc-edit-icons' click=(action "toggleEditContributors")}}
+    <!--span class="glyphicon glyphicon-pencil bo-doc-edit-icons"></span-->
+</div>
+<div class="col-md-11">
+  <div class="row">
+    <div class="col-md-12 content-title">{{t 'bo.document_contributors'}}</div>
+  </div>
+  <div class="row" id="doc-contributors-list-pane">
+    <div class="col-md-12 content-value">{{#each document.contributors as |contrib index|}}{{if index " ; "}}{{#if contrib.name}}{{contrib.name}}{{else}}{{contrib.url}}{{/if}} ({{t (document-contributor-role-translation-tag contrib.role)}}){{/each}}</div>
+  </div>
+  <div class="row" id="doc-contributors-table-pane">
+    <div class="col-md-12 panel panel-default">
+      <table class="table table-striped table-condensed">
+        <thead>
+          <tr>
+            <th>#</th>
+            <th>{{t 'bo.contributors_th_name'}}</th>
+            <th>{{t 'bo.contributors_th_url'}}</th>
+            <th>{{t 'bo.contributors_th_role'}}</th>
+          </tr>
+        </thead>
+        <tbody>
+        {{#each document.contributors as |contrib index|}}
+          <tr>
+            <td>{{add-one index}}</td>
+            <td>{{contrib.name}}</td>
+            <td>{{contrib.url}}</td>
+            <td>{{contrib.role}}</td>
+          </tr>
+        {{/each}}
+      </tbody>
+      </table>
+    </div>
+  </div>
+</div>
--- a/server/bo_client/app/templates/doc.hbs	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/app/templates/doc.hbs	Tue Dec 01 13:33:08 2015 +0100
@@ -1,27 +1,48 @@
 <div class="row">
-  <div class="col-md-10 col-md-offset-1">
+  <div class="col-md-12">
     <div class="panel panel-default">
       <div class="panel-heading doc_details_title">{{t 'bo.document_detail'}}</div>
 
       <div class="panel-body">
-        <div class="doc_details">
-          <div class="data">
-            <div class="data-audio-title">{{t 'bo.document_audio'}}</div>
-            <div class="data-audio-player">
-              <audio id='' controls="controls">
-              {{#each model.mediaArray as |audio|}}
-                <source src="{{ audio.url }}" type="{{ audio.format }}"/>
-              {{/each}}
-                {{t 'bo.audio_support_error' }}
-              </audio>
+        <div class="doc_details row">
+          <div class="col-md-8 content">
+              <div class="content-main-title">{{t 'bo.document_content'}}</div>
+              <div class="row">
+                <div class="col-md-1">
+                  &nbsp;
+                </div>
+                <div class="col-md-11">
+                  <div class="content-title">{{t 'bo.document_title'}}</div>
+                  <div class="content-value">{{model.title}}</div>
+                </div>
+              </div>
+              <div class="row">
+                {{bo-doc-contributors document=model}}
+              </div>
+              <div class="row">
+                <div class="col-md-1">
+                  &nbsp;
+                </div>
+                <div class="col-md-11">
+                  <div class="content-title">{{t 'bo.document_editors'}}</div>
+                  <div class="content-value">{{#each model.publishers as |publisher index|}}{{if index ", "}}{{publisher}}{{/each}}</div>
+                </div>
+              </div>
+          </div>
+          <div class="col-md-4">
+            <div class="data">
+              <div class="data-audio-title">{{t 'bo.document_audio'}}</div>
+              <div class="data-audio-player">
+                <audio id='' controls="controls">
+                {{#each model.mediaList as |audio|}}
+                  <source src="{{ audio.url }}" type="{{ audio.format }}"/>
+                {{/each}}
+                  {{t 'bo.audio_support_error' }}
+                </audio>
+              </div>
             </div>
           </div>
           <div class="content">
-            <div class="content-main-title">{{t 'bo.document_content'}}</div>
-            <div class="content-title">{{t 'bo.document_title'}}</div>
-            <div class="content-value">{{model.title}}</div>
-            <div class="content-title">{{t 'bo.document_editors'}}</div>
-            <div class="content-value">{{#each model.publishers as |publisher index|}}{{if index ", "}}{{publisher}}{{/each}}</div>
           </div>
         </div>
       </div>
--- a/server/bo_client/bower.json	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/bower.json	Tue Dec 01 13:33:08 2015 +0100
@@ -1,16 +1,25 @@
 {
   "name": "bo-client",
   "dependencies": {
-    "ember": "2.1.0",
-    "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3",
+    "ember": "2.2.0",
+    "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.6",
     "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
     "ember-data": ">=2.1.0",
-    "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
-    "ember-qunit": "0.4.9",
-    "ember-qunit-notifications": "0.0.7",
-    "ember-resolver": "~0.1.18",
+    "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.7",
+    "ember-qunit": ">=0.4.9",
+    "ember-qunit-notifications": ">=0.0.7",
+    "ember-resolver": ">=0.1.18",
     "jquery": "latest",
-    "loader.js": "ember-cli/loader.js#3.2.1",
-    "qunit": "~1.18.0"
+    "loader.js": "ember-cli/loader.js#3.5.0",
+    "qunit": "~1.18.0",
+    "bootstrap-sass": "bootstrap-sass-official#~3.3.6",
+    "font-awesome": "~4.4.0"
+  },
+  "resolutions": {
+    "ember-cli-shims": "0.0.6",
+    "loader.js": "3.5.0",
+    "ember-load-initializers": "0.1.7",
+    "ember": "2.2.0",
+    "qunit-notifications": "~0.1.0"
   }
 }
--- a/server/bo_client/config/environment.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/config/environment.js	Tue Dec 01 13:33:08 2015 +0100
@@ -5,6 +5,7 @@
     modulePrefix: 'bo-client',
     environment: environment,
     baseURL: '/',
+    //locationType: 'auto',
     locationType: 'auto',
     EmberENV: {
       FEATURES: {
@@ -20,11 +21,11 @@
   };
 
   if (environment === 'development') {
-    // ENV.APP.LOG_RESOLVER = true;
-    // ENV.APP.LOG_ACTIVE_GENERATION = true;
-    // ENV.APP.LOG_TRANSITIONS = true;
-    // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
-    // ENV.APP.LOG_VIEW_LOOKUPS = true;
+    ENV.APP.LOG_RESOLVER = true;
+    ENV.APP.LOG_ACTIVE_GENERATION = true;
+    ENV.APP.LOG_TRANSITIONS = true;
+    ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+    ENV.APP.LOG_VIEW_LOOKUPS = true;
   }
 
   if (environment === 'test') {
@@ -40,7 +41,7 @@
   }
 
   if (environment === 'production') {
-
+    ENV.locationType = 'hash';
   }
 
   return ENV;
--- a/server/bo_client/ember-cli-build.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/ember-cli-build.js	Tue Dec 01 13:33:08 2015 +0100
@@ -1,20 +1,44 @@
 /* global require, module */
 var EmberApp = require('ember-cli/lib/broccoli/ember-app');
+var pickFiles = require('broccoli-static-compiler');
 
 
 module.exports = function(defaults) {
 
   var app = new EmberApp(defaults, {
+    outputPaths: {
+      vendor: {
+        js: '/assets/bo-client-vendor.js',
+        css: '/assets/bo-client-vendor.css'
+      }
+    },
+    fingerprint: {
+      enabled: false
+    },
+    storeConfigInMeta: false,
     // Add options here
+    emberCliFontAwesome: {
+      useScss: true
+    },
     sassOptions: {
       includePaths: [
         'app/styles',
-        '../src/resources/assets/sass',
-        '../src/vendor/bower_components/bootstrap-sass/assets/stylesheets'
       ],
     }
   });
 
+  // bootstrap
+  app.import('bower_components/bootstrap-sass/assets/javascripts/bootstrap.js');
+  var bootstrapFonts = pickFiles('bower_components/bootstrap-sass/assets/fonts', {
+    srcDir: '/',
+    destDir: '/fonts'
+  });
+
+
+  // app.import('../src/vendor/bower_components/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff', {
+  //   destDir: 'fonts'
+  // })
+
   // Use `app.import` to add additional libraries to the generated
   // output files.
   //
@@ -28,5 +52,5 @@
   // please specify an object with the list of modules as keys
   // along with the exports of each module as its value.
 
-  return app.toTree();
+  return app.toTree(bootstrapFonts);
 };
--- a/server/bo_client/package.json	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/package.json	Tue Dec 01 13:33:08 2015 +0100
@@ -19,30 +19,37 @@
   "author": "",
   "license": "MIT",
   "devDependencies": {
-    "bower": "^1.5.2",
-    "broccoli-asset-rev": "^2.1.2",
-    "broccoli-funnel": "^0.2.8",
-    "broccoli-merge-trees": "^0.2.3",
-    "ember-cli": "1.13.8",
-    "ember-cli-app-version": "0.5.0",
-    "ember-cli-babel": "^5.1.3",
+    "bower": "^1.6.8",
+    "broccoli-asset-rev": "^2.3.0",
+    "broccoli-funnel": "^1.0.1",
+    "broccoli-merge-trees": "^1.0.0",
+    "ember-cli": "1.13.13",
+    "ember-cli-app-version": "1.0.0",
+    "ember-cli-babel": "^5.1.6",
     "ember-cli-content-security-policy": "0.4.0",
-    "ember-cli-dependency-checker": "^1.0.1",
-    "ember-cli-htmlbars": "0.7.9",
-    "ember-cli-htmlbars-inline-precompile": "^0.2.0",
-    "ember-cli-ic-ajax": "0.2.1",
+    "ember-cli-dependency-checker": "^1.1.0",
+    "ember-cli-font-awesome": "1.3.0",
+    "ember-cli-htmlbars": "1.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^0.3.1",
+    "ember-cli-ic-ajax": "0.2.4",
     "ember-cli-inject-live-reload": "^1.3.1",
-    "ember-cli-qunit": "^1.0.0",
-    "ember-cli-release": "0.2.3",
-    "ember-cli-sass": "4.2.0",
-    "ember-cli-sri": "^1.0.3",
+    "ember-cli-qunit": "^1.0.4",
+    "ember-cli-release": "0.2.8",
+    "ember-cli-sass": "5.2.0",
+    "ember-cli-sri": "^1.2.1",
     "ember-cli-uglify": "^1.2.0",
-    "ember-data": "1.13.8",
-    "ember-disable-proxy-controllers": "^1.0.0",
-    "ember-export-application-global": "^1.0.3",
-    "ember-i18n": "4.1.3",
+    "ember-data": "2.2.1",
+    "ember-disable-proxy-controllers": "^1.0.1",
+    "ember-export-application-global": "^1.0.5",
+    "ember-i18n": "4.2.0",
+    "ember-lodash": "0.0.6",
     "express": "^4.13.3",
-    "glob": "^4.5.3",
-    "morgan": "^1.6.1"
+    "glob": "^6.0.1",
+    "morgan": "^1.6.1",
+    "npm-check-updates": "^2.5.1",
+    "walk-sync": "^0.2.6"
+  },
+  "dependencies": {
+    "broccoli-static-compiler": "^0.2.2"
   }
 }
--- a/server/bo_client/server/mocks/documents.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/bo_client/server/mocks/documents.js	Tue Dec 01 13:33:08 2015 +0100
@@ -1,42 +1,162 @@
 module.exports = function(app) {
   var express = require('express');
+  var _ = require('lodash');
+
   var documentsRouter = express.Router();
 
+
+  var documentList = [{
+    "id": "crdo-09-CAYCHAX_SOUND",
+    "uri": "http://purl.org/poi/corpusdelaparole.huma-num.fr/crdo-09-CAYCHAX_SOUND",
+    "title": "ALLOc : Caychax : Parabole",
+    "modified": "2010-10-25T18:16:38+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
+    ],
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Alazet, Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
+      }
+    ],
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144792.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144792.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xhtml": {
+        "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xhtml",
+        "format": "application/xhtml+xml",
+        "extent": null,
+        "extent_ms": null,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xml": {
+        "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xml",
+        "format": "application/xml",
+        "extent": null,
+        "extent_ms": null,
+        "master": false
+      }
+    }
+  },
+  {
+    "id": "crdo-ALA_177",
+    "uri": "http://purl.org/poi/corpusdelaparole.huma-num.fr/crdo-ALA_177",
+    "title": "Atlas Linguistique et ethnographique de l'Alsace - Enquêtes linguistiques - Cleebourg: 04",
+    "modified": "2014-12-01T18:34:43+01:00",
+    "publishers": [
+      "Atlas linguistiques, cultures et parlers régionaux de France"
+    ],
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/9122216",
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/61542329",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": "Informateur 1",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/61542329",
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
+      }
+    ],
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/ala/ALA_177.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/ala/ALA_177.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT23M53S",
+        "extent_ms": 1433000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/ala/masters/ALA_177.wav": {
+        "url": "http://cocoon.huma-num.fr/data/ala/masters/ALA_177.wav",
+        "format": "audio/x-wav",
+        "extent": "PT23M53S",
+        "extent_ms": 1433000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/ala/ALA_177_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/ala/ALA_177_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT23M53S",
+        "extent_ms": 1433000,
+        "master": false
+      }
+    }
+  }];
+
   documentsRouter.get('/', function(req, res) {
     res.send({
-      'documents': [{
-            id: "crdo-ALA_170",
-            uri: "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-ALA_170",
-            title: "Atlas Linguistique et ethnographique de l'Alsace - Enqu\u00eates linguistiques - Brumath: 03",
-            publishers: ["Atlas linguistiques, cultures et parlers r\u00e9gionaux de France"],
-            mediaArray: [
-              {
-                url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_170_22km.wav",
-                format: "audio\/x-wav"},
-              {
-                url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_170.mp3",
-                format: "audio\/mpeg"},
-              {
-                url: "http:\/\/purl.org\/poi\/crdo.vjf.cnrs.fr\/crdo-ALA_170",
-                format: "audio\/x-wav" }
-            ]
-          },
-          {
-            id: "crdo-ALA_177",
-            uri: "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-ALA_177",
-            title: "Atlas Linguistique et ethnographique de l'Alsace - Enqu\u00eates linguistiques - Cleebourg: 04",
-            publishers: ["Atlas linguistiques, cultures et parlers r\u00e9gionaux de France"],
-            mediaArray: [{
-                url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_177_22km.wav",
-                format: "audio\/x-wav"
-            }, {
-                url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_177.mp3",
-                format: "audio\/mpeg"
-            }, {
-                url: "http:\/\/purl.org\/poi\/crdo.vjf.cnrs.fr\/crdo-ALA_177",
-                format: "audio\/x-wav"
-            }]
-          }]
+      'documents': documentList,
     });
   });
 
@@ -45,25 +165,14 @@
   });
 
   documentsRouter.get('/:id', function(req, res) {
-    res.send({
-      'document': {
-        id: req.params.id,
-        uri: "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-ALA_170",
-        title: "Atlas Linguistique et ethnographique de l'Alsace - Enqu\u00eates linguistiques - Brumath: 03",
-        publishers: ["Atlas linguistiques, cultures et parlers r\u00e9gionaux de France"],
-        mediaArray: [
-          {
-            url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_170_22km.wav",
-            format: "audio\/x-wav"},
-          {
-            url: "http:\/\/cocoon.huma-num.fr\/data\/ala\/ALA_170.mp3",
-            format: "audio\/mpeg"},
-          {
-            url: "http:\/\/purl.org\/poi\/crdo.vjf.cnrs.fr\/crdo-ALA_170",
-            format: "audio\/x-wav" }
-        ]
-      }
-    });
+
+    var docRes = _.find(documentList, 'id', req.params.id);
+    if(docRes) {
+      res.send({'document': docRes});
+    } else {
+      res.status(404).send('Not found');
+    }
+
   });
 
   documentsRouter.put('/:id', function(req, res) {
@@ -78,5 +187,5 @@
     res.status(204).end();
   });
 
-  app.use('/api/documents', documentsRouter);
+  app.use('/api/v1/documents', documentsRouter);
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/tests/integration/components/bo-doc-contributors-test.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,25 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('bo-doc-contributors', 'Integration | Component | bo doc contributors', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+  this.render(hbs`{{bo-doc-contributors}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#bo-doc-contributors}}
+      template block text
+    {{/bo-doc-contributors}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/tests/unit/helpers/add-one-test.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,10 @@
+import { addOne } from '../../../helpers/add-one';
+import { module, test } from 'qunit';
+
+module('Unit | Helper | add one');
+
+// Replace this with your real tests.
+test('it works', function(assert) {
+  let result = addOne(42);
+  assert.equal(result, 43);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/tests/unit/helpers/document-contributor-role-translation-tag-test.js	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,10 @@
+import { documentContributorRoleTranslationTag } from '../../../helpers/document-contributor-role-translation-tag';
+import { module, test } from 'qunit';
+
+module('Unit | Helper | document contributor role translation tag');
+
+// Replace this with your real tests.
+test('it works', function(assert) {
+  let result = documentContributorRoleTranslationTag("http://www.language-archives.org/OLAC/1.1/transcriber");
+  assert.equal(result, "bo.olac_role_transcriber");
+});
--- a/server/src/app/Http/Controllers/Api/DocumentController.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Http/Controllers/Api/DocumentController.php	Tue Dec 01 13:33:08 2015 +0100
@@ -24,7 +24,12 @@
      */
     public function index()
     {
-        return response()->json($this->documentRepository->paginateAll());
+        $paginator = $this->documentRepository->paginateAll();
+        $res = [];
+        foreach ($paginator->toArray() as $key => $value) {
+            $res[($key === 'data')?'documents':$key] = $value;
+        }
+        return response()->json($res);
     }
 
     /**
@@ -60,7 +65,7 @@
         if(is_null($doc)) {
             abort(404);
         }
-        return response()->json($doc);
+        return response()->json(["document" => $doc]);
     }
 
     /**
--- a/server/src/app/Http/Controllers/Bo/DocumentListController.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Http/Controllers/Bo/DocumentListController.php	Tue Dec 01 13:33:08 2015 +0100
@@ -69,6 +69,27 @@
     }
 
     /**
+     * Display the specified resource with the js client.
+     *
+     * @param string $id
+     *
+     * @return Response
+     */
+    public function getClient($id)
+    {
+        //$doc->add("<$doc_uri>");
+        $doc = $this->documentRepository->get($id);
+
+        if(is_null($doc)) {
+            abort(404);
+        }
+
+        return view('bo.docDetailClient', ['doc' => $doc]);
+
+    }
+
+
+    /**
      * Show the form for editing the specified resource.
      *
      * @param int $id
--- a/server/src/app/Http/routes.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Http/routes.php	Tue Dec 01 13:33:08 2015 +0100
@@ -15,7 +15,12 @@
 
 Route::get('home', 'HomeController@index');
 
+//Route::get('bo/docs/docDetailClient', 'Bo\DocumentListController@showClient');
 Route::resource('bo/docs', 'Bo\DocumentListController');
+Route::controller('bo/docs', 'Bo\DocumentListController', [
+    'getClient' => 'bo.docs.client'
+]);
+
 
 Route::controllers([
 //    'auth' => 'Auth\AuthController',
@@ -30,5 +35,7 @@
 |
 */
 
-Route::resource('api/document', 'Api\DocumentController',
-                ['only' => ['index', 'show']]);
+Route::group(['prefix' => 'api/v1'] , function() {
+    Route::resource('documents', 'Api\DocumentController',
+                    ['only' => ['index', 'show']]);
+});
--- a/server/src/app/Libraries/CocoonUtils.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Libraries/CocoonUtils.php	Tue Dec 01 13:33:08 2015 +0100
@@ -3,6 +3,33 @@
 
 class CocoonUtils {
 
+    const OLAC_ROLES = [
+        'http://www.language-archives.org/OLAC/1.1/annotator',
+        'http://www.language-archives.org/OLAC/1.1/author',
+        'http://www.language-archives.org/OLAC/1.1/compiler',
+        'http://www.language-archives.org/OLAC/1.1/consultant',
+        'http://www.language-archives.org/OLAC/1.1/data_inputter',
+        'http://www.language-archives.org/OLAC/1.1/depositor',
+        'http://www.language-archives.org/OLAC/1.1/developer',
+        'http://www.language-archives.org/OLAC/1.1/editor',
+        'http://www.language-archives.org/OLAC/1.1/illustrator',
+        'http://www.language-archives.org/OLAC/1.1/interpreter',
+        'http://www.language-archives.org/OLAC/1.1/interviewer',
+        'http://www.language-archives.org/OLAC/1.1/participant',
+        'http://www.language-archives.org/OLAC/1.1/performer',
+        'http://www.language-archives.org/OLAC/1.1/photographer',
+        'http://www.language-archives.org/OLAC/1.1/recorder',
+        'http://www.language-archives.org/OLAC/1.1/researcher',
+        'http://www.language-archives.org/OLAC/1.1/research_participant',
+        'http://www.language-archives.org/OLAC/1.1/responder',
+        'http://www.language-archives.org/OLAC/1.1/signer',
+        'http://www.language-archives.org/OLAC/1.1/singer',
+        'http://www.language-archives.org/OLAC/1.1/speaker',
+        'http://www.language-archives.org/OLAC/1.1/sponsor',
+        'http://www.language-archives.org/OLAC/1.1/transcriber',
+        'http://www.language-archives.org/OLAC/1.1/translator',
+    ];
+
     /**
      * Extract id form cocoon url.
      *
--- a/server/src/app/Libraries/Utils.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Libraries/Utils.php	Tue Dec 01 13:33:08 2015 +0100
@@ -15,7 +15,7 @@
      */
     public static function dateIntervalToMillis(\DateInterval $di) {
         if(is_null($di)) {
-            return 0;
+            return null;
         }
         $seconds = ($di->s)
          + ($di->i * 60)
@@ -35,9 +35,13 @@
      * @return the number of milliseconds or 0 if $str is null
      */
     public static function iso8601IntervalToMillis($str) {
-        if(is_null($str) || $str === '') {
+        if(is_null($str)) {
+            return null;
+        }
+        elseif( $str === '') {
             return 0;
         }
+
         $di = new \DateInterval($str);
         return self::dateIntervalToMillis($di);
     }
--- a/server/src/app/Models/Document.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Models/Document.php	Tue Dec 01 13:33:08 2015 +0100
@@ -67,6 +67,11 @@
         return $this->title;
     }
 
+    public function getTitleValue() {
+        $title = $this->getTitle();
+        return is_null($title)?null:$title->getValue();
+    }
+
     public function getPublishers() {
         if(is_null($this->publishers)) {
             try {
@@ -89,6 +94,11 @@
         return $this->issued;
     }
 
+    public function getIssuedValue() {
+        $issued = $this->getIssued();
+        return is_null($issued)?null:$issued->getValue();
+    }
+
     public function getModified() {
         if(is_null($this->modified)) {
             try {
@@ -96,9 +106,6 @@
                 if(is_null($this->modified)) {
                     $this->modified = $this->getIssued();
                 }
-                else {
-                    $this->modified = $this->modified->getValue();
-                }
             } catch(\Exception $e) {
                 $this->modified = null;
             }
@@ -106,6 +113,11 @@
         return $this->modified;
     }
 
+    public function getModifiedValue() {
+        $modified = $this->getModified();
+        return is_null($modified)?null:$modified->getValue();
+    }
+
     public function getMediaArray() {
 
         if(is_null($this->mediaArray)) {
@@ -116,7 +128,7 @@
             $masterUrl = is_null($master)?null:$master->getUri();
 
             foreach($this->graph->allOfType("<http://www.europeana.eu/schemas/edm/WebResources>") as $webResource) {
-                $extent = $webResource->getLiteral("dc:extent");
+                $extent = $webResource->getLiteral("<http://purl.org/dc/terms/extent>");
                 $extent = is_null($extent)?null:$extent->getValue();
                 $extent_ms = Utils::iso8601IntervalToMillis($extent);
                 $format = $webResource->getLiteral("dc11:format");
@@ -150,6 +162,28 @@
         return $res;
     }
 
+    public function getContributors() {
+        return array_reduce(
+            CocoonUtils::OLAC_ROLES,
+            function($res, $olacRole) {
+                return array_merge(
+                    $res,
+                    array_map(
+                        function($olacValue) use ($olacRole) {
+                            return [
+                                'name' => ($olacValue instanceof Literal)?$olacValue->getValue():null,
+                                'url' => ($olacValue instanceof Resource)?$olacValue->getUri():null,
+                                'role' => $olacRole
+                            ];
+                        },
+                        $this->getProvidedCHO()->all("<$olacRole>")
+                    )
+                );
+            },
+            []
+        );
+    }
+
     /**
      * change discourse type list
      */
@@ -195,7 +229,9 @@
             $mediaArray = array_map(
                 function($m) {
                     $f = Utils::processLiteralOrString($m['format']);
-                    return ['url' => $m['url'], 'format' => $f];},
+                    $res = $m;
+                    $res['format'] = $f;
+                    return $res;},
                 $this->getMediaArray()
             );
 
@@ -207,9 +243,10 @@
             return [
                 'id' => $this->getId(),
                 'uri' => $this->getUri(),
-                'title' => $this->getTitle()->getValue(),
-                'modified' => $this->getModified(),
+                'title' => $this->getTitleValue(),
+                'modified' => $this->getModifiedValue(),
                 'publishers' => $publishers,
+                'contributors' => $this->getContributors(),
                 'mediaArray'=> $mediaArray
             ];
         }
--- a/server/src/app/Repositories/RdfDocumentRepository.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/app/Repositories/RdfDocumentRepository.php	Tue Dec 01 13:33:08 2015 +0100
@@ -134,12 +134,12 @@
 
         $page = Paginator::resolveCurrentPage($pageName);
 
-        assert(is_numeric($page));
+        assert(is_null($page) || is_numeric($page));
 
         $total = $this->getCount();
 
         $offset = max(0,($page - 1) * $perPage);
-        
+
         $query =
             "SELECT DISTINCT ?uri ?doc ?title ?issued ?modified".
             "    WHERE {".
--- a/server/src/config/cache.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/config/cache.php	Tue Dec 01 13:33:08 2015 +0100
@@ -74,6 +74,6 @@
     |
     */
 
-    'prefix' => 'laravel',
+    'prefix' => 'corpus',
 
 ];
--- a/server/src/gulpfile.js	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/gulpfile.js	Tue Dec 01 13:33:08 2015 +0100
@@ -1,5 +1,8 @@
-var elixir = require('laravel-elixir');
+var gulp = require('gulp'),
+    elixir = require('laravel-elixir');
 
+
+var exec = require('child_process').execSync;
 /*
  |--------------------------------------------------------------------------
  | Elixir Asset Management
@@ -16,11 +19,27 @@
  'bootstrap': './vendor/bower_components/bootstrap-sass/assets/'
  };
 
+gulp.task('build-ember', function(cb) {
+    exec('node_modules/.bin/ember build -prod', {
+        cwd: '../bo_client',
+        stdio:[0,1,2]
+    });
+});
+
+
+gulp.task('copy-bo-ember', function() {
+    gulp.src('../bo_client/dist/assets/*.js')
+        .pipe(gulp.dest('public/js/vendor/'));
+    gulp.src('../bo_client/dist/assets/*.css')
+        .pipe(gulp.dest('public/css/vendor/'));
+});
 
 elixir(function(mix) {
     mix.sass('app.scss', 'public/css/app.css', {includePaths: [paths['bootstrap']+'stylesheets/']})
         .copy(paths.bootstrap + 'fonts/bootstrap', 'public/fonts')
         .copy(paths.bootstrap + 'javascripts/bootstrap.js', 'public/js/vendor/bootstrap.js')
         .copy(paths.bower_base_path + 'jquery/dist/jquery.min.js', 'public/js/vendor/jquery.js')
-        .copy(paths.bower_base_path + 'font-awesome/css/font-awesome.min.css', 'public/css/vendor/font-awesome.css');
+        .copy(paths.bower_base_path + 'font-awesome/css/font-awesome.min.css', 'public/css/vendor/font-awesome.css')
+        .task('build-ember')
+        .task('copy-bo-ember');
 });
--- a/server/src/package.json	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/package.json	Tue Dec 01 13:33:08 2015 +0100
@@ -3,6 +3,7 @@
   "devDependencies": {
     "bower": "^1.5.3",
     "gulp": "^3.8.8",
+    "gulp-exec": "^2.1.2",
     "laravel-elixir": "*"
   }
 }
--- a/server/src/public/css/app.css	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/public/css/app.css	Tue Dec 01 13:33:08 2015 +0100
@@ -1,3 +1,4 @@
+@charset "UTF-8";
 /*!
  * Bootstrap v3.3.5 (http://getbootstrap.com)
  * Copyright 2011-2015 Twitter, Inc.
@@ -123,7 +124,8 @@
   text-transform: none; }
 
 button,
-html input[type="button"], input[type="reset"],
+html input[type="button"],
+input[type="reset"],
 input[type="submit"] {
   -webkit-appearance: button;
   cursor: pointer; }
@@ -1066,8 +1068,7 @@
 a {
   color: #337ab7;
   text-decoration: none; }
-  a:hover,
-  a:focus {
+  a:hover, a:focus {
     color: #23527c;
     text-decoration: underline; }
   a:focus {
@@ -1119,8 +1120,7 @@
   clip: rect(0, 0, 0, 0);
   border: 0; }
 
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
+.sr-only-focusable:active, .sr-only-focusable:focus {
   position: static;
   width: auto;
   height: auto;
@@ -1132,7 +1132,7 @@
   cursor: pointer; }
 
 h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
+.h1, .h2, .h3, .doc_details_title, .h4, .content-main-title, .data-audio-title, .h5, .content-title, .h6 {
   font-family: inherit;
   font-weight: 500;
   line-height: 1.1;
@@ -1146,10 +1146,10 @@
   h6 .small,
   .h1 small,
   .h1 .small, .h2 small,
-  .h2 .small, .h3 small,
-  .h3 .small, .h4 small,
-  .h4 .small, .h5 small,
-  .h5 .small, .h6 small,
+  .h2 .small, .h3 small, .doc_details_title small,
+  .h3 .small, .doc_details_title .small, .h4 small, .content-main-title small, .data-audio-title small,
+  .h4 .small, .content-main-title .small, .data-audio-title .small, .h5 small, .content-title small,
+  .h5 .small, .content-title .small, .h6 small,
   .h6 .small {
     font-weight: normal;
     line-height: 1;
@@ -1157,7 +1157,7 @@
 
 h1, .h1,
 h2, .h2,
-h3, .h3 {
+h3, .h3, .doc_details_title {
   margin-top: 20px;
   margin-bottom: 10px; }
   h1 small,
@@ -1167,21 +1167,21 @@
   h2 .small, .h2 small,
   .h2 .small,
   h3 small,
-  h3 .small, .h3 small,
-  .h3 .small {
+  h3 .small, .h3 small, .doc_details_title small,
+  .h3 .small, .doc_details_title .small {
     font-size: 65%; }
 
-h4, .h4,
-h5, .h5,
+h4, .h4, .content-main-title, .data-audio-title,
+h5, .h5, .content-title,
 h6, .h6 {
   margin-top: 10px;
   margin-bottom: 10px; }
   h4 small,
-  h4 .small, .h4 small,
-  .h4 .small,
+  h4 .small, .h4 small, .content-main-title small, .data-audio-title small,
+  .h4 .small, .content-main-title .small, .data-audio-title .small,
   h5 small,
-  h5 .small, .h5 small,
-  .h5 .small,
+  h5 .small, .h5 small, .content-title small,
+  .h5 .small, .content-title .small,
   h6 small,
   h6 .small, .h6 small,
   .h6 .small {
@@ -1193,13 +1193,13 @@
 h2, .h2 {
   font-size: 30px; }
 
-h3, .h3 {
+h3, .h3, .doc_details_title {
   font-size: 24px; }
 
-h4, .h4 {
+h4, .h4, .content-main-title, .data-audio-title {
   font-size: 18px; }
 
-h5, .h5 {
+h5, .h5, .content-title {
   font-size: 14px; }
 
 h6, .h6 {
@@ -1368,8 +1368,7 @@
 dd {
   margin-left: 0; }
 
-.dl-horizontal dd:before,
-.dl-horizontal dd:after {
+.dl-horizontal dd:before, .dl-horizontal dd:after {
   content: " ";
   display: table; }
 
@@ -1499,8 +1498,7 @@
   margin-left: auto;
   padding-left: 15px;
   padding-right: 15px; }
-  .container:before,
-  .container:after {
+  .container:before, .container:after {
     content: " ";
     display: table; }
   .container:after {
@@ -1520,8 +1518,7 @@
   margin-left: auto;
   padding-left: 15px;
   padding-right: 15px; }
-  .container-fluid:before,
-  .container-fluid:after {
+  .container-fluid:before, .container-fluid:after {
     content: " ";
     display: table; }
   .container-fluid:after {
@@ -1530,8 +1527,7 @@
 .row {
   margin-left: -15px;
   margin-right: -15px; }
-  .row:before,
-  .row:after {
+  .row:before, .row:after {
     content: " ";
     display: table; }
   .row:after {
@@ -2324,8 +2320,7 @@
     color: #999; }
   .form-control::-webkit-input-placeholder {
     color: #999; }
-  .form-control[disabled],
-  .form-control[readonly],
+  .form-control[disabled], .form-control[readonly],
   fieldset[disabled] .form-control {
     background-color: #eeeeee;
     opacity: 1; }
@@ -2345,8 +2340,7 @@
   input[type="datetime-local"].form-control,
   input[type="month"].form-control {
     line-height: 34px; }
-  input[type="date"].input-sm,
-  .input-group-sm > input[type="date"].form-control,
+  input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control,
   .input-group-sm > input[type="date"].input-group-addon,
   .input-group-sm > .input-group-btn > input[type="date"].btn,
   .input-group-sm input[type="date"],
@@ -2354,20 +2348,22 @@
   .input-group-sm > input[type="time"].form-control,
   .input-group-sm > input[type="time"].input-group-addon,
   .input-group-sm > .input-group-btn > input[type="time"].btn,
-  .input-group-sm input[type="time"],
+  .input-group-sm
+  input[type="time"],
   input[type="datetime-local"].input-sm,
   .input-group-sm > input[type="datetime-local"].form-control,
   .input-group-sm > input[type="datetime-local"].input-group-addon,
   .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
-  .input-group-sm input[type="datetime-local"],
+  .input-group-sm
+  input[type="datetime-local"],
   input[type="month"].input-sm,
   .input-group-sm > input[type="month"].form-control,
   .input-group-sm > input[type="month"].input-group-addon,
   .input-group-sm > .input-group-btn > input[type="month"].btn,
-  .input-group-sm input[type="month"] {
+  .input-group-sm
+  input[type="month"] {
     line-height: 30px; }
-  input[type="date"].input-lg,
-  .input-group-lg > input[type="date"].form-control,
+  input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control,
   .input-group-lg > input[type="date"].input-group-addon,
   .input-group-lg > .input-group-btn > input[type="date"].btn,
   .input-group-lg input[type="date"],
@@ -2375,17 +2371,20 @@
   .input-group-lg > input[type="time"].form-control,
   .input-group-lg > input[type="time"].input-group-addon,
   .input-group-lg > .input-group-btn > input[type="time"].btn,
-  .input-group-lg input[type="time"],
+  .input-group-lg
+  input[type="time"],
   input[type="datetime-local"].input-lg,
   .input-group-lg > input[type="datetime-local"].form-control,
   .input-group-lg > input[type="datetime-local"].input-group-addon,
   .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
-  .input-group-lg input[type="datetime-local"],
+  .input-group-lg
+  input[type="datetime-local"],
   input[type="month"].input-lg,
   .input-group-lg > input[type="month"].form-control,
   .input-group-lg > input[type="month"].input-group-addon,
   .input-group-lg > .input-group-btn > input[type="month"].btn,
-  .input-group-lg input[type="month"] {
+  .input-group-lg
+  input[type="month"] {
     line-height: 46px; } }
 
 .form-group {
@@ -2432,24 +2431,26 @@
   margin-top: 0;
   margin-left: 10px; }
 
-input[type="radio"][disabled],
-input[type="radio"].disabled,
+input[type="radio"][disabled], input[type="radio"].disabled,
 fieldset[disabled] input[type="radio"],
 input[type="checkbox"][disabled],
 input[type="checkbox"].disabled,
-fieldset[disabled] input[type="checkbox"] {
+fieldset[disabled]
+input[type="checkbox"] {
   cursor: not-allowed; }
 
 .radio-inline.disabled,
 fieldset[disabled] .radio-inline,
 .checkbox-inline.disabled,
-fieldset[disabled] .checkbox-inline {
+fieldset[disabled]
+.checkbox-inline {
   cursor: not-allowed; }
 
 .radio.disabled label,
 fieldset[disabled] .radio label,
 .checkbox.disabled label,
-fieldset[disabled] .checkbox label {
+fieldset[disabled]
+.checkbox label {
   cursor: not-allowed; }
 
 .form-control-static {
@@ -2457,11 +2458,9 @@
   padding-bottom: 7px;
   margin-bottom: 0;
   min-height: 34px; }
-  .form-control-static.input-lg,
-  .input-group-lg > .form-control-static.form-control,
+  .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,
   .input-group-lg > .form-control-static.input-group-addon,
-  .input-group-lg > .input-group-btn > .form-control-static.btn,
-  .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
+  .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
   .input-group-sm > .form-control-static.input-group-addon,
   .input-group-sm > .input-group-btn > .form-control-static.btn {
     padding-left: 0;
@@ -2482,11 +2481,11 @@
   height: 30px;
   line-height: 30px; }
 
-textarea.input-sm,
-.input-group-sm > textarea.form-control,
+textarea.input-sm, .input-group-sm > textarea.form-control,
 .input-group-sm > textarea.input-group-addon,
 .input-group-sm > .input-group-btn > textarea.btn,
-select[multiple].input-sm, .input-group-sm > select[multiple].form-control,
+select[multiple].input-sm,
+.input-group-sm > select[multiple].form-control,
 .input-group-sm > select[multiple].input-group-addon,
 .input-group-sm > .input-group-btn > select[multiple].btn {
   height: auto; }
@@ -2528,11 +2527,11 @@
   height: 46px;
   line-height: 46px; }
 
-textarea.input-lg,
-.input-group-lg > textarea.form-control,
+textarea.input-lg, .input-group-lg > textarea.form-control,
 .input-group-lg > textarea.input-group-addon,
 .input-group-lg > .input-group-btn > textarea.btn,
-select[multiple].input-lg, .input-group-lg > select[multiple].form-control,
+select[multiple].input-lg,
+.input-group-lg > select[multiple].form-control,
 .input-group-lg > select[multiple].input-group-addon,
 .input-group-lg > .input-group-btn > select[multiple].btn {
   height: auto; }
@@ -2576,8 +2575,7 @@
   text-align: center;
   pointer-events: none; }
 
-.input-lg + .form-control-feedback,
-.input-group-lg > .form-control + .form-control-feedback,
+.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
 .input-group-lg > .input-group-addon + .form-control-feedback,
 .input-group-lg > .input-group-btn > .btn + .form-control-feedback,
 .input-group-lg + .form-control-feedback,
@@ -2586,8 +2584,7 @@
   height: 46px;
   line-height: 46px; }
 
-.input-sm + .form-control-feedback,
-.input-group-sm > .form-control + .form-control-feedback,
+.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
 .input-group-sm > .input-group-addon + .form-control-feedback,
 .input-group-sm > .input-group-btn > .btn + .form-control-feedback,
 .input-group-sm + .form-control-feedback,
@@ -2743,8 +2740,7 @@
 .form-horizontal .form-group {
   margin-left: -15px;
   margin-right: -15px; }
-  .form-horizontal .form-group:before,
-  .form-horizontal .form-group:after {
+  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
     content: " ";
     display: table; }
   .form-horizontal .form-group:after {
@@ -2789,27 +2785,18 @@
   -moz-user-select: none;
   -ms-user-select: none;
   user-select: none; }
-  .btn:focus,
-  .btn.focus,
-  .btn:active:focus,
-  .btn:active.focus,
-  .btn.active:focus,
-  .btn.active.focus {
+  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
     outline: thin dotted;
     outline: 5px auto -webkit-focus-ring-color;
     outline-offset: -2px; }
-  .btn:hover,
-  .btn:focus,
-  .btn.focus {
+  .btn:hover, .btn:focus, .btn.focus {
     color: #333;
     text-decoration: none; }
-  .btn:active,
-  .btn.active {
+  .btn:active, .btn.active {
     outline: 0;
     background-image: none;
     box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
-  .btn.disabled,
-  .btn[disabled],
+  .btn.disabled, .btn[disabled],
   fieldset[disabled] .btn {
     cursor: not-allowed;
     opacity: 0.65;
@@ -2824,8 +2811,7 @@
   color: #333;
   background-color: #fff;
   border-color: #ccc; }
-  .btn-default:focus,
-  .btn-default.focus {
+  .btn-default:focus, .btn-default.focus {
     color: #333;
     background-color: #e6e6e6;
     border-color: #8c8c8c; }
@@ -2833,40 +2819,22 @@
     color: #333;
     background-color: #e6e6e6;
     border-color: #adadad; }
-  .btn-default:active,
-  .btn-default.active,
+  .btn-default:active, .btn-default.active,
   .open > .btn-default.dropdown-toggle {
     color: #333;
     background-color: #e6e6e6;
     border-color: #adadad; }
-    .btn-default:active:hover,
-    .btn-default:active:focus,
-    .btn-default:active.focus,
-    .btn-default.active:hover,
-    .btn-default.active:focus,
-    .btn-default.active.focus,
+    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
     .open > .btn-default.dropdown-toggle:hover,
     .open > .btn-default.dropdown-toggle:focus,
     .open > .btn-default.dropdown-toggle.focus {
       color: #333;
       background-color: #d4d4d4;
       border-color: #8c8c8c; }
-  .btn-default:active,
-  .btn-default.active,
+  .btn-default:active, .btn-default.active,
   .open > .btn-default.dropdown-toggle {
     background-image: none; }
-  .btn-default.disabled,
-  .btn-default.disabled:hover,
-  .btn-default.disabled:focus,
-  .btn-default.disabled.focus,
-  .btn-default.disabled:active,
-  .btn-default.disabled.active,
-  .btn-default[disabled],
-  .btn-default[disabled]:hover,
-  .btn-default[disabled]:focus,
-  .btn-default[disabled].focus,
-  .btn-default[disabled]:active,
-  .btn-default[disabled].active,
+  .btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active,
   fieldset[disabled] .btn-default,
   fieldset[disabled] .btn-default:hover,
   fieldset[disabled] .btn-default:focus,
@@ -2883,8 +2851,7 @@
   color: #fff;
   background-color: #337ab7;
   border-color: #2e6da4; }
-  .btn-primary:focus,
-  .btn-primary.focus {
+  .btn-primary:focus, .btn-primary.focus {
     color: #fff;
     background-color: #286090;
     border-color: #122b40; }
@@ -2892,40 +2859,22 @@
     color: #fff;
     background-color: #286090;
     border-color: #204d74; }
-  .btn-primary:active,
-  .btn-primary.active,
+  .btn-primary:active, .btn-primary.active,
   .open > .btn-primary.dropdown-toggle {
     color: #fff;
     background-color: #286090;
     border-color: #204d74; }
-    .btn-primary:active:hover,
-    .btn-primary:active:focus,
-    .btn-primary:active.focus,
-    .btn-primary.active:hover,
-    .btn-primary.active:focus,
-    .btn-primary.active.focus,
+    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
     .open > .btn-primary.dropdown-toggle:hover,
     .open > .btn-primary.dropdown-toggle:focus,
     .open > .btn-primary.dropdown-toggle.focus {
       color: #fff;
       background-color: #204d74;
       border-color: #122b40; }
-  .btn-primary:active,
-  .btn-primary.active,
+  .btn-primary:active, .btn-primary.active,
   .open > .btn-primary.dropdown-toggle {
     background-image: none; }
-  .btn-primary.disabled,
-  .btn-primary.disabled:hover,
-  .btn-primary.disabled:focus,
-  .btn-primary.disabled.focus,
-  .btn-primary.disabled:active,
-  .btn-primary.disabled.active,
-  .btn-primary[disabled],
-  .btn-primary[disabled]:hover,
-  .btn-primary[disabled]:focus,
-  .btn-primary[disabled].focus,
-  .btn-primary[disabled]:active,
-  .btn-primary[disabled].active,
+  .btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active,
   fieldset[disabled] .btn-primary,
   fieldset[disabled] .btn-primary:hover,
   fieldset[disabled] .btn-primary:focus,
@@ -2942,8 +2891,7 @@
   color: #fff;
   background-color: #5cb85c;
   border-color: #4cae4c; }
-  .btn-success:focus,
-  .btn-success.focus {
+  .btn-success:focus, .btn-success.focus {
     color: #fff;
     background-color: #449d44;
     border-color: #255625; }
@@ -2951,40 +2899,22 @@
     color: #fff;
     background-color: #449d44;
     border-color: #398439; }
-  .btn-success:active,
-  .btn-success.active,
+  .btn-success:active, .btn-success.active,
   .open > .btn-success.dropdown-toggle {
     color: #fff;
     background-color: #449d44;
     border-color: #398439; }
-    .btn-success:active:hover,
-    .btn-success:active:focus,
-    .btn-success:active.focus,
-    .btn-success.active:hover,
-    .btn-success.active:focus,
-    .btn-success.active.focus,
+    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
     .open > .btn-success.dropdown-toggle:hover,
     .open > .btn-success.dropdown-toggle:focus,
     .open > .btn-success.dropdown-toggle.focus {
       color: #fff;
       background-color: #398439;
       border-color: #255625; }
-  .btn-success:active,
-  .btn-success.active,
+  .btn-success:active, .btn-success.active,
   .open > .btn-success.dropdown-toggle {
     background-image: none; }
-  .btn-success.disabled,
-  .btn-success.disabled:hover,
-  .btn-success.disabled:focus,
-  .btn-success.disabled.focus,
-  .btn-success.disabled:active,
-  .btn-success.disabled.active,
-  .btn-success[disabled],
-  .btn-success[disabled]:hover,
-  .btn-success[disabled]:focus,
-  .btn-success[disabled].focus,
-  .btn-success[disabled]:active,
-  .btn-success[disabled].active,
+  .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active,
   fieldset[disabled] .btn-success,
   fieldset[disabled] .btn-success:hover,
   fieldset[disabled] .btn-success:focus,
@@ -3001,8 +2931,7 @@
   color: #fff;
   background-color: #5bc0de;
   border-color: #46b8da; }
-  .btn-info:focus,
-  .btn-info.focus {
+  .btn-info:focus, .btn-info.focus {
     color: #fff;
     background-color: #31b0d5;
     border-color: #1b6d85; }
@@ -3010,40 +2939,22 @@
     color: #fff;
     background-color: #31b0d5;
     border-color: #269abc; }
-  .btn-info:active,
-  .btn-info.active,
+  .btn-info:active, .btn-info.active,
   .open > .btn-info.dropdown-toggle {
     color: #fff;
     background-color: #31b0d5;
     border-color: #269abc; }
-    .btn-info:active:hover,
-    .btn-info:active:focus,
-    .btn-info:active.focus,
-    .btn-info.active:hover,
-    .btn-info.active:focus,
-    .btn-info.active.focus,
+    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
     .open > .btn-info.dropdown-toggle:hover,
     .open > .btn-info.dropdown-toggle:focus,
     .open > .btn-info.dropdown-toggle.focus {
       color: #fff;
       background-color: #269abc;
       border-color: #1b6d85; }
-  .btn-info:active,
-  .btn-info.active,
+  .btn-info:active, .btn-info.active,
   .open > .btn-info.dropdown-toggle {
     background-image: none; }
-  .btn-info.disabled,
-  .btn-info.disabled:hover,
-  .btn-info.disabled:focus,
-  .btn-info.disabled.focus,
-  .btn-info.disabled:active,
-  .btn-info.disabled.active,
-  .btn-info[disabled],
-  .btn-info[disabled]:hover,
-  .btn-info[disabled]:focus,
-  .btn-info[disabled].focus,
-  .btn-info[disabled]:active,
-  .btn-info[disabled].active,
+  .btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active,
   fieldset[disabled] .btn-info,
   fieldset[disabled] .btn-info:hover,
   fieldset[disabled] .btn-info:focus,
@@ -3060,8 +2971,7 @@
   color: #fff;
   background-color: #f0ad4e;
   border-color: #eea236; }
-  .btn-warning:focus,
-  .btn-warning.focus {
+  .btn-warning:focus, .btn-warning.focus {
     color: #fff;
     background-color: #ec971f;
     border-color: #985f0d; }
@@ -3069,40 +2979,22 @@
     color: #fff;
     background-color: #ec971f;
     border-color: #d58512; }
-  .btn-warning:active,
-  .btn-warning.active,
+  .btn-warning:active, .btn-warning.active,
   .open > .btn-warning.dropdown-toggle {
     color: #fff;
     background-color: #ec971f;
     border-color: #d58512; }
-    .btn-warning:active:hover,
-    .btn-warning:active:focus,
-    .btn-warning:active.focus,
-    .btn-warning.active:hover,
-    .btn-warning.active:focus,
-    .btn-warning.active.focus,
+    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
     .open > .btn-warning.dropdown-toggle:hover,
     .open > .btn-warning.dropdown-toggle:focus,
     .open > .btn-warning.dropdown-toggle.focus {
       color: #fff;
       background-color: #d58512;
       border-color: #985f0d; }
-  .btn-warning:active,
-  .btn-warning.active,
+  .btn-warning:active, .btn-warning.active,
   .open > .btn-warning.dropdown-toggle {
     background-image: none; }
-  .btn-warning.disabled,
-  .btn-warning.disabled:hover,
-  .btn-warning.disabled:focus,
-  .btn-warning.disabled.focus,
-  .btn-warning.disabled:active,
-  .btn-warning.disabled.active,
-  .btn-warning[disabled],
-  .btn-warning[disabled]:hover,
-  .btn-warning[disabled]:focus,
-  .btn-warning[disabled].focus,
-  .btn-warning[disabled]:active,
-  .btn-warning[disabled].active,
+  .btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active,
   fieldset[disabled] .btn-warning,
   fieldset[disabled] .btn-warning:hover,
   fieldset[disabled] .btn-warning:focus,
@@ -3119,8 +3011,7 @@
   color: #fff;
   background-color: #d9534f;
   border-color: #d43f3a; }
-  .btn-danger:focus,
-  .btn-danger.focus {
+  .btn-danger:focus, .btn-danger.focus {
     color: #fff;
     background-color: #c9302c;
     border-color: #761c19; }
@@ -3128,40 +3019,22 @@
     color: #fff;
     background-color: #c9302c;
     border-color: #ac2925; }
-  .btn-danger:active,
-  .btn-danger.active,
+  .btn-danger:active, .btn-danger.active,
   .open > .btn-danger.dropdown-toggle {
     color: #fff;
     background-color: #c9302c;
     border-color: #ac2925; }
-    .btn-danger:active:hover,
-    .btn-danger:active:focus,
-    .btn-danger:active.focus,
-    .btn-danger.active:hover,
-    .btn-danger.active:focus,
-    .btn-danger.active.focus,
+    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
     .open > .btn-danger.dropdown-toggle:hover,
     .open > .btn-danger.dropdown-toggle:focus,
     .open > .btn-danger.dropdown-toggle.focus {
       color: #fff;
       background-color: #ac2925;
       border-color: #761c19; }
-  .btn-danger:active,
-  .btn-danger.active,
+  .btn-danger:active, .btn-danger.active,
   .open > .btn-danger.dropdown-toggle {
     background-image: none; }
-  .btn-danger.disabled,
-  .btn-danger.disabled:hover,
-  .btn-danger.disabled:focus,
-  .btn-danger.disabled.focus,
-  .btn-danger.disabled:active,
-  .btn-danger.disabled.active,
-  .btn-danger[disabled],
-  .btn-danger[disabled]:hover,
-  .btn-danger[disabled]:focus,
-  .btn-danger[disabled].focus,
-  .btn-danger[disabled]:active,
-  .btn-danger[disabled].active,
+  .btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active,
   fieldset[disabled] .btn-danger,
   fieldset[disabled] .btn-danger:hover,
   fieldset[disabled] .btn-danger:focus,
@@ -3178,25 +3051,17 @@
   color: #337ab7;
   font-weight: normal;
   border-radius: 0; }
-  .btn-link,
-  .btn-link:active,
-  .btn-link.active,
-  .btn-link[disabled],
+  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
   fieldset[disabled] .btn-link {
     background-color: transparent;
     box-shadow: none; }
-  .btn-link,
-  .btn-link:hover,
-  .btn-link:focus,
-  .btn-link:active {
+  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
     border-color: transparent; }
-  .btn-link:hover,
-  .btn-link:focus {
+  .btn-link:hover, .btn-link:focus {
     color: #23527c;
     text-decoration: underline;
     background-color: transparent; }
-  .btn-link[disabled]:hover,
-  .btn-link[disabled]:focus,
+  .btn-link[disabled]:hover, .btn-link[disabled]:focus,
   fieldset[disabled] .btn-link:hover,
   fieldset[disabled] .btn-link:focus {
     color: #777777;
@@ -3311,27 +3176,21 @@
     color: #333333;
     white-space: nowrap; }
 
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
   text-decoration: none;
   color: #262626;
   background-color: #f5f5f5; }
 
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
   color: #fff;
   text-decoration: none;
   outline: 0;
   background-color: #337ab7; }
 
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
   color: #777777; }
 
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
   text-decoration: none;
   background-color: transparent;
   background-image: none;
@@ -3402,10 +3261,7 @@
   .btn-group-vertical > .btn {
     position: relative;
     float: left; }
-    .btn-group > .btn:hover,
-    .btn-group > .btn:focus,
-    .btn-group > .btn:active,
-    .btn-group > .btn.active,
+    .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
     .btn-group-vertical > .btn:hover,
     .btn-group-vertical > .btn:focus,
     .btn-group-vertical > .btn:active,
@@ -3420,8 +3276,7 @@
 
 .btn-toolbar {
   margin-left: -5px; }
-  .btn-toolbar:before,
-  .btn-toolbar:after {
+  .btn-toolbar:before, .btn-toolbar:after {
     content: " ";
     display: table; }
   .btn-toolbar:after {
@@ -3499,8 +3354,7 @@
   width: 100%;
   max-width: 100%; }
 
-.btn-group-vertical > .btn-group:before,
-.btn-group-vertical > .btn-group:after {
+.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {
   content: " ";
   display: table; }
 
@@ -3605,12 +3459,14 @@
   background-color: #eeeeee;
   border: 1px solid #ccc;
   border-radius: 4px; }
-  .input-group-addon.input-sm, .input-group-sm > .input-group-addon,
+  .input-group-addon.input-sm,
+  .input-group-sm > .input-group-addon,
   .input-group-sm > .input-group-btn > .input-group-addon.btn {
     padding: 5px 10px;
     font-size: 12px;
     border-radius: 3px; }
-  .input-group-addon.input-lg, .input-group-lg > .input-group-addon,
+  .input-group-addon.input-lg,
+  .input-group-lg > .input-group-addon,
   .input-group-lg > .input-group-btn > .input-group-addon.btn {
     padding: 10px 16px;
     font-size: 18px;
@@ -3653,9 +3509,7 @@
     position: relative; }
     .input-group-btn > .btn + .btn {
       margin-left: -1px; }
-    .input-group-btn > .btn:hover,
-    .input-group-btn > .btn:focus,
-    .input-group-btn > .btn:active {
+    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
       z-index: 2; }
   .input-group-btn:first-child > .btn,
   .input-group-btn:first-child > .btn-group {
@@ -3669,8 +3523,7 @@
   margin-bottom: 0;
   padding-left: 0;
   list-style: none; }
-  .nav:before,
-  .nav:after {
+  .nav:before, .nav:after {
     content: " ";
     display: table; }
   .nav:after {
@@ -3682,21 +3535,17 @@
       position: relative;
       display: block;
       padding: 10px 15px; }
-      .nav > li > a:hover,
-      .nav > li > a:focus {
+      .nav > li > a:hover, .nav > li > a:focus {
         text-decoration: none;
         background-color: #eeeeee; }
     .nav > li.disabled > a {
       color: #777777; }
-      .nav > li.disabled > a:hover,
-      .nav > li.disabled > a:focus {
+      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
         color: #777777;
         text-decoration: none;
         background-color: transparent;
         cursor: not-allowed; }
-  .nav .open > a,
-  .nav .open > a:hover,
-  .nav .open > a:focus {
+  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
     background-color: #eeeeee;
     border-color: #337ab7; }
   .nav .nav-divider {
@@ -3719,9 +3568,7 @@
       border-radius: 4px 4px 0 0; }
       .nav-tabs > li > a:hover {
         border-color: #eeeeee #eeeeee #ddd; }
-    .nav-tabs > li.active > a,
-    .nav-tabs > li.active > a:hover,
-    .nav-tabs > li.active > a:focus {
+    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
       color: #555555;
       background-color: #fff;
       border: 1px solid #ddd;
@@ -3734,9 +3581,7 @@
     border-radius: 4px; }
   .nav-pills > li + li {
     margin-left: 2px; }
-  .nav-pills > li.active > a,
-  .nav-pills > li.active > a:hover,
-  .nav-pills > li.active > a:focus {
+  .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
     color: #fff;
     background-color: #337ab7; }
 
@@ -3768,17 +3613,17 @@
   .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
     margin-right: 0;
     border-radius: 4px; }
-  .nav-tabs-justified > .active > a,
-  .nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active > a:hover,
-  .nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
+  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
     border: 1px solid #ddd; }
   @media (min-width: 768px) {
     .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
       border-bottom: 1px solid #ddd;
       border-radius: 4px 4px 0 0; }
-    .nav-tabs-justified > .active > a,
-    .nav-tabs.nav-justified > .active > a, .nav-tabs-justified > .active > a:hover,
-    .nav-tabs.nav-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
+    .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+    .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
+    .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
       border-bottom-color: #fff; } }
 
 .tab-content > .tab-pane {
@@ -3797,8 +3642,7 @@
   min-height: 50px;
   margin-bottom: 20px;
   border: 1px solid transparent; }
-  .navbar:before,
-  .navbar:after {
+  .navbar:before, .navbar:after {
     content: " ";
     display: table; }
   .navbar:after {
@@ -3807,8 +3651,7 @@
     .navbar {
       border-radius: 4px; } }
 
-.navbar-header:before,
-.navbar-header:after {
+.navbar-header:before, .navbar-header:after {
   content: " ";
   display: table; }
 
@@ -3826,8 +3669,7 @@
   border-top: 1px solid transparent;
   box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
   -webkit-overflow-scrolling: touch; }
-  .navbar-collapse:before,
-  .navbar-collapse:after {
+  .navbar-collapse:before, .navbar-collapse:after {
     content: " ";
     display: table; }
   .navbar-collapse:after {
@@ -3907,8 +3749,7 @@
   font-size: 18px;
   line-height: 20px;
   height: 50px; }
-  .navbar-brand:hover,
-  .navbar-brand:focus {
+  .navbar-brand:hover, .navbar-brand:focus {
     text-decoration: none; }
   .navbar-brand > img {
     display: block; }
@@ -3961,8 +3802,7 @@
         padding: 5px 15px 5px 25px; }
       .navbar-nav .open .dropdown-menu > li > a {
         line-height: 20px; }
-        .navbar-nav .open .dropdown-menu > li > a:hover,
-        .navbar-nav .open .dropdown-menu > li > a:focus {
+        .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {
           background-image: none; } }
   @media (min-width: 768px) {
     .navbar-nav {
@@ -4081,58 +3921,44 @@
   border-color: #e7e7e7; }
   .navbar-default .navbar-brand {
     color: #777; }
-    .navbar-default .navbar-brand:hover,
-    .navbar-default .navbar-brand:focus {
+    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
       color: #5e5e5e;
       background-color: transparent; }
   .navbar-default .navbar-text {
     color: #777; }
   .navbar-default .navbar-nav > li > a {
     color: #777; }
-    .navbar-default .navbar-nav > li > a:hover,
-    .navbar-default .navbar-nav > li > a:focus {
+    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
       color: #333;
       background-color: transparent; }
-  .navbar-default .navbar-nav > .active > a,
-  .navbar-default .navbar-nav > .active > a:hover,
-  .navbar-default .navbar-nav > .active > a:focus {
+  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
     color: #555;
     background-color: #e7e7e7; }
-  .navbar-default .navbar-nav > .disabled > a,
-  .navbar-default .navbar-nav > .disabled > a:hover,
-  .navbar-default .navbar-nav > .disabled > a:focus {
+  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
     color: #ccc;
     background-color: transparent; }
   .navbar-default .navbar-toggle {
     border-color: #ddd; }
-    .navbar-default .navbar-toggle:hover,
-    .navbar-default .navbar-toggle:focus {
+    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
       background-color: #ddd; }
     .navbar-default .navbar-toggle .icon-bar {
       background-color: #888; }
   .navbar-default .navbar-collapse,
   .navbar-default .navbar-form {
     border-color: #e7e7e7; }
-  .navbar-default .navbar-nav > .open > a,
-  .navbar-default .navbar-nav > .open > a:hover,
-  .navbar-default .navbar-nav > .open > a:focus {
+  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
     background-color: #e7e7e7;
     color: #555; }
   @media (max-width: 767px) {
     .navbar-default .navbar-nav .open .dropdown-menu > li > a {
       color: #777; }
-      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
-      .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
         color: #333;
         background-color: transparent; }
-    .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
-    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
-    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
       color: #555;
       background-color: #e7e7e7; }
-    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
-    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
       color: #ccc;
       background-color: transparent; } }
   .navbar-default .navbar-link {
@@ -4141,11 +3967,9 @@
       color: #333; }
   .navbar-default .btn-link {
     color: #777; }
-    .navbar-default .btn-link:hover,
-    .navbar-default .btn-link:focus {
+    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
       color: #333; }
-    .navbar-default .btn-link[disabled]:hover,
-    .navbar-default .btn-link[disabled]:focus,
+    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,
     fieldset[disabled] .navbar-default .btn-link:hover,
     fieldset[disabled] .navbar-default .btn-link:focus {
       color: #ccc; }
@@ -4155,41 +3979,32 @@
   border-color: #090909; }
   .navbar-inverse .navbar-brand {
     color: #9d9d9d; }
-    .navbar-inverse .navbar-brand:hover,
-    .navbar-inverse .navbar-brand:focus {
+    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
       color: #fff;
       background-color: transparent; }
   .navbar-inverse .navbar-text {
     color: #9d9d9d; }
   .navbar-inverse .navbar-nav > li > a {
     color: #9d9d9d; }
-    .navbar-inverse .navbar-nav > li > a:hover,
-    .navbar-inverse .navbar-nav > li > a:focus {
+    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
       color: #fff;
       background-color: transparent; }
-  .navbar-inverse .navbar-nav > .active > a,
-  .navbar-inverse .navbar-nav > .active > a:hover,
-  .navbar-inverse .navbar-nav > .active > a:focus {
+  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
     color: #fff;
     background-color: #090909; }
-  .navbar-inverse .navbar-nav > .disabled > a,
-  .navbar-inverse .navbar-nav > .disabled > a:hover,
-  .navbar-inverse .navbar-nav > .disabled > a:focus {
+  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
     color: #444;
     background-color: transparent; }
   .navbar-inverse .navbar-toggle {
     border-color: #333; }
-    .navbar-inverse .navbar-toggle:hover,
-    .navbar-inverse .navbar-toggle:focus {
+    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
       background-color: #333; }
     .navbar-inverse .navbar-toggle .icon-bar {
       background-color: #fff; }
   .navbar-inverse .navbar-collapse,
   .navbar-inverse .navbar-form {
     border-color: #101010; }
-  .navbar-inverse .navbar-nav > .open > a,
-  .navbar-inverse .navbar-nav > .open > a:hover,
-  .navbar-inverse .navbar-nav > .open > a:focus {
+  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
     background-color: #090909;
     color: #fff; }
   @media (max-width: 767px) {
@@ -4199,18 +4014,13 @@
       background-color: #090909; }
     .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
       color: #9d9d9d; }
-      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
-      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
         color: #fff;
         background-color: transparent; }
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
       color: #fff;
       background-color: #090909; }
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
       color: #444;
       background-color: transparent; } }
   .navbar-inverse .navbar-link {
@@ -4219,11 +4029,9 @@
       color: #fff; }
   .navbar-inverse .btn-link {
     color: #9d9d9d; }
-    .navbar-inverse .btn-link:hover,
-    .navbar-inverse .btn-link:focus {
+    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
       color: #fff; }
-    .navbar-inverse .btn-link[disabled]:hover,
-    .navbar-inverse .btn-link[disabled]:focus,
+    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,
     fieldset[disabled] .navbar-inverse .btn-link:hover,
     fieldset[disabled] .navbar-inverse .btn-link:focus {
       color: #444; }
@@ -4237,7 +4045,7 @@
   .breadcrumb > li {
     display: inline-block; }
     .breadcrumb > li + li:before {
-      content: "/\\00a0";
+      content: "/ ";
       padding: 0 5px;
       color: #ccc; }
   .breadcrumb > .active {
@@ -4270,17 +4078,14 @@
     .pagination > li:last-child > span {
       border-bottom-right-radius: 4px;
       border-top-right-radius: 4px; }
-  .pagination > li > a:hover,
-  .pagination > li > a:focus,
+  .pagination > li > a:hover, .pagination > li > a:focus,
   .pagination > li > span:hover,
   .pagination > li > span:focus {
     z-index: 3;
     color: #23527c;
     background-color: #eeeeee;
     border-color: #ddd; }
-  .pagination > .active > a,
-  .pagination > .active > a:hover,
-  .pagination > .active > a:focus,
+  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
   .pagination > .active > span,
   .pagination > .active > span:hover,
   .pagination > .active > span:focus {
@@ -4337,8 +4142,7 @@
   margin: 20px 0;
   list-style: none;
   text-align: center; }
-  .pager:before,
-  .pager:after {
+  .pager:before, .pager:after {
     content: " ";
     display: table; }
   .pager:after {
@@ -4372,7 +4176,7 @@
 
 .label {
   display: inline;
-  padding: 0.2em 0.6em 0.3em;
+  padding: .2em .6em .3em;
   font-size: 75%;
   font-weight: bold;
   line-height: 1;
@@ -4387,46 +4191,39 @@
     position: relative;
     top: -1px; }
 
-a.label:hover,
-a.label:focus {
+a.label:hover, a.label:focus {
   color: #fff;
   text-decoration: none;
   cursor: pointer; }
 
 .label-default {
   background-color: #777777; }
-  .label-default[href]:hover,
-  .label-default[href]:focus {
+  .label-default[href]:hover, .label-default[href]:focus {
     background-color: #5e5e5e; }
 
 .label-primary {
   background-color: #337ab7; }
-  .label-primary[href]:hover,
-  .label-primary[href]:focus {
+  .label-primary[href]:hover, .label-primary[href]:focus {
     background-color: #286090; }
 
 .label-success {
   background-color: #5cb85c; }
-  .label-success[href]:hover,
-  .label-success[href]:focus {
+  .label-success[href]:hover, .label-success[href]:focus {
     background-color: #449d44; }
 
 .label-info {
   background-color: #5bc0de; }
-  .label-info[href]:hover,
-  .label-info[href]:focus {
+  .label-info[href]:hover, .label-info[href]:focus {
     background-color: #31b0d5; }
 
 .label-warning {
   background-color: #f0ad4e; }
-  .label-warning[href]:hover,
-  .label-warning[href]:focus {
+  .label-warning[href]:hover, .label-warning[href]:focus {
     background-color: #ec971f; }
 
 .label-danger {
   background-color: #d9534f; }
-  .label-danger[href]:hover,
-  .label-danger[href]:focus {
+  .label-danger[href]:hover, .label-danger[href]:focus {
     background-color: #c9302c; }
 
 .badge {
@@ -4447,8 +4244,7 @@
   .btn .badge {
     position: relative;
     top: -1px; }
-  .btn-xs .badge,
-  .btn-group-xs > .btn .badge,
+  .btn-xs .badge, .btn-group-xs > .btn .badge,
   .btn-group-xs > .btn .badge {
     top: 0;
     padding: 1px 5px; }
@@ -4463,8 +4259,7 @@
   .nav-pills > li > a > .badge {
     margin-left: 3px; }
 
-a.badge:hover,
-a.badge:focus {
+a.badge:hover, a.badge:focus {
   color: #fff;
   text-decoration: none;
   cursor: pointer; }
@@ -4542,9 +4337,11 @@
   .alert > p + p {
     margin-top: 5px; }
 
-.alert-dismissable, .alert-dismissible {
+.alert-dismissable,
+.alert-dismissible {
   padding-right: 35px; }
-  .alert-dismissable .close, .alert-dismissible .close {
+  .alert-dismissable .close,
+  .alert-dismissible .close {
     position: relative;
     top: -2px;
     right: -21px;
@@ -4719,8 +4516,7 @@
   a.list-group-item .list-group-item-heading,
   button.list-group-item .list-group-item-heading {
     color: #333; }
-  a.list-group-item:hover,
-  a.list-group-item:focus,
+  a.list-group-item:hover, a.list-group-item:focus,
   button.list-group-item:hover,
   button.list-group-item:focus {
     text-decoration: none;
@@ -4731,41 +4527,29 @@
   width: 100%;
   text-align: left; }
 
-.list-group-item.disabled,
-.list-group-item.disabled:hover,
-.list-group-item.disabled:focus {
+.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
   background-color: #eeeeee;
   color: #777777;
   cursor: not-allowed; }
-  .list-group-item.disabled .list-group-item-heading,
-  .list-group-item.disabled:hover .list-group-item-heading,
-  .list-group-item.disabled:focus .list-group-item-heading {
+  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
     color: inherit; }
-  .list-group-item.disabled .list-group-item-text,
-  .list-group-item.disabled:hover .list-group-item-text,
-  .list-group-item.disabled:focus .list-group-item-text {
+  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
     color: #777777; }
 
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
+.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
   z-index: 2;
   color: #fff;
   background-color: #337ab7;
   border-color: #337ab7; }
   .list-group-item.active .list-group-item-heading,
   .list-group-item.active .list-group-item-heading > small,
-  .list-group-item.active .list-group-item-heading > .small,
-  .list-group-item.active:hover .list-group-item-heading,
+  .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
   .list-group-item.active:hover .list-group-item-heading > small,
-  .list-group-item.active:hover .list-group-item-heading > .small,
-  .list-group-item.active:focus .list-group-item-heading,
+  .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
   .list-group-item.active:focus .list-group-item-heading > small,
   .list-group-item.active:focus .list-group-item-heading > .small {
     color: inherit; }
-  .list-group-item.active .list-group-item-text,
-  .list-group-item.active:hover .list-group-item-text,
-  .list-group-item.active:focus .list-group-item-text {
+  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
     color: #c7ddef; }
 
 .list-group-item-success {
@@ -4778,15 +4562,12 @@
   a.list-group-item-success .list-group-item-heading,
   button.list-group-item-success .list-group-item-heading {
     color: inherit; }
-  a.list-group-item-success:hover,
-  a.list-group-item-success:focus,
+  a.list-group-item-success:hover, a.list-group-item-success:focus,
   button.list-group-item-success:hover,
   button.list-group-item-success:focus {
     color: #3c763d;
     background-color: #d0e9c6; }
-  a.list-group-item-success.active,
-  a.list-group-item-success.active:hover,
-  a.list-group-item-success.active:focus,
+  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,
   button.list-group-item-success.active,
   button.list-group-item-success.active:hover,
   button.list-group-item-success.active:focus {
@@ -4804,15 +4585,12 @@
   a.list-group-item-info .list-group-item-heading,
   button.list-group-item-info .list-group-item-heading {
     color: inherit; }
-  a.list-group-item-info:hover,
-  a.list-group-item-info:focus,
+  a.list-group-item-info:hover, a.list-group-item-info:focus,
   button.list-group-item-info:hover,
   button.list-group-item-info:focus {
     color: #31708f;
     background-color: #c4e3f3; }
-  a.list-group-item-info.active,
-  a.list-group-item-info.active:hover,
-  a.list-group-item-info.active:focus,
+  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,
   button.list-group-item-info.active,
   button.list-group-item-info.active:hover,
   button.list-group-item-info.active:focus {
@@ -4830,15 +4608,12 @@
   a.list-group-item-warning .list-group-item-heading,
   button.list-group-item-warning .list-group-item-heading {
     color: inherit; }
-  a.list-group-item-warning:hover,
-  a.list-group-item-warning:focus,
+  a.list-group-item-warning:hover, a.list-group-item-warning:focus,
   button.list-group-item-warning:hover,
   button.list-group-item-warning:focus {
     color: #8a6d3b;
     background-color: #faf2cc; }
-  a.list-group-item-warning.active,
-  a.list-group-item-warning.active:hover,
-  a.list-group-item-warning.active:focus,
+  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,
   button.list-group-item-warning.active,
   button.list-group-item-warning.active:hover,
   button.list-group-item-warning.active:focus {
@@ -4856,15 +4631,12 @@
   a.list-group-item-danger .list-group-item-heading,
   button.list-group-item-danger .list-group-item-heading {
     color: inherit; }
-  a.list-group-item-danger:hover,
-  a.list-group-item-danger:focus,
+  a.list-group-item-danger:hover, a.list-group-item-danger:focus,
   button.list-group-item-danger:hover,
   button.list-group-item-danger:focus {
     color: #a94442;
     background-color: #ebcccc; }
-  a.list-group-item-danger.active,
-  a.list-group-item-danger.active:hover,
-  a.list-group-item-danger.active:focus,
+  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,
   button.list-group-item-danger.active,
   button.list-group-item-danger.active:hover,
   button.list-group-item-danger.active:focus {
@@ -4889,8 +4661,7 @@
 
 .panel-body {
   padding: 15px; }
-  .panel-body:before,
-  .panel-body:after {
+  .panel-body:before, .panel-body:after {
     content: " ";
     display: table; }
   .panel-body:after {
@@ -5236,8 +5007,7 @@
   text-shadow: 0 1px 0 #fff;
   opacity: 0.2;
   filter: alpha(opacity=20); }
-  .close:hover,
-  .close:focus {
+  .close:hover, .close:focus {
     color: #000;
     text-decoration: none;
     cursor: pointer;
@@ -5328,8 +5098,7 @@
   padding: 15px;
   text-align: right;
   border-top: 1px solid #e5e5e5; }
-  .modal-footer:before,
-  .modal-footer:after {
+  .modal-footer:before, .modal-footer:after {
     content: " ";
     display: table; }
   .modal-footer:after {
@@ -5521,8 +5290,7 @@
 .popover-content {
   padding: 9px 14px; }
 
-.popover > .arrow,
-.popover > .arrow:after {
+.popover > .arrow, .popover > .arrow:after {
   position: absolute;
   display: block;
   width: 0;
@@ -5618,19 +5386,15 @@
         backface-visibility: hidden;
         -webkit-perspective: 1000px;
         perspective: 1000px; }
-        .carousel-inner > .item.next,
-        .carousel-inner > .item.active.right {
+        .carousel-inner > .item.next, .carousel-inner > .item.active.right {
           -webkit-transform: translate3d(100%, 0, 0);
           transform: translate3d(100%, 0, 0);
           left: 0; }
-        .carousel-inner > .item.prev,
-        .carousel-inner > .item.active.left {
+        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
           -webkit-transform: translate3d(-100%, 0, 0);
           transform: translate3d(-100%, 0, 0);
           left: 0; }
-        .carousel-inner > .item.next.left,
-        .carousel-inner > .item.prev.right,
-        .carousel-inner > .item.active {
+        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
           -webkit-transform: translate3d(0, 0, 0);
           transform: translate3d(0, 0, 0);
           left: 0; } }
@@ -5679,8 +5443,7 @@
     background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
     background-repeat: repeat-x;
     filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }
-  .carousel-control:hover,
-  .carousel-control:focus {
+  .carousel-control:hover, .carousel-control:focus {
     outline: 0;
     color: #fff;
     text-decoration: none;
@@ -5777,8 +5540,7 @@
   .carousel-indicators {
     bottom: 20px; } }
 
-.clearfix:before,
-.clearfix:after {
+.clearfix:before, .clearfix:after {
   content: " ";
   display: table; }
 
@@ -5994,4 +5756,7 @@
 body, label, .checkbox label {
   font-weight: 300; }
 
+.doc_details_title {
+  margin-top: 0; }
+
 /*# sourceMappingURL=app.css.map */
--- a/server/src/resources/views/app.blade.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/resources/views/app.blade.php	Tue Dec 01 13:33:08 2015 +0100
@@ -4,12 +4,14 @@
 	<meta charset="utf-8">
 	<meta http-equiv="X-UA-Compatible" content="IE=edge">
 	<meta name="viewport" content="width=device-width, initial-scale=1">
-	<title>Laravel</title>
+	<title>@yield('title','Laravel')</title>
 
+	@section('css-assets')
 	<link href="{{ asset('/css/app.css') }}" rel="stylesheet">
 
 	<!-- Fonts -->
 	<link href='//fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>
+	@show
 
 	<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
 	<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
@@ -55,8 +57,10 @@
 
 	@yield('content')
 
+	@section('js-assets')
 	<!-- Scripts -->
-	<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
-	<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
+	<script src="{{ asset('/js/vendor/jquery.js') }}"></script>
+	<script src="{{ asset('/js/vendor/bootstrap.js') }}"></script>
+	@show
 </body>
 </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/resources/views/bo/docDetailClient.blade.php	Tue Dec 01 13:33:08 2015 +0100
@@ -0,0 +1,21 @@
+@extends('app')
+
+@section('title', 'Document detail')
+
+@section('css-assets')
+
+	<link href="{{ asset('/css/vendor/bo-client-vendor.css') }}" rel="stylesheet">
+	<link href="{{ asset('/css/vendor/bo-client.css') }}" rel="stylesheet">
+@endsection
+
+@section('js-assets')
+	@parent
+
+	<script src="{{ asset('/js/vendor/bo-client-vendor.js') }}"></script>
+	<script src="{{ asset('/js/vendor/bo-client.js') }}"></script>
+@endsection
+
+@section('content')
+<div class="container" id="ember-container">
+</div>
+@endsection
--- a/server/src/resources/views/bo/docList.blade.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/resources/views/bo/docList.blade.php	Tue Dec 01 13:33:08 2015 +0100
@@ -15,7 +15,10 @@
                         <tbody>
                         @foreach ($docs as $doc)
                             <tr>
-                                <td><a href="{{ route('bo.docs.show',[ 'id' => $doc->getId()]) }}">{{ $doc->getId() }}</a></td>
+                                <td>
+                                    <a href="{{ route('bo.docs.show',[ 'id' => $doc->getId()]) }}">{{ $doc->getId() }}</a><br>
+                                    <a href="{{ route('bo.docs.client',[ 'id' => $doc->getId()]) }}#/doc/{{ $doc->getId() }}">{{ $doc->getId() }}</a>
+                                </td>
                                 <td>{{ $doc->getTitle() }}</td>
                                 <td>{{ $doc->getModified() }}</td>
                             </tr>
--- a/server/src/tests/Models/DocumentTest.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/tests/Models/DocumentTest.php	Tue Dec 01 13:33:08 2015 +0100
@@ -1,6 +1,7 @@
 <?php
 
 use CorpusParole\Models\Document;
+use CorpusParole\Libraries\CocoonUtils;
 
 /**
  *
@@ -120,6 +121,17 @@
         $this->assertEquals('fr', $doc->getTitle()->getLang(), "Language title must be fr");
     }
 
+    public function testModified() {
+        $this->assertNotNull($this->graph, 'Graph shoud not be null');
+
+        $doc = new Document("http://purl.org/poi/corpusdelaparole.huma-num.fr/crdo-CFPP2000_35_SOUND", $this->graph);
+        $this->assertInstanceOf(EasyRdf\Literal::class, $doc->getModified(), "Modified must be a literal");
+        $this->assertEquals("http://purl.org/dc/terms/W3CDTF", $doc->getModified()->getDatatypeURI(), "type must be http://purl.org/dc/terms/W3CDTF");
+        $this->assertEquals("2013-10-12T14:35:57+02:00", $doc->getModified(), "modified must be 2013-10-12T14:35:57+02:00");
+
+    }
+
+
     public function testPublisher() {
 
         $doc = new Document("http://purl.org/poi/corpusdelaparole.huma-num.fr/crdo-CFPP2000_35_SOUND", $this->graph);
@@ -169,7 +181,7 @@
             }
             else {
                 $this->assertNull($media['extent'], "no media extent");
-                $this->assertSame(0, $media['extent_ms'], "extend in ms is 0");
+                $this->assertNull($media['extent_ms'], "extend in ms is null");
                 $this->assertStringStartsWith('application/', $media['format']);
             }
 
@@ -302,4 +314,20 @@
         $this->assertFalse($doc->isIsomorphic($doc2),"document must not be isomorphic after adding discourse type");
     }
 
+    public function testGetContributors() {
+        $doc = new Document("http://purl.org/poi/corpusdelaparole.huma-num.fr/crdo-CFPP2000_35_SOUND", $this->graph);
+
+        $contributors = $doc->getContributors();
+
+        $this->assertNotEmpty($contributors, "The contributors array should not be empty");
+        $this->assertCount(8, $contributors, "The contributors array should have 8 elements");
+
+        foreach ($contributors as $contribDef) {
+            $this->assertArrayHasKey('name', $contribDef, "ContribDef must have name key");
+            $this->assertArrayHasKey('url', $contribDef, "ContribDef must have url key");
+            $this->assertArrayHasKey('role', $contribDef, "ContribDef must have role key");
+            $this->assertContains($contribDef['role'], CocoonUtils::OLAC_ROLES, "Role should be in OLAC_ROLES");
+        }
+    }
+
 }
--- a/server/src/tests/libraries/UtilsTest.php	Fri Nov 27 17:59:36 2015 +0100
+++ b/server/src/tests/libraries/UtilsTest.php	Tue Dec 01 13:33:08 2015 +0100
@@ -25,4 +25,10 @@
         $ms = Utils::iso8601IntervalToMillis("P1Y1M1DT1H1M1S");
         $this->assertEquals(34277461000, $ms, "duration must be 3427746100");
     }
+
+    public function testiso8601IntervalToMillisNull() {
+        $ms = Utils::iso8601IntervalToMillis(null);
+        $this->assertNull($ms, "duration must be null");
+    }
+
 }